From c25638f257aa5fc5850b4210ad5ab029b345b805 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Fri, 27 Sep 2024 08:33:55 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=80=9A=E7=9F=A5=E5=85=AC?= =?UTF-8?q?=E5=91=8A=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql5/youlai_boot.sql | 14 +- sql/mysql8/youlai_boot.sql | 14 +- .../boot/common/enums/NoticeTypeEnum.java | 33 -- .../boot/common/enums/NoticeWayEnum.java | 30 -- .../youlai/boot/common/enums/StatusEnum.java | 8 +- .../youlai/boot/common/util/CommonUtil.java | 67 ---- .../auth/controller/AuthController.java | 2 - .../auth}/enums/CaptchaTypeEnum.java | 2 +- .../auth/service/impl/AuthServiceImpl.java | 2 +- .../codegen}/enums/FormTypeEnum.java | 2 +- .../codegen}/enums/JavaTypeEnum.java | 2 +- .../codegen}/enums/QueryTypeEnum.java | 2 +- .../codegen/model/entity/GenFieldConfig.java | 4 +- .../codegen/model/form/GenConfigForm.java | 4 +- .../service/impl/CodegenServiceImpl.java | 7 +- .../service/impl/GenConfigServiceImpl.java | 6 +- .../file/service/impl/MinioFileService.java | 4 +- .../controller/WebsocketController.java | 8 +- .../listener/OnlineUserListener.java | 44 +++ .../websocket/service/MessageService.java | 29 -- .../websocket/service/OnlineUserService.java | 70 +++++ .../service/impl/WebsocketServiceImpl.java | 96 ------ .../system/controller/NoticeController.java | 91 +++--- .../system/controller/UserController.java | 2 +- .../system/converter/NoticeConverter.java | 14 +- .../boot/system/converter/UserConverter.java | 2 +- .../{common => system}/enums/ContactType.java | 2 +- .../{common => system}/enums/GenderEnum.java | 2 +- .../enums/MenuTypeEnum.java | 2 +- .../system/enums/NoticePublishStatusEnum.java | 30 ++ .../system/enums/NoticeTargetTypeEnum.java | 29 ++ .../boot/system/handler/MessageHandler.java | 35 --- .../system/listener/UserImportListener.java | 8 +- .../boot/system/mapper/NoticeMapper.java | 8 +- ...tatusMapper.java => UserNoticeMapper.java} | 12 +- .../youlai/boot/system/model/bo/NoticeBO.java | 61 ++-- .../youlai/boot/system/model/bo/RouteBO.java | 2 +- .../boot/system/model/dto/ChatMessage.java | 6 - .../boot/system/model/dto/MessageDTO.java | 9 +- .../boot/system/model/dto/NoticeDTO.java | 27 ++ .../youlai/boot/system/model/entity/Menu.java | 2 +- .../boot/system/model/entity/Notice.java | 38 ++- .../{NoticeStatus.java => UserNotice.java} | 19 +- .../boot/system/model/form/MenuForm.java | 2 +- .../boot/system/model/form/NoticeForm.java | 15 +- ...{NoticeQuery.java => NoticePageQuery.java} | 4 +- .../youlai/boot/system/model/vo/MenuVO.java | 2 +- .../boot/system/model/vo/NoticeDetailVO.java | 12 +- ...iceStatusVO.java => UserNoticePageVO.java} | 20 +- .../boot/system/service/NoticeService.java | 30 +- ...tusService.java => UserNoticeService.java} | 13 +- .../boot/system/service/UserService.java | 2 +- .../system/service/impl/MenuServiceImpl.java | 2 +- .../service/impl/NoticeServiceImpl.java | 292 ++++++++++-------- .../service/impl/NoticeStatusServiceImpl.java | 67 ---- .../service/impl/UserNoticeServiceImpl.java | 74 +++++ .../system/service/impl/UserServiceImpl.java | 2 +- src/main/resources/application-dev.yml | 2 + src/main/resources/application-prod.yml | 1 + .../resources/mapper/NoticeStatusMapper.xml | 49 --- .../mapper/{ => codegen}/DatabaseMapper.xml | 0 .../mapper/{ => codegen}/GenConfigMapper.xml | 0 .../{ => codegen}/GenFieldConfigMapper.xml | 0 .../mapper/{ => system}/ConfigMapper.xml | 0 .../mapper/{ => system}/DeptMapper.xml | 0 .../mapper/{ => system}/DictItemMapper.xml | 0 .../mapper/{ => system}/DictMapper.xml | 0 .../mapper/{ => system}/LogMapper.xml | 0 .../mapper/{ => system}/MenuMapper.xml | 2 +- .../mapper/{ => system}/NoticeMapper.xml | 65 ++-- .../mapper/{ => system}/RoleMapper.xml | 0 .../mapper/{ => system}/RoleMenuMapper.xml | 4 +- .../mapper/{ => system}/UserMapper.xml | 0 .../mapper/system/UserNoticeMapper.xml | 44 +++ .../mapper/{ => system}/UserRoleMapper.xml | 0 75 files changed, 750 insertions(+), 805 deletions(-) delete mode 100644 src/main/java/com/youlai/boot/common/enums/NoticeTypeEnum.java delete mode 100644 src/main/java/com/youlai/boot/common/enums/NoticeWayEnum.java delete mode 100644 src/main/java/com/youlai/boot/common/util/CommonUtil.java rename src/main/java/com/youlai/boot/{common => module/auth}/enums/CaptchaTypeEnum.java (88%) rename src/main/java/com/youlai/boot/{common => module/codegen}/enums/FormTypeEnum.java (97%) rename src/main/java/com/youlai/boot/{common => module/codegen}/enums/JavaTypeEnum.java (98%) rename src/main/java/com/youlai/boot/{common => module/codegen}/enums/QueryTypeEnum.java (96%) create mode 100644 src/main/java/com/youlai/boot/module/websocket/listener/OnlineUserListener.java delete mode 100644 src/main/java/com/youlai/boot/module/websocket/service/MessageService.java create mode 100644 src/main/java/com/youlai/boot/module/websocket/service/OnlineUserService.java delete mode 100644 src/main/java/com/youlai/boot/module/websocket/service/impl/WebsocketServiceImpl.java rename src/main/java/com/youlai/boot/{common => system}/enums/ContactType.java (82%) rename src/main/java/com/youlai/boot/{common => system}/enums/GenderEnum.java (92%) rename src/main/java/com/youlai/boot/{common => system}/enums/MenuTypeEnum.java (94%) create mode 100644 src/main/java/com/youlai/boot/system/enums/NoticePublishStatusEnum.java create mode 100644 src/main/java/com/youlai/boot/system/enums/NoticeTargetTypeEnum.java delete mode 100644 src/main/java/com/youlai/boot/system/handler/MessageHandler.java rename src/main/java/com/youlai/boot/system/mapper/{NoticeStatusMapper.java => UserNoticeMapper.java} (63%) create mode 100644 src/main/java/com/youlai/boot/system/model/dto/NoticeDTO.java rename src/main/java/com/youlai/boot/system/model/entity/{NoticeStatus.java => UserNotice.java} (64%) rename src/main/java/com/youlai/boot/system/model/query/{NoticeQuery.java => NoticePageQuery.java} (87%) rename src/main/java/com/youlai/boot/system/model/vo/{NoticeStatusVO.java => UserNoticePageVO.java} (61%) rename src/main/java/com/youlai/boot/system/service/{NoticeStatusService.java => UserNoticeService.java} (65%) delete mode 100644 src/main/java/com/youlai/boot/system/service/impl/NoticeStatusServiceImpl.java create mode 100644 src/main/java/com/youlai/boot/system/service/impl/UserNoticeServiceImpl.java delete mode 100644 src/main/resources/mapper/NoticeStatusMapper.xml rename src/main/resources/mapper/{ => codegen}/DatabaseMapper.xml (100%) rename src/main/resources/mapper/{ => codegen}/GenConfigMapper.xml (100%) rename src/main/resources/mapper/{ => codegen}/GenFieldConfigMapper.xml (100%) rename src/main/resources/mapper/{ => system}/ConfigMapper.xml (100%) rename src/main/resources/mapper/{ => system}/DeptMapper.xml (100%) rename src/main/resources/mapper/{ => system}/DictItemMapper.xml (100%) rename src/main/resources/mapper/{ => system}/DictMapper.xml (100%) rename src/main/resources/mapper/{ => system}/LogMapper.xml (100%) rename src/main/resources/mapper/{ => system}/MenuMapper.xml (97%) rename src/main/resources/mapper/{ => system}/NoticeMapper.xml (52%) rename src/main/resources/mapper/{ => system}/RoleMapper.xml (100%) rename src/main/resources/mapper/{ => system}/RoleMenuMapper.xml (94%) rename src/main/resources/mapper/{ => system}/UserMapper.xml (100%) create mode 100644 src/main/resources/mapper/system/UserNoticeMapper.xml rename src/main/resources/mapper/{ => system}/UserRoleMapper.xml (100%) diff --git a/sql/mysql5/youlai_boot.sql b/sql/mysql5/youlai_boot.sql index 0d542dcb..ab5a4998 100644 --- a/sql/mysql5/youlai_boot.sql +++ b/sql/mysql5/youlai_boot.sql @@ -240,14 +240,14 @@ INSERT INTO `sys_menu` VALUES (123,120,'0,1,120','修改系统配置',4,NULL,'', INSERT INTO `sys_menu` VALUES (124,120,'0,1,120','删除系统配置',4,NULL,'',NULL,'sys:config:delete',0,1,1,4,'',NULL,'2024-07-30 16:31:07','2024-07-30 16:31:07',NULL); INSERT INTO `sys_menu` VALUES (125,120,'0,1,120','刷新系统配置',4,NULL,'',NULL,'sys:config:refresh',0,1,1,5,'',NULL,'2024-07-30 16:31:25','2024-07-30 16:31:25',NULL); INSERT INTO `sys_menu` VALUES (126,1,'0,1','通知公告',1,'Notice','notice','system/notice/index',NULL,NULL,NULL,1,9,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); -INSERT INTO `sys_menu` VALUES (127,126,'0,1,132','查询',4,NULL,'',NULL,'system:notice:query',NULL,NULL,1,1,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); -INSERT INTO `sys_menu` VALUES (128,126,'0,1,133','新增',4,NULL,'',NULL,'system:notice:add',NULL,NULL,1,2,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); -INSERT INTO `sys_menu` VALUES (129,126,'0,1,134','编辑',4,NULL,'',NULL,'system:notice:edit',NULL,NULL,1,3,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); -INSERT INTO `sys_menu` VALUES (130,126,'0,1,135','删除',4,NULL,'',NULL,'system:notice:delete',NULL,NULL,1,4,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); +INSERT INTO `sys_menu` VALUES (127,126,'0,1,132','查询',4,NULL,'',NULL,'sys:notice:query',NULL,NULL,1,1,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); +INSERT INTO `sys_menu` VALUES (128,126,'0,1,133','新增',4,NULL,'',NULL,'sys:notice:add',NULL,NULL,1,2,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); +INSERT INTO `sys_menu` VALUES (129,126,'0,1,134','编辑',4,NULL,'',NULL,'sys:notice:edit',NULL,NULL,1,3,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); +INSERT INTO `sys_menu` VALUES (130,126,'0,1,135','删除',4,NULL,'',NULL,'sys:notice:delete',NULL,NULL,1,4,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); INSERT INTO `sys_menu` VALUES (131,0,'0','消息中心',2,NULL,'/notice','Layout',NULL,1,1,1,13,'el-icon-Message',NULL,'2024-08-31 21:16:06','2024-08-31 21:16:41',NULL); INSERT INTO `sys_menu` VALUES (132,131,'0,136','我的消息',1,'MyNotice','notice','notice/index',NULL,0,1,1,1,'',NULL,'2024-08-31 21:17:36','2024-09-12 11:28:42',NULL); -INSERT INTO `sys_menu` VALUES (133,132,'0,1,131','发布',4,NULL,'',NULL,'system:notice:release',0,1,1,5,'',NULL,'2024-09-01 23:53:52','2024-09-01 23:53:52',NULL); -INSERT INTO `sys_menu` VALUES (134,132,'0,1,131','撤回',4,NULL,'',NULL,'system:notice:recall',0,1,1,6,'',NULL,'2024-09-01 23:54:16','2024-09-01 23:54:16',NULL); +INSERT INTO `sys_menu` VALUES (133,132,'0,1,131','发布',4,NULL,'',NULL,'sys:notice:publish',0,1,1,5,'',NULL,'2024-09-01 23:53:52','2024-09-01 23:53:52',NULL); +INSERT INTO `sys_menu` VALUES (134,132,'0,1,131','撤回',4,NULL,'',NULL,'sys:notice:revoke',0,1,1,6,'',NULL,'2024-09-01 23:54:16','2024-09-01 23:54:16',NULL); -- ---------------------------- -- Table structure for sys_message @@ -419,7 +419,7 @@ CREATE TABLE `sys_user` ( -- ---------------------------- INSERT INTO `sys_user` VALUES (1, 'root', '有来技术', 0, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', NULL, 'https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif', '17621590365', 1, 'youlaitech@163.com', NULL, NULL, NULL, NULL, 0); INSERT INTO `sys_user` VALUES (2, 'admin', '系统管理员', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 1, 'https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif', '17621210366', 1, '', '2019-10-10 13:41:22', NULL, '2022-07-31 12:39:30', NULL, 0); -INSERT INTO `sys_user` VALUES (3, 'test', '测试小用户', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 3, 'https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif', '17621210366', 1, 'youlaitech@163.com', '2021-06-05 01:31:29', NULL, '2021-06-05 01:31:29', NULL, 0); +INSERT INTO `sys_user` VALUES (3, 'websocket', '测试小用户', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 3, 'https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif', '17621210366', 1, 'youlaitech@163.com', '2021-06-05 01:31:29', NULL, '2021-06-05 01:31:29', NULL, 0); -- ---------------------------- -- Table structure for sys_user_role diff --git a/sql/mysql8/youlai_boot.sql b/sql/mysql8/youlai_boot.sql index 370ff92f..f9ab7a55 100644 --- a/sql/mysql8/youlai_boot.sql +++ b/sql/mysql8/youlai_boot.sql @@ -228,14 +228,14 @@ INSERT INTO `sys_menu` VALUES (123,120,'0,1,120','修改系统配置',4,NULL,'', INSERT INTO `sys_menu` VALUES (124,120,'0,1,120','删除系统配置',4,NULL,'',NULL,'sys:config:delete',0,1,1,4,'',NULL,'2024-07-30 16:31:07','2024-07-30 16:31:07',NULL); INSERT INTO `sys_menu` VALUES (125,120,'0,1,120','刷新系统配置',4,NULL,'',NULL,'sys:config:refresh',0,1,1,5,'',NULL,'2024-07-30 16:31:25','2024-07-30 16:31:25',NULL); INSERT INTO `sys_menu` VALUES (126,1,'0,1','通知公告',1,'Notice','notice','system/notice/index',NULL,NULL,NULL,1,9,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); -INSERT INTO `sys_menu` VALUES (127,126,'0,1,132','查询',4,NULL,'',NULL,'system:notice:query',NULL,NULL,1,1,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); -INSERT INTO `sys_menu` VALUES (128,126,'0,1,133','新增',4,NULL,'',NULL,'system:notice:add',NULL,NULL,1,2,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); -INSERT INTO `sys_menu` VALUES (129,126,'0,1,134','编辑',4,NULL,'',NULL,'system:notice:edit',NULL,NULL,1,3,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); -INSERT INTO `sys_menu` VALUES (130,126,'0,1,135','删除',4,NULL,'',NULL,'system:notice:delete',NULL,NULL,1,4,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); +INSERT INTO `sys_menu` VALUES (127,126,'0,1,132','查询',4,NULL,'',NULL,'sys:notice:query',NULL,NULL,1,1,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); +INSERT INTO `sys_menu` VALUES (128,126,'0,1,133','新增',4,NULL,'',NULL,'sys:notice:add',NULL,NULL,1,2,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); +INSERT INTO `sys_menu` VALUES (129,126,'0,1,134','编辑',4,NULL,'',NULL,'sys:notice:edit',NULL,NULL,1,3,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); +INSERT INTO `sys_menu` VALUES (130,126,'0,1,135','删除',4,NULL,'',NULL,'sys:notice:delete',NULL,NULL,1,4,'',NULL,'2024-08-24 13:39:03','2024-08-24 13:39:03',NULL); INSERT INTO `sys_menu` VALUES (131,0,'0','消息中心',2,NULL,'/notice','Layout',NULL,1,1,1,13,'el-icon-Message',NULL,'2024-08-31 21:16:06','2024-08-31 21:16:41',NULL); INSERT INTO `sys_menu` VALUES (132,131,'0,136','我的消息',1,'MyNotice','notice','notice/index',NULL,0,1,1,1,'',NULL,'2024-08-31 21:17:36','2024-09-12 11:28:42',NULL); -INSERT INTO `sys_menu` VALUES (133,132,'0,1,131','发布',4,NULL,'',NULL,'system:notice:release',0,1,1,5,'',NULL,'2024-09-01 23:53:52','2024-09-01 23:53:52',NULL); -INSERT INTO `sys_menu` VALUES (134,132,'0,1,131','撤回',4,NULL,'',NULL,'system:notice:recall',0,1,1,6,'',NULL,'2024-09-01 23:54:16','2024-09-01 23:54:16',NULL); +INSERT INTO `sys_menu` VALUES (133,132,'0,1,131','发布',4,NULL,'',NULL,'sys:notice:publish',0,1,1,5,'',NULL,'2024-09-01 23:53:52','2024-09-01 23:53:52',NULL); +INSERT INTO `sys_menu` VALUES (134,132,'0,1,131','撤回',4,NULL,'',NULL,'sys:notice:revoke',0,1,1,6,'',NULL,'2024-09-01 23:54:16','2024-09-01 23:54:16',NULL); -- ---------------------------- -- Table structure for sys_message @@ -407,7 +407,7 @@ CREATE TABLE `sys_user` ( -- ---------------------------- INSERT INTO `sys_user` VALUES (1, 'root', '有来技术', 0, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', NULL, 'https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif', '17621590365', 1, 'youlaitech@163.com', NULL, NULL, NULL, NULL, 0); INSERT INTO `sys_user` VALUES (2, 'admin', '系统管理员', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 1, 'https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif', '17621210366', 1, '', '2019-10-10 13:41:22', NULL, '2022-07-31 12:39:30', NULL, 0); -INSERT INTO `sys_user` VALUES (3, 'test', '测试小用户', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 3, 'https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif', '17621210366', 1, 'youlaitech@163.com', '2021-06-05 01:31:29', NULL, '2021-06-05 01:31:29', NULL, 0); +INSERT INTO `sys_user` VALUES (3, 'websocket', '测试小用户', 1, '$2a$10$xVWsNOhHrCxh5UbpCE7/HuJ.PAOKcYAqRxD2CO2nVnJS.IAXkr5aq', 3, 'https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif', '17621210366', 1, 'youlaitech@163.com', '2021-06-05 01:31:29', NULL, '2021-06-05 01:31:29', NULL, 0); -- ---------------------------- -- Table structure for sys_user_role diff --git a/src/main/java/com/youlai/boot/common/enums/NoticeTypeEnum.java b/src/main/java/com/youlai/boot/common/enums/NoticeTypeEnum.java deleted file mode 100644 index 2bf5b176..00000000 --- a/src/main/java/com/youlai/boot/common/enums/NoticeTypeEnum.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.youlai.boot.common.enums; - -import com.youlai.boot.common.base.IBaseEnum; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * 通知类型枚举 - * 0-系统消息 - * - * @since 2024-9-1 17:33:06 - * @author Theo - */ -@Getter -@RequiredArgsConstructor -public enum NoticeTypeEnum implements IBaseEnum { - - /** - * 通知类型 - */ - SYSTEM_MESSAGE(0, "系统消息"); - - @Getter - private Integer value; - - @Getter - private String label; - - NoticeTypeEnum(Integer value, String label) { - this.value = value; - this.label = label; - } -} diff --git a/src/main/java/com/youlai/boot/common/enums/NoticeWayEnum.java b/src/main/java/com/youlai/boot/common/enums/NoticeWayEnum.java deleted file mode 100644 index bf11e68c..00000000 --- a/src/main/java/com/youlai/boot/common/enums/NoticeWayEnum.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.youlai.boot.common.enums; - -import com.youlai.boot.common.base.IBaseEnum; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * 通知方式枚举 - * @author Theo - * @since 2024-9-2 14:32:58 - */ -@Getter -@RequiredArgsConstructor -public enum NoticeWayEnum implements IBaseEnum { - /** - * 通知方式 - */ - WEBSOCKET("webSocket", "发送websocket消息"); - - @Getter - private String value; - - @Getter - private String label; - - NoticeWayEnum(String value, String label) { - this.value = value; - this.label = label; - } -} diff --git a/src/main/java/com/youlai/boot/common/enums/StatusEnum.java b/src/main/java/com/youlai/boot/common/enums/StatusEnum.java index 4d767c83..229086fa 100644 --- a/src/main/java/com/youlai/boot/common/enums/StatusEnum.java +++ b/src/main/java/com/youlai/boot/common/enums/StatusEnum.java @@ -9,16 +9,16 @@ import lombok.Getter; * @author haoxr * @since 2022/10/14 */ +@Getter public enum StatusEnum implements IBaseEnum { ENABLE(1, "启用"), DISABLE (0, "禁用"); - @Getter - private Integer value; + private final Integer value; - @Getter - private String label; + + private final String label; StatusEnum(Integer value, String label) { this.value = value; diff --git a/src/main/java/com/youlai/boot/common/util/CommonUtil.java b/src/main/java/com/youlai/boot/common/util/CommonUtil.java deleted file mode 100644 index f039ed48..00000000 --- a/src/main/java/com/youlai/boot/common/util/CommonUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.youlai.boot.common.util; - -import com.youlai.boot.common.constant.SymbolConstant; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 通用工具类 - * - * @author Theo - * @since 2024-9-1 23:42:33 - * @version 1.0.0 - */ -public class CommonUtil { - - private CommonUtil(){} - - - - /** - * 将List转换为字符串 - * - * @param list List - * @param separator 分隔符 - * @return 字符串 - */ - public static String listToStr(List list, String separator) { - return list.stream().collect(Collectors.joining(separator)); - } - - /** - * 将字符串转换为List - * - * @param list List - * @return List - */ - public static String listToStr(List list) { - return listToStr(list, SymbolConstant.COMMA); - } - - /** - * 将字符串转换为List - * - * @param str 字符串 - * @return List - */ - public static List strToList(String str) { - return strToList(str, SymbolConstant.COMMA); - } - - /** - * 将字符串转换为List - * - * @param str 字符串 - * @param separator 分隔符 - * @return List - */ - public static List strToList(String str, String separator) { - return List.of(str.split(separator)); - } - - - public static String delHtmlTags(String htmlStr) { - return htmlStr.replaceAll("<[^>]+>", ""); - } -} diff --git a/src/main/java/com/youlai/boot/module/auth/controller/AuthController.java b/src/main/java/com/youlai/boot/module/auth/controller/AuthController.java index d6d7d06d..4e3f7825 100644 --- a/src/main/java/com/youlai/boot/module/auth/controller/AuthController.java +++ b/src/main/java/com/youlai/boot/module/auth/controller/AuthController.java @@ -1,13 +1,11 @@ package com.youlai.boot.module.auth.controller; -import com.youlai.boot.common.constant.RedisConstants; import com.youlai.boot.common.enums.LogModuleEnum; import com.youlai.boot.common.result.Result; import com.youlai.boot.module.auth.service.AuthService; import com.youlai.boot.system.model.dto.CaptchaResult; import com.youlai.boot.system.model.dto.LoginResult; import com.youlai.boot.common.annotation.Log; -import com.youlai.boot.system.service.ConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; diff --git a/src/main/java/com/youlai/boot/common/enums/CaptchaTypeEnum.java b/src/main/java/com/youlai/boot/module/auth/enums/CaptchaTypeEnum.java similarity index 88% rename from src/main/java/com/youlai/boot/common/enums/CaptchaTypeEnum.java rename to src/main/java/com/youlai/boot/module/auth/enums/CaptchaTypeEnum.java index 8d3fe10e..1a0ec96f 100644 --- a/src/main/java/com/youlai/boot/common/enums/CaptchaTypeEnum.java +++ b/src/main/java/com/youlai/boot/module/auth/enums/CaptchaTypeEnum.java @@ -1,4 +1,4 @@ -package com.youlai.boot.common.enums; +package com.youlai.boot.module.auth.enums; /** * EasyCaptcha 验证码类型枚举 diff --git a/src/main/java/com/youlai/boot/module/auth/service/impl/AuthServiceImpl.java b/src/main/java/com/youlai/boot/module/auth/service/impl/AuthServiceImpl.java index b4e734c2..b1ee363c 100644 --- a/src/main/java/com/youlai/boot/module/auth/service/impl/AuthServiceImpl.java +++ b/src/main/java/com/youlai/boot/module/auth/service/impl/AuthServiceImpl.java @@ -9,7 +9,7 @@ import cn.hutool.json.JSONObject; import cn.hutool.jwt.JWTPayload; import cn.hutool.jwt.JWTUtil; import com.youlai.boot.common.constant.SecurityConstants; -import com.youlai.boot.common.enums.CaptchaTypeEnum; +import com.youlai.boot.module.auth.enums.CaptchaTypeEnum; import com.youlai.boot.module.auth.service.AuthService; import com.youlai.boot.system.model.dto.CaptchaResult; import com.youlai.boot.system.model.dto.LoginResult; diff --git a/src/main/java/com/youlai/boot/common/enums/FormTypeEnum.java b/src/main/java/com/youlai/boot/module/codegen/enums/FormTypeEnum.java similarity index 97% rename from src/main/java/com/youlai/boot/common/enums/FormTypeEnum.java rename to src/main/java/com/youlai/boot/module/codegen/enums/FormTypeEnum.java index cad7f245..4e271e1d 100644 --- a/src/main/java/com/youlai/boot/common/enums/FormTypeEnum.java +++ b/src/main/java/com/youlai/boot/module/codegen/enums/FormTypeEnum.java @@ -1,4 +1,4 @@ -package com.youlai.boot.common.enums; +package com.youlai.boot.module.codegen.enums; import com.baomidou.mybatisplus.annotation.EnumValue; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/youlai/boot/common/enums/JavaTypeEnum.java b/src/main/java/com/youlai/boot/module/codegen/enums/JavaTypeEnum.java similarity index 98% rename from src/main/java/com/youlai/boot/common/enums/JavaTypeEnum.java rename to src/main/java/com/youlai/boot/module/codegen/enums/JavaTypeEnum.java index 2d544b88..f6f89f58 100644 --- a/src/main/java/com/youlai/boot/common/enums/JavaTypeEnum.java +++ b/src/main/java/com/youlai/boot/module/codegen/enums/JavaTypeEnum.java @@ -1,4 +1,4 @@ -package com.youlai.boot.common.enums; +package com.youlai.boot.module.codegen.enums; import lombok.Getter; diff --git a/src/main/java/com/youlai/boot/common/enums/QueryTypeEnum.java b/src/main/java/com/youlai/boot/module/codegen/enums/QueryTypeEnum.java similarity index 96% rename from src/main/java/com/youlai/boot/common/enums/QueryTypeEnum.java rename to src/main/java/com/youlai/boot/module/codegen/enums/QueryTypeEnum.java index 0428f4f0..5e665ed7 100644 --- a/src/main/java/com/youlai/boot/common/enums/QueryTypeEnum.java +++ b/src/main/java/com/youlai/boot/module/codegen/enums/QueryTypeEnum.java @@ -1,4 +1,4 @@ -package com.youlai.boot.common.enums; +package com.youlai.boot.module.codegen.enums; import com.baomidou.mybatisplus.annotation.EnumValue; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/youlai/boot/module/codegen/model/entity/GenFieldConfig.java b/src/main/java/com/youlai/boot/module/codegen/model/entity/GenFieldConfig.java index 742067e2..c67a2436 100644 --- a/src/main/java/com/youlai/boot/module/codegen/model/entity/GenFieldConfig.java +++ b/src/main/java/com/youlai/boot/module/codegen/model/entity/GenFieldConfig.java @@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonIgnore; import com.youlai.boot.common.base.BaseEntity; -import com.youlai.boot.common.enums.FormTypeEnum; -import com.youlai.boot.common.enums.QueryTypeEnum; +import com.youlai.boot.module.codegen.enums.FormTypeEnum; +import com.youlai.boot.module.codegen.enums.QueryTypeEnum; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/youlai/boot/module/codegen/model/form/GenConfigForm.java b/src/main/java/com/youlai/boot/module/codegen/model/form/GenConfigForm.java index ddc8a473..19e3f71d 100644 --- a/src/main/java/com/youlai/boot/module/codegen/model/form/GenConfigForm.java +++ b/src/main/java/com/youlai/boot/module/codegen/model/form/GenConfigForm.java @@ -1,7 +1,7 @@ package com.youlai.boot.module.codegen.model.form; -import com.youlai.boot.common.enums.FormTypeEnum; -import com.youlai.boot.common.enums.QueryTypeEnum; +import com.youlai.boot.module.codegen.enums.FormTypeEnum; +import com.youlai.boot.module.codegen.enums.QueryTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java b/src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java index 7e54dc91..56f11acc 100644 --- a/src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java +++ b/src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java @@ -10,12 +10,11 @@ import cn.hutool.extra.template.TemplateEngine; import cn.hutool.extra.template.TemplateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.youlai.boot.common.enums.JavaTypeEnum; +import com.youlai.boot.module.codegen.enums.JavaTypeEnum; import com.youlai.boot.config.property.CodegenProperties; import com.youlai.boot.module.codegen.service.GenConfigService; import com.youlai.boot.module.codegen.service.GenFieldConfigService; import com.youlai.boot.module.codegen.service.CodegenService; -import com.youlai.boot.module.codegen.converter.CodegenConverter; import com.youlai.boot.common.exception.BusinessException; import com.youlai.boot.module.codegen.mapper.DatabaseMapper; import com.youlai.boot.module.codegen.model.entity.GenConfig; @@ -23,10 +22,8 @@ import com.youlai.boot.module.codegen.model.entity.GenFieldConfig; import com.youlai.boot.module.codegen.model.query.TablePageQuery; import com.youlai.boot.module.codegen.model.vo.CodegenPreviewVO; import com.youlai.boot.module.codegen.model.vo.TablePageVO; -import com.youlai.boot.system.service.MenuService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.ByteArrayOutputStream; @@ -224,7 +221,7 @@ public class CodegenServiceImpl implements CodegenService { bindMap.put("tableName", genConfig.getTableName()); bindMap.put("author", genConfig.getAuthor()); bindMap.put("lowerFirstEntityName", StrUtil.lowerFirst(entityName)); // UserTest → userTest - bindMap.put("kebabCaseEntityName", StrUtil.toSymbolCase(entityName, '-')); // UserTest → user-test + bindMap.put("kebabCaseEntityName", StrUtil.toSymbolCase(entityName, '-')); // UserTest → user-websocket bindMap.put("businessName", genConfig.getBusinessName()); bindMap.put("fieldConfigs", fieldConfigs); diff --git a/src/main/java/com/youlai/boot/module/codegen/service/impl/GenConfigServiceImpl.java b/src/main/java/com/youlai/boot/module/codegen/service/impl/GenConfigServiceImpl.java index bf4975b0..a937cfc6 100644 --- a/src/main/java/com/youlai/boot/module/codegen/service/impl/GenConfigServiceImpl.java +++ b/src/main/java/com/youlai/boot/module/codegen/service/impl/GenConfigServiceImpl.java @@ -7,9 +7,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.boot.YouLaiApplication; import com.youlai.boot.common.enums.EnvEnum; -import com.youlai.boot.common.enums.FormTypeEnum; -import com.youlai.boot.common.enums.JavaTypeEnum; -import com.youlai.boot.common.enums.QueryTypeEnum; +import com.youlai.boot.module.codegen.enums.FormTypeEnum; +import com.youlai.boot.module.codegen.enums.JavaTypeEnum; +import com.youlai.boot.module.codegen.enums.QueryTypeEnum; import com.youlai.boot.common.exception.BusinessException; import com.youlai.boot.config.property.CodegenProperties; import com.youlai.boot.module.codegen.converter.CodegenConverter; diff --git a/src/main/java/com/youlai/boot/module/file/service/impl/MinioFileService.java b/src/main/java/com/youlai/boot/module/file/service/impl/MinioFileService.java index 6157e671..a1d95807 100644 --- a/src/main/java/com/youlai/boot/module/file/service/impl/MinioFileService.java +++ b/src/main/java/com/youlai/boot/module/file/service/impl/MinioFileService.java @@ -138,10 +138,10 @@ public class MinioFileService implements FileService { try { String fileName; if (StrUtil.isNotBlank(customDomain)) { - // https://oss.youlai.tech/default/20221120/test.jpg → 20221120/test.jpg + // https://oss.youlai.tech/default/20221120/test.jpg → 20221120/websocket.jpg fileName = filePath.substring(customDomain.length() + 1 + bucketName.length() + 1); // 两个/占了2个字符长度 } else { - // http://localhost:9000/default/20221120/test.jpg → 20221120/test.jpg + // http://localhost:9000/default/20221120/test.jpg → 20221120/websocket.jpg fileName = filePath.substring(endpoint.length() + 1 + bucketName.length() + 1); } RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder() diff --git a/src/main/java/com/youlai/boot/module/websocket/controller/WebsocketController.java b/src/main/java/com/youlai/boot/module/websocket/controller/WebsocketController.java index 5bf9b089..aa234cac 100644 --- a/src/main/java/com/youlai/boot/module/websocket/controller/WebsocketController.java +++ b/src/main/java/com/youlai/boot/module/websocket/controller/WebsocketController.java @@ -1,6 +1,5 @@ package com.youlai.boot.module.websocket.controller; -import com.youlai.boot.common.enums.NoticeTypeEnum; import com.youlai.boot.system.model.dto.ChatMessage; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,7 +13,9 @@ import org.springframework.web.bind.annotation.RestController; import java.security.Principal; /** - * WebSocket 测试控制层 + * WebSocket 测试用例控制层 + *

+ * 包含点对点/广播发送消息 * * @author Ray * @since 2.3.0 @@ -28,7 +29,6 @@ public class WebsocketController { private final SimpMessagingTemplate messagingTemplate; - /** * 广播发送消息 * @@ -58,7 +58,7 @@ public class WebsocketController { log.info("发送人:{}; 接收人:{}", sender, receiver); // 发送消息给指定用户,拼接后路径 /user/{receiver}/queue/greeting - messagingTemplate.convertAndSendToUser(receiver, "/queue/greeting", new ChatMessage(sender, message, NoticeTypeEnum.SYSTEM_MESSAGE)); + messagingTemplate.convertAndSendToUser(receiver, "/queue/greeting", new ChatMessage(sender, message)); } } diff --git a/src/main/java/com/youlai/boot/module/websocket/listener/OnlineUserListener.java b/src/main/java/com/youlai/boot/module/websocket/listener/OnlineUserListener.java new file mode 100644 index 00000000..29585023 --- /dev/null +++ b/src/main/java/com/youlai/boot/module/websocket/listener/OnlineUserListener.java @@ -0,0 +1,44 @@ +package com.youlai.boot.module.websocket.listener; + +import com.youlai.boot.module.websocket.service.OnlineUserService; +import com.youlai.boot.system.event.UserConnectionEvent; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Component; + +/** + * 在线用户监听器 + * + * @author haoxr + * @since 2024/9/25 + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class OnlineUserListener { + + private final SimpMessagingTemplate messagingTemplate; + private final OnlineUserService onlineUserService; + + /** + * 用户连接事件处理 + * + * @param event 用户连接事件 + */ + @EventListener + public void handleUserConnectionEvent(UserConnectionEvent event) { + String username = event.getUsername(); + if (event.isConnected()) { + onlineUserService.addOnlineUser(username); + log.info("User connected: {}", username); + } else { + onlineUserService.removeOnlineUser(username); + log.info("User disconnected: {}", username); + } + // 推送在线用户人数 + messagingTemplate.convertAndSend("/topic/onlineUserCount", onlineUserService.getOnlineUserCount()); + } + +} diff --git a/src/main/java/com/youlai/boot/module/websocket/service/MessageService.java b/src/main/java/com/youlai/boot/module/websocket/service/MessageService.java deleted file mode 100644 index 040990b7..00000000 --- a/src/main/java/com/youlai/boot/module/websocket/service/MessageService.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.youlai.boot.module.websocket.service; - -import com.youlai.boot.common.enums.NoticeWayEnum; -import com.youlai.boot.system.model.dto.MessageDTO; - -/** - * 消息服务接口 - * - * @author Theo - * @since 2024-9-2 14:32:58 - */ -public interface MessageService { - - - /** - * 检查消息类型 - * - * @param messageType 消息类型 - * @return 是否支持 - */ - boolean check(NoticeWayEnum messageType); - - /** - * 发送消息 - * - * @param message 消息 - */ - void sendMessage(MessageDTO message); -} diff --git a/src/main/java/com/youlai/boot/module/websocket/service/OnlineUserService.java b/src/main/java/com/youlai/boot/module/websocket/service/OnlineUserService.java new file mode 100644 index 00000000..87b23b8c --- /dev/null +++ b/src/main/java/com/youlai/boot/module/websocket/service/OnlineUserService.java @@ -0,0 +1,70 @@ +package com.youlai.boot.module.websocket.service; + +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * 在线用户服务 + * + * @author haoxr + * @since 2024/9/26 + */ + +@Service +public class OnlineUserService { + + private final Set onlineUsers = ConcurrentHashMap.newKeySet(); + + /** + * 添加用户到在线用户集合 + * + * @param username 用户名 + */ + public void addOnlineUser(String username) { + onlineUsers.add(username); + } + + /** + * 从在线用户集合移除用户 + * + * @param username 用户名 + */ + public void removeOnlineUser(String username) { + onlineUsers.remove(username); + } + + /** + * 获取所有在线用户 + * + * @return 在线用户集合 + */ + public Set getAllOnlineUsers() { + return Collections.unmodifiableSet(onlineUsers); + } + + /** + * 获取在线的接收者 + * 从所有接收者中过滤出在线的接收者 + * + * @param receivers 接收者 + * @return 在线的接收者集合 + */ + public Set getOnlineReceivers(Set receivers) { + return receivers.stream().filter(onlineUsers::contains).collect(Collectors.toSet()); + } + + /** + * 获取在线用户数量 + * + * @return 在线用户数量 + */ + public int getOnlineUserCount() { + return onlineUsers.size(); + } + + +} diff --git a/src/main/java/com/youlai/boot/module/websocket/service/impl/WebsocketServiceImpl.java b/src/main/java/com/youlai/boot/module/websocket/service/impl/WebsocketServiceImpl.java deleted file mode 100644 index aab4fd50..00000000 --- a/src/main/java/com/youlai/boot/module/websocket/service/impl/WebsocketServiceImpl.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.youlai.boot.module.websocket.service.impl; - -import com.youlai.boot.common.enums.NoticeWayEnum; -import com.youlai.boot.common.enums.NoticeTypeEnum; -import com.youlai.boot.module.websocket.service.MessageService; -import com.youlai.boot.system.event.UserConnectionEvent; -import com.youlai.boot.system.model.dto.ChatMessage; -import com.youlai.boot.system.model.dto.MessageDTO; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.event.EventListener; -import org.springframework.messaging.simp.SimpMessagingTemplate; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -/** - * WebSocket消息服务实现类 - * - * @author ray - * @since 2024-9-2 14:32:58 - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class WebsocketServiceImpl implements MessageService { - - private final SimpMessagingTemplate messagingTemplate; - - private final Set onlineUsers = ConcurrentHashMap.newKeySet(); - - /** - * 用户连接事件处理 - * - * @param event 用户连接事件 - */ - @EventListener - public void handleUserConnectionEvent(UserConnectionEvent event) { - String username = event.getUsername(); - if (event.isConnected()) { - onlineUsers.add(username); - log.info("User connected: {}", username); - } else { - onlineUsers.remove(username); - log.info("User disconnected: {}", username); - } - // 推送在线用户人数 - messagingTemplate.convertAndSend("/topic/onlineUserCount", onlineUsers.size()); - } - - /** - * 定时推送在线用户人数 - */ - @Scheduled(fixedRate = 5000) - public void sendOnlineUserCount() { - messagingTemplate.convertAndSend("/topic/onlineUserCount", onlineUsers.size()); - } - - - /** - * 策略模式检查 - * - * @param noticeWayEnum 通知方式 - * @return boolean 是否支持 - */ - @Override - public boolean check(NoticeWayEnum noticeWayEnum) { - return noticeWayEnum.equals(NoticeWayEnum.WEBSOCKET); - } - - /** - * 发送消息 - * - * @param message 消息 - */ - @Override - public void sendMessage(MessageDTO message) { - List users = null; - if(message.getReceiver() == null || message.getReceiver().isEmpty()){ - // 发送给所有在线用户 离线用户不发送,因为离线用户下次登录会直接查询未读消息 - users = new ArrayList<>(onlineUsers); - }else{ - users = message.getReceiver().stream().filter(onlineUsers::contains).collect(Collectors.toList()); - } - //获取当前用户 - ChatMessage chatMessage = new ChatMessage(message.getSender(), message.getContent(), NoticeTypeEnum.SYSTEM_MESSAGE); - users.forEach(receiver -> { - messagingTemplate.convertAndSendToUser(receiver, "/queue/message", chatMessage); - }); - } -} diff --git a/src/main/java/com/youlai/boot/system/controller/NoticeController.java b/src/main/java/com/youlai/boot/system/controller/NoticeController.java index 3e2ac049..2f628dd6 100644 --- a/src/main/java/com/youlai/boot/system/controller/NoticeController.java +++ b/src/main/java/com/youlai/boot/system/controller/NoticeController.java @@ -4,11 +4,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.youlai.boot.common.result.PageResult; import com.youlai.boot.common.result.Result; import com.youlai.boot.system.model.form.NoticeForm; -import com.youlai.boot.system.model.query.NoticeQuery; -import com.youlai.boot.system.model.vo.NoticeStatusVO; +import com.youlai.boot.system.model.query.NoticePageQuery; +import com.youlai.boot.system.model.vo.NoticeDetailVO; +import com.youlai.boot.system.model.vo.UserNoticePageVO; import com.youlai.boot.system.model.vo.NoticeVO; import com.youlai.boot.system.service.NoticeService; -import com.youlai.boot.system.service.NoticeStatusService; +import com.youlai.boot.system.service.UserNoticeService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -18,6 +19,8 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 通知公告前端控制层 * @@ -28,48 +31,51 @@ import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/v1/notices") @RequiredArgsConstructor -public class NoticeController { +public class NoticeController { private final NoticeService noticeService; - private final NoticeStatusService noticeStatusService; + private final UserNoticeService userNoticeService; @Operation(summary = "通知公告分页列表") @GetMapping("/page") - @PreAuthorize("@ss.hasPerm('system:notice:query')") - public PageResult getNoticePage(NoticeQuery queryParams ) { + @PreAuthorize("@ss.hasPerm('sys:notice:query')") + public PageResult getNoticePage(NoticePageQuery queryParams) { IPage result = noticeService.getNoticePage(queryParams); return PageResult.success(result); } @Operation(summary = "新增通知公告") @PostMapping - @PreAuthorize("@ss.hasPerm('system:notice:add')") - public Result saveNotice(@RequestBody @Valid NoticeForm formData ) { + @PreAuthorize("@ss.hasPerm('sys:notice:add')") + public Result saveNotice(@RequestBody @Valid NoticeForm formData) { boolean result = noticeService.saveNotice(formData); return Result.judge(result); } @Operation(summary = "获取通知公告表单数据") @GetMapping("/{id}/form") - @PreAuthorize("@ss.hasPerm('system:notice:edit')") + @PreAuthorize("@ss.hasPerm('sys:notice:edit')") public Result getNoticeForm( - @Parameter(description = "通知公告ID") @PathVariable Long id + @Parameter(description = "通知公告ID") @PathVariable Long id ) { NoticeForm formData = noticeService.getNoticeFormData(id); return Result.success(formData); } - @Operation(summary = "管理页面查看通知公告") - @GetMapping("/detail/{id}") - public Result getReadNoticeDetail( - @Parameter(description = "通知公告ID")@PathVariable Long id) { - return Result.success(noticeService.getReadNoticeDetail(id)); + + @Operation(summary = "阅读获取通知公告详情") + @GetMapping("/{id}/detail") + public Result getNoticeDetail( + @Parameter(description = "通知公告ID") @PathVariable Long id + ) { + NoticeDetailVO detailVO = noticeService.getNoticeDetail(id); + return Result.success(detailVO); } @Operation(summary = "修改通知公告") @PutMapping(value = "/{id}") - @PreAuthorize("@ss.hasPerm('system:notice:edit')") - public Result updateNotice( + @PreAuthorize("@ss.hasPerm('sys:notice:edit')") + public Result updateNotice( @Parameter(description = "通知公告ID") @PathVariable Long id, @RequestBody @Validated NoticeForm formData ) { @@ -78,26 +84,30 @@ public class NoticeController { } @Operation(summary = "发布通知公告") - @PatchMapping(value = "/release/{id}") - @PreAuthorize("@ss.hasPerm('system:notice:release')") - public Result releaseNotice(@Parameter(description = "通知公告ID") @PathVariable Long id) { - boolean result = noticeService.releaseNotice(id); + @PatchMapping(value = "/{id}/publish") + @PreAuthorize("@ss.hasPerm('sys:notice:publish')") + public Result publishNotice( + @Parameter(description = "通知公告ID") @PathVariable Long id + ) { + boolean result = noticeService.publishNotice(id); return Result.judge(result); } @Operation(summary = "撤回通知公告") - @PatchMapping(value = "/recall/{id}") - @PreAuthorize("@ss.hasPerm('system:notice:recall')") - public Result recallNotice(@Parameter(description = "通知公告ID") @PathVariable Long id) { - boolean result = noticeService.recallNotice(id); + @PatchMapping(value = "/{id}/revoke") + @PreAuthorize("@ss.hasPerm('sys:notice:revoke')") + public Result revokeNotice( + @Parameter(description = "通知公告ID") @PathVariable Long id + ) { + boolean result = noticeService.revokeNotice(id); return Result.judge(result); } @Operation(summary = "删除通知公告") @DeleteMapping("/{ids}") - @PreAuthorize("@ss.hasPerm('system:notice:delete')") - public Result deleteNotices( - @Parameter(description = "通知公告ID,多个以英文逗号(,)分割") @PathVariable String ids + @PreAuthorize("@ss.hasPerm('sys:notice:delete')") + public Result deleteNotices( + @Parameter(description = "通知公告ID,多个以英文逗号(,)分割") @PathVariable String ids ) { boolean result = noticeService.deleteNotices(ids); return Result.judge(result); @@ -105,27 +115,22 @@ public class NoticeController { @Operation(summary = "获取未读的通知公告") @GetMapping("/unread") - public Result listUnreadNotices() { - return Result.success(noticeStatusService.listUnreadNotices()); - } - - @Operation(summary = "阅读通知公告") - @PatchMapping("/read/{id}") - public Result readNotice(@PathVariable Long id) { - return Result.success(noticeService.readNotice(id)); + public Result> listUnreadNotices() { + List list = userNoticeService.listUnreadNotices(); + return Result.success(list); } @Operation(summary = "全部已读") - @PatchMapping("/readAll") - public Result readAll() { - noticeStatusService.readAll(); + @PatchMapping("/read-all") + public Result readAll() { + userNoticeService.readAll(); return Result.success(); } - @Operation(summary = "获取我的通知公告") + @Operation(summary = "获取我的通知公告分页列表") @GetMapping("/my/page") - public PageResult getMyNoticePage(NoticeQuery queryParams) { - IPage result = noticeService.getMyNoticePage(queryParams); + public PageResult getMyNoticePage(NoticePageQuery queryParams) { + IPage result = noticeService.getMyNoticePage(queryParams); return PageResult.success(result); } } diff --git a/src/main/java/com/youlai/boot/system/controller/UserController.java b/src/main/java/com/youlai/boot/system/controller/UserController.java index bac8aa85..ca67883e 100644 --- a/src/main/java/com/youlai/boot/system/controller/UserController.java +++ b/src/main/java/com/youlai/boot/system/controller/UserController.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.youlai.boot.common.annotation.Log; import com.youlai.boot.common.annotation.RepeatSubmit; -import com.youlai.boot.common.enums.ContactType; +import com.youlai.boot.system.enums.ContactType; import com.youlai.boot.common.enums.LogModuleEnum; import com.youlai.boot.common.model.Option; import com.youlai.boot.common.result.PageResult; diff --git a/src/main/java/com/youlai/boot/system/converter/NoticeConverter.java b/src/main/java/com/youlai/boot/system/converter/NoticeConverter.java index 3ba79b45..737ee2d6 100644 --- a/src/main/java/com/youlai/boot/system/converter/NoticeConverter.java +++ b/src/main/java/com/youlai/boot/system/converter/NoticeConverter.java @@ -1,9 +1,11 @@ package com.youlai.boot.system.converter; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.youlai.boot.system.model.bo.NoticeBO; import com.youlai.boot.system.model.entity.Notice; import com.youlai.boot.system.model.form.NoticeForm; +import com.youlai.boot.system.model.vo.NoticeDetailVO; import com.youlai.boot.system.model.vo.NoticeVO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -18,22 +20,20 @@ import org.mapstruct.Mappings; @Mapper(componentModel = "spring") public interface NoticeConverter{ + @Mappings({ - @Mapping(target = "tarIds", expression = "java(com.youlai.boot.common.util.CommonUtil.strToList(entity.getTarIds()))") + @Mapping(target = "targetUserIds", expression = "java(cn.hutool.core.util.StrUtil.split(entity.getTargetUserIds(),\",\"))") }) NoticeForm toForm(Notice entity); @Mappings({ - @Mapping(target = "tarIds", expression = "java(com.youlai.boot.common.util.CommonUtil.listToStr(formData.getTarIds()))") + @Mapping(target = "targetUserIds", expression = "java(cn.hutool.core.collection.CollUtil.join(formData.getTargetUserIds(),\",\"))") }) Notice toEntity(NoticeForm formData); - NoticeVO toVO(Notice notice); + NoticeVO toPageVo(NoticeBO bo); Page toPageVo(Page noticePage); - @Mappings({ - }) - NoticeVO toPageVo(NoticeBO bo); - + NoticeDetailVO toDetailVO(NoticeBO noticeBO); } diff --git a/src/main/java/com/youlai/boot/system/converter/UserConverter.java b/src/main/java/com/youlai/boot/system/converter/UserConverter.java index 8ba19974..9379954e 100644 --- a/src/main/java/com/youlai/boot/system/converter/UserConverter.java +++ b/src/main/java/com/youlai/boot/system/converter/UserConverter.java @@ -24,7 +24,7 @@ import org.mapstruct.Mappings; public interface UserConverter { @Mappings({ - @Mapping(target = "genderLabel", expression = "java(com.youlai.boot.common.base.IBaseEnum.getLabelByValue(bo.getGender(), com.youlai.boot.common.enums.GenderEnum.class))") + @Mapping(target = "genderLabel", expression = "java(com.youlai.boot.common.base.IBaseEnum.getLabelByValue(bo.getGender(), com.youlai.boot.system.enums.GenderEnum.class))") }) UserPageVO toPageVo(UserBO bo); diff --git a/src/main/java/com/youlai/boot/common/enums/ContactType.java b/src/main/java/com/youlai/boot/system/enums/ContactType.java similarity index 82% rename from src/main/java/com/youlai/boot/common/enums/ContactType.java rename to src/main/java/com/youlai/boot/system/enums/ContactType.java index 317a0516..8c6f87dc 100644 --- a/src/main/java/com/youlai/boot/common/enums/ContactType.java +++ b/src/main/java/com/youlai/boot/system/enums/ContactType.java @@ -1,4 +1,4 @@ -package com.youlai.boot.common.enums; +package com.youlai.boot.system.enums; /** * 联系方式类型 diff --git a/src/main/java/com/youlai/boot/common/enums/GenderEnum.java b/src/main/java/com/youlai/boot/system/enums/GenderEnum.java similarity index 92% rename from src/main/java/com/youlai/boot/common/enums/GenderEnum.java rename to src/main/java/com/youlai/boot/system/enums/GenderEnum.java index 94a565ae..114fd543 100644 --- a/src/main/java/com/youlai/boot/common/enums/GenderEnum.java +++ b/src/main/java/com/youlai/boot/system/enums/GenderEnum.java @@ -1,4 +1,4 @@ -package com.youlai.boot.common.enums; +package com.youlai.boot.system.enums; import com.youlai.boot.common.base.IBaseEnum; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/src/main/java/com/youlai/boot/common/enums/MenuTypeEnum.java b/src/main/java/com/youlai/boot/system/enums/MenuTypeEnum.java similarity index 94% rename from src/main/java/com/youlai/boot/common/enums/MenuTypeEnum.java rename to src/main/java/com/youlai/boot/system/enums/MenuTypeEnum.java index 66c533cb..fa24303e 100644 --- a/src/main/java/com/youlai/boot/common/enums/MenuTypeEnum.java +++ b/src/main/java/com/youlai/boot/system/enums/MenuTypeEnum.java @@ -1,4 +1,4 @@ -package com.youlai.boot.common.enums; +package com.youlai.boot.system.enums; import com.baomidou.mybatisplus.annotation.EnumValue; import com.youlai.boot.common.base.IBaseEnum; diff --git a/src/main/java/com/youlai/boot/system/enums/NoticePublishStatusEnum.java b/src/main/java/com/youlai/boot/system/enums/NoticePublishStatusEnum.java new file mode 100644 index 00000000..f7f5d007 --- /dev/null +++ b/src/main/java/com/youlai/boot/system/enums/NoticePublishStatusEnum.java @@ -0,0 +1,30 @@ +package com.youlai.boot.system.enums; + +import com.youlai.boot.common.base.IBaseEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +/** + * 通告发布状态枚举 + * + * @author haoxr + * @since 2022/10/14 + */ +@Getter +@Schema(enumAsRef = true) +public enum NoticePublishStatusEnum implements IBaseEnum { + + UNPUBLISHED(0, "未发布"), + PUBLISHED(1, "已发布"), + REVOKED(-1, "已撤回"); + + + private final Integer value; + + private final String label; + + NoticePublishStatusEnum(Integer value, String label) { + this.value = value; + this.label = label; + } +} diff --git a/src/main/java/com/youlai/boot/system/enums/NoticeTargetTypeEnum.java b/src/main/java/com/youlai/boot/system/enums/NoticeTargetTypeEnum.java new file mode 100644 index 00000000..f15441d6 --- /dev/null +++ b/src/main/java/com/youlai/boot/system/enums/NoticeTargetTypeEnum.java @@ -0,0 +1,29 @@ +package com.youlai.boot.system.enums; + +import com.youlai.boot.common.base.IBaseEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +/** + * 通知目标类型枚举 + * + * @author haoxr + * @since 2022/10/14 + */ +@Getter +@Schema(enumAsRef = true) +public enum NoticeTargetTypeEnum implements IBaseEnum { + + ALL(1, "全体"), + SPECIFIED(2, "指定"); + + + private final Integer value; + + private final String label; + + NoticeTargetTypeEnum(Integer value, String label) { + this.value = value; + this.label = label; + } +} diff --git a/src/main/java/com/youlai/boot/system/handler/MessageHandler.java b/src/main/java/com/youlai/boot/system/handler/MessageHandler.java deleted file mode 100644 index 689a3816..00000000 --- a/src/main/java/com/youlai/boot/system/handler/MessageHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.youlai.boot.system.handler; - -import com.youlai.boot.module.websocket.service.MessageService; -import com.youlai.boot.system.model.dto.MessageDTO; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * 消息处理器 - * - * @author Theo - * @since 2024-9-2 14:32:58 - */ -@Component -@RequiredArgsConstructor -public class MessageHandler { - - private final List messageServices; - - - /** - * 发送消息 - * 如果后面有多种消息发送方式,可以设置MessageDTO中的noticeWay,调用不同的消息发送方式,实现消息多种发送方式 - * @param messageDTO 消息载体 - */ - public void sendMessage(MessageDTO messageDTO) { - messageServices.forEach(messageService -> { - if (messageService.check(messageDTO.getNoticeWay())) { - messageService.sendMessage(messageDTO); - } - }); - } -} diff --git a/src/main/java/com/youlai/boot/system/listener/UserImportListener.java b/src/main/java/com/youlai/boot/system/listener/UserImportListener.java index 9fb8b011..65c470df 100644 --- a/src/main/java/com/youlai/boot/system/listener/UserImportListener.java +++ b/src/main/java/com/youlai/boot/system/listener/UserImportListener.java @@ -8,13 +8,13 @@ import cn.hutool.json.JSONUtil; import com.alibaba.excel.context.AnalysisContext; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.youlai.boot.common.base.BaseAnalysisEventListener; +import com.youlai.boot.system.enums.GenderEnum; import com.youlai.boot.system.model.entity.Dept; import com.youlai.boot.system.model.entity.Role; import com.youlai.boot.system.model.entity.User; import com.youlai.boot.system.model.entity.UserRole; import com.youlai.boot.common.base.IBaseEnum; import com.youlai.boot.common.constant.SystemConstants; -import com.youlai.boot.common.enums.GenderEnum; import com.youlai.boot.common.enums.StatusEnum; import com.youlai.boot.system.converter.UserConverter; import com.youlai.boot.system.model.dto.UserImportDTO; @@ -107,13 +107,12 @@ public class UserImportListener extends BaseAnalysisEventListener // 校验通过,持久化至数据库 User entity = userConverter.toEntity(userImportDTO); entity.setPassword(passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD)); // 默认密码 - // 性别翻译 + // 性别逆向解析 String genderLabel = userImportDTO.getGenderLabel(); if (StrUtil.isNotBlank(genderLabel)) { Integer genderValue = (Integer) IBaseEnum.getValueByLabel(genderLabel, GenderEnum.class); entity.setGender(genderValue); } - // 角色解析 String roleCodes = userImportDTO.getRoleCodes(); List roleIds = null; @@ -155,7 +154,7 @@ public class UserImportListener extends BaseAnalysisEventListener } } else { invalidCount++; - msg.append("第").append(validCount + invalidCount).append("行数据校验失败:").append(validationMsg + "
"); + msg.append("第").append(validCount + invalidCount).append("行数据校验失败:").append(validationMsg).append("
"); } } @@ -166,7 +165,6 @@ public class UserImportListener extends BaseAnalysisEventListener @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { log.info("所有数据解析完成!"); - } diff --git a/src/main/java/com/youlai/boot/system/mapper/NoticeMapper.java b/src/main/java/com/youlai/boot/system/mapper/NoticeMapper.java index 5a11f119..366ed79a 100644 --- a/src/main/java/com/youlai/boot/system/mapper/NoticeMapper.java +++ b/src/main/java/com/youlai/boot/system/mapper/NoticeMapper.java @@ -4,9 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.youlai.boot.system.model.bo.NoticeBO; import com.youlai.boot.system.model.entity.Notice; -import com.youlai.boot.system.model.query.NoticeQuery; +import com.youlai.boot.system.model.query.NoticePageQuery; import com.youlai.boot.system.model.vo.NoticeVO; -import com.youlai.boot.system.model.vo.NoticeDetailVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -26,12 +25,13 @@ public interface NoticeMapper extends BaseMapper { * @param queryParams 查询参数 * @return 通知公告分页数据 */ - Page getNoticePage(Page page, @Param("queryParams") NoticeQuery queryParams); + Page getNoticePage(Page page, @Param("queryParams") NoticePageQuery queryParams); /** * 获取阅读时通知公告详情 + * * @param id 通知公告ID * @return 通知公告详情 */ - NoticeDetailVO getReadNoticeVO(@Param("id") Long id); + NoticeBO getNoticeDetail(@Param("id") Long id); } diff --git a/src/main/java/com/youlai/boot/system/mapper/NoticeStatusMapper.java b/src/main/java/com/youlai/boot/system/mapper/UserNoticeMapper.java similarity index 63% rename from src/main/java/com/youlai/boot/system/mapper/NoticeStatusMapper.java rename to src/main/java/com/youlai/boot/system/mapper/UserNoticeMapper.java index 7de27f85..2ed8324b 100644 --- a/src/main/java/com/youlai/boot/system/mapper/NoticeStatusMapper.java +++ b/src/main/java/com/youlai/boot/system/mapper/UserNoticeMapper.java @@ -3,9 +3,9 @@ package com.youlai.boot.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.youlai.boot.system.model.entity.NoticeStatus; -import com.youlai.boot.system.model.query.NoticeQuery; -import com.youlai.boot.system.model.vo.NoticeStatusVO; +import com.youlai.boot.system.model.entity.UserNotice; +import com.youlai.boot.system.model.query.NoticePageQuery; +import com.youlai.boot.system.model.vo.UserNoticePageVO; import com.youlai.boot.system.model.vo.NoticeVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -19,14 +19,14 @@ import java.util.List; * @since 2024-08-28 16:56 */ @Mapper -public interface NoticeStatusMapper extends BaseMapper { +public interface UserNoticeMapper extends BaseMapper { /** * 获取未读的通知公告 * @param userId 用户ID * @return 公告列表 */ - List listUnreadNotices(@Param("userId")Long userId); + List listUnreadNotices(@Param("userId")Long userId); /** * 分页获取我的通知公告 @@ -34,5 +34,5 @@ public interface NoticeStatusMapper extends BaseMapper { * @param queryParams 查询参数 * @return 通知公告分页列表 */ - IPage getMyNoticePage(Page page, @Param("queryParams") NoticeQuery queryParams); + IPage getMyNoticePage(Page page, @Param("queryParams") NoticePageQuery queryParams); } diff --git a/src/main/java/com/youlai/boot/system/model/bo/NoticeBO.java b/src/main/java/com/youlai/boot/system/model/bo/NoticeBO.java index e6f9fbc8..fb4b33be 100644 --- a/src/main/java/com/youlai/boot/system/model/bo/NoticeBO.java +++ b/src/main/java/com/youlai/boot/system/model/bo/NoticeBO.java @@ -1,9 +1,7 @@ package com.youlai.boot.system.model.bo; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.io.Serial; import java.time.LocalDateTime; /** @@ -11,36 +9,57 @@ import java.time.LocalDateTime; * * @author Theo * @since 2024-09-01 10:31 - * @version 1.0.0 */ @Data public class NoticeBO { - @Serial - private static final long serialVersionUID = 1L; - + /** + * 通知ID + */ private Long id; - @Schema(description = "通知标题") + + /** + * 通知标题 + */ private String title; - @Schema(description = "通知类型") - private Integer noticeType; + /** + * 通知类型 + */ + private Integer type; - @Schema(description = "发布人") - private String releaseBy; + /** + * 通知内容 + */ + private String content; - @Schema(description = "优先级(0-低 1-中 2-高)") - private Integer priority; + /** + * 发布人姓名 + */ + private String publisherName; - @Schema(description = "目标类型(0-全体 1-指定)") - private Integer tarType; + /** + * 通知等级(L: 低, M: 中, H: 高) + */ + private Integer level; - @Schema(description = "发布状态(0-未发布 1已发布 2已撤回)") - private Integer releaseStatus; + /** + * 目标类型(1: 全体 2: 指定) + */ + private Integer targetType; - @Schema(description = "发布时间") - private LocalDateTime releaseTime; + /** + * 发布状态(0: 未发布, 1: 已发布, -1: 已撤回) + */ + private Integer publishStatus; - @Schema(description = "撤回时间") - private LocalDateTime recallTime; + /** + * 发布时间 + */ + private LocalDateTime publishTime; + + /** + * 撤回时间 + */ + private LocalDateTime revokeTime; } diff --git a/src/main/java/com/youlai/boot/system/model/bo/RouteBO.java b/src/main/java/com/youlai/boot/system/model/bo/RouteBO.java index b546b280..c0e60a83 100644 --- a/src/main/java/com/youlai/boot/system/model/bo/RouteBO.java +++ b/src/main/java/com/youlai/boot/system/model/bo/RouteBO.java @@ -1,6 +1,6 @@ package com.youlai.boot.system.model.bo; -import com.youlai.boot.common.enums.MenuTypeEnum; +import com.youlai.boot.system.enums.MenuTypeEnum; import lombok.Data; /** diff --git a/src/main/java/com/youlai/boot/system/model/dto/ChatMessage.java b/src/main/java/com/youlai/boot/system/model/dto/ChatMessage.java index e4ce3db4..51dac334 100644 --- a/src/main/java/com/youlai/boot/system/model/dto/ChatMessage.java +++ b/src/main/java/com/youlai/boot/system/model/dto/ChatMessage.java @@ -1,6 +1,5 @@ package com.youlai.boot.system.model.dto; -import com.youlai.boot.common.enums.NoticeTypeEnum; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -23,9 +22,4 @@ public class ChatMessage { */ private String content; - /** - * 消息类型 - */ - private NoticeTypeEnum noticeType; - } diff --git a/src/main/java/com/youlai/boot/system/model/dto/MessageDTO.java b/src/main/java/com/youlai/boot/system/model/dto/MessageDTO.java index 5b792c71..cf040f60 100644 --- a/src/main/java/com/youlai/boot/system/model/dto/MessageDTO.java +++ b/src/main/java/com/youlai/boot/system/model/dto/MessageDTO.java @@ -1,10 +1,9 @@ package com.youlai.boot.system.model.dto; -import com.youlai.boot.common.enums.NoticeWayEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.util.List; +import java.util.Set; /** * 消息载体 @@ -23,8 +22,8 @@ public class MessageDTO { private String sender; @Schema(description = "接收者") - private List receiver; + private Set receivers; + + - @Schema(description = "通知方式") - private NoticeWayEnum noticeWay; } diff --git a/src/main/java/com/youlai/boot/system/model/dto/NoticeDTO.java b/src/main/java/com/youlai/boot/system/model/dto/NoticeDTO.java new file mode 100644 index 00000000..044d3a5b --- /dev/null +++ b/src/main/java/com/youlai/boot/system/model/dto/NoticeDTO.java @@ -0,0 +1,27 @@ +package com.youlai.boot.system.model.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Set; + +/** + * 通知传送对象 + * + * @author Theo + * @since 2024-9-2 14:32:58 + */ +@Data +public class NoticeDTO { + + @Schema(description = "通知ID") + private Long id; + + @Schema(description = "通知类型") + private Integer type; + + @Schema(description = "通知标题") + private String title; + + +} diff --git a/src/main/java/com/youlai/boot/system/model/entity/Menu.java b/src/main/java/com/youlai/boot/system/model/entity/Menu.java index cd5a1aae..0a2921ae 100644 --- a/src/main/java/com/youlai/boot/system/model/entity/Menu.java +++ b/src/main/java/com/youlai/boot/system/model/entity/Menu.java @@ -2,7 +2,7 @@ package com.youlai.boot.system.model.entity; import com.baomidou.mybatisplus.annotation.*; -import com.youlai.boot.common.enums.MenuTypeEnum; +import com.youlai.boot.system.enums.MenuTypeEnum; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/youlai/boot/system/model/entity/Notice.java b/src/main/java/com/youlai/boot/system/model/entity/Notice.java index d8f6a2d9..aa73b953 100644 --- a/src/main/java/com/youlai/boot/system/model/entity/Notice.java +++ b/src/main/java/com/youlai/boot/system/model/entity/Notice.java @@ -2,11 +2,11 @@ package com.youlai.boot.system.model.entity; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.annotation.JsonFormat; import com.youlai.boot.common.base.BaseEntity; import lombok.Getter; import lombok.Setter; +import java.io.Serial; import java.time.LocalDateTime; /** * 通知公告实体对象 @@ -19,6 +19,7 @@ import java.time.LocalDateTime; @TableName("sys_notice") public class Notice extends BaseEntity { + @Serial private static final long serialVersionUID = 1L; /** @@ -32,41 +33,48 @@ public class Notice extends BaseEntity { /** * 通知类型 */ - private Integer noticeType; + private Integer type; + /** * 发布人 */ - private Long releaseBy; + private Long publisherBy; + /** - * 优先级(0-低 1-中 2-高) + * 通知等级(L: 低, M: 中, H: 高) */ - private Integer priority; + private String level; + /** - * 目标类型(0-全体 1-指定) + * 目标类型(1: 全体, 2: 指定) */ - private Integer tarType; + private Integer targetType; + /** - * 目标ID + * 目标用户ID集合 */ - private String tarIds; + private String targetUserIds; + /** - * 发布状态(0-未发布 1已发布 2已撤回) + * 发布状态(0: 未发布, 1: 已发布, -1: 已撤回) */ - private Integer releaseStatus; + private Integer publishStatus; + /** * 发布时间 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime releaseTime; + private LocalDateTime publishTime; + /** * 撤回时间 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime recallTime; + private LocalDateTime revokeTime; + /** * 创建人ID */ private Long createBy; + /** * 更新人ID */ diff --git a/src/main/java/com/youlai/boot/system/model/entity/NoticeStatus.java b/src/main/java/com/youlai/boot/system/model/entity/UserNotice.java similarity index 64% rename from src/main/java/com/youlai/boot/system/model/entity/NoticeStatus.java rename to src/main/java/com/youlai/boot/system/model/entity/UserNotice.java index 4cdc34c9..960eaf35 100644 --- a/src/main/java/com/youlai/boot/system/model/entity/NoticeStatus.java +++ b/src/main/java/com/youlai/boot/system/model/entity/UserNotice.java @@ -2,25 +2,24 @@ package com.youlai.boot.system.model.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; +import com.youlai.boot.common.base.BaseEntity; import lombok.Getter; import lombok.Setter; -import java.io.Serializable; import java.time.LocalDateTime; /** - * 用户公告状态实体对象 + * 用户通知公告实体对象 * * @author youlaitech * @since 2024-08-28 16:56 */ @Getter @Setter -@TableName("sys_notice_status") -public class NoticeStatus implements Serializable { - - private static final long serialVersionUID = 1L; +@TableName("sys_user_notice") +public class UserNotice extends BaseEntity { /** * 主键ID @@ -39,9 +38,15 @@ public class NoticeStatus implements Serializable { /** * 读取状态,0未读,1已读 */ - private Integer readStatus; + private Integer isRead; /** * 用户阅读时间 */ private LocalDateTime readTime; + + /** + * 逻辑删除标识(0-未删除 1-已删除) + */ + @TableLogic(value = "0", delval = "1") + private Integer isDeleted; } diff --git a/src/main/java/com/youlai/boot/system/model/form/MenuForm.java b/src/main/java/com/youlai/boot/system/model/form/MenuForm.java index 98550a7c..dc26cb4c 100644 --- a/src/main/java/com/youlai/boot/system/model/form/MenuForm.java +++ b/src/main/java/com/youlai/boot/system/model/form/MenuForm.java @@ -1,6 +1,6 @@ package com.youlai.boot.system.model.form; -import com.youlai.boot.common.enums.MenuTypeEnum; +import com.youlai.boot.system.enums.MenuTypeEnum; import com.youlai.boot.common.model.KeyValue; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/src/main/java/com/youlai/boot/system/model/form/NoticeForm.java b/src/main/java/com/youlai/boot/system/model/form/NoticeForm.java index 980517bd..f5de6dce 100644 --- a/src/main/java/com/youlai/boot/system/model/form/NoticeForm.java +++ b/src/main/java/com/youlai/boot/system/model/form/NoticeForm.java @@ -39,17 +39,16 @@ public class NoticeForm implements Serializable { private String content; @Schema(description = "通知类型") - private Integer noticeType; + private Integer type; - @Schema(description = "优先级(0-低 1-中 2-高)") - @Range(min = 0, max = 2, message = "优先级取值范围[0,2]") - private Integer priority; + @Schema(description = "优先级(L-低 M-中 H-高)") + private String level; - @Schema(description = "目标类型(0-全体 1-指定)") - @Range(min = 0, max = 1, message = "目标类型取值范围[0,1]") - private Integer tarType; + @Schema(description = "目标类型(1-全体 2-指定)") + @Range(min = 1, max = 2, message = "目标类型取值范围[1,2]") + private Integer targetType; @Schema(description = "接收人ID集合") - private List tarIds; + private List targetUserIds; } diff --git a/src/main/java/com/youlai/boot/system/model/query/NoticeQuery.java b/src/main/java/com/youlai/boot/system/model/query/NoticePageQuery.java similarity index 87% rename from src/main/java/com/youlai/boot/system/model/query/NoticeQuery.java rename to src/main/java/com/youlai/boot/system/model/query/NoticePageQuery.java index f58a9f6e..12e6bb03 100644 --- a/src/main/java/com/youlai/boot/system/model/query/NoticeQuery.java +++ b/src/main/java/com/youlai/boot/system/model/query/NoticePageQuery.java @@ -16,9 +16,7 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = true) @Schema(description ="通知公告查询对象") -public class NoticeQuery extends BasePageQuery { - - private static final long serialVersionUID = 1L; +public class NoticePageQuery extends BasePageQuery { @Schema(description = "通知标题") private String title; diff --git a/src/main/java/com/youlai/boot/system/model/vo/MenuVO.java b/src/main/java/com/youlai/boot/system/model/vo/MenuVO.java index 3b76fcda..ec9eaaf7 100644 --- a/src/main/java/com/youlai/boot/system/model/vo/MenuVO.java +++ b/src/main/java/com/youlai/boot/system/model/vo/MenuVO.java @@ -1,7 +1,7 @@ package com.youlai.boot.system.model.vo; import com.fasterxml.jackson.annotation.JsonInclude; -import com.youlai.boot.common.enums.MenuTypeEnum; +import com.youlai.boot.system.enums.MenuTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/src/main/java/com/youlai/boot/system/model/vo/NoticeDetailVO.java b/src/main/java/com/youlai/boot/system/model/vo/NoticeDetailVO.java index 8070fdea..c8a7a22b 100644 --- a/src/main/java/com/youlai/boot/system/model/vo/NoticeDetailVO.java +++ b/src/main/java/com/youlai/boot/system/model/vo/NoticeDetailVO.java @@ -25,18 +25,18 @@ public class NoticeDetailVO { private String content; @Schema(description = "通知类型") - private String noticeType; + private Integer type; @Schema(description = "发布人") - private String releaseBy; + private String publisherName; - @Schema(description = "优先级(0-低 1-中 2-高)") - private Integer priority; + @Schema(description = "优先级(L-低 M-中 H-高)") + private String level; @Schema(description = "发布状态(0-未发布 1已发布 2已撤回) 冗余字段,方便判断是否已经发布") - private Integer releaseStatus; + private Integer publishStatus; @Schema(description = "发布时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime releaseTime; + private LocalDateTime publishTime; } diff --git a/src/main/java/com/youlai/boot/system/model/vo/NoticeStatusVO.java b/src/main/java/com/youlai/boot/system/model/vo/UserNoticePageVO.java similarity index 61% rename from src/main/java/com/youlai/boot/system/model/vo/NoticeStatusVO.java rename to src/main/java/com/youlai/boot/system/model/vo/UserNoticePageVO.java index 119638f1..50c906eb 100644 --- a/src/main/java/com/youlai/boot/system/model/vo/NoticeStatusVO.java +++ b/src/main/java/com/youlai/boot/system/model/vo/UserNoticePageVO.java @@ -7,14 +7,14 @@ import lombok.Data; import java.time.LocalDateTime; /** - * 用户公告状态VO + * 用户公告VO * * @author Theo * @since 2024-08-28 16:56 */ @Data -@Schema(description = "用户公告状态VO") -public class NoticeStatusVO { +@Schema(description = "用户公告VO") +public class UserNoticePageVO { @Schema(description = "通知ID") private Long id; @@ -23,19 +23,19 @@ public class NoticeStatusVO { private String title; @Schema(description = "通知类型") - private String noticeType; + private String typeLabel; - @Schema(description = "发布人") - private String releaseBy; + @Schema(description = "发布人姓名") + private String publisherName; - @Schema(description = "优先级(0-低 1-中 2-高)") - private Integer priority; + @Schema(description = "通知级别") + private String levelLabel; @Schema(description = "发布时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime releaseTime; + private LocalDateTime publishTime; @Schema(description = "是否已读") - private Integer readStatus; + private String isReadLabel; } diff --git a/src/main/java/com/youlai/boot/system/service/NoticeService.java b/src/main/java/com/youlai/boot/system/service/NoticeService.java index 8b6ddebf..5f7fcb80 100644 --- a/src/main/java/com/youlai/boot/system/service/NoticeService.java +++ b/src/main/java/com/youlai/boot/system/service/NoticeService.java @@ -4,8 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.youlai.boot.system.model.entity.Notice; import com.youlai.boot.system.model.form.NoticeForm; -import com.youlai.boot.system.model.query.NoticeQuery; -import com.youlai.boot.system.model.vo.NoticeStatusVO; +import com.youlai.boot.system.model.query.NoticePageQuery; +import com.youlai.boot.system.model.vo.UserNoticePageVO; import com.youlai.boot.system.model.vo.NoticeVO; import com.youlai.boot.system.model.vo.NoticeDetailVO; @@ -18,11 +18,11 @@ import com.youlai.boot.system.model.vo.NoticeDetailVO; public interface NoticeService extends IService { /** - *通知公告分页列表 + * 通知公告分页列表 * * @return 通知公告分页列表 */ - IPage getNoticePage(NoticeQuery queryParams); + IPage getNoticePage(NoticePageQuery queryParams); /** * 获取通知公告表单数据 @@ -30,7 +30,7 @@ public interface NoticeService extends IService { * @param id 通知公告ID * @return 通知公告表单对象 */ - NoticeForm getNoticeFormData(Long id); + NoticeForm getNoticeFormData(Long id); /** * 新增通知公告 @@ -43,7 +43,7 @@ public interface NoticeService extends IService { /** * 修改通知公告 * - * @param id 通知公告ID + * @param id 通知公告ID * @param formData 通知公告表单对象 * @return 是否修改成功 */ @@ -63,7 +63,7 @@ public interface NoticeService extends IService { * @param id 通知公告ID * @return 是否发布成功 */ - boolean releaseNotice(Long id); + boolean publishNotice(Long id); /** * 撤回通知公告 @@ -71,27 +71,21 @@ public interface NoticeService extends IService { * @param id 通知公告ID * @return 是否撤回成功 */ - boolean recallNotice(Long id); + boolean revokeNotice(Long id); /** - * 阅读通知公告 + * 阅读获取通知公告详情 * * @param id 通知公告ID - * @return 通知公告对象 - */ - NoticeDetailVO readNotice(Long id); - - /** - * 获取阅读时通知公告详情 - * @param id 通知公告ID * @return 通知公告详情 */ - NoticeDetailVO getReadNoticeDetail(Long id); + NoticeDetailVO getNoticeDetail(Long id); /** * 获取我的通知公告分页列表 + * * @param queryParams 查询参数 * @return 通知公告分页列表 */ - IPage getMyNoticePage(NoticeQuery queryParams); + IPage getMyNoticePage(NoticePageQuery queryParams); } diff --git a/src/main/java/com/youlai/boot/system/service/NoticeStatusService.java b/src/main/java/com/youlai/boot/system/service/UserNoticeService.java similarity index 65% rename from src/main/java/com/youlai/boot/system/service/NoticeStatusService.java rename to src/main/java/com/youlai/boot/system/service/UserNoticeService.java index aae06907..d5b3de25 100644 --- a/src/main/java/com/youlai/boot/system/service/NoticeStatusService.java +++ b/src/main/java/com/youlai/boot/system/service/UserNoticeService.java @@ -3,9 +3,9 @@ package com.youlai.boot.system.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import com.youlai.boot.system.model.entity.NoticeStatus; -import com.youlai.boot.system.model.query.NoticeQuery; -import com.youlai.boot.system.model.vo.NoticeStatusVO; +import com.youlai.boot.system.model.entity.UserNotice; +import com.youlai.boot.system.model.query.NoticePageQuery; +import com.youlai.boot.system.model.vo.UserNoticePageVO; import com.youlai.boot.system.model.vo.NoticeVO; import java.util.List; @@ -16,16 +16,17 @@ import java.util.List; * @author youlaitech * @since 2024-08-28 16:56 */ -public interface NoticeStatusService extends IService { +public interface UserNoticeService extends IService { /** * 获取未读的通知公告 * @return 公告列表 */ - List listUnreadNotices(); + List listUnreadNotices(); /** * 全部标记为已读 + * * @return 是否成功 */ boolean readAll(); @@ -36,5 +37,5 @@ public interface NoticeStatusService extends IService { * @param queryParams 查询参数 * @return 我的通知公告分页列表 */ - IPage getMyNoticePage(Page page, NoticeQuery queryParams); + IPage getMyNoticePage(Page page, NoticePageQuery queryParams); } diff --git a/src/main/java/com/youlai/boot/system/service/UserService.java b/src/main/java/com/youlai/boot/system/service/UserService.java index 0cecd5a2..2b0cc7ce 100644 --- a/src/main/java/com/youlai/boot/system/service/UserService.java +++ b/src/main/java/com/youlai/boot/system/service/UserService.java @@ -3,7 +3,7 @@ package com.youlai.boot.system.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; -import com.youlai.boot.common.enums.ContactType; +import com.youlai.boot.system.enums.ContactType; import com.youlai.boot.common.model.Option; import com.youlai.boot.system.model.dto.UserAuthInfo; import com.youlai.boot.system.model.dto.UserExportDTO; diff --git a/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java index c65ad416..c46cc090 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java @@ -20,7 +20,7 @@ import com.youlai.boot.system.model.query.MenuQuery; import com.youlai.boot.system.model.vo.MenuVO; import com.youlai.boot.system.model.vo.RouteVO; import com.youlai.boot.common.constant.SystemConstants; -import com.youlai.boot.common.enums.MenuTypeEnum; +import com.youlai.boot.system.enums.MenuTypeEnum; import com.youlai.boot.common.enums.StatusEnum; import com.youlai.boot.common.model.KeyValue; import com.youlai.boot.common.model.Option; diff --git a/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java index 7a1641d7..a8fddbd6 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java @@ -1,45 +1,48 @@ package com.youlai.boot.system.service.impl; -import cn.hutool.core.lang.Assert; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.youlai.boot.common.constant.SymbolConstant; -import com.youlai.boot.common.enums.NoticeWayEnum; +import com.youlai.boot.common.exception.BusinessException; import com.youlai.boot.core.security.util.SecurityUtils; +import com.youlai.boot.module.websocket.service.OnlineUserService; import com.youlai.boot.system.converter.NoticeConverter; -import com.youlai.boot.system.handler.MessageHandler; +import com.youlai.boot.system.enums.NoticePublishStatusEnum; +import com.youlai.boot.system.enums.NoticeTargetTypeEnum; import com.youlai.boot.system.mapper.NoticeMapper; import com.youlai.boot.system.model.bo.NoticeBO; -import com.youlai.boot.system.model.dto.MessageDTO; +import com.youlai.boot.system.model.dto.NoticeDTO; import com.youlai.boot.system.model.entity.Notice; -import com.youlai.boot.system.model.entity.NoticeStatus; +import com.youlai.boot.system.model.entity.UserNotice; import com.youlai.boot.system.model.entity.User; import com.youlai.boot.system.model.form.NoticeForm; -import com.youlai.boot.system.model.query.NoticeQuery; -import com.youlai.boot.system.model.vo.NoticeStatusVO; +import com.youlai.boot.system.model.query.NoticePageQuery; +import com.youlai.boot.system.model.vo.UserNoticePageVO; import com.youlai.boot.system.model.vo.NoticeVO; import com.youlai.boot.system.model.vo.NoticeDetailVO; import com.youlai.boot.system.service.NoticeService; -import com.youlai.boot.system.service.NoticeStatusService; +import com.youlai.boot.system.service.UserNoticeService; import com.youlai.boot.system.service.UserService; import lombok.RequiredArgsConstructor; +import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; /** * 通知公告服务实现类 * - * @author youlaitech + * @author Theo * @since 2024-08-27 10:31 */ @Service @@ -48,20 +51,21 @@ public class NoticeServiceImpl extends ServiceImpl impleme private final NoticeConverter noticeConverter; - private final MessageHandler messageHandler; - - private final NoticeStatusService noticeStatusService; + private final UserNoticeService userNoticeService; private final UserService userService; + private final SimpMessagingTemplate messagingTemplate; + private final OnlineUserService onlineUserService; + /** * 获取通知公告分页列表 * * @param queryParams 查询参数 - * @return {@link IPage} 通知公告分页列表 + * @return {@link IPage} 通知公告分页列表 */ @Override - public IPage getNoticePage(NoticeQuery queryParams) { + public IPage getNoticePage(NoticePageQuery queryParams) { Page noticePage = this.baseMapper.getNoticePage( new Page<>(queryParams.getPageNum(), queryParams.getPageSize()), queryParams @@ -89,12 +93,15 @@ public class NoticeServiceImpl extends ServiceImpl impleme */ @Override public boolean saveNotice(NoticeForm formData) { - Notice entity = noticeConverter.toEntity(formData); - entity.setReleaseStatus(0); - entity.setCreateBy(SecurityUtils.getUserId()); - if (entity.getTarType() == 1) { - Assert.notBlank(entity.getTarIds(), "指定用户不能为空"); + + if (NoticeTargetTypeEnum.SPECIFIED.getValue().equals(formData.getTargetType())) { + List targetUserIdList = formData.getTargetUserIds(); + if (CollectionUtil.isEmpty(targetUserIdList)) { + throw new BusinessException("推送指定用户不能为空"); + } } + Notice entity = noticeConverter.toEntity(formData); + entity.setCreateBy(SecurityUtils.getUserId()); return this.save(entity); } @@ -107,11 +114,14 @@ public class NoticeServiceImpl extends ServiceImpl impleme */ @Override public boolean updateNotice(Long id, NoticeForm formData) { - Notice entity = noticeConverter.toEntity(formData); - entity.setUpdateBy(SecurityUtils.getUserId()); - if (entity.getTarType() == 1) { - Assert.notBlank(entity.getTarIds(), "指定用户不能为空"); + if (NoticeTargetTypeEnum.SPECIFIED.getValue().equals(formData.getTargetType())) { + List targetUserIdList = formData.getTargetUserIds(); + if (CollectionUtil.isEmpty(targetUserIdList)) { + throw new BusinessException("推送指定用户不能为空"); + } } + + Notice entity = noticeConverter.toEntity(formData); return this.updateById(entity); } @@ -122,87 +132,97 @@ public class NoticeServiceImpl extends ServiceImpl impleme * @return {@link Boolean} 是否删除成功 */ @Override - @Transactional(rollbackFor = Exception.class) + @Transactional public boolean deleteNotices(String ids) { - Assert.isTrue(StrUtil.isNotBlank(ids), "删除的通知公告数据为空"); - // 逻辑删除 - List idList = Arrays.stream(ids.split(SymbolConstant.COMMA)) - .map(Long::parseLong) - .toList(); - boolean b = this.removeByIds(idList); - if (b) { - //删除通知公告的同时,需要删除通知公告对应的用户通知状态 - noticeStatusService.remove(new LambdaQueryWrapper().in(NoticeStatus::getNoticeId, idList)); + if (StrUtil.isBlank(ids)) { + throw new BusinessException("删除的通知公告数据为空"); } - return true; + // 逻辑删除 + List idList = Arrays.stream(ids.split(",")) + .map(Long::parseLong) + .toList(); + boolean isRemoved = this.removeByIds(idList); + if (isRemoved) { + // 删除通知公告的同时,需要删除通知公告对应的用户通知状态 + userNoticeService.remove(new LambdaQueryWrapper().in(UserNotice::getNoticeId, idList)); + } + return isRemoved; } /** * 发布通知公告 + * * @param id 通知公告ID * @return 是否发布成功 */ @Override - @Transactional(rollbackFor = Exception.class) - public boolean releaseNotice(Long id) { + @Transactional + public boolean publishNotice(Long id) { Notice notice = this.getById(id); - Assert.notNull(notice, "通知公告不存在"); - Assert.isTrue(notice.getReleaseStatus() != 1, "通知公告已发布"); - notice.setReleaseStatus(1); - notice.setReleaseBy(SecurityUtils.getUserId()); - notice.setReleaseTime(LocalDateTime.now()); - this.updateById(notice); - //发布通知公告的同时,需要将通知公告发送给目标用户 - //先删除掉该通知公告之前对应的用户信息 - noticeStatusService.remove(new LambdaQueryWrapper().eq(NoticeStatus::getNoticeId, id)); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (notice.getTarType() == 1) { - Assert.notBlank(notice.getTarIds(), "指定用户不能为空"); - queryWrapper.in(User::getId, Arrays.asList(notice.getTarIds().split(SymbolConstant.COMMA))); + if (notice == null) { + throw new BusinessException("通知公告不存在"); } - //查询出目标用户,增加用户通知状态 - List list = userService.list(queryWrapper); - List needSaveList = list.stream().map(user -> { - NoticeStatus noticeStatus = new NoticeStatus(); - noticeStatus.setNoticeId(id); - noticeStatus.setUserId(user.getId()); - noticeStatus.setReadStatus(0); - return noticeStatus; - }).toList(); - if(needSaveList.size() > 0){ - noticeStatusService.saveBatch(needSaveList); - } - //最后,给当前在线的用户发送websocket消息 - List usernameList = null; - if(notice.getTarType() == 1){ - List collect = needSaveList.stream().map(NoticeStatus::getUserId).collect(Collectors.toList()); - List userList = userService.list(new LambdaQueryWrapper().in(User::getId, collect).select(User::getUsername)); - usernameList = userList.stream().map(User::getUsername).collect(Collectors.toList()); - } - MessageDTO message = new MessageDTO(); - message.setNoticeWay(NoticeWayEnum.WEBSOCKET); - message.setReceiver(usernameList); - message.setContent(getNoticeContent(notice)); - message.setSender(SecurityUtils.getUsername()); - messageHandler.sendMessage(message); - return this.updateById(notice); - } - /** - * 自定义组合公告内容 - * - * @param notice 通知公告 - * @return 自定义组合通知公告内容 - */ - private String getNoticeContent(Notice notice) { - JSONObject jsonObject = new JSONObject(); - jsonObject.set("id", notice.getId()); - jsonObject.set("title", notice.getTitle()); - jsonObject.set("messageType", notice.getNoticeType()); - jsonObject.set("releaseTime", notice.getReleaseTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - jsonObject.set("type", "release"); - return jsonObject.toString(); + if (NoticePublishStatusEnum.PUBLISHED.getValue().equals(notice.getPublishStatus())) { + throw new BusinessException("通知公告已发布"); + } + + Integer targetType = notice.getTargetType(); + String targetUserIds = notice.getTargetUserIds(); + if (NoticeTargetTypeEnum.SPECIFIED.getValue().equals(targetType) + && StrUtil.isBlank(targetUserIds)) { + throw new BusinessException("推送指定用户不能为空"); + } + + notice.setPublishStatus(NoticePublishStatusEnum.PUBLISHED.getValue()); + notice.setPublisherBy(SecurityUtils.getUserId()); + notice.setPublishTime(LocalDateTime.now()); + boolean publishResult = this.updateById(notice); + + if (publishResult) { + // 发布通知公告的同时,删除该通告之前的用户通知数据,因为可能是重新发布 + userNoticeService.remove( + new LambdaQueryWrapper().eq(UserNotice::getNoticeId, id) + ); + + // 添加新的用户通知数据 + List targetUserIdList = Arrays.asList(targetUserIds.split(",")); + List targetUserList = userService.list( + new LambdaQueryWrapper() + // 如果是指定用户,则筛选出指定用户 + .in(NoticeTargetTypeEnum.SPECIFIED.getValue().equals(targetType), User::getId, targetUserIdList) + ); + + + List userNoticeList = targetUserList.stream().map(user -> { + UserNotice userNotice = new UserNotice(); + userNotice.setNoticeId(id); + userNotice.setUserId(user.getId()); + userNotice.setIsRead(0); + return userNotice; + }).toList(); + + if (CollectionUtil.isNotEmpty(userNoticeList)) { + userNoticeService.saveBatch(userNoticeList); + } + + Set receivers = targetUserList.stream().map(User::getUsername).collect(Collectors.toSet()); + + Set allOnlineUsers = onlineUserService.getAllOnlineUsers(); + + // 找出在线用户的通知接收者 + Set onlineReceivers = new HashSet<>(CollectionUtil.intersection(receivers, allOnlineUsers)); + + + NoticeDTO noticeDTO = new NoticeDTO(); + noticeDTO.setId(id); + noticeDTO.setTitle(notice.getTitle()); + noticeDTO.setType(notice.getType()); + + onlineReceivers.forEach(receiver -> messagingTemplate.convertAndSendToUser(receiver, "/queue/message", noticeDTO)); + } + return publishResult; } /** @@ -212,67 +232,65 @@ public class NoticeServiceImpl extends ServiceImpl impleme * @return 是否撤回成功 */ @Override - @Transactional(rollbackFor = Exception.class) - public boolean recallNotice(Long id) { + @Transactional + public boolean revokeNotice(Long id) { Notice notice = this.getById(id); - Assert.notNull(notice, "通知公告不存在"); - Assert.isTrue(notice.getReleaseStatus() == 1, "通知公告未发布"); - notice.setReleaseStatus(2); - notice.setRecallTime(LocalDateTime.now()); - if (!this.updateById(notice)) { - return false; + if (notice == null) { + throw new BusinessException("通知公告不存在"); } - //先删除掉该通知公告之前对应的用户信息 - noticeStatusService.remove(new LambdaQueryWrapper().eq(NoticeStatus::getNoticeId, id)); - return true; + + if (!NoticePublishStatusEnum.PUBLISHED.getValue().equals(notice.getPublishStatus())) { + throw new BusinessException("通知公告未发布或已撤回"); + } + + notice.setPublishStatus(NoticePublishStatusEnum.REVOKED.getValue()); + notice.setRevokeTime(LocalDateTime.now()); + notice.setUpdateBy(SecurityUtils.getUserId()); + + boolean revokeResult = this.updateById(notice); + + if (revokeResult) { + // 撤回通知公告的同时,需要删除通知公告对应的用户通知状态 + userNoticeService.remove(new LambdaQueryWrapper() + .eq(UserNotice::getNoticeId, id) + ); + } + return revokeResult; } /** - * 阅读通知公告 - * @param id 通知公告ID - * @return 通知公告表单对象 - */ - @Override - public NoticeDetailVO readNotice(Long id) { - NoticeDetailVO noticeDetailVO = this.getReadNoticeDetail(id); - Assert.isTrue(noticeDetailVO != null && noticeDetailVO.getReleaseStatus() == 1, "公告不存在或未发布"); - //获取当前登录用户 - Long userId = SecurityUtils.getUserId(); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(NoticeStatus::getUserId, userId) - .eq(NoticeStatus::getNoticeId, id) - .eq(NoticeStatus::getReadStatus, 0); - NoticeStatus noticeStatus = noticeStatusService.getOne(queryWrapper); - if (noticeStatus != null) { - noticeStatus.setReadStatus(1); - noticeStatusService.updateById(noticeStatus); - } - return noticeDetailVO; - } - - /** - * 获取阅读时通知公告详情 + * 阅读获取通知公告详情 + * * @param id 通知公告ID * @return */ @Override - public NoticeDetailVO getReadNoticeDetail(Long id) { - Assert.notNull(id, "公告ID不能为空"); - NoticeDetailVO noticeDetailVO = this.baseMapper.getReadNoticeVO(id); - Assert.isTrue(noticeDetailVO != null, "公告不存在"); - return noticeDetailVO; + public NoticeDetailVO getNoticeDetail(Long id) { + NoticeBO noticeBO = this.baseMapper.getNoticeDetail(id); + // 更新用户通知公告的阅读状态 + Long userId = SecurityUtils.getUserId(); + userNoticeService.update(new LambdaUpdateWrapper() + .eq(UserNotice::getNoticeId, id) + .eq(UserNotice::getUserId, userId) + .eq(UserNotice::getIsRead, 0) + .set(UserNotice::getIsRead, 1) + ); + return noticeConverter.toDetailVO(noticeBO); } /** * 获取当前登录用户的通知公告列表 + * * @param queryParams 查询参数 * @return 通知公告分页列表 */ @Override - public IPage getMyNoticePage(NoticeQuery queryParams) { - Long userId = SecurityUtils.getUserId(); - queryParams.setUserId(userId); - return noticeStatusService.getMyNoticePage(new Page<>(queryParams.getPageNum(), queryParams.getPageSize()),queryParams); + public IPage getMyNoticePage(NoticePageQuery queryParams) { + queryParams.setUserId(SecurityUtils.getUserId()); + return userNoticeService.getMyNoticePage( + new Page<>(queryParams.getPageNum(), queryParams.getPageSize()), + queryParams + ); } } diff --git a/src/main/java/com/youlai/boot/system/service/impl/NoticeStatusServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/NoticeStatusServiceImpl.java deleted file mode 100644 index 2a1599bd..00000000 --- a/src/main/java/com/youlai/boot/system/service/impl/NoticeStatusServiceImpl.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.youlai.boot.system.service.impl; - -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.youlai.boot.core.security.util.SecurityUtils; -import com.youlai.boot.system.mapper.NoticeStatusMapper; -import com.youlai.boot.system.model.entity.NoticeStatus; -import com.youlai.boot.system.model.query.NoticeQuery; -import com.youlai.boot.system.model.vo.NoticeStatusVO; -import com.youlai.boot.system.model.vo.NoticeVO; -import com.youlai.boot.system.service.NoticeStatusService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 用户公告状态服务实现类 - * - * @author youlaitech - * @since 2024-08-28 16:56 - */ -@Service -@RequiredArgsConstructor -public class NoticeStatusServiceImpl extends ServiceImpl implements NoticeStatusService { - - private final NoticeStatusMapper noticeStatusMapper; - - /** - * 获取未读的通知公告 - * @return 公告列表 - */ - @Override - public List listUnreadNotices() { - //获取当前登录用户 - Long userId = SecurityUtils.getUserId(); - return noticeStatusMapper.listUnreadNotices(userId); - } - - /** - * 全部标记为已读 - * @return 是否成功 - */ - @Override - public boolean readAll() { - Long userId = SecurityUtils.getUserId(); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(NoticeStatus::getUserId, userId); - updateWrapper.set(NoticeStatus::getReadStatus, 1); - return this.update(updateWrapper); - } - - /** - * 分页获取我的通知公告 - * @param page 分页对象 - * @param queryParams 查询参数 - * @return 通知公告分页列表 - */ - @Override - public IPage getMyNoticePage(Page page, NoticeQuery queryParams) { - return this.getBaseMapper().getMyNoticePage(new Page<>(queryParams.getPageNum(), queryParams.getPageSize()),queryParams); - } - - -} diff --git a/src/main/java/com/youlai/boot/system/service/impl/UserNoticeServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/UserNoticeServiceImpl.java new file mode 100644 index 00000000..c1557108 --- /dev/null +++ b/src/main/java/com/youlai/boot/system/service/impl/UserNoticeServiceImpl.java @@ -0,0 +1,74 @@ +package com.youlai.boot.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.youlai.boot.core.security.util.SecurityUtils; +import com.youlai.boot.system.mapper.UserNoticeMapper; +import com.youlai.boot.system.model.entity.UserNotice; +import com.youlai.boot.system.model.query.NoticePageQuery; +import com.youlai.boot.system.model.vo.UserNoticePageVO; +import com.youlai.boot.system.model.vo.NoticeVO; +import com.youlai.boot.system.service.UserNoticeService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 用户公告状态服务实现类 + * + * @author youlaitech + * @since 2024-08-28 16:56 + */ +@Service +@RequiredArgsConstructor +public class UserNoticeServiceImpl extends ServiceImpl implements UserNoticeService { + + private final UserNoticeMapper userNoticeMapper; + + /** + * 获取未读的通知公告 + * + * @return 公告列表 + */ + @Override + public List listUnreadNotices() { + //获取当前登录用户 + Long userId = SecurityUtils.getUserId(); + return userNoticeMapper.listUnreadNotices(userId); + } + + /** + * 全部标记为已读 + * + * @return 是否成功 + */ + @Override + public boolean readAll() { + Long userId = SecurityUtils.getUserId(); + return this.update(new LambdaUpdateWrapper() + .eq(UserNotice::getUserId, userId) + .eq(UserNotice::getIsRead, 0) + .set(UserNotice::getIsRead, 1) + ); + } + + /** + * 我的通知公告分页列表 + * + * @param page 分页对象 + * @param queryParams 查询参数 + * @return 通知公告分页列表 + */ + @Override + public IPage getMyNoticePage(Page page, NoticePageQuery queryParams) { + return this.getBaseMapper().getMyNoticePage( + new Page<>(queryParams.getPageNum(), queryParams.getPageSize()), + queryParams + ); + } + + +} diff --git a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java index a1f7b8f1..a3b76b38 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java @@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.boot.common.constant.RedisConstants; import com.youlai.boot.common.constant.SystemConstants; -import com.youlai.boot.common.enums.ContactType; +import com.youlai.boot.system.enums.ContactType; import com.youlai.boot.common.model.Option; import com.youlai.boot.module.mail.service.MailService; import com.youlai.boot.module.sms.service.SmsService; diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 5d7b1c9c..eac2b0b3 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -56,6 +56,7 @@ spring: from: youlaitech@163.com mybatis-plus: + mapper-locations: classpath*:/mapper/**/*.xml global-config: db-config: # 主键ID类型 @@ -73,6 +74,7 @@ mybatis-plus: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # 安全配置 security: jwt: diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 09ccde44..3475156b 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -40,6 +40,7 @@ spring: # 缓存null值,防止缓存穿透 cache-null-values: true mybatis-plus: + mapper-locations: classpath*:/mapper/**/*.xml global-config: db-config: # 主键ID类型 diff --git a/src/main/resources/mapper/NoticeStatusMapper.xml b/src/main/resources/mapper/NoticeStatusMapper.xml deleted file mode 100644 index 76b706e9..00000000 --- a/src/main/resources/mapper/NoticeStatusMapper.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - diff --git a/src/main/resources/mapper/DatabaseMapper.xml b/src/main/resources/mapper/codegen/DatabaseMapper.xml similarity index 100% rename from src/main/resources/mapper/DatabaseMapper.xml rename to src/main/resources/mapper/codegen/DatabaseMapper.xml diff --git a/src/main/resources/mapper/GenConfigMapper.xml b/src/main/resources/mapper/codegen/GenConfigMapper.xml similarity index 100% rename from src/main/resources/mapper/GenConfigMapper.xml rename to src/main/resources/mapper/codegen/GenConfigMapper.xml diff --git a/src/main/resources/mapper/GenFieldConfigMapper.xml b/src/main/resources/mapper/codegen/GenFieldConfigMapper.xml similarity index 100% rename from src/main/resources/mapper/GenFieldConfigMapper.xml rename to src/main/resources/mapper/codegen/GenFieldConfigMapper.xml diff --git a/src/main/resources/mapper/ConfigMapper.xml b/src/main/resources/mapper/system/ConfigMapper.xml similarity index 100% rename from src/main/resources/mapper/ConfigMapper.xml rename to src/main/resources/mapper/system/ConfigMapper.xml diff --git a/src/main/resources/mapper/DeptMapper.xml b/src/main/resources/mapper/system/DeptMapper.xml similarity index 100% rename from src/main/resources/mapper/DeptMapper.xml rename to src/main/resources/mapper/system/DeptMapper.xml diff --git a/src/main/resources/mapper/DictItemMapper.xml b/src/main/resources/mapper/system/DictItemMapper.xml similarity index 100% rename from src/main/resources/mapper/DictItemMapper.xml rename to src/main/resources/mapper/system/DictItemMapper.xml diff --git a/src/main/resources/mapper/DictMapper.xml b/src/main/resources/mapper/system/DictMapper.xml similarity index 100% rename from src/main/resources/mapper/DictMapper.xml rename to src/main/resources/mapper/system/DictMapper.xml diff --git a/src/main/resources/mapper/LogMapper.xml b/src/main/resources/mapper/system/LogMapper.xml similarity index 100% rename from src/main/resources/mapper/LogMapper.xml rename to src/main/resources/mapper/system/LogMapper.xml diff --git a/src/main/resources/mapper/MenuMapper.xml b/src/main/resources/mapper/system/MenuMapper.xml similarity index 97% rename from src/main/resources/mapper/MenuMapper.xml rename to src/main/resources/mapper/system/MenuMapper.xml index 205498a9..4155e1a0 100644 --- a/src/main/resources/mapper/MenuMapper.xml +++ b/src/main/resources/mapper/system/MenuMapper.xml @@ -44,7 +44,7 @@ INNER JOIN sys_role_menu t2 ON t1.id = t2.menu_id INNER JOIN sys_role t3 ON t2.role_id = t3.id AND t3.status = 1 AND t3.is_deleted = 0 WHERE - t1.type != '${@com.youlai.boot.common.enums.MenuTypeEnum@BUTTON.getValue()}' + t1.type != '${@com.youlai.boot.system.enums.MenuTypeEnum@BUTTON.getValue()}' diff --git a/src/main/resources/mapper/NoticeMapper.xml b/src/main/resources/mapper/system/NoticeMapper.xml similarity index 52% rename from src/main/resources/mapper/NoticeMapper.xml rename to src/main/resources/mapper/system/NoticeMapper.xml index ef23eaee..0d70de51 100644 --- a/src/main/resources/mapper/NoticeMapper.xml +++ b/src/main/resources/mapper/system/NoticeMapper.xml @@ -5,59 +5,56 @@ - SELECT - sn.id, - sn.title, - sn.content, - sn.notice_type, - su.nickname AS release_by, - sn.priority, - sn.release_status, - sn.release_time + t1.id, + t1.title, + t1.content, + t1.type, + t2.nickname AS release_by, + t1.level, + t1.release_status, + t1.release_time FROM - sys_notice sn - LEFT JOIN - sys_user su ON su.id = sn.release_by - where - sn.is_deleted = 0 - AND sn.id = #{id} + sys_notice t1 + LEFT JOIN sys_user t2 ON t2.id = t1.release_by + WHERE + t1.id = #{id} AND t1.is_deleted = 0 diff --git a/src/main/resources/mapper/RoleMapper.xml b/src/main/resources/mapper/system/RoleMapper.xml similarity index 100% rename from src/main/resources/mapper/RoleMapper.xml rename to src/main/resources/mapper/system/RoleMapper.xml diff --git a/src/main/resources/mapper/RoleMenuMapper.xml b/src/main/resources/mapper/system/RoleMenuMapper.xml similarity index 94% rename from src/main/resources/mapper/RoleMenuMapper.xml rename to src/main/resources/mapper/system/RoleMenuMapper.xml index aedcf8f0..c6654581 100644 --- a/src/main/resources/mapper/RoleMenuMapper.xml +++ b/src/main/resources/mapper/system/RoleMenuMapper.xml @@ -33,7 +33,7 @@ INNER JOIN sys_role t2 ON t1.role_id = t2.id AND t2.is_deleted = 0 AND t2.`status` = 1 INNER JOIN sys_menu t3 ON t1.menu_id = t3.id WHERE - type = '${@com.youlai.boot.common.enums.MenuTypeEnum@BUTTON.getValue()}' + type = '${@com.youlai.boot.system.enums.MenuTypeEnum@BUTTON.getValue()}' AND t2.`code` = #{roleCode} @@ -48,7 +48,7 @@ INNER JOIN sys_menu t2 ON t2.id = t1.menu_id INNER JOIN sys_role t3 ON t3.id = t1.role_id WHERE - t2.type = '${@com.youlai.boot.common.enums.MenuTypeEnum@BUTTON.getValue()}' + t2.type = '${@com.youlai.boot.system.enums.MenuTypeEnum@BUTTON.getValue()}' AND t2.perm IS NOT NULL AND t3.CODE IN diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/system/UserMapper.xml similarity index 100% rename from src/main/resources/mapper/UserMapper.xml rename to src/main/resources/mapper/system/UserMapper.xml diff --git a/src/main/resources/mapper/system/UserNoticeMapper.xml b/src/main/resources/mapper/system/UserNoticeMapper.xml new file mode 100644 index 00000000..fe993e33 --- /dev/null +++ b/src/main/resources/mapper/system/UserNoticeMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + diff --git a/src/main/resources/mapper/UserRoleMapper.xml b/src/main/resources/mapper/system/UserRoleMapper.xml similarity index 100% rename from src/main/resources/mapper/UserRoleMapper.xml rename to src/main/resources/mapper/system/UserRoleMapper.xml