DDD设计思路
先和相关人员充分沟通,把用户需求详细记录下来。然后呢,从这些需求里提炼出关键的概念和规则,构建领域模型。设计数据库表结构时,要考虑数据的存储和查询效率,还要能支持领域模型。在代码实现阶段,按照领域模型进行分层架构设计,让每个模块职责清晰,这样就能较好地兼顾数据库和代码实现。
首先从需求分析,在线考试系统里,老师得能出题、安排考试,学生要能参加考试、查看成绩,管理员负责系统管理和审核。接着设计领域模型,老师有出题、安排考试的操作,学生有参加考试、查看成绩的操作,管理员有审核、系统管理的操作。然后是数据库表结构,老师表有教师ID、姓名等字段,学生表有学号、姓名等字段,再设计考试表关联老师和学生,记录考试信息。最后在代码实现时,按照领域模型设计各个功能模块,比如老师模块、学生模块和管理员模块,分别实现相应功能。
数据库基本信息
- 数据库类型:MySQL
- 数据库名称:exam_system_ai
核心表结构
1. 用户表(user)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 用户唯一标识 | 主键,自增 |
| account | VARCHAR | 登录账号(手机号/工号) | 非空 |
| password | VARCHAR | 加密密码(MD5+盐值) | 非空 |
| name | VARCHAR | 用户姓名 | 非空 |
| role | VARCHAR | 角色(ADMIN/TEACHER/STUDENT) | 非空 |
| phone | VARCHAR | 联系电话 | |
| VARCHAR | 邮箱 | ||
| avatar | VARCHAR | 头像URL | |
| status | INTEGER | 状态(1正常/0禁用) | 非空 |
| create_time | DATETIME | 创建时间 | 非空 |
| update_time | DATETIME | 更新时间 | 非空 |
| class_id | BIGINT | 班级ID | 外键,关联classroom表 |
| grade_id | BIGINT | 年级ID | 外键,关联grade表 |
2. 年级表(grade)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 年级唯一标识 | 主键,自增 |
| grade_name | VARCHAR | 年级名称 | 非空 |
| status | INTEGER | 状态(1正常/0禁用) | 非空 |
| create_time | DATETIME | 创建时间 | 非空 |
| update_time | DATETIME | 更新时间 | 非空 |
3. 班级表(classroom)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 班级唯一标识 | 主键,自增 |
| class_name | VARCHAR | 班级名称 | 非空 |
| grade_id | BIGINT | 年级ID | 外键,关联grade表 |
| status | INTEGER | 状态(1正常/0禁用) | 非空 |
| create_time | DATETIME | 创建时间 | 非空 |
| update_time | DATETIME | 更新时间 | 非空 |
4. 科目表(subject)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 科目ID | 主键,自增 |
| name | VARCHAR | 科目名称 | 非空 |
| status | INTEGER | 状态:1-启用,0-禁用 | 非空 |
| create_time | DATETIME | 创建时间 | 非空 |
| update_time | DATETIME | 更新时间 | 非空 |
5. 知识点表(knowledge)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 知识点ID | 主键,自增 |
| name | VARCHAR | 知识点名称 | 非空 |
| parent_id | BIGINT | 父知识点ID(0为一级) | 外键,自关联 |
| subject_id | BIGINT | 所属科目ID | 外键,关联subject表 |
| content | VARCHAR | 知识点内容 | |
| source | VARCHAR | 来源 | |
| status | INTEGER | 状态:0-待审核,1-通过,2-驳回 | 非空 |
| sort | INTEGER | 排序序号 | |
| creator_id | BIGINT | 创建人ID | 外键,关联user表 |
| create_time | DATETIME | 创建时间 | 非空 |
| update_time | DATETIME | 更新时间 | 非空 |
| recorder | VARCHAR | 记录者或IPR相关信息 |
6. 试题表(question)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 试题ID | 主键,自增 |
| stem | VARCHAR | 题干内容 | 非空 |
| options | VARCHAR | 选项(JSON格式,客观题必填) | |
| answer | VARCHAR | 答案(客观题如"A",主观题为文本) | 非空 |
| analysis | VARCHAR | 试题解析 | |
| knowledge_id | BIGINT | 关联知识点ID | 外键,关联knowledge表 |
| subject_id | BIGINT | 所属科目ID | 外键,关联subject表 |
| difficulty | VARCHAR | 难度(EASY/MEDIUM/HARD) | 非空 |
| type | VARCHAR | 题型(SINGLE_CHOICE/多选/JUDGMENT/简答) | 非空 |
| score | DECIMAL | 试题分值 | 非空 |
| creator_id | BIGINT | 创建人ID | 外键,关联user表 |
| audit_status | INTEGER | 审核状态(0待审核/1通过/2拒绝) | 非空 |
| create_time | DATETIME | 创建时间 | 非空 |
7. 试卷表(paper)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 试卷ID | 主键,自增 |
| paper_name | VARCHAR | 试卷名称 | 非空 |
| subject | VARCHAR | 所属科目 | 非空 |
| compose_method | VARCHAR | 组卷方式(MANUAL手动/AUTO自动) | 非空 |
| total_score | DECIMAL | 试卷总分 | 非空 |
| duration | INTEGER | 考试时长(分钟) | 非空 |
| creator_id | BIGINT | 创建人ID | 外键,关联user表 |
| publish_status | INTEGER | 发布状态(0草稿/1已发布/2已停用) | 非空 |
| create_time | DATETIME | 创建时间 | 非空 |
| update_time | DATETIME | 更新时间 | 非空 |
8. 试卷题目关联表(paper_question)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 主键ID | 主键,自增 |
| paper_id | BIGINT | 试卷ID | 外键,关联paper表 |
| question_id | BIGINT | 题目ID | 外键,关联question表 |
| score | DECIMAL | 题目分数 | 非空 |
9. 考试表(mock_exam)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 考试ID | 主键,自增 |
| title | VARCHAR | 考试标题 | 非空 |
| description | VARCHAR | 考试描述 | |
| total_score | DECIMAL | 总分 | 非空 |
| total_time | INTEGER | 总时间(分钟) | 非空 |
| status | INTEGER | 状态:1-未开始,2-进行中,3-已结束 | 非空 |
| create_by | BIGINT | 创建人ID | 外键,关联user表 |
| create_time | DATETIME | 创建时间 | 非空 |
| update_by | BIGINT | 更新人ID | 外键,关联user表 |
| update_time | DATETIME | 更新时间 | 非空 |
| paper_id | BIGINT | 关联试卷ID | 外键,关联paper表 |
| start_time | DATETIME | 开始时间 | 非空 |
| end_time | DATETIME | 结束时间 | 非空 |
| publish_status | INTEGER | 发布状态(0未发布/1已发布/2已结束) | 非空 |
| question_ids | JSON | 题目ID列表(JSON格式存储) | 非空 |
| student_ids | JSON | 学生ID列表(JSON格式存储) | 非空 |
| allow_pause | BOOLEAN | 允许暂停 | 非空 |
| allow_retake | BOOLEAN | 允许重考 | 非空 |
| real_time_judge | BOOLEAN | 实时判断 | 非空 |
| show_analysis | BOOLEAN | 显示分析 | 非空 |
| show_suggestions | BOOLEAN | 显示建议 | 非空 |
| auto_save_interval | INTEGER | 自动保存间隔(秒) | |
| max_attempts | INTEGER | 最大尝试次数 |
10. 模拟考试记录表(mock_exam_record)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 考试记录ID | 主键,自增 |
| exam_id | BIGINT | 考试ID | 外键,关联mock_exam表 |
| user_id | BIGINT | 用户ID | 外键,关联user表 |
| class_id | BIGINT | 班级ID | 外键,关联classroom表 |
| grade_id | BIGINT | 年级ID | 外键,关联grade表 |
| title | VARCHAR | 考试标题 | 非空 |
| subject | VARCHAR | 考试科目 | 非空 |
| exam_config | VARCHAR | 考试配置(JSON格式) | |
| question_ids | JSON | 题目ID列表(JSON格式存储) | 非空 |
| start_time | DATETIME | 开始时间 | 非空 |
| end_time | DATETIME | 结束时间 | |
| total_score | DOUBLE | 总分 | 非空 |
| actual_score | DOUBLE | 实际得分 | |
| status | INTEGER | 状态:1-未开始 2-进行中 3-已完成 | 非空 |
| spent_time | INTEGER | 耗时(秒) | |
| result_data | VARCHAR | 考试结果数据(JSON格式) | |
| create_time | DATETIME | 创建时间 | 非空 |
| create_by | BIGINT | 创建人(用户ID) | 外键,关联user表 |
| update_time | DATETIME | 更新时间 | 非空 |
| class_rank | INTEGER | 班级排名 | |
| class_total | INTEGER | 班级总人数 | |
| grade_rank | INTEGER | 年级排名 | |
| grade_total | INTEGER | 年级总人数 | |
| is_auto_generated | INTEGER | 自动化标识:1-自动化生成,0-人工创建 | 非空 |
| is_valid | INTEGER | 是否有效:1-有效,0-无效(逻辑删除) | 非空 |
| attempt_number | INTEGER | 尝试次数 |
11. 阅卷任务表(marking_task)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 任务ID | 主键,自增 |
| exam_id | BIGINT | 考试ID | 外键,关联mock_exam表 |
| mock_exam_record_id | BIGINT | 模拟考试记录ID | 外键,关联mock_exam_record表 |
| name | VARCHAR | 任务名称 | 非空 |
| status | INTEGER | 状态:1-待分配,2-分配中,3-进行中,4-已完成,5-已取消 | 非空 |
| trigger_type | INTEGER | 触发类型:1-手动,2-系统自动 | 非空 |
| priority | INTEGER | 优先级:1-紧急,2-普通,3-低 | 非空 |
| assign_rule | INTEGER | 分配规则:1-按试题,2-按考生,3-混合 | 非空 |
| marking_type | INTEGER | 评分类型:1-自动,2-人工,3-混合 | 非空 |
| total_students | INTEGER | 总学生数 | |
| total_questions | INTEGER | 总题目数 | |
| create_by | BIGINT | 创建人ID | 外键,关联user表 |
| create_time | DATETIME | 创建时间 | 非空 |
| update_by | BIGINT | 修改人ID | 外键,关联user表 |
| update_time | DATETIME | 更新时间 | 非空 |
| version | INTEGER | 版本号(乐观锁) | 非空 |
12. 错题集表(wrong_question_collection)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 错题集ID | 主键,自增 |
| user_id | BIGINT | 用户ID | 外键,关联user表 |
| name | VARCHAR | 错题集名称 | 非空 |
| description | VARCHAR | 错题集描述 | |
| question_count | INTEGER | 错题数量 | 非空 |
| create_time | DATETIME | 创建时间 | 非空 |
| update_time | DATETIME | 更新时间 | 非空 |
13. 错题集条目表(wrong_question_item)
| 字段名 | 字段类型 | 描述 | 约束 |
|---|---|---|---|
| id | BIGINT | 错题条目ID | 主键,自增 |
| collection_id | BIGINT | 错题集ID | 外键,关联wrong_question_collection表 |
| question_id | BIGINT | 题目ID | 外键,关联question表 |
| user_id | BIGINT | 用户ID | 外键,关联user表 |
| exam_id | BIGINT | 考试ID | 外键,关联mock_exam表 |
| user_answer | VARCHAR | 用户答案 | 非空 |
| correct_answer | VARCHAR | 正确答案 | 非空 |
| answer_time | DATETIME | 答题时间 | 非空 |
| add_time | DATETIME | 加入错题集时间 | 非空 |
| is_mastered | BOOLEAN | 是否已掌握 | 非空 |
| master_time | DATETIME | 掌握时间 | |
| error_count | INTEGER | 错误次数 | 非空 |
表关系图
user (用户)
├── grade (年级) ──┐
└── classroom (班级) ─┘
│
└── mock_exam_record (模拟考试记录)
├── mock_exam (考试)
│ └── paper (试卷)
│ └── paper_question (试卷题目关联)
│ └── question (试题)
│ ├── knowledge (知识点)
│ └── subject (科目)
└── marking_task (阅卷任务)
user (用户)
└── wrong_question_collection (错题集)
└── wrong_question_item (错题集条目)
├── question (试题)
└── mock_exam (考试)
主要业务流程
- 用户管理:管理员创建用户,分配角色(学生/教师/管理员),关联年级和班级
- 题库管理:教师创建知识点、添加试题,关联知识点和科目
- 试卷管理:教师手动或自动组卷,设置试卷属性和题目分数
- 考试管理:教师创建考试,关联试卷,设置考试时间和规则,指定参考学生
- 考试过程:学生参加考试,系统自动保存答案,考试结束后自动提交
- 阅卷管理:系统自动处理客观题,教师进行主观题阅卷,系统计算总分
- 错题管理:系统自动收集学生错题,学生可查看、管理自己的错题集
技术特点
- 使用MyBatis-Plus:简化数据库操作,提供CRUD、分页、乐观锁等功能
- JSON字段存储:使用JSON格式存储复杂数据,如题目选项、考试题目列表等
- 外键关联:表之间通过外键建立关联,保证数据完整性
- 逻辑删除:部分表使用逻辑删除(如模拟考试记录),而非物理删除
- 乐观锁:关键表(如阅卷任务)使用乐观锁机制,防止并发冲突
该考试系统采用了分层架构设计,包括API层、应用层、领域层和基础设施层,通过清晰的表结构设计和关系定义,实现了完整的考试管理功能。
根据已有的表结构和业务流程,我将详细分析考试系统的模块划分、交互关系和业务流程:
一、模块划分
1. 基础数据模块
- 核心表:grade(年级)、classroom(班级)、subject(科目)
- 功能:提供系统的基础数据支撑,是其他模块的基础
2. 用户管理模块
- 核心表:user(用户)
- 功能:管理系统用户,包括管理员、教师、学生的创建和管理
3. 题库管理模块
- 核心表:knowledge(知识点)、question(试题)
- 功能:管理知识点体系和试题库,为组卷提供素材
4. 试卷管理模块
- 核心表:paper(试卷)、paper_question(试卷题目关联)
- 功能:基于试题库进行组卷,生成标准化试卷
5. 考试管理模块
- 核心表:mock_exam(考试)、mock_exam_record(考试记录)、mock_exam_answer(答题记录)
- 功能:创建和管理考试,记录学生考试过程
6. 考试监控模块
- 核心表:exam_screen_record(考试屏幕记录)
- 功能:监控学生考试过程,防止作弊
7. 阅卷管理模块
- 核心表:marking_task(阅卷任务)、marking_task_assignment(任务分配)、marking_score(评分)
- 功能:管理阅卷流程,分配评卷任务,记录评分结果
8. 质量控制模块
- 核心表:marking_quality_control(质量控制)
- 功能:实现双评模式,处理分差,记录仲裁状态
9. 异常检测模块
- 核心表:marking_anomaly(异常检测)
- 功能:检测阅卷过程中的异常情况
10. 错题管理模块
- 核心表:wrong_question_collection(错题集)、wrong_question_item(错题条目)
- 功能:自动收集学生错题,提供错题管理功能
11. 学情分析模块
- 核心表:多表联合分析
- 功能:基于考试数据进行学情分析,生成分析报告
二、模块交互关系
1. 基础数据初始化流程
基础数据模块 系统 管理员 基础数据模块 系统 管理员 初始化基础数据 创建年级(grade) 创建班级(classroom) 创建科目(subject) 基础数据初始化完成 基础数据初始化成功
2. 用户管理流程
基础数据模块 用户管理模块 系统 管理员 基础数据模块 用户管理模块 系统 管理员 创建用户 创建管理员用户 创建教师用户 创建学生用户 关联年级和班级 用户创建完成 用户创建成功
3. 题库管理流程
基础数据模块 题库管理模块 系统 教师 基础数据模块 题库管理模块 系统 教师 创建知识点 创建知识点(knowledge) 关联科目(subject) 创建试题 创建试题(question) 关联知识点(knowledge) 关联科目(subject) 试题创建完成 试题创建成功
4. 试卷管理流程
题库管理模块 试卷管理模块 系统 教师 题库管理模块 试卷管理模块 系统 教师 组卷 创建试卷(paper) 选择试题(question) 创建试卷题目关联(paper_question) 组卷完成 组卷成功
5. 考试管理流程
用户管理模块 试卷管理模块 考试管理模块 系统 教师 用户管理模块 试卷管理模块 考试管理模块 系统 教师 创建考试 创建考试(mock_exam) 关联试卷(paper) 指定参考学生(user) 考试创建完成 考试创建成功 发布考试 更新考试状态为已发布 考试发布完成 考试发布成功
6. 考试过程流程
考试监控模块 考试管理模块 系统 学生 考试监控模块 考试管理模块 系统 学生 参加考试 创建考试记录(mock_exam_record) 答题 记录答题(mock_exam_answer) 监控考试(exam_screen_record) 提交试卷 更新考试记录状态为已完成 考试完成 考试提交成功
7. 阅卷管理流程
考试管理模块 阅卷管理模块 系统 教师 考试管理模块 阅卷管理模块 系统 教师 创建阅卷任务 创建阅卷任务(marking_task) 关联考试记录(mock_exam_record) 分配评卷任务(marking_task_assignment) 评卷 记录评分(marking_score) 评卷完成 评卷成功
8. 质量控制流程
仲裁教师 教师B 教师A 质量控制模块 系统 仲裁教师 教师B 教师A 质量控制模块 系统 alt [分差大] 第一评 第二评 比较分差(marking_quality_control) 记录仲裁状态 仲裁评分 提交仲裁结果 质量控制完成
9. 错题管理流程
考试管理模块 错题管理模块 系统 考试管理模块 错题管理模块 系统 分析考试结果 自动收集错题(wrong_question_item) 更新错题集(wrong_question_collection) 错题收集完成
10. 学情分析流程
错题管理模块 考试管理模块 学情分析模块 系统 错题管理模块 考试管理模块 学情分析模块 系统 获取考试数据 获取错题数据 进行多表联合分析 学情分析完成
三、模块内部流程
1. 基础数据模块
- 年级管理:创建年级 → 设置状态 → 更新年级信息
- 班级管理:创建班级 → 关联年级 → 设置状态 → 更新班级信息
- 科目管理:创建科目 → 设置状态 → 更新科目信息
2. 用户管理模块
- 用户创建:填写用户信息 → 选择角色 → 关联年级/班级 → 保存用户
- 用户管理:查询用户列表 → 编辑用户信息 → 禁用/启用用户 → 删除用户
3. 题库管理模块
- 知识点管理:创建知识点 → 关联父知识点 → 关联科目 → 设置状态 → 审核知识点
- 试题管理:填写题干和选项 → 设置答案和解析 → 关联知识点和科目 → 设置难度和题型 → 提交审核 → 审核试题
4. 试卷管理模块
- 手动组卷:选择试题 → 设置题目分数 → 生成试卷 → 设置试卷属性 → 发布试卷
- 自动组卷:设置组卷规则 → 系统自动选择试题 → 生成试卷 → 人工审核 → 发布试卷
5. 考试管理模块
- 考试创建:填写考试信息 → 选择试卷 → 设置考试时间 → 指定参考学生 → 保存考试
- 考试发布:更新考试状态为已发布 → 通知学生考试信息
- 考试监控:记录学生考试行为 → 检测异常操作 → 生成监控记录
- 考试统计:收集考试数据 → 计算考试结果 → 生成考试报表
6. 阅卷管理模块
- 任务创建:选择考试 → 设置阅卷规则 → 创建阅卷任务 → 设置优先级
- 任务分配:根据分配规则 → 自动分配评卷任务 → 通知评卷教师
- 主观题阅卷:查看学生答题 → 参考标准答案 → 给出评分和评语 → 提交评分
- 客观题阅卷:系统自动判分 → 生成评分结果 → 人工复核
7. 质量控制模块
- 双评管理:为同一题目分配两位教师 → 收集两位教师的评分 → 比较分差
- 仲裁管理:识别分差过大的题目 → 分配给仲裁教师 → 记录仲裁结果 → 更新最终评分
- 质量统计:统计评卷质量指标 → 生成质量报告 → 反馈给评卷教师
8. 错题管理模块
- 错题收集:分析考试结果 → 自动识别错题 → 收集到错题集 → 标记错误原因
- 错题管理:查看错题集 → 标记已掌握的错题 → 导出错题 → 分享错题集
- 错题练习:基于错题集生成练习 → 学生进行练习 → 系统记录练习结果
9. 学情分析模块
- 成绩分析:统计学生成绩 → 分析成绩分布 → 生成成绩报表
- 知识点分析:分析知识点掌握情况 → 识别薄弱环节 → 生成知识点分析报告
- 班级分析:比较班级成绩 → 分析班级差异 → 生成班级分析报告
- 趋势分析:跟踪学生成绩变化 → 分析学习趋势 → 生成趋势分析报告
四、业务流程依赖关系
依赖链:基础数据 → 用户 → 题库 → 试卷 → 考试 → 阅卷 → 错题 → 分析
- 基础数据层:年级、班级、科目是所有后续业务的基础
- 用户层:基于基础数据创建和管理用户
- 题库层:基于知识点和科目创建试题
- 试卷层:基于试题创建试卷
- 考试层:基于试卷创建考试,学生参加考试
- 阅卷层:基于考试结果进行阅卷和质量控制
- 错题层:基于考试和阅卷结果自动收集错题
- 分析层:基于所有数据进行学情分析
数据流向
- 向下流:基础数据 → 用户 → 知识点 → 试题 → 试卷 → 考试
- 向上流:考试结果 → 阅卷数据 → 错题数据 → 分析数据
- 横向流:各模块内部的数据交互和处理
五、核心业务流程总结
1. 准备阶段
- 管理员初始化基础数据
- 管理员创建用户
- 教师创建知识点和试题
- 教师组卷和创建考试
2. 执行阶段
- 教师发布考试
- 学生参加考试和答题
- 学生提交试卷
- 系统监控考试过程
3. 评估阶段
- 教师创建阅卷任务
- 系统分配评卷任务
- 教师进行评卷
- 系统进行质量控制和仲裁
4. 分析阶段
- 系统检测异常
- 系统自动收集错题
- 系统进行学情分析
- 学生查看错题和分析结果
5. 改进阶段
- 教师根据分析结果调整教学策略
- 学生根据错题集进行针对性学习
- 系统持续优化考试和评卷流程
通过这种模块化的设计和清晰的业务流程,考试系统能够实现从基础数据管理到最终学情分析的完整闭环,为教育教学提供全面的支持。