自考互助社区门户网站详细设计说明书(单体架构版)
1. 系统架构设计
1.1 整体架构图

1.2 技术栈说明
| 层级 | 技术选型 | 版本 | 用途 |
|---|
| 前端 | Vue3 + Element Plus | 3.x | PC/移动端界面 |
| 后端 | Spring Boot | 2.7.x | 业务逻辑处理 |
| 安全 | Spring Security | 5.7.x | 认证授权 |
| 数据 | MySQL | 8.0 | 主数据库 |
| 缓存 | Redis | 6.x | 会话/热点数据 |
| 搜索 | Elasticsearch | 7.x | 公告/政策检索 |
2. 数据库设计
2.1 表设计原则
-
表名前缀规范:
- 表名使用
se_前缀(se_announcement),体现业务领域(Self-education Exam)
- 前缀长度控制在 2-3 字符,避免影响可读性
-
字段名无前缀:
- 字段名采用语义化命名(如
publish_date而非pub_date)
- 遵循驼峰命名法(如
examType)或下划线命名法(如exam_type),本设计采用下划线提升兼容性
-
UUID 主键设计:
id字段使用varchar(36)存储 UUID,支持分布式系统
- UUID 生成方式(Java):
UUID.randomUUID().toString()
自考资讯公告表(sys_notice)
CREATE TABLE `sys_notice` (
`anno_id` varchar(50) NOT NULL COMMENT '公告ID(UUID)',
`title` varchar(255) NOT NULL COMMENT '公告标题',
`content` longtext COMMENT '公告内容',
`province` varchar(50) DEFAULT NULL COMMENT '发布地区',
`exam_type` tinyint(1) DEFAULT NULL COMMENT '考试类型(1=专科,2=本科)',
`publish_date` datetime DEFAULT NULL COMMENT '发布日期',
`is_new` tinyint(1) DEFAULT '0' COMMENT '是否最新(1=是,0=否)',
`is_hot` tinyint(1) DEFAULT '0' COMMENT '是否热门(1=是,0=否)',
`source_type` tinyint(1) NOT NULL COMMENT '数据来源类型(1=系统内置,2=爬取数据)',
`source_url` varchar(512) DEFAULT NULL COMMENT '爬取数据来源URL',
`crawl_time` datetime DEFAULT NULL COMMENT '爬取时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_source_type` (`source_type`),
KEY `idx_province` (`province`),
KEY `idx_exam_type` (`exam_type`),
KEY `idx_publish_date` (`publish_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自考公告表';
| 字段名 | 数据类型 | 允许空 | 默认值 | 说明 |
|---|
| id | varchar(50) | 否 | | 公告 ID,使用 UUID 字符串(如1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p) |
| title | varchar(255) | 否 | | 公告标题,用于页面展示和搜索 |
| content | longtext | 是 | | 公告具体内容,支持 HTML 或纯文本存储 |
| summary | varchar(500) | 是 | | 公告内容摘要,支持 HTML 或纯文本存储 |
| province | varchar(50) | 是 | | 发布地区,对应页面筛选条件 |
| publish_date | datetime | 是 | | 公告发布日期,用于排序和筛选 |
| is_new | tinyint(1) | 是 | 0 | 是否标记为最新,对应页面 "最新" 标签 |
| is_hot | tinyint(1) | 是 | 0 | 是否标记为热门,对应页面 "热门" 标签 |
| view_count | int(11) | 是 | 0 | 公告浏览数量 |
| source_type | tinyint(1) | 否 | | 数据来源类型 (1 = 系统内置,2 = 爬取数据),核心区分字段 |
| source_url | varchar(512) | 是 | | 爬取数据的原始 URL,用于溯源和更新 |
| crawl_time | datetime | 是 | | 爬取数据的时间,用于数据更新和时效性判断 |
| update_time | datetime | 否 | CURRENT_TIMESTAMP | 数据最后更新时间,自动维护 |
| create_time | datetime | 否 | CURRENT_TIMESTAMP | 数据创建时间,自动维护 |
自考考试时间表(sys_exam_schedule)
CREATE TABLE `sys_exam_schedule` (
`exam_schedule_id` bigint NOT NULL AUTO_INCREMENT,
`exam_year` smallint NOT NULL COMMENT '考试年份',
`exam_term` smallint NOT NULL COMMENT '考试学期(4月/7月/10月等)',
`start_date` date NOT NULL COMMENT '考试开始日期',
`end_date` date NOT NULL COMMENT '考试结束日期',
`registration_start` date COMMENT '报名开始日期',
`registration_end` date COMMENT '报名结束日期',
`score_release_date` date COMMENT '成绩公布日期',
`status` tinyint DEFAULT '0' COMMENT '状态(0未开始/1进行中/2已结束)',
PRIMARY KEY (`exam_schedule_id`),
UNIQUE KEY `idx_year_term` (`exam_year`, `exam_term`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自考考试时间表';
| 字段名 | 数据类型 | 说明 | 约束 |
|---|
exam_schedule_id | BIGINT | 主键ID | PRIMARY KEY, AUTO_INCREMENT |
exam_year | SMALLINT | 考试年份 | NOT NULL |
exam_term | SMALLINT | 考试学期(4月/7月/10月等) | NOT NULL |
start_date | DATE | 考试开始日期 | NOT NULL |
end_date | DATE | 考试结束日期 | NOT NULL |
registration_start | DATE | 报名开始日期 | |
registration_end | DATE | 报名结束日期 | |
score_release_date | DATE | 成绩公布日期 | |
status | TINYINT | 状态(0未开始/1进行中/2已结束) | DEFAULT 0 |
自考学科门类表(sys_subject_category)
CREATE TABLE `sys_subject_category` (
`subject_category_id` varchar(50) NOT NULL COMMENT '门类ID',
`subject_code` varchar(10) NOT NULL COMMENT '门类代码(如:02)',
`subject_name` varchar(50) NOT NULL COMMENT '门类名称(如:经济学)',
`sort` int DEFAULT '0' COMMENT '排序字段',
`status` tinyint DEFAULT '1' COMMENT '状态(0禁用 1启用)',
PRIMARY KEY (`subject_category_id`),
UNIQUE KEY `idx_code` (`subject_code`)
) ENGINE=InnoDB COMMENT='学科门类表(一级分类)';
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| subject_category_id | VARCHAR(50) | 门类ID | 是 | |
| subject_code | VARCHAR(20) | 门类代码 | 否 | 如:02(经济学) |
| subject_name | VARCHAR(50) | 门类名称 | 否 | 如:经济学 |
| sort | INT | 排序权重 | 否 | 默认0 |
| status | TINYINT | 状态 | 否 | 0禁用 1启用 |
自考专业类别表(sys_major_category)
CREATE TABLE `sys_major_category` (
`major_category_id` varchar(50) NOT NULL COMMENT '类别ID',
`subject_category_id` varchar(50) NOT NULL COMMENT '所属学科门类ID',
`category_code` varchar(50) NOT NULL COMMENT '类别代码(如:0201)',
`category_name` varchar(50) NOT NULL COMMENT '类别名称(如:经济学类)',
PRIMARY KEY (`major_category_id`)
) ENGINE=InnoDB COMMENT='专业类别表(二级分类)';
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| major_category_id | VARCHAR(50) | 类别ID | 是 | 自增主键 |
| subject_category_id | VARCHAR(50) | 所属门类ID | 否 | 外键→subject_category |
| category_code | VARCHAR(50) | 类别代码 | 否 | 如:0201(经济学类) |
| category_name | VARCHAR(50) | 类别名称 | 否 | 如:经济学类 |
自考专业表(sys_major)
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| major_id | VARCHAR(20) | 专业 ID | 是 | UUID |
| major_code | VARCHAR(20) | 专业代码 | 否 | 例如:C050201 |
| major_name | VARCHAR(50) | 专业名称 | 否 | 例如:英语 (本科) |
| degree | VARCHAR(20) | 学历层次 | 否 | 如:专科、本科 |
| department | VARCHAR(50) | 主考院校 | 否 | 例如:北京大学 |
| credit_require | INT | 毕业学分要求 | 否 | 例如:68 学分 |
| create_time | DATETIME | 创建时间 | 否 | 自动记录创建时间 |
| update_time | DATETIME | 更新时间 | 否 | 自动记录更新时间 |
CREATE TABLE IF NOT EXISTS `sys_major` (
`major_id` VARCHAR(20) PRIMARY KEY,
`major_code` VARCHAR(20) NOT NULL COMMENT '专业代码',
`major_name` VARCHAR(50) NOT NULL COMMENT '专业名称',
`degree` VARCHAR(20) NOT NULL COMMENT '学历层次',
`department` VARCHAR(50) NOT NULL COMMENT '主考院校',
`credit_require` INT NOT NULL COMMENT '毕业学分要求',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE KEY `idx_major_code` (`major_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自考专业表';
自考课程表(sys_course)
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| course_id | INT | 课程 ID | 是 | 自增主键 |
| course_code | VARCHAR(20) | 课程代码 | 否 | 例如:00001 |
| course_name | VARCHAR(50) | 课程名称 | 否 | 例如:马克思基本原理概论 |
| credit | INT | 学分 | 否 | 例如:4 学分 |
| course_type | VARCHAR(20) | 课程类型 | 否 | 如:公共课、专业课 |
| exam_type | VARCHAR(20) | 考试类型 | 否 | 如:笔试、实践考核 |
| major_id | INT | 所属专业 ID | 否 | 外键关联 major 表 |
| is_required | TINYINT | 是否必修课 | 否 | 1 = 必修,0 = 选修 |
| create_time | DATETIME | 创建时间 | 否 | 自动记录创建时间 |
| update_time | DATETIME | 更新时间 | 否 | 自动记录更新时间 |
CREATE TABLE IF NOT EXISTS `sys_course` (
`course_id` VARCHAR(20) PRIMARY KEY,
`course_code` VARCHAR(20) NOT NULL COMMENT '课程代码',
`course_name` VARCHAR(50) NOT NULL COMMENT '课程名称',
`credit` INT NOT NULL COMMENT '学分',
`course_type` VARCHAR(20) NOT NULL COMMENT '课程类型',
`exam_type` VARCHAR(20) NOT NULL COMMENT '考试类型',
`major_id` VARCHAR(20) NOT NULL COMMENT '所属专业ID',
`is_required` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否必修课',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE KEY `idx_course_code` (`course_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自考课程表';
课程建议表(sys_course_suggestion)
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| id | bigint | 主键ID | 是 | 自增长 |
| course_id | bigint | 关联课程ID | 否 | 外键,关联课程表(course) |
| user_id | bigint | 提交用户ID | 否 | 外键,关联用户表(user) |
| content | text | 建议内容 | 否 | 支持长文本输入 |
| upvotes | int | 点赞数 | 否 | 默认值0,表示未获赞 |
| anonymous | tinyint(1) | 是否匿名 | 否 | 0-不匿名(默认),1-匿名 |
| status | tinyint | 状态 | 否 | 1-正常显示(默认),0-隐藏 |
| create_time | datetime | 创建时间 | 否 | 自动记录首次提交时间 |
| update_time | datetime | 更新时间 | 否 | 自动更新最后修改时间 |
CREATE TABLE `sys_course_suggestion` (
`course_suggestion_id` varchar(50) NOT NULL,
`course_id` varchar(50) NOT NULL COMMENT '课程ID',
`user_id` varchar(50) NOT NULL COMMENT '用户ID',
`content` text NOT NULL COMMENT '建议内容',
`upvotes` int DEFAULT '0' COMMENT '点赞数',
`anonymous` tinyint(1) DEFAULT '0' COMMENT '是否匿名',
`status` tinyint DEFAULT '1' COMMENT '状态(1-正常,0-隐藏)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`course_suggestion_id`),
KEY `idx_course` (`course_suggestion_id`),
KEY `idx_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程建议表';
自考院校表(sys_school)
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| school_id | VARCHAR(20) | 院校 ID | 是 | 自增主键 |
| school_code | VARCHAR(20) | 院校代码 | 否 | 教育部院校代码 |
| school_name | VARCHAR(100) | 院校名称 | 否 | 全称 |
| school_level | INT | 院校层次 | 否 | 如:985、211、双非 |
| province | VARCHAR(20) | 所在省份 | 否 | |
| city | VARCHAR(20) | 所在城市 | 否 | |
| address | VARCHAR(200) | 详细地址 | 否 | |
| website | VARCHAR(100) | 官方网站 | 否 | |
| contact_phone | VARCHAR(20) | 联系电话 | 否 | 自考办联系电话 |
| contact_email | VARCHAR(50) | 联系邮箱 | 否 | |
| established_at | DATE | 建校时间 | 否 | |
| school_intro | TEXT | 院校简介 | 否 | |
| create_time | DATETIME | 创建时间 | 否 | 自动记录 |
| update_time | DATETIME | 更新时间 | 否 | 自动记录 |
CREATE TABLE IF NOT EXISTS `sys_school` (
`school_id` VARCHAR(20) PRIMARY KEY,
`school_code` VARCHAR(20) NOT NULL COMMENT '院校代码',
`school_name` VARCHAR(100) NOT NULL COMMENT '院校名称',
`school_level` VARCHAR(20) NOT NULL COMMENT '院校层次',
`area_id` VARCHAR(20) NOT NULL COMMENT '所在省份',
`city` VARCHAR(20) NOT NULL COMMENT '所在城市',
`address` VARCHAR(200) DEFAULT NULL COMMENT '详细地址',
`website` VARCHAR(100) DEFAULT NULL COMMENT '官方网站',
`contact_phone` VARCHAR(20) DEFAULT NULL COMMENT '联系电话',
`contact_email` VARCHAR(50) DEFAULT NULL COMMENT '联系邮箱',
`established_at` DATE DEFAULT NULL COMMENT '建校时间',
`school_intro` TEXT COMMENT '院校简介',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE KEY `idx_school_code` (`school_code`),
KEY `idx_school_name` (`school_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自考主考院校表';
自考题目表(sys_exam_question)
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| question_id | varchar(50) | 题目 ID | 是 | |
| type | tinyint | 题型 | 否 | 1 单选 / 2 多选 / 3 判断 / 4 填空 / 5 简答 / 6 案例 |
| course_id | varchar(50) | 课程 ID | 否 | |
| difficulty | tinyint | 难度 | 否 | 1-5,默认 3 |
| content | text | 题目内容 | 否 | |
| options | json | 选项 | 否 | JSON 数组 |
| answer | text | 正确答案 | 否 | |
| analysis | text | 题目解析 | 否 | |
| status | tinyint | 状态 | 否 | 0 待审核 / 1 已发布 / 2 已下线 |
| create_by | varchar(50) | 创建人 ID | 否 | |
| create_time | datetime | 创建时间 | 否 | 默认 CURRENT_TIMESTAMP |
| update_time | datetime | 更新时间 | 否 | 默认 CURRENT_TIMESTAMP,更新时自动刷新 |
CREATE TABLE `sys_exam_question`
(
`question_id` varchar(50) NOT NULL,
`type` tinyint NOT NULL COMMENT '题型(1单选/2多选/3判断/4填空/5简答/6案例)',
`course_id` varchar(50) NOT NULL COMMENT '课程ID',
`difficulty` tinyint DEFAULT '3' COMMENT '难度(1-5)',
`content` text NOT NULL COMMENT '题目内容',
`options` json DEFAULT NULL COMMENT '选项(JSON数组)',
`answer` text NOT NULL COMMENT '正确答案',
`analysis` text COMMENT '题目解析',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态(0待审核/1已发布/2已下线)',
create_by varchar(50) NOT NULL COMMENT '创建人ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`question_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自考题目表';
自考试卷表(sys_exam_paper)
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| paper_id | varchar(50) | 试卷 ID | 是 | |
| title | varchar(100) | 试卷名称 | 否 | |
| course_id | varchar(50) | 课程 ID | 否 | |
| type | tinyint | 类型 | 否 | 1 真题 / 2 模拟 / 3 练习 |
| paper_strategy_id | varchar(50) | 试卷策略 ID | 否 | |
| create_by | varchar(50) | 创建人 ID | 否 | 可空 |
| create_time | datetime | 创建时间 | 否 | 默认 CURRENT_TIMESTAMP |
| update_time | datetime | 更新时间 | 否 | 默认 CURRENT_TIMESTAMP,更新时自动刷新 |
CREATE TABLE `sys_exam_paper`
(
`paper_id` varchar(50) NOT NULL,
`title` varchar(100) NOT NULL COMMENT '试卷名称',
`course_id` varchar(50) NOT NULL COMMENT '课程ID',
`type` tinyint NOT NULL COMMENT '类型(1真题/2模拟/3练习)',
`paper_strategy_id` varchar(50) NOT NULL COMMENT '试卷策略ID',
`create_by` varchar(50) DEFAULT NULL COMMENT '创建人ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`paper_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='试卷表';
自考试卷策略表(sys_exam_paper_strategy)
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| paper_strategy_id | varchar(50) | 策略 ID | 是 | |
| name | varchar(100) | 策略名称 | 否 | |
| strategy_type | varchar(20) | 策略类型 | 否 | random/fixed/manual |
| course_id | varchar(50) | 课程 ID | 否 | |
| total_score | int | 试卷总分 | 否 | |
| time_limit | int | 考试时长 | 否 | 分钟,可空 |
| create_by | varchar(50) | 创建人 | 否 | |
| create_time | datetime | 创建时间 | 否 | 默认 CURRENT_TIMESTAMP |
CREATE TABLE `sys_exam_paper_strategy`
(
`paper_strategy_id` varchar(50) NOT NULL,
`name` varchar(100) NOT NULL COMMENT '策略名称',
`strategy_type` varchar(20) NOT NULL COMMENT 'random/fixed/manual',
`course_id` varchar(50) NOT NULL COMMENT '课程ID',
`total_score` int NOT NULL COMMENT '试卷总分',
`time_limit` int DEFAULT NULL COMMENT '考试时长(分钟)',
`create_by` varchar(50) NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`paper_strategy_id`)
) ENGINE=InnoDB COMMENT='试卷生成策略表';
自考试卷策略明细表(sys_exam_strategy_rule)
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| strategy_rule_id | varchar(50) | 策略规则 ID | 是 | |
| paper_strategy_id | bigint | 策略 ID | 否 | 外键关联 sys_exam_paper_strategy 表 |
| question_type | tinyint | 题型 | 否 | |
| difficulty | tinyint | 难度 | 否 | 1-3,可空 |
| question_count | int | 题目数量 | 否 | |
| each_score | decimal(5,2) | 每题分值 | 否 | |
| sort | int | 排序 | 否 | 默认 0 |
CREATE TABLE `sys_exam_strategy_rule`
(
`strategy_rule_id` varchar(50) NOT NULL,
`paper_strategy_id` bigint NOT NULL COMMENT '策略ID',
`question_type` tinyint NOT NULL COMMENT '题型',
`difficulty` tinyint DEFAULT NULL COMMENT '难度(1-3)',
`question_count` int NOT NULL COMMENT '题目数量',
`each_score` decimal(5, 2) NOT NULL COMMENT '每题分值',
`sort` int DEFAULT '0' COMMENT '排序',
PRIMARY KEY (`strategy_rule_id`),
KEY `idx_strategy` (`paper_strategy_id`)
) ENGINE=InnoDB COMMENT='组卷策略明细表';
试卷题目关联表(sys_exam_paper_question)
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| paper_question_id | varchar(50) | 关联 ID | 是 | |
| paper_id | varchar(50) | 试卷 ID | 否 | 外键关联 sys_exam_paper 表 |
| question_id | varchar(50) | 题目 ID | 否 | 外键关联 sys_exam_question 表 |
| score | int | 题目分值 | 否 | |
| sort | int | 题目排序 | 否 | 默认 0 |
| create_time | datetime | 创建时间 | 否 | 默认 CURRENT_TIMESTAMP |
CREATE TABLE `sys_exam_paper_question`
(
`paper_question_id` varchar(50) NOT NULL,
`paper_id` varchar(50) NOT NULL COMMENT '试卷ID',
`question_id` varchar(50) NOT NULL COMMENT '题目ID',
`score` int NOT NULL COMMENT '题目分值',
`sort` int DEFAULT '0' COMMENT '题目排序',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`paper_question_id`),
UNIQUE KEY `uk_paper_question` (`paper_id`,`question_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='试卷题目关联表';
用户答题记录表(sys_exam_user_answer)
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| user_answer_id | varchar(50) | 答题记录 ID | 是 | |
| user_id | varchar(50) | 用户 ID | 否 | |
| question_id | varchar(50) | 题目 ID | 否 | |
| paper_id | varchar(50) | 试卷 ID | 否 | 单独练习时可为空 |
| user_answer | text | 用户答案 | 否 | |
| is_correct | tinyint | 是否正确 | 否 | 可空 |
| spend_time | int | 答题耗时 | 否 | 秒,可空 |
| answer_time | datetime | 答题时间 | 否 | 默认 CURRENT_TIMESTAMP |
CREATE TABLE `sys_exam_user_answer`
(
`user_answer_id` varchar(50) NOT NULL,
`user_id` varchar(50) NOT NULL COMMENT '用户ID',
`question_id` varchar(50) NOT NULL COMMENT '题目ID',
`paper_id` varchar(50) DEFAULT NULL COMMENT '试卷ID(如为单独练习则为空)',
`user_answer` text COMMENT '用户答案',
`is_correct` tinyint DEFAULT NULL COMMENT '是否正确',
`spend_time` int DEFAULT NULL COMMENT '答题耗时(秒)',
`answer_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`user_answer_id`),
KEY `idx_user_question` (`user_id`,`question_id`),
KEY `idx_user_paper` (`user_id`,`paper_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户答题记录表';
用户错题本表(sys_exam_user_wrong_question)
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| user_wrong_question_id | varchar(50) | 错题记录 ID | 是 | |
| user_id | varchar(50) | 用户 ID | 否 | |
| question_id | varchar(50) | 题目 ID | 否 | |
| wrong_count | int | 错误次数 | 否 | 默认 0 |
| last_wrong_time | datetime | 最后错误时间 | 否 | 默认 CURRENT_TIMESTAMP |
| create_time | datetime | 创建时间 | 否 | 默认 CURRENT_TIMESTAMP |
| update_time | datetime | 更新时间 | 否 | 默认 CURRENT_TIMESTAMP,更新时自动刷新 |
CREATE TABLE `sys_exam_user_wrong_question`
(
`user_wrong_question_id` varchar(50) NOT NULL,
`user_id` varchar(50) NOT NULL COMMENT '用户ID',
`question_id` varchar(50) NOT NULL COMMENT '题目ID',
`wrong_count` int NOT NULL DEFAULT 0 COMMENT '错误次数',
`last_wrong_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`user_wrong_question_id`),
UNIQUE KEY `uk_user_wrong_question` (`user_id`,`question_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户错题本表';
消息模板表(sys_message_template)
CREATE TABLE IF NOT EXISTS `message_template` (
`msg_template_id` varchar(50) NOT NULL COMMENT '主键ID',
`template_code` varchar(64) NOT NULL COMMENT '模板编码',
`template_name` varchar(128) NOT NULL COMMENT '模板名称',
`template_type` tinyint(4) NOT NULL COMMENT '模板类型(1:短信 2:邮件 3:站内信 4:APP推送)',
`title` varchar(255) DEFAULT NULL COMMENT '消息标题(邮件/站内信需要)',
`content` text NOT NULL COMMENT '消息内容',
`variables` varchar(512) DEFAULT NULL COMMENT '模板变量(JSON格式)',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态(0:禁用 1:启用)',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`msg_template_id`),
UNIQUE KEY `uk_template_code` (`template_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息模板表';
INSERT INTO `message_template` (`msg_template_id`, `template_code`, `template_name`, `template_type`, `title`, `content`, `variables`, `status`, `remark`)
VALUES
('1', 'REGISTER_EMAIL', '用户注册邮件', 2, '欢迎注册我们的平台', '尊敬的{username},感谢您注册我们的平台,您的验证码是:{code},有效期10分钟。', '["username","code"]', 1, '用户注册时发送的欢迎邮件'),
('2', 'LOGIN_SMS', '登录验证码短信', 1, NULL, '【XX平台】您的登录验证码是:{code},有效期5分钟。', '["code"]', 1, '用户登录时发送的验证码短信');
| 字段名 | 类型 | 描述 | 是否主键 | 备注 |
|---|
| msg_template_id | varchar(50) | 主键 ID | 是 | |
| template_code | varchar(64) | 模板编码 | 否 | 唯一索引 |
| template_name | varchar(128) | 模板名称 | 否 | |
| template_type | tinyint(4) | 模板类型 (1: 短信 2: 邮件 3: 站内信 4:APP 推送) | 否 | 可增加渠道管理(todo) |
| title | varchar(255) | 消息标题 (邮件 / 站内信需要) | 否 | 可为空 |
| content | text | 消息内容 | 否 | |
| variables | varchar(512) | 模板变量 (JSON 格式) | 否 | 可为空 |
| status | tinyint(4) | 状态 (0: 禁用 1: 启用) | 否 | 默认值为 1 |
| remark | varchar(255) | 备注 | | |
3. 接口设计
4. 安全设计
4.1 认证流程
5. 首页功能详细设计
5.1 首页
5.2 关于自考
6. 前端设计
7. 部署方案
7.1 应用打包
7.2 启动脚本
8. 性能优化
8.1 缓存策略
8.2 SQL优化建议
// 使用MyBatis-Plus优化查询
noticeService.lambdaQuery()
.eq(Notice::getIsTop, 1)
.orderByDesc(Notice::getCreateTime)
.page(new Page<>(1, 10));
本设计文档针对单体架构特点进行了以下优化:
- 简化了服务拆分,所有模块集成在单一应用中
- 采用传统分层架构(Controller-Service-DAO)
- 数据库设计更强调单库优化
- 部署方案更简单直接
- 保留了必要的缓存和搜索组件提升性能