DDD设计思路
先和相关人员充分沟通,把用户需求详细记录下来。然后呢,从这些需求里提炼出关键的概念和规则,构建领域模型。设计数据库表结构时,要考虑数据的存储和查询效率,还要能支持领域模型。在代码实现阶段,按照领域模型进行分层架构设计,让每个模块职责清晰,这样就能较好地兼顾数据库和代码实现。
首先从需求分析,在线考试系统里,老师得能出题、安排考试,学生要能参加考试、查看成绩,管理员负责系统管理和审核。接着设计领域模型,老师有出题、安排考试的操作,学生有参加考试、查看成绩的操作,管理员有审核、系统管理的操作。然后是数据库表结构,老师表有教师
ID、姓名等字段,学生表有学号、姓名等字段,再设计考试表关联老师和学生,记录考试信息。最后在代码实现时,按照领域模型设计各个功能模块,比如老师模块、学生模块和管理员模块,分别实现相应功能。
数据库基本信息
- 数据库类型:MySQL
- 数据库名称:exam_system_ai
核心表结构
1. 用户表(user)
| 字段名 |
字段类型 |
描述 |
约束 |
| id |
BIGINT |
用户唯一标识 |
主键,自增 |
| account |
VARCHAR |
登录账号(手机号/工号) |
非空 |
| password |
VARCHAR |
加密密码(MD5+盐值) |
非空 |
| name |
VARCHAR |
用户姓名 |
非空 |
| role |
VARCHAR |
角色(ADMIN/TEACHER/STUDENT) |
非空 |
| phone |
VARCHAR |
联系电话 |
|
| email |
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. 基础数据初始化流程
2. 用户管理流程
3. 题库管理流程
4. 试卷管理流程
5. 考试管理流程
6. 考试过程流程
7. 阅卷管理流程
8. 质量控制流程
9. 错题管理流程
10. 学情分析流程
三、模块内部流程
1. 基础数据模块
- 年级管理:创建年级 → 设置状态 → 更新年级信息
- 班级管理:创建班级 → 关联年级 → 设置状态 → 更新班级信息
- 科目管理:创建科目 → 设置状态 → 更新科目信息
2. 用户管理模块
- 用户创建:填写用户信息 → 选择角色 → 关联年级/班级 → 保存用户
- 用户管理:查询用户列表 → 编辑用户信息 → 禁用/启用用户 → 删除用户
3. 题库管理模块
- 知识点管理:创建知识点 → 关联父知识点 → 关联科目 → 设置状态 → 审核知识点
- 试题管理:填写题干和选项 → 设置答案和解析 → 关联知识点和科目 → 设置难度和题型 → 提交审核 → 审核试题
4. 试卷管理模块
- 手动组卷:选择试题 → 设置题目分数 → 生成试卷 → 设置试卷属性 → 发布试卷
- 自动组卷:设置组卷规则 → 系统自动选择试题 → 生成试卷 → 人工审核 → 发布试卷
5. 考试管理模块
- 考试创建:填写考试信息 → 选择试卷 → 设置考试时间 → 指定参考学生 → 保存考试
- 考试发布:更新考试状态为已发布 → 通知学生考试信息
- 考试监控:记录学生考试行为 → 检测异常操作 → 生成监控记录
- 考试统计:收集考试数据 → 计算考试结果 → 生成考试报表
6. 阅卷管理模块
- 任务创建:选择考试 → 设置阅卷规则 → 创建阅卷任务 → 设置优先级
- 任务分配:根据分配规则 → 自动分配评卷任务 → 通知评卷教师
- 主观题阅卷:查看学生答题 → 参考标准答案 → 给出评分和评语 → 提交评分
- 客观题阅卷:系统自动判分 → 生成评分结果 → 人工复核
7. 质量控制模块
- 双评管理:为同一题目分配两位教师 → 收集两位教师的评分 → 比较分差
- 仲裁管理:识别分差过大的题目 → 分配给仲裁教师 → 记录仲裁结果 → 更新最终评分
- 质量统计:统计评卷质量指标 → 生成质量报告 → 反馈给评卷教师
8. 错题管理模块
- 错题收集:分析考试结果 → 自动识别错题 → 收集到错题集 → 标记错误原因
- 错题管理:查看错题集 → 标记已掌握的错题 → 导出错题 → 分享错题集
- 错题练习:基于错题集生成练习 → 学生进行练习 → 系统记录练习结果
9. 学情分析模块
- 成绩分析:统计学生成绩 → 分析成绩分布 → 生成成绩报表
- 知识点分析:分析知识点掌握情况 → 识别薄弱环节 → 生成知识点分析报告
- 班级分析:比较班级成绩 → 分析班级差异 → 生成班级分析报告
- 趋势分析:跟踪学生成绩变化 → 分析学习趋势 → 生成趋势分析报告
四、业务流程依赖关系
依赖链:基础数据 → 用户 → 题库 → 试卷 → 考试 → 阅卷 → 错题 → 分析
- 基础数据层:年级、班级、科目是所有后续业务的基础
- 用户层:基于基础数据创建和管理用户
- 题库层:基于知识点和科目创建试题
- 试卷层:基于试题创建试卷
- 考试层:基于试卷创建考试,学生参加考试
- 阅卷层:基于考试结果进行阅卷和质量控制
- 错题层:基于考试和阅卷结果自动收集错题
- 分析层:基于所有数据进行学情分析
数据流向
- 向下流:基础数据 → 用户 → 知识点 → 试题 → 试卷 → 考试
- 向上流:考试结果 → 阅卷数据 → 错题数据 → 分析数据
- 横向流:各模块内部的数据交互和处理
五、核心业务流程总结
1. 准备阶段
- 管理员初始化基础数据
- 管理员创建用户
- 教师创建知识点和试题
- 教师组卷和创建考试
2. 执行阶段
- 教师发布考试
- 学生参加考试和答题
- 学生提交试卷
- 系统监控考试过程
3. 评估阶段
- 教师创建阅卷任务
- 系统分配评卷任务
- 教师进行评卷
- 系统进行质量控制和仲裁
4. 分析阶段
- 系统检测异常
- 系统自动收集错题
- 系统进行学情分析
- 学生查看错题和分析结果
5. 改进阶段
- 教师根据分析结果调整教学策略
- 学生根据错题集进行针对性学习
- 系统持续优化考试和评卷流程
通过这种模块化的设计和清晰的业务流程,考试系统能够实现从基础数据管理到最终学情分析的完整闭环,为教育教学提供全面的支持。
所有评论(0)