sxwz2.0/.trae/documents/notification_plan.md

7.1 KiB
Raw Permalink Blame History

通知功能实现方案

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)

// 新增字段
@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]
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
角色层级控制 未实现 新增权限验证逻辑

结论:当前代码不满足需求,需要进行上述修改。