1. 修改 SysNotification 实体,新增 senderId, senderName, targetType 字段 2. 新增 SendNotificationRequest 请求DTO 3. 扩展通知类型至6种(新增用户通知、课程通知) 4. 实现角色层级权限控制,支持多级管理员通知下级 5. 支持老师群发课程通知给学生 6. 新增批量发送接口和权限配置
7.1 KiB
7.1 KiB
通知功能实现方案
1. 需求分析
根据业务描述,通知系统需要支持以下功能:
1.1 系统通知
- 次级管理员增加/删除学校管理员 → 主要管理员可见
- 次级管理员增加/修改/删除套餐 → 主要管理员可见
- 老师的系统通知 → 主要管理员可见
1.2 管理员对用户通知(层级发送)
| 角色 | 可通知对象 | 说明 |
|---|---|---|
| 主要管理员(SUPER) | 次级管理员、学校管理员、学院管理员、老师、学生 | 可多选 |
| 次级管理员(SUPER1) | 学校管理员、学院管理员、老师、学生 | 可多选 |
| 学校管理员(SCOOL_ADMIN) | 学院管理员、老师、学生 | 可多选 |
| 学院管理员(COLLEGE_ADMIN) | 老师、学生 | 可多选 |
| 老师(TEACHER) | 指定课程的学生 | 课程可多选 |
| 学生(STUDENT) | 仅收件箱 | 无发送权限 |
1.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)
// 新增字段
@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 | 否 | 目标用户ID列表 |
| targetRoleTypes | List | 否 | 目标角色类型列表 |
| courseIds | List | 否 | 课程ID列表(老师群发) |
3.4 Service层增强
新增接口方法 (SysNotificationService.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] |
| SCOOL_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, SCOOL_ADMIN, COLLEGE_ADMIN |
notification:send:course |
发送课程通知 | TEACHER |
6. 总结
当前代码是否满足需求:
| 需求 | 当前状态 | 需要修改 |
|---|---|---|
| 通知创建人 | ❌ 缺少发送者信息 | 新增 senderId, senderName |
| 发送目标 | ✅ userId作为接收者 | 支持批量发送 |
| 通知类型 | ❌ 只有4种 | 新增类型5和6 |
| 角色层级控制 | ❌ 未实现 | 新增权限验证逻辑 |
结论:当前代码不满足需求,需要进行上述修改。