206 lines
7.1 KiB
Markdown
206 lines
7.1 KiB
Markdown
# 通知功能实现方案
|
||
|
||
## 1. 需求分析
|
||
|
||
根据业务描述,通知系统需要支持以下功能:
|
||
|
||
### 1.1 系统通知
|
||
- 次级管理员增加/删除学校管理员 → 主要管理员可见
|
||
- 次级管理员增加/修改/删除套餐 → 主要管理员可见
|
||
- 老师的系统通知 → 主要管理员可见
|
||
|
||
### 1.2 管理员对用户通知(层级发送)
|
||
|
||
| 角色 | 可通知对象 | 说明 |
|
||
|------|-----------|------|
|
||
| 主要管理员(SUPER) | 次级管理员、学校管理员、学院管理员、老师、学生 | 可多选 |
|
||
| 次级管理员(SUPER1) | 学校管理员、学院管理员、老师、学生 | 可多选 |
|
||
| 学校管理员(SCHOOL_ADMIN) | 学院管理员、老师、学生 | 可多选 |
|
||
| 学院管理员(COLLEGE_ADMIN) | 老师、学生 | 可多选 |
|
||
| 老师(TEACHER) | 指定课程的学生 | 课程可多选 |
|
||
| 学生(STUDENT) | 仅收件箱 | 无发送权限 |
|
||
|
||
### 1.3 核心需求(用户明确)
|
||
1. **通知创建人** - 需要记录发送者信息
|
||
2. **发送目标** - 需要记录接收人信息
|
||
3. **通知类型** - 需要支持多种类型
|
||
|
||
---
|
||
|
||
## 2. 当前代码分析
|
||
|
||
### 2.1 现有通知实体 (`SysNotification`)
|
||
|
||
| 字段 | 类型 | 说明 | 当前状态 |
|
||
|------|------|------|----------|
|
||
| id | Long | 主键ID | ✅ 存在 |
|
||
| schoolId | Long | 学校ID(数据隔离) | ✅ 存在 |
|
||
| userId | Long | 用户ID | ✅ 存在(作为接收者ID) |
|
||
| title | String | 通知标题 | ✅ 存在 |
|
||
| content | String | 通知内容 | ✅ 存在 |
|
||
| type | Integer | 通知类型 | ✅ 存在(仅4种) |
|
||
| isRead | Integer | 是否已读 | ✅ 存在(用户表示可保留) |
|
||
| createTime | Date | 创建时间 | ✅ 存在 |
|
||
|
||
### 2.2 现有问题
|
||
|
||
| 问题 | 说明 |
|
||
|------|------|
|
||
| 缺少发送者信息 | 当前只有接收者ID(userId),缺少发送者ID和姓名 |
|
||
| 通知类型不足 | 只有4种类型,缺少用户通知和课程通知 |
|
||
| 缺少批量发送功能 | 当前只能单条发送给单个用户 |
|
||
| 缺少角色层级控制 | 没有实现角色层级的发送权限控制 |
|
||
|
||
---
|
||
|
||
## 3. 实现方案(最小化修改)
|
||
|
||
### 3.1 数据库表结构调整
|
||
|
||
**新增字段到 `sys_notification` 表:**
|
||
|
||
| 字段名 | 类型 | 约束 | 说明 |
|
||
|--------|------|------|------|
|
||
| sender_id | BIGINT | NULL | 发送者用户ID |
|
||
| sender_name | VARCHAR(100) | NULL | 发送者姓名 |
|
||
| target_type | TINYINT(1) | DEFAULT 1 | 目标类型:1-单个用户,2-角色,3-课程 |
|
||
|
||
**更新通知类型定义:**
|
||
|
||
| 类型值 | 类型名称 | 说明 |
|
||
|--------|----------|------|
|
||
| 1 | 系统通知 | 系统自动生成的通知 |
|
||
| 2 | 作业通知 | 作业相关通知 |
|
||
| 3 | 考试通知 | 考试相关通知 |
|
||
| 4 | 考勤通知 | 考勤相关通知 |
|
||
| 5 | 用户通知 | 管理员发送给用户的通知 |
|
||
| 6 | 课程通知 | 老师发送给课程学生的通知 |
|
||
|
||
### 3.2 实体类修改 (`SysNotification.java`)
|
||
|
||
```java
|
||
// 新增字段
|
||
@Schema(description = "发送者用户ID")
|
||
private Long senderId;
|
||
|
||
@Schema(description = "发送者姓名")
|
||
private String senderName;
|
||
|
||
@Schema(description = "目标类型:1-单个用户,2-角色,3-课程")
|
||
private Integer targetType;
|
||
```
|
||
|
||
### 3.3 新增请求DTO
|
||
|
||
**`SendNotificationRequest.java`** - 发送通知请求
|
||
|
||
| 字段 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| schoolId | Long | 是 | 学校ID |
|
||
| title | String | 是 | 通知标题 |
|
||
| content | String | 是 | 通知内容 |
|
||
| type | Integer | 是 | 通知类型(5-用户通知, 6-课程通知) |
|
||
| targetUserIds | List<Long> | 否 | 目标用户ID列表 |
|
||
| targetRoleTypes | List<Integer> | 否 | 目标角色类型列表 |
|
||
| courseIds | List<Long> | 否 | 课程ID列表(老师群发) |
|
||
|
||
### 3.4 Service层增强
|
||
|
||
**新增接口方法 (`SysNotificationService.java`):**
|
||
|
||
```java
|
||
/**
|
||
* 发送用户通知(批量发送给指定角色或用户)
|
||
*/
|
||
void sendUserNotification(Long schoolId, Long senderId, String senderName,
|
||
String title, String content,
|
||
List<Long> targetUserIds, List<Integer> targetRoleTypes);
|
||
|
||
/**
|
||
* 发送课程通知(老师群发课程消息)
|
||
*/
|
||
void sendCourseNotification(Long schoolId, Long teacherId, String teacherName,
|
||
String title, String content, List<Long> courseIds);
|
||
|
||
/**
|
||
* 发送系统通知给指定用户
|
||
*/
|
||
void sendSystemNotification(Long schoolId, List<Long> targetUserIds,
|
||
String title, String content);
|
||
|
||
/**
|
||
* 获取当前用户可通知的下级角色类型
|
||
*/
|
||
List<Integer> getAvailableTargetRoles(Long currentUserId);
|
||
|
||
/**
|
||
* 获取指定角色类型下的用户列表
|
||
*/
|
||
List<SysUser> getUsersByRoleTypes(Long schoolId, List<Integer> roleTypes);
|
||
```
|
||
|
||
### 3.5 Controller层增强
|
||
|
||
**新增接口 (`SysNotificationController.java`):**
|
||
|
||
| 接口 | 方法 | 权限 | 说明 |
|
||
|------|------|------|------|
|
||
| `/api/notification/send-to-users` | POST | 管理员/老师 | 发送通知给指定用户 |
|
||
| `/api/notification/send-to-roles` | POST | 管理员/老师 | 发送通知给指定角色 |
|
||
| `/api/notification/send-to-course` | POST | TEACHER | 发送课程通知 |
|
||
| `/api/notification/available-targets` | GET | 登录用户 | 获取当前用户可通知的目标角色 |
|
||
|
||
### 3.6 角色层级权限控制
|
||
|
||
**角色层级关系与可通知范围:**
|
||
|
||
| 当前角色 | roleType | 可通知角色类型 |
|
||
|----------|----------|---------------|
|
||
| SUPER | 1 | [1, 2, 3, 4, 5] |
|
||
| SUPER1 | 1 | [2, 3, 4, 5] |
|
||
| SCHOOL_ADMIN | 2 | [3, 4, 5] |
|
||
| COLLEGE_ADMIN | 3 | [4, 5] |
|
||
| TEACHER | 4 | [5] (仅限自己课程的学生) |
|
||
| STUDENT | 5 | [] (无发送权限) |
|
||
|
||
---
|
||
|
||
## 4. 文件修改清单
|
||
|
||
| 文件路径 | 修改类型 | 说明 |
|
||
|----------|----------|------|
|
||
| `entity/SysNotification.java` | 修改 | 新增 senderId, senderName, targetType 字段 |
|
||
| `entity/request/SendNotificationRequest.java` | 新增 | 发送通知请求DTO |
|
||
| `service/SysNotificationService.java` | 修改 | 新增接口方法 |
|
||
| `service/impl/SysNotificationServiceImpl.java` | 修改 | 实现新增方法 |
|
||
| `controller/SysNotificationController.java` | 修改 | 新增接口 |
|
||
| `mapper/SysNotificationMapper.java` | 修改 | 新增批量插入方法 |
|
||
| `mapper/SysNotificationMapper.xml` | 修改 | 新增批量插入SQL |
|
||
| `db/create_edu_tables.sql` | 修改 | 添加新字段 |
|
||
| `db/sys_role_permission_data_init_merged.sql` | 修改 | 添加发送通知权限 |
|
||
|
||
---
|
||
|
||
## 5. 权限配置
|
||
|
||
**新增权限码:**
|
||
|
||
| 权限码 | 权限名称 | 适用角色 |
|
||
|--------|----------|----------|
|
||
| `notification:send:users` | 发送通知给用户 | SUPER, SUPER1, SCHOOL_ADMIN, COLLEGE_ADMIN |
|
||
| `notification:send:course` | 发送课程通知 | TEACHER |
|
||
|
||
---
|
||
|
||
## 6. 总结
|
||
|
||
**当前代码是否满足需求:**
|
||
|
||
| 需求 | 当前状态 | 需要修改 |
|
||
|------|----------|----------|
|
||
| 通知创建人 | ❌ 缺少发送者信息 | 新增 senderId, senderName |
|
||
| 发送目标 | ✅ userId作为接收者 | 支持批量发送 |
|
||
| 通知类型 | ❌ 只有4种 | 新增类型5和6 |
|
||
| 角色层级控制 | ❌ 未实现 | 新增权限验证逻辑 |
|
||
|
||
**结论:当前代码不满足需求,需要进行上述修改。** |