1. 修改 SysNotification 实体,新增 senderId, senderName, targetType 字段 2. 新增 SendNotificationRequest 请求DTO 3. 扩展通知类型至6种(新增用户通知、课程通知) 4. 实现角色层级权限控制,支持多级管理员通知下级 5. 支持老师群发课程通知给学生 6. 新增批量发送接口和权限配置
558 lines
22 KiB
Markdown
558 lines
22 KiB
Markdown
# 实训平台客户端后端开发计划
|
||
|
||
## 一、需求分析
|
||
|
||
根据《实训平台客户端完整需求文档(V2.0)》,需要实现以下核心模块:
|
||
|
||
| 模块 | 功能点 | 状态 |
|
||
| :--- | :--- | :--- |
|
||
| **注册登录** | 手机号验证码注册、账号密码注册、微信扫码登录、自动注册 | 部分实现 |
|
||
| **通知中心** | 通知列表、详情查看、单条/全部已读 | 未实现 |
|
||
| **充值中心** | 充值套餐、套餐支付、自定义充值 | 已实现(沿用account/accountTransaction/paymentOrder表) |
|
||
| **教学管理** | 课程管理、作业管理、考试管理、考勤管理 | 未实现 |
|
||
| **优秀作品** | 作品展示、点赞互动 | 未实现 |
|
||
| **个人中心** | 个人信息、消费记录、订单记录、密码修改、手机号修改 | 部分实现 |
|
||
|
||
## 二、技术架构
|
||
|
||
### 2.1 技术栈
|
||
- **语言**: Java 17
|
||
- **框架**: Spring Boot 3.2.2
|
||
- **数据库**: MySQL
|
||
- **ORM**: MyBatis
|
||
- **缓存**: Redis + Redisson
|
||
- **认证**: Sa-Token
|
||
- **支付**: 微信支付 SDK、支付宝 SDK
|
||
- **文档**: SpringDoc OpenAPI
|
||
|
||
### 2.2 代码结构
|
||
```
|
||
src/main/java/com/kexue/skills/
|
||
├── annotation/ # 自定义注解
|
||
├── aspect/ # AOP切面
|
||
├── common/ # 通用工具类
|
||
├── config/ # 配置类
|
||
├── controller/ # 控制器
|
||
├── entity/ # 实体类
|
||
│ ├── base/ # 基础实体
|
||
│ ├── dto/ # 数据传输对象
|
||
│ ├── request/ # 请求对象
|
||
│ └── response/ # 响应对象
|
||
├── exception/ # 异常处理
|
||
├── interceptor/ # 拦截器
|
||
├── mapper/ # MyBatis映射器
|
||
├── service/ # 业务服务
|
||
│ └── impl/ # 服务实现
|
||
└── SkillsApp.java # 启动类
|
||
```
|
||
|
||
## 三、开发计划
|
||
|
||
### 阶段一:数据库表设计与初始化(预计1天)
|
||
|
||
**任务1.1:设计并创建教学管理相关表**
|
||
- `edu_course` - 课程表
|
||
- `edu_course_student` - 课程学生关联表
|
||
- `edu_homework` - 作业表
|
||
- `edu_homework_submit` - 作业提交表
|
||
- `edu_exam` - 考试表
|
||
- `edu_exam_paper` - 考试答卷表
|
||
- `edu_attendance` - 考勤表
|
||
- `edu_attendance_record` - 考勤记录表
|
||
|
||
**任务1.2:设计并创建通知表**
|
||
- `sys_notification` - 通知表
|
||
- `sys_notification_read` - 通知已读记录表
|
||
|
||
**任务1.3:设计并创建优秀作品表**
|
||
- `edu_excellent_work` - 优秀作品表
|
||
- `edu_work_like` - 作品点赞表
|
||
|
||
**任务1.4:扩展用户表字段**
|
||
- 添加院校相关字段:school_id, college_id, major_id, grade, class_name
|
||
- 添加角色字段:role_type (1-学生, 2-老师)
|
||
- 添加账户状态字段:account_status (1-可学用户, 2-试用用户, 3-学校用户, 4-冻结用户)
|
||
- 添加激活码相关字段:activation_code, binding_status
|
||
|
||
### 阶段二:用户体系模块开发(预计2天)
|
||
|
||
**任务2.1:完善注册功能**
|
||
- 添加学校/学院/专业/年级/班级选择接口
|
||
- 实现手机号验证码注册
|
||
- 实现账号密码注册
|
||
- 支持默认角色为学生
|
||
|
||
**任务2.2:完善登录功能**
|
||
- 实现微信扫码登录(绑定wxid)
|
||
- 实现手机号密码登录
|
||
- 完善自动注册逻辑
|
||
|
||
**任务2.3:院校绑定功能**
|
||
- 实现身份信息填写接口
|
||
- 实现院校预校验接口
|
||
- 实现激活码绑定接口
|
||
|
||
**任务2.4:个人中心功能**
|
||
- 个人信息查看与修改
|
||
- 密码修改(含找回密码)
|
||
- 绑定手机号修改
|
||
|
||
### 阶段三:通知模块开发(预计1天)
|
||
|
||
**任务3.1:通知管理接口**
|
||
- 获取通知列表(按时间倒序)
|
||
- 查看通知详情(自动标记已读)
|
||
- 单条通知已读
|
||
- 全部通知已读
|
||
|
||
### 阶段四:教学管理模块开发(预计4天)
|
||
|
||
**任务4.1:课程管理**
|
||
- 老师端:创建课程、管理课程、课程学生管理、导出成绩
|
||
- 学生端:查看课程、查看课程内容
|
||
|
||
**任务4.2:作业管理**
|
||
- 老师端:作业草稿管理、发布作业、作业批改、优秀标记、删除作业
|
||
- 学生端:查看作业、提交作业、修改作业、重做退回作业
|
||
|
||
**任务4.3:考试管理**
|
||
- 老师端:考试草稿管理、发布考试、阅卷管理、补考管理、删除考试
|
||
- 学生端:查看考试、参加考试、参加补考
|
||
|
||
**任务4.4:考勤管理**
|
||
- 老师端:发起签到(二维码/手动点名)、管理签到记录、修改考勤状态
|
||
- 学生端:扫码签到、查看考勤记录
|
||
|
||
### 阶段五:优秀作品模块开发(预计1天)
|
||
|
||
**任务5.1:优秀作品展示**
|
||
- 获取优秀作品列表
|
||
- 作品点赞(每个作品仅可点赞1次)
|
||
|
||
### 阶段六:统一异常处理与安全加固(预计1天)
|
||
|
||
**任务6.1:统一异常处理**
|
||
- 实现统一错误提示语
|
||
- 完善全局异常处理器
|
||
|
||
**任务6.2:安全加固**
|
||
- 权限双重校验
|
||
- 数据隔离机制
|
||
- 操作日志留存
|
||
|
||
## 四、接口清单
|
||
|
||
### 4.1 用户体系接口
|
||
|
||
| API路径 | 方法 | 功能描述 |
|
||
| :--- | :--- | :--- |
|
||
| `/api/register/phone` | POST | 手机号验证码注册 |
|
||
| `/api/register/password` | POST | 账号密码注册 |
|
||
| `/api/login/wechat` | POST | 微信扫码登录 |
|
||
| `/api/login/phone` | POST | 手机号验证码登录 |
|
||
| `/api/login/password` | POST | 账号密码登录 |
|
||
| `/api/binding/school/check` | POST | 院校预校验 |
|
||
| `/api/binding/activation` | POST | 激活码绑定 |
|
||
| `/api/user/info` | GET | 获取个人信息 |
|
||
| `/api/user/info` | PUT | 修改个人信息 |
|
||
| `/api/user/password` | PUT | 修改密码 |
|
||
| `/api/user/phone` | PUT | 修改绑定手机号 |
|
||
|
||
### 4.2 通知接口
|
||
|
||
| API路径 | 方法 | 功能描述 |
|
||
| :--- | :--- | :--- |
|
||
| `/api/notification/list` | GET | 获取通知列表 |
|
||
| `/api/notification/detail/{id}` | GET | 查看通知详情 |
|
||
| `/api/notification/read/{id}` | PUT | 标记单条已读 |
|
||
| `/api/notification/read/all` | PUT | 标记全部已读 |
|
||
|
||
### 4.3 课程管理接口
|
||
|
||
| API路径 | 方法 | 功能描述 |
|
||
| :--- | :--- | :--- |
|
||
| `/api/course/list` | GET | 获取课程列表 |
|
||
| `/api/course/create` | POST | 创建课程 |
|
||
| `/api/course/update` | PUT | 修改课程信息 |
|
||
| `/api/course/delete/{id}` | DELETE | 删除课程 |
|
||
| `/api/course/students/{courseId}` | GET | 获取课程学生列表 |
|
||
| `/api/course/addStudents` | POST | 批量添加学生 |
|
||
| `/api/course/removeStudent` | DELETE | 踢出学生 |
|
||
| `/api/course/exportScore/{courseId}` | GET | 导出成绩 |
|
||
|
||
### 4.5 作业管理接口
|
||
|
||
| API路径 | 方法 | 功能描述 |
|
||
| :--- | :--- | :--- |
|
||
| `/api/homework/list/{courseId}` | GET | 获取作业列表 |
|
||
| `/api/homework/create` | POST | 创建作业草稿 |
|
||
| `/api/homework/update` | PUT | 修改作业草稿 |
|
||
| `/api/homework/delete/{id}` | DELETE | 删除作业 |
|
||
| `/api/homework/publish` | PUT | 发布作业 |
|
||
| `/api/homework/submit` | POST | 提交作业 |
|
||
| `/api/homework/correct` | PUT | 批改作业 |
|
||
| `/api/homework/excellent/{id}` | PUT | 标记优秀 |
|
||
| `/api/homework/return` | PUT | 退回作业 |
|
||
|
||
### 4.6 考试管理接口
|
||
|
||
| API路径 | 方法 | 功能描述 |
|
||
| :--- | :--- | :--- |
|
||
| `/api/exam/list/{courseId}` | GET | 获取考试列表 |
|
||
| `/api/exam/create` | POST | 创建考试草稿 |
|
||
| `/api/exam/update` | PUT | 修改考试草稿 |
|
||
| `/api/exam/delete/{id}` | DELETE | 删除考试 |
|
||
| `/api/exam/publish` | PUT | 发布考试 |
|
||
| `/api/exam/take/{examId}` | POST | 参加考试 |
|
||
| `/api/exam/correct` | PUT | 阅卷打分 |
|
||
| `/api/exam/makeup` | POST | 创建补考 |
|
||
|
||
### 4.7 考勤管理接口
|
||
|
||
| API路径 | 方法 | 功能描述 |
|
||
| :--- | :--- | :--- |
|
||
| `/api/attendance/start` | POST | 发起签到 |
|
||
| `/api/attendance/list/{courseId}` | GET | 获取签到记录列表 |
|
||
| `/api/attendance/detail/{id}` | GET | 查看签到详情 |
|
||
| `/api/attendance/sign` | POST | 扫码签到 |
|
||
| `/api/attendance/status` | PUT | 修改考勤状态 |
|
||
| `/api/attendance/myList` | GET | 个人考勤记录 |
|
||
|
||
### 4.8 优秀作品接口
|
||
|
||
| API路径 | 方法 | 功能描述 |
|
||
| :--- | :--- | :--- |
|
||
| `/api/excellent/list` | GET | 获取优秀作品列表 |
|
||
| `/api/excellent/like/{workId}` | POST | 点赞作品 |
|
||
|
||
## 五、数据库表设计
|
||
|
||
### 5.1 用户表扩展字段
|
||
|
||
```sql
|
||
-- sys_user 表新增字段(仅添加通用字段,角色专属字段移至扩展表)
|
||
ALTER TABLE `sys_user`
|
||
ADD COLUMN `account_status` TINYINT(1) DEFAULT '1' COMMENT '账户状态:1-可学用户,2-试用用户,3-学校用户,4-冻结用户',
|
||
ADD COLUMN `wxid` VARCHAR(100) DEFAULT NULL COMMENT '微信ID';
|
||
```
|
||
|
||
### 5.2 用户角色关联表
|
||
|
||
```sql
|
||
CREATE TABLE `sys_user_role` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`user_id` BIGINT(20) NOT NULL COMMENT '用户ID',
|
||
`role_code` VARCHAR(50) NOT NULL COMMENT '角色编码:student-学生,teacher-老师,admin-管理员',
|
||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_user_role` (`user_id`, `role_code`),
|
||
KEY `idx_user_id` (`user_id`),
|
||
KEY `idx_role_code` (`role_code`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色关联表';
|
||
```
|
||
|
||
### 5.3 学生扩展表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_student` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`user_id` BIGINT(20) NOT NULL COMMENT '用户ID(关联sys_user)',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID',
|
||
`college_id` BIGINT(20) DEFAULT NULL COMMENT '学院ID',
|
||
`major_id` BIGINT(20) DEFAULT NULL COMMENT '专业ID',
|
||
`grade` VARCHAR(20) DEFAULT NULL COMMENT '年级',
|
||
`class_name` VARCHAR(50) DEFAULT NULL COMMENT '班级',
|
||
`student_no` VARCHAR(50) DEFAULT NULL COMMENT '学号',
|
||
`real_name` VARCHAR(50) DEFAULT NULL COMMENT '真实姓名',
|
||
`activation_code` VARCHAR(50) DEFAULT NULL COMMENT '激活码',
|
||
`binding_status` TINYINT(1) DEFAULT '0' COMMENT '绑定状态:0-未绑定,1-已绑定',
|
||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_user_id` (`user_id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_college_id` (`college_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生扩展表';
|
||
```
|
||
|
||
### 5.4 教师扩展表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_teacher` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`user_id` BIGINT(20) NOT NULL COMMENT '用户ID(关联sys_user)',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID',
|
||
`college_id` BIGINT(20) DEFAULT NULL COMMENT '学院ID',
|
||
`real_name` VARCHAR(50) DEFAULT NULL COMMENT '真实姓名',
|
||
`teacher_no` VARCHAR(50) DEFAULT NULL COMMENT '教师编号',
|
||
`title` VARCHAR(50) DEFAULT NULL COMMENT '职称',
|
||
`activation_code` VARCHAR(50) DEFAULT NULL COMMENT '激活码',
|
||
`binding_status` TINYINT(1) DEFAULT '0' COMMENT '绑定状态:0-未绑定,1-已绑定',
|
||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_user_id` (`user_id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_college_id` (`college_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='教师扩展表';
|
||
```
|
||
|
||
### 5.5 通知表
|
||
|
||
```sql
|
||
CREATE TABLE `sys_notification` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID(数据隔离)',
|
||
`user_id` BIGINT(20) NOT NULL COMMENT '用户ID',
|
||
`title` VARCHAR(100) NOT NULL COMMENT '通知标题',
|
||
`content` TEXT NOT NULL COMMENT '通知内容',
|
||
`type` TINYINT(1) DEFAULT '1' COMMENT '通知类型:1-系统通知,2-作业通知,3-考试通知,4-考勤通知',
|
||
`is_read` TINYINT(1) DEFAULT '0' COMMENT '是否已读:0-未读,1-已读',
|
||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_user_id` (`user_id`),
|
||
KEY `idx_is_read` (`is_read`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通知表';
|
||
```
|
||
|
||
### 5.6 课程表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_course` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID(数据隔离)',
|
||
`name` VARCHAR(100) NOT NULL COMMENT '课程名称',
|
||
`cover` VARCHAR(255) DEFAULT NULL COMMENT '课程封面',
|
||
`description` TEXT DEFAULT NULL COMMENT '课程简介',
|
||
`class_time` VARCHAR(100) DEFAULT NULL COMMENT '上课时间',
|
||
`teaching_method` TINYINT(1) DEFAULT '1' COMMENT '授课方式:1-线上,2-线下,3-混合',
|
||
`teacher_id` BIGINT(20) NOT NULL COMMENT '创建老师ID',
|
||
`status` TINYINT(1) DEFAULT '1' COMMENT '课程状态:1-进行中,2-已结课',
|
||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_teacher_id` (`teacher_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程表';
|
||
```
|
||
|
||
### 5.7 课程学生关联表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_course_student` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID(数据隔离)',
|
||
`course_id` BIGINT(20) NOT NULL COMMENT '课程ID',
|
||
`student_id` BIGINT(20) NOT NULL COMMENT '学生ID',
|
||
`join_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
|
||
`is_kicked` TINYINT(1) DEFAULT '0' COMMENT '是否被踢出:0-正常,1-已踢出',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_course_student` (`course_id`, `student_id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_course_id` (`course_id`),
|
||
KEY `idx_student_id` (`student_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程学生关联表';
|
||
```
|
||
|
||
### 5.8 作业表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_homework` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID(数据隔离)',
|
||
`course_id` BIGINT(20) NOT NULL COMMENT '课程ID',
|
||
`name` VARCHAR(100) NOT NULL COMMENT '作业名称',
|
||
`requirement` TEXT DEFAULT NULL COMMENT '作业要求',
|
||
`questions` TEXT NOT NULL COMMENT '题目JSON',
|
||
`allow_late` TINYINT(1) DEFAULT '0' COMMENT '是否允许迟交',
|
||
`start_time` DATETIME NOT NULL COMMENT '开始时间',
|
||
`end_time` DATETIME NOT NULL COMMENT '截止时间',
|
||
`status` TINYINT(1) DEFAULT '1' COMMENT '状态:1-草稿,2-已发布',
|
||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_course_id` (`course_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='作业表';
|
||
```
|
||
|
||
### 5.9 作业提交表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_homework_submit` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID(数据隔离)',
|
||
`homework_id` BIGINT(20) NOT NULL COMMENT '作业ID',
|
||
`student_id` BIGINT(20) NOT NULL COMMENT '学生ID',
|
||
`answers` TEXT NOT NULL COMMENT '答案JSON',
|
||
`submit_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '提交时间',
|
||
`is_late` TINYINT(1) DEFAULT '0' COMMENT '是否迟交',
|
||
`status` TINYINT(1) DEFAULT '1' COMMENT '状态:1-待批改,2-已批改,3-已退回',
|
||
`score` DECIMAL(5,2) DEFAULT NULL COMMENT '分数',
|
||
`comment` TEXT DEFAULT NULL COMMENT '评语',
|
||
`is_excellent` TINYINT(1) DEFAULT '0' COMMENT '是否优秀',
|
||
`redo_end_time` DATETIME DEFAULT NULL COMMENT '重做截止时间',
|
||
`redo_count` INT(11) DEFAULT '0' COMMENT '重做次数',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_homework_id` (`homework_id`),
|
||
KEY `idx_student_id` (`student_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='作业提交表';
|
||
```
|
||
|
||
### 5.10 考试表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_exam` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID(数据隔离)',
|
||
`course_id` BIGINT(20) NOT NULL COMMENT '课程ID',
|
||
`name` VARCHAR(100) NOT NULL COMMENT '考试名称',
|
||
`requirement` TEXT DEFAULT NULL COMMENT '考试要求',
|
||
`questions` TEXT NOT NULL COMMENT '考卷JSON',
|
||
`duration` INT(11) NOT NULL COMMENT '考试时长(分钟)',
|
||
`start_time` DATETIME NOT NULL COMMENT '开始时间',
|
||
`end_time` DATETIME NOT NULL COMMENT '截止时间',
|
||
`status` TINYINT(1) DEFAULT '1' COMMENT '状态:1-草稿,2-已发布,3-已结束',
|
||
`is_makeup` TINYINT(1) DEFAULT '0' COMMENT '是否补考',
|
||
`parent_exam_id` BIGINT(20) DEFAULT NULL COMMENT '关联主考ID',
|
||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_course_id` (`course_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考试表';
|
||
```
|
||
|
||
### 5.11 考试答卷表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_exam_paper` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID(数据隔离)',
|
||
`exam_id` BIGINT(20) NOT NULL COMMENT '考试ID',
|
||
`student_id` BIGINT(20) NOT NULL COMMENT '学生ID',
|
||
`answers` TEXT NOT NULL COMMENT '答案JSON',
|
||
`submit_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '提交时间',
|
||
`status` TINYINT(1) DEFAULT '1' COMMENT '状态:1-待阅卷,2-已阅卷',
|
||
`score` DECIMAL(5,2) DEFAULT NULL COMMENT '分数',
|
||
`comment` TEXT DEFAULT NULL COMMENT '评语',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_exam_student` (`exam_id`, `student_id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_exam_id` (`exam_id`),
|
||
KEY `idx_student_id` (`student_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考试答卷表';
|
||
```
|
||
|
||
### 5.12 考勤表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_attendance` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID(数据隔离)',
|
||
`course_id` BIGINT(20) NOT NULL COMMENT '课程ID',
|
||
`name` VARCHAR(100) DEFAULT NULL COMMENT '签到名称(按时间自动生成)',
|
||
`start_time` DATETIME NOT NULL COMMENT '开始时间',
|
||
`duration` INT(11) DEFAULT '15' COMMENT '签到时长(分钟)',
|
||
`type` TINYINT(1) DEFAULT '1' COMMENT '签到类型:1-二维码签到,2-手动点名',
|
||
`status` TINYINT(1) DEFAULT '1' COMMENT '状态:1-进行中,2-已结束',
|
||
`qr_code` VARCHAR(255) DEFAULT NULL COMMENT '二维码内容',
|
||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_course_id` (`course_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤表';
|
||
```
|
||
|
||
### 5.13 考勤记录表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_attendance_record` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID(数据隔离)',
|
||
`attendance_id` BIGINT(20) NOT NULL COMMENT '考勤ID',
|
||
`student_id` BIGINT(20) NOT NULL COMMENT '学生ID',
|
||
`status` TINYINT(1) DEFAULT '1' COMMENT '考勤状态:1-出勤,2-迟到,3-缺勤,4-请假',
|
||
`sign_time` DATETIME DEFAULT NULL COMMENT '签到时间',
|
||
`remark` VARCHAR(255) DEFAULT NULL COMMENT '备注(手动点名时填写)',
|
||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_attendance_student` (`attendance_id`, `student_id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_attendance_id` (`attendance_id`),
|
||
KEY `idx_student_id` (`student_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤记录表';
|
||
```
|
||
|
||
### 5.14 优秀作品表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_excellent_work` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID(数据隔离)',
|
||
`work_type` TINYINT(1) NOT NULL COMMENT '作品类型:1-作业,2-考试',
|
||
`work_id` BIGINT(20) NOT NULL COMMENT '关联作业/考试ID',
|
||
`submit_id` BIGINT(20) NOT NULL COMMENT '关联提交ID',
|
||
`student_id` BIGINT(20) NOT NULL COMMENT '学生ID',
|
||
`score` DECIMAL(5,2) DEFAULT NULL COMMENT '分数',
|
||
`comment` TEXT DEFAULT NULL COMMENT '评语',
|
||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '标记时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_school_id` (`school_id`),
|
||
KEY `idx_work_type_work_id` (`work_type`, `work_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优秀作品表';
|
||
```
|
||
|
||
### 5.15 作品点赞表
|
||
|
||
```sql
|
||
CREATE TABLE `edu_work_like` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`school_id` BIGINT(20) NOT NULL COMMENT '学校ID(数据隔离)',
|
||
`work_id` BIGINT(20) NOT NULL COMMENT '优秀作品ID',
|
||
`user_id` BIGINT(20) NOT NULL COMMENT '点赞用户ID',
|
||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '点赞时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_work_user` (`work_id`, `user_id`),
|
||
KEY `idx_school_id` (`school_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='作品点赞表';
|
||
```
|
||
|
||
## 六、开发进度安排
|
||
|
||
| 阶段 | 任务 | 预计天数 | 负责人 |
|
||
| :--- | :--- | :--- | :--- |
|
||
| 第一阶段 | 数据库表设计与初始化 | 1 | 开发人员 |
|
||
| 第二阶段 | 用户体系模块开发 | 2 | 开发人员 |
|
||
| 第三阶段 | 通知模块开发 | 1 | 开发人员 |
|
||
| 第四阶段 | 教学管理模块开发 | 4 | 开发人员 |
|
||
| 第五阶段 | 优秀作品模块开发 | 1 | 开发人员 |
|
||
| 第六阶段 | 统一异常处理与安全加固 | 1 | 开发人员 |
|
||
| **总计** | | **10天** | |
|
||
|
||
## 七、风险与注意事项
|
||
|
||
### 7.1 风险识别
|
||
|
||
| 风险 | 描述 | 应对措施 |
|
||
| :--- | :--- | :--- |
|
||
| 数据权限安全 | 用户可能越权访问其他用户数据 | 前端展示+后端接口双重校验,token验证 |
|
||
| 并发问题 | 高并发场景下的数据一致性问题 | 使用Redis分布式锁,数据库事务 |
|
||
| 支付安全 | 支付回调可能被篡改 | 验证签名,使用安全的回调地址 |
|
||
| 接口幂等性 | 重复提交导致数据重复 | 使用防重复提交注解,唯一业务ID |
|
||
|
||
### 7.2 注意事项
|
||
|
||
1. **权限校验**:所有API查询严格校验token与对应用户ID
|
||
2. **数据排序**:所有数据获取接口默认按日期最新排序
|
||
3. **操作留痕**:课程/作业/考试/考勤/充值操作全量日志留存≥1年
|
||
4. **流程不可逆**:院校绑定、注册登录、作业考试发布流程严格按文档执行
|
||
5. **异常处理**:统一错误提示语,返回标准化错误信息
|
||
|
||
---
|
||
|
||
**文档版本**: V1.0
|
||
**创建时间**: 2026-04-30
|
||
**创建人**: 系统生成 |