sxwz2.0/.trae/documents/development_plan.md
wangzhiwei 5f5c0759ce feat(notification): 实现通知功能,支持角色层级发送和课程群发
1. 修改 SysNotification 实体,新增 senderId, senderName, targetType 字段

2. 新增 SendNotificationRequest 请求DTO

3. 扩展通知类型至6种(新增用户通知、课程通知)

4. 实现角色层级权限控制,支持多级管理员通知下级

5. 支持老师群发课程通知给学生

6. 新增批量发送接口和权限配置
2026-05-15 16:57:07 +08:00

558 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 实训平台客户端后端开发计划
## 一、需求分析
根据《实训平台客户端完整需求文档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
**创建人**: 系统生成