From 8a13470f9c551daa819ec191c8fa294882343506 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 3 May 2021 00:09:07 +0800 Subject: [PATCH] 项目结构调整 x 18 : 解决拆分后的报错 --- yudao-admin-server/src/main/java/cn/iocoder/dashboard/AdminServerApplication.java | 13 ------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/config/AsyncConfiguration.java | 9 --------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/package-info.java | 4 ---- yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/《芋道 Spring Boot 异步任务入门》.md | 1 - yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/config/AdminServerConfiguration.java | 9 --------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/package-info.java | 4 ---- yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md | 1 - yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/package-info.java | 6 ------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/InfConfigController.java | 105 --------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigBaseVO.java | 40 ---------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigCreateReqVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExcelVO.java | 46 ---------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExportReqVO.java | 33 --------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigPageReqVO.java | 38 -------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigRespVO.java | 31 ------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java | 150 ------------------------------------------------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/InfFileController.java | 81 --------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFilePageReqVO.java | 35 ----------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFileRespVO.java | 22 ---------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobController.java | 145 ------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobLogController.java | 81 --------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobBaseVO.java | 37 ------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobExcelVO.java | 56 -------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobExportReqVO.java | 20 -------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobPageReqVO.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobRespVO.java | 31 ------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java | 53 ----------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java | 53 ----------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java | 33 --------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java | 38 -------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogRespVO.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/InfApiAccessLogController.java | 60 ------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/InfApiErrorLogController.java | 74 -------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java | 75 --------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java | 65 ----------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java | 42 ------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java | 47 ----------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java | 96 ------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java | 91 ------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java | 39 --------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java | 44 -------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.http | 7 ------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java | 55 ------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java | 36 ------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java | 44 -------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/config/InfConfigConvert.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/file/InfFileConvert.java | 18 ------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/job/InfJobConvert.java | 36 ------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/job/InfJobLogConvert.java | 30 ------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/logger/InfApiAccessLogConvert.java | 33 --------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/logger/InfApiErrorLogConvert.java | 31 ------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/package-info.java | 6 ------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/redis/RedisConvert.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md | 1 - yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/config/InfConfigDO.java | 65 ----------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/file/InfFileDO.java | 43 ------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobDO.java | 72 ------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobLogDO.java | 80 -------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java | 107 ----------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java | 153 --------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigDAOImpl.java | 39 --------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigMapper.java | 37 ------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/file/InfFileMapper.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/job/InfJobLogMapper.java | 43 ------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/job/InfJobMapper.java | 41 ----------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java | 47 ----------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java | 45 --------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfDictTypeConstants.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfErrorCodeConstants.java | 33 --------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/config/InfConfigTypeEnum.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/job/InfJobLogStatusEnum.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/job/InfJobStatusEnum.java | 43 ------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java | 28 ---------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/config/FileConfiguration.java | 12 ------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/config/FileProperties.java | 22 ---------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/package-info.java | 16 ---------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/package-info.java | 6 ------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/consumer/package-info.java | 1 - yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/message/config/InfConfigRefreshMessage.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/message/package-info.java | 1 - yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/producer/config/InfConfigProducer.java | 27 --------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/producer/package-info.java | 1 - yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/package-info.java | 7 ------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigService.java | 75 --------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/impl/InfConfigServiceImpl.java | 132 ------------------------------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileService.java | 46 ---------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/impl/InfFileServiceImpl.java | 72 ------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobLogService.java | 51 --------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobService.java | 91 ------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobLogServiceImpl.java | 74 -------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java | 174 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogService.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogService.java | 43 ------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java | 51 --------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java | 71 ----------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.http | 22 ---------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java | 90 ------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java | 79 ------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java | 40 ---------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java | 20 -------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java | 42 ------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java | 43 ------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java | 38 -------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java | 20 -------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.http | 2 -- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.java | 30 ------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/vo/SysCaptchaImageRespVO.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysDeptController.java | 86 -------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysPostController.java | 99 --------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java | 48 ------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java | 13 ------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptRespVO.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java | 37 ------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java | 11 ----------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostExcelVO.java | 31 ------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostExportReqVO.java | 20 -------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostListReqVO.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostPageReqVO.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostRespVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.http | 3 --- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.java | 95 ----------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictTypeController.java | 95 ----------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java | 44 -------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java | 12 ------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java | 27 --------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataRespVO.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java | 20 -------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java | 28 ---------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java | 33 --------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java | 38 -------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java | 28 ---------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.http | 12 ------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.java | 89 ----------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java | 30 ------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java | 14 -------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java | 41 ----------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java | 36 ------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java | 41 ----------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java | 26 -------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysLoginLogController.java | 59 ----------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.http | 3 --- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.java | 85 ------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java | 43 ------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java | 14 -------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java | 36 ------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java | 33 --------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java | 36 ------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java | 85 ------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java | 42 ------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java | 36 ------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java | 37 ------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/SysNoticeController.java | 72 ------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeBaseVO.java | 32 -------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java | 11 ----------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticePageReqVO.java | 20 -------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeRespVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.http | 3 --- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.java | 86 -------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysPermissionController.java | 73 ------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.http | 41 ----------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.java | 106 ---------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java | 53 ----------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java | 10 ---------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuRespVO.java | 28 ---------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java | 18 ------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java | 27 --------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java | 22 ---------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java | 22 ---------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java | 37 ------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java | 12 ------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleExcelVO.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java | 33 --------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRolePageReqVO.java | 36 ------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleRespVO.java | 38 -------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java | 22 ---------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsCallbackController.java | 49 ------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsChannelController.java | 80 -------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsLogController.java | 60 ------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsTemplateController.http | 12 ------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsTemplateController.java | 98 -------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java | 38 -------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java | 35 ----------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java | 26 -------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java | 100 ---------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java | 47 ----------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java | 52 ---------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java | 89 ----------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java | 46 ---------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java | 14 -------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java | 55 ------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java | 42 ------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java | 47 ----------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java | 30 ------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.http | 3 --- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java | 174 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java | 102 ------------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java | 88 ---------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java | 31 ------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserBaseVO.java | 52 ---------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserCreateReqVO.java | 22 ---------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserExcelVO.java | 52 ---------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserExportReqVO.java | 40 ---------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportExcelVO.java | 44 -------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportRespVO.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserPageReqVO.java | 43 ------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserRespVO.java | 31 ------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java | 22 ---------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java | 79 ------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysUserSessionConvert.java | 15 --------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/common/SysCaptchaConvert.java | 18 ------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysDeptConvert.java | 28 ---------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysPostConvert.java | 28 ---------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictDataConvert.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictTypeConvert.java | 28 ---------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/errorcode/SysErrorCodeConvert.java | 42 ------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysLoginLogConvert.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysOperateLogConvert.java | 41 ----------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/notice/SysNoticeConvert.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/package-info.java | 6 ------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysMenuConvert.java | 28 ---------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysRoleConvert.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsChannelConvert.java | 39 --------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsLogConvert.java | 30 ------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsTemplateConvert.java | 31 ------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java | 45 --------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md | 1 - yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/auth/SysUserSessionDO.java | 62 -------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dept/SysDeptDO.java | 58 ---------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dept/SysPostDO.java | 49 ------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictDataDO.java | 54 ------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictTypeDO.java | 49 ------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java | 50 -------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/logger/SysLoginLogDO.java | 59 ----------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/logger/SysOperateLogDO.java | 137 ----------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/notice/SysNoticeDO.java | 47 ----------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysMenuDO.java | 76 ---------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysRoleDO.java | 77 ----------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysRoleMenuDO.java | 33 --------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysUserRoleDO.java | 33 --------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsChannelDO.java | 60 ------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsLogDO.java | 173 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java | 89 ----------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/user/SysUserDO.java | 94 ---------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/auth/SysUserSessionMapper.java | 26 -------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dept/SysDeptMapper.java | 35 ----------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dept/SysPostMapper.java | 45 --------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictDataMapper.java | 46 ---------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictTypeMapper.java | 40 ---------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java | 52 ---------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/logger/SysLoginLogMapper.java | 45 --------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/logger/SysOperateLogMapper.java | 48 ------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/notice/SysNoticeMapper.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysMenuMapper.java | 35 ----------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMapper.java | 51 --------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMenuMapper.java | 48 ------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysUserRoleMapper.java | 43 ------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsChannelMapper.java | 27 --------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsLogMapper.java | 40 ---------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java | 53 ----------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/user/SysUserMapper.java | 56 -------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java | 0 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/SysRedisKeyConstants.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/auth/SysLoginUserRedisDAO.java | 47 ----------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/common/SysCaptchaRedisDAO.java | 41 ----------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysDictTypeConstants.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java | 98 -------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/common/SysSexEnum.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/dept/DeptIdEnum.java | 20 -------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java | 39 --------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginLogTypeEnum.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginResultEnum.java | 27 --------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/notice/SysNoticeTypeEnum.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/MenuIdEnum.java | 20 -------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/MenuTypeEnum.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/RoleCodeEnum.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/SysRoleTypeEnum.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsReceiveStatusEnum.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsSendStatusEnum.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsTemplateTypeEnum.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/config/CaptchaConfig.java | 9 --------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/config/CaptchaProperties.java | 31 ------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/package-info.java | 4 ---- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/config/CodegenConfiguration.java | 9 --------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/config/CodegenProperties.java | 28 ---------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/package-info.java | 4 ---- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/package-info.java | 6 ------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/job/auth/SysUserSessionTimeoutJob.java | 30 ------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/job/package-info.java | 1 - yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/mail/SysMailSendConsumer.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsSendConsumer.java | 30 ------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dept/SysDeptRefreshMessage.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dict/SysDictDataRefreshMessage.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/mail/SysMailSendMessage.java | 46 ---------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysMenuRefreshMessage.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleRefreshMessage.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsSendMessage.java | 48 ------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dept/SysDeptProducer.java | 27 --------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dict/SysDictDataProducer.java | 27 --------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysMenuProducer.java | 27 --------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysPermissionProducer.java | 27 --------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysRoleProducer.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SysSmsProducer.java | 60 ------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/package-info.java | 7 ------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthService.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionService.java | 69 --------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java | 218 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java | 151 ------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaService.java | 32 -------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/common/impl/SysCaptchaServiceImpl.java | 48 ------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptService.java | 96 ------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostService.java | 89 ----------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java | 274 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysPostServiceImpl.java | 128 -------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataService.java | 86 -------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeService.java | 80 -------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java | 256 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictTypeServiceImpl.java | 143 ----------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeService.java | 67 ------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java | 174 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogService.java | 39 --------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogService.java | 32 -------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysLoginLogServiceImpl.java | 41 ----------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java | 85 ------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeService.java | 52 ---------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/impl/SysNoticeServiceImpl.java | 75 --------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuService.java | 100 ---------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionService.java | 109 ------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleService.java | 132 ------------------------------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java | 311 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java | 332 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java | 290 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java | 79 ------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java | 77 ----------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java | 62 -------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateService.java | 115 ------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java | 172 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java | 86 -------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java | 171 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java | 275 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java | 169 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java | 373 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodegenController.java | 167 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java | 17 ----------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java | 49 ------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java | 85 ------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java | 57 --------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java | 35 ----------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java | 26 -------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/ToolTestDemoController.http | 7 ------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/ToolTestDemoController.java | 108 ------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java | 14 -------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java | 44 -------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java | 39 --------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java | 44 -------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoRespVO.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java | 21 --------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/convert/codegen/ToolCodegenConvert.java | 70 ---------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/convert/test/ToolTestDemoConvert.java | 36 ------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java | 125 ----------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java | 96 ------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java | 54 ------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java | 36 ------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/test/ToolTestDemoDO.java | 55 ------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java | 22 ---------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java | 19 ------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java | 26 -------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/test/ToolTestDemoMapper.java | 43 ------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/ToolErrorCodeConstants.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java | 29 ----------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java | 27 --------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java | 23 ----------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java | 36 ------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/config/ErrorCodeProperties.java | 26 -------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java | 34 ---------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java | 28 ---------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java | 15 --------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java | 98 -------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java | 24 ------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java | 73 ------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java | 35 ----------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/package-info.java | 6 ------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/package-info.java | 6 ------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/package-info.java | 7 ------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenService.java | 121 ------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java | 234 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java | 207 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java | 108 ------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java | 284 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/test/ToolTestDemoService.java | 75 --------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java | 86 -------------------------------------------------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java | 13 +++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/config/AsyncConfiguration.java | 9 +++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/package-info.java | 4 ++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/《芋道 Spring Boot 异步任务入门》.md | 1 + yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/config/AdminServerConfiguration.java | 9 +++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/package-info.java | 4 ++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md | 1 + yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/package-info.java | 6 ++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/InfConfigController.java | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigBaseVO.java | 40 ++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigCreateReqVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExportReqVO.java | 33 +++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigPageReqVO.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigRespVO.java | 31 +++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/doc/InfDbDocController.java | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java | 35 +++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFileRespVO.java | 22 ++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobController.java | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobLogController.java | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobBaseVO.java | 37 +++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExcelVO.java | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExportReqVO.java | 20 ++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobPageReqVO.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobRespVO.java | 31 +++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java | 33 +++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogRespVO.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiAccessLogController.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiErrorLogController.java | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java | 42 ++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.http | 7 +++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.java | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/config/InfConfigConvert.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java | 18 ++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobConvert.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobLogConvert.java | 30 ++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiAccessLogConvert.java | 33 +++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiErrorLogConvert.java | 31 +++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/package-info.java | 6 ++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/redis/RedisConvert.java | 34 ++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md | 1 + yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/config/InfConfigDO.java | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/file/InfFileDO.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobDO.java | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobLogDO.java | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigDAOImpl.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigMapper.java | 37 +++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobLogMapper.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobMapper.java | 41 +++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfDictTypeConstants.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java | 33 +++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/config/InfConfigTypeEnum.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobLogStatusEnum.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobStatusEnum.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java | 28 ++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileConfiguration.java | 12 ++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileProperties.java | 22 ++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/package-info.java | 16 ++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/package-info.java | 6 ++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/package-info.java | 1 + yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/config/InfConfigRefreshMessage.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/package-info.java | 1 + yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/config/InfConfigProducer.java | 27 +++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/package-info.java | 1 + yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/package-info.java | 7 +++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigService.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/impl/InfConfigServiceImpl.java | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogService.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobService.java | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobLogServiceImpl.java | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobServiceImpl.java | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogService.java | 34 ++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogService.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.http | 22 ++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java | 40 ++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java | 20 ++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java | 42 ++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java | 20 ++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.http | 2 ++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.java | 30 ++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/vo/SysCaptchaImageRespVO.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java | 13 +++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptRespVO.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostBaseVO.java | 37 +++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java | 11 +++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java | 31 +++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExportReqVO.java | 20 ++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostListReqVO.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostPageReqVO.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostRespVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.http | 3 +++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictTypeController.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java | 12 ++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java | 34 ++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java | 27 +++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataRespVO.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java | 20 ++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java | 28 ++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java | 33 +++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java | 28 ++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.http | 12 ++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.java | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java | 30 ++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java | 14 ++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java | 41 +++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java | 41 +++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java | 26 ++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysLoginLogController.java | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.http | 3 +++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java | 14 ++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java | 33 +++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java | 42 ++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java | 37 +++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/SysNoticeController.java | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeBaseVO.java | 32 ++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java | 11 +++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticePageReqVO.java | 20 ++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeRespVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.http | 3 +++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysPermissionController.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.http | 41 +++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java | 10 ++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuRespVO.java | 28 ++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java | 18 ++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java | 27 +++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java | 22 ++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java | 22 ++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleBaseVO.java | 37 +++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java | 12 ++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java | 34 ++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java | 33 +++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRolePageReqVO.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleRespVO.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java | 22 ++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SmsCallbackController.java | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsChannelController.java | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsLogController.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.http | 12 ++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.java | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java | 35 +++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java | 26 ++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java | 14 ++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java | 42 ++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java | 30 ++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.http | 3 +++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java | 31 +++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserBaseVO.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserCreateReqVO.java | 22 ++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExportReqVO.java | 40 ++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportRespVO.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java | 34 ++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageReqVO.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserRespVO.java | 31 +++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java | 22 ++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysUserSessionConvert.java | 15 +++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/common/SysCaptchaConvert.java | 18 ++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java | 28 ++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java | 28 ++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictDataConvert.java | 34 ++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictTypeConvert.java | 28 ++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/errorcode/SysErrorCodeConvert.java | 42 ++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysLoginLogConvert.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysOperateLogConvert.java | 41 +++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/notice/SysNoticeConvert.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/package-info.java | 6 ++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysMenuConvert.java | 28 ++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsChannelConvert.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsLogConvert.java | 30 ++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsTemplateConvert.java | 31 +++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md | 1 + yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/auth/SysUserSessionDO.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysDeptDO.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysPostDO.java | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictDataDO.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictTypeDO.java | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysLoginLogDO.java | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/notice/SysNoticeDO.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysMenuDO.java | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleDO.java | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleMenuDO.java | 33 +++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysUserRoleDO.java | 33 +++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsChannelDO.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsLogDO.java | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/user/SysUserDO.java | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/auth/SysUserSessionMapper.java | 26 ++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java | 35 +++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictDataMapper.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictTypeMapper.java | 40 ++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysLoginLogMapper.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysOperateLogMapper.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/notice/SysNoticeMapper.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysMenuMapper.java | 35 +++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMenuMapper.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsChannelMapper.java | 27 +++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsLogMapper.java | 40 ++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/RedisKeyConstants.java | 0 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/auth/SysLoginUserRedisDAO.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/common/SysCaptchaRedisDAO.java | 41 +++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysDictTypeConstants.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/common/SysSexEnum.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/dept/DeptIdEnum.java | 20 ++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginLogTypeEnum.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginResultEnum.java | 27 +++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/notice/SysNoticeTypeEnum.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuIdEnum.java | 20 ++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuTypeEnum.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/RoleCodeEnum.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/SysRoleTypeEnum.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsReceiveStatusEnum.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsSendStatusEnum.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsTemplateTypeEnum.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaConfig.java | 9 +++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaProperties.java | 31 +++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/package-info.java | 4 ++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenConfiguration.java | 9 +++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenProperties.java | 28 ++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/package-info.java | 4 ++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/package-info.java | 6 ++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/auth/SysUserSessionTimeoutJob.java | 30 ++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/package-info.java | 1 + yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/mail/SysMailSendConsumer.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java | 30 ++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dept/SysDeptRefreshMessage.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dict/SysDictDataRefreshMessage.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/mail/SysMailSendMessage.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysMenuRefreshMessage.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleRefreshMessage.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsSendMessage.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dept/SysDeptProducer.java | 27 +++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dict/SysDictDataProducer.java | 27 +++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysMenuProducer.java | 27 +++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysPermissionProducer.java | 27 +++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysRoleProducer.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/package-info.java | 7 +++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthService.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionService.java | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaService.java | 32 ++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/impl/SysCaptchaServiceImpl.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java | 274 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeService.java | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java | 256 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictTypeServiceImpl.java | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeService.java | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogService.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogService.java | 32 ++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java | 41 +++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysOperateLogServiceImpl.java | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeService.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/impl/SysNoticeServiceImpl.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuService.java | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysMenuServiceImpl.java | 311 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java | 332 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java | 290 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelService.java | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogService.java | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsService.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateService.java | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsLogServiceImpl.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsServiceImpl.java | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java | 275 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImpl.java | 373 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/ToolCodegenController.java | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java | 17 +++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java | 35 +++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java | 26 ++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.http | 7 +++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.java | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java | 34 ++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java | 14 ++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoRespVO.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java | 21 +++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/codegen/ToolCodegenConvert.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/test/ToolTestDemoConvert.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/test/ToolTestDemoDO.java | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java | 22 ++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java | 19 +++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java | 26 ++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/test/ToolTestDemoMapper.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolErrorCodeConstants.java | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java | 27 +++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeProperties.java | 26 ++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java | 34 ++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java | 28 ++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java | 15 +++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java | 35 +++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/package-info.java | 6 ++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/package-info.java | 6 ++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/package-info.java | 7 +++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenService.java | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenBuilder.java | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java | 284 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/ToolTestDemoService.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/main/resources/application-dev.yaml | 20 +------------------- yudao-admin-server/src/main/resources/application-local.yaml | 20 +------------------- yudao-admin-server/src/main/resources/application.yaml | 20 +++++++++++++++++++- yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/BaseDbAndRedisIntegrationTest.java | 38 -------------------------------------- yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/BaseRedisIntegrationTest.java | 23 ----------------------- yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/quartz/core/SchedulerManagerTest.java | 53 ----------------------------------------------------- yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/redis/core/stream/RedisStreamTest.java | 63 --------------------------------------------------------------- yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java | 54 ------------------------------------------------------ yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java | 45 --------------------------------------------- yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java | 52 ---------------------------------------------------- yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/package-info.java | 1 - yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/system/service/package-info.java | 1 - yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsServiceIntegrationTest.java | 74 -------------------------------------------------------------------------- yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java | 24 ------------------------ yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java | 12 ------------ yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenEngineTest.java | 34 ---------------------------------- yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenSQLParserTest.java | 29 ----------------------------- yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenServiceImplTest.java | 21 --------------------- yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisIntegrationTest.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/BaseRedisIntegrationTest.java | 23 +++++++++++++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/quartz/core/SchedulerManagerTest.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/package-info.java | 1 + yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/package-info.java | 1 + yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java | 24 ++++++++++++++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java | 12 ++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenEngineTest.java | 34 ++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenSQLParserTest.java | 29 +++++++++++++++++++++++++++++ yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenServiceImplTest.java | 21 +++++++++++++++++++++ yudao-admin-server/src/test-integration/resources/application-integration-test.yaml | 13 ------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java | 48 ------------------------------------------------ yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java | 39 --------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseMockitoUnitTest.java | 13 ------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseRedisUnitTest.java | 33 --------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/config/QuartzTestConfiguration.java | 16 ---------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/config/RedisTestConfiguration.java | 30 ------------------------------ yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java | 256 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileServiceTest.java | 126 ------------------------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobLogServiceTest.java | 173 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobServiceTest.java | 309 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java | 176 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java | 207 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java | 269 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionServiceImplTest.java | 227 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaServiceTest.java | 66 ------------------------------------------------------------------ yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java | 274 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java | 200 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataServiceTest.java | 302 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java | 279 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeServiceTest.java | 305 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java | 145 ------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java | 166 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java | 164 -------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuServiceTest.java | 366 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionServiceTest.java | 109 ------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleServiceTest.java | 302 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelServiceTest.java | 202 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogServiceTest.java | 248 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsServiceTest.java | 201 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateServiceTest.java | 380 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImplTest.java | 590 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisUnitTest.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseMockitoUnitTest.java | 13 +++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseRedisUnitTest.java | 33 +++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/QuartzTestConfiguration.java | 16 ++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/RedisTestConfiguration.java | 30 ++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigServiceTest.java | 256 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogServiceTest.java | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobServiceTest.java | 309 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java | 269 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaServiceTest.java | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java | 274 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataServiceTest.java | 302 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeServiceTest.java | 279 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeServiceTest.java | 305 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogServiceImplTest.java | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogServiceImplTest.java | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeServiceImplTest.java | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuServiceTest.java | 366 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java | 302 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelServiceTest.java | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogServiceTest.java | 248 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceTest.java | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateServiceTest.java | 380 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java | 590 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-admin-server/src/test/resources/application-unit-test.yaml | 13 ------------- 979 files changed, 28420 insertions(+), 28461 deletions(-) delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/AdminServerApplication.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/config/AsyncConfiguration.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/《芋道 Spring Boot 异步任务入门》.md delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/config/AdminServerConfiguration.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/InfConfigController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/InfFileController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFilePageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFileRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobLogController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/InfApiAccessLogController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/InfApiErrorLogController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.http delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/config/InfConfigConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/file/InfFileConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/job/InfJobConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/job/InfJobLogConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/logger/InfApiAccessLogConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/logger/InfApiErrorLogConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/redis/RedisConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/config/InfConfigDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/file/InfFileDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobLogDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigDAOImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/file/InfFileMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/job/InfJobLogMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/job/InfJobMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfDictTypeConstants.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfErrorCodeConstants.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/config/InfConfigTypeEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/job/InfJobLogStatusEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/job/InfJobStatusEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/config/FileConfiguration.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/config/FileProperties.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/consumer/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/message/config/InfConfigRefreshMessage.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/message/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/producer/config/InfConfigProducer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/producer/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/impl/InfConfigServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/impl/InfFileServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobLogService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobLogServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.http delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.http delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/vo/SysCaptchaImageRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysDeptController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysPostController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostListReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.http delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictTypeController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.http delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysLoginLogController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.http delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/SysNoticeController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticePageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.http delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysPermissionController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.http delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRolePageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsCallbackController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsChannelController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsLogController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsTemplateController.http delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsTemplateController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.http delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysUserSessionConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/common/SysCaptchaConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysDeptConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysPostConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictDataConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictTypeConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/errorcode/SysErrorCodeConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysLoginLogConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysOperateLogConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/notice/SysNoticeConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysMenuConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysRoleConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsChannelConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsLogConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsTemplateConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/auth/SysUserSessionDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dept/SysDeptDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dept/SysPostDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictDataDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictTypeDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/logger/SysLoginLogDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/logger/SysOperateLogDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/notice/SysNoticeDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysMenuDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysRoleDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysRoleMenuDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysUserRoleDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsChannelDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsLogDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/user/SysUserDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/auth/SysUserSessionMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dept/SysDeptMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dept/SysPostMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictDataMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictTypeMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/logger/SysLoginLogMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/logger/SysOperateLogMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/notice/SysNoticeMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysMenuMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMenuMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysUserRoleMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsChannelMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsLogMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/user/SysUserMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/SysRedisKeyConstants.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/auth/SysLoginUserRedisDAO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/common/SysCaptchaRedisDAO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysDictTypeConstants.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/common/SysSexEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/dept/DeptIdEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginLogTypeEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginResultEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/notice/SysNoticeTypeEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/MenuIdEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/MenuTypeEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/RoleCodeEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/SysRoleTypeEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsReceiveStatusEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsSendStatusEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsTemplateTypeEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/config/CaptchaConfig.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/config/CaptchaProperties.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/config/CodegenConfiguration.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/config/CodegenProperties.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/job/auth/SysUserSessionTimeoutJob.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/job/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/mail/SysMailSendConsumer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsSendConsumer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dept/SysDeptRefreshMessage.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dict/SysDictDataRefreshMessage.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/mail/SysMailSendMessage.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysMenuRefreshMessage.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleRefreshMessage.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsSendMessage.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dept/SysDeptProducer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dict/SysDictDataProducer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysMenuProducer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysPermissionProducer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysRoleProducer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SysSmsProducer.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/common/impl/SysCaptchaServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysPostServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictTypeServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysLoginLogServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/impl/SysNoticeServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodegenController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/ToolTestDemoController.http delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/ToolTestDemoController.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/convert/codegen/ToolCodegenConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/convert/test/ToolTestDemoConvert.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/test/ToolTestDemoDO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/test/ToolTestDemoMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/ToolErrorCodeConstants.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/config/ErrorCodeProperties.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/test/ToolTestDemoService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/config/AsyncConfiguration.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/《芋道 Spring Boot 异步任务入门》.md create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/config/AdminServerConfiguration.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/InfConfigController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/doc/InfDbDocController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFileRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobLogController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiAccessLogController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiErrorLogController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.http create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/config/InfConfigConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobLogConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiAccessLogConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiErrorLogConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/redis/RedisConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/config/InfConfigDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/file/InfFileDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobLogDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigDAOImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobLogMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfDictTypeConstants.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/config/InfConfigTypeEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobLogStatusEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobStatusEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileConfiguration.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileProperties.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/config/InfConfigRefreshMessage.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/config/InfConfigProducer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/impl/InfConfigServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobLogServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.http create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.http create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/vo/SysCaptchaImageRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostListReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.http create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictTypeController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.http create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysLoginLogController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.http create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/SysNoticeController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticePageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.http create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysPermissionController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.http create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRolePageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SmsCallbackController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsChannelController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsLogController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.http create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.http create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysUserSessionConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/common/SysCaptchaConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictDataConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictTypeConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/errorcode/SysErrorCodeConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysLoginLogConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysOperateLogConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/notice/SysNoticeConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysMenuConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsChannelConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsLogConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsTemplateConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/auth/SysUserSessionDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysDeptDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysPostDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictDataDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictTypeDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysLoginLogDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/notice/SysNoticeDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysMenuDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleMenuDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysUserRoleDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsChannelDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsLogDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/user/SysUserDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/auth/SysUserSessionMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictDataMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictTypeMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysLoginLogMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysOperateLogMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/notice/SysNoticeMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysMenuMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMenuMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsChannelMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsLogMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/RedisKeyConstants.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/auth/SysLoginUserRedisDAO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/common/SysCaptchaRedisDAO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysDictTypeConstants.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/common/SysSexEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/dept/DeptIdEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginLogTypeEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginResultEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/notice/SysNoticeTypeEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuIdEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuTypeEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/RoleCodeEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/SysRoleTypeEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsReceiveStatusEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsSendStatusEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsTemplateTypeEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaConfig.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaProperties.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenConfiguration.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenProperties.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/auth/SysUserSessionTimeoutJob.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/mail/SysMailSendConsumer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dept/SysDeptRefreshMessage.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dict/SysDictDataRefreshMessage.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/mail/SysMailSendMessage.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysMenuRefreshMessage.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleRefreshMessage.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsSendMessage.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dept/SysDeptProducer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dict/SysDictDataProducer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysMenuProducer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysPermissionProducer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysRoleProducer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/impl/SysCaptchaServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictTypeServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysOperateLogServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/impl/SysNoticeServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysMenuServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsLogServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/ToolCodegenController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.http create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoRespVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/codegen/ToolCodegenConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/test/ToolTestDemoConvert.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/test/ToolTestDemoDO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/test/ToolTestDemoMapper.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolErrorCodeConstants.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeProperties.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/package-info.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenBuilder.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/ToolTestDemoService.java create mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/BaseDbAndRedisIntegrationTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/BaseRedisIntegrationTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/quartz/core/SchedulerManagerTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/redis/core/stream/RedisStreamTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/package-info.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/system/service/package-info.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsServiceIntegrationTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenEngineTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenSQLParserTest.java delete mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenServiceImplTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisIntegrationTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/BaseRedisIntegrationTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/quartz/core/SchedulerManagerTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/package-info.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/package-info.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenEngineTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenSQLParserTest.java create mode 100644 yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenServiceImplTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseMockitoUnitTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseRedisUnitTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/config/QuartzTestConfiguration.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/config/RedisTestConfiguration.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobLogServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionServiceImplTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateServiceTest.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImplTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisUnitTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseMockitoUnitTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseRedisUnitTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/QuartzTestConfiguration.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/RedisTestConfiguration.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogServiceImplTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogServiceImplTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeServiceImplTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateServiceTest.java create mode 100644 yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/AdminServerApplication.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/AdminServerApplication.java deleted file mode 100644 index 60fd641..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/AdminServerApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.iocoder.dashboard; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class AdminServerApplication { - - public static void main(String[] args) { - SpringApplication.run(AdminServerApplication.class, args); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/config/AsyncConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/config/AsyncConfiguration.java deleted file mode 100644 index 58096d5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/config/AsyncConfiguration.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.iocoder.dashboard.framework.async.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.EnableAsync; - -@Configuration -@EnableAsync -public class AsyncConfiguration { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/package-info.java deleted file mode 100644 index 3753589..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 异步执行,基于 Spring @Async 实现 - */ -package cn.iocoder.dashboard.framework.async; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/《芋道 Spring Boot 异步任务入门》.md b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/《芋道 Spring Boot 异步任务入门》.md deleted file mode 100644 index 5822b83..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/async/《芋道 Spring Boot 异步任务入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/config/AdminServerConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/config/AdminServerConfiguration.java deleted file mode 100644 index 77c166c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/config/AdminServerConfiguration.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.iocoder.dashboard.framework.monitor.config; - -import de.codecentric.boot.admin.server.config.EnableAdminServer; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableAdminServer -public class AdminServerConfiguration { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/package-info.java deleted file mode 100644 index dec6e31..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 使用 Spring Boot Admin 实现简单的监控平台 - */ -package cn.iocoder.dashboard.framework.monitor; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md deleted file mode 100644 index a1e3676..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/package-info.java deleted file mode 100644 index 991a69b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于整个 yudao-admin-server 的 framework 封装 - * - * @author 芋道源码 - */ -package cn.iocoder.dashboard.framework; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/InfConfigController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/InfConfigController.java deleted file mode 100644 index 4fa9c4b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/InfConfigController.java +++ /dev/null @@ -1,105 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.config; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.*; -import cn.iocoder.dashboard.modules.infra.convert.config.InfConfigConvert; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; -import cn.iocoder.dashboard.modules.infra.service.config.InfConfigService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_SENSITIVE; - -@Api(tags = "参数配置") -@RestController -@RequestMapping("/infra/config") -@Validated -public class InfConfigController { - - @Resource - private InfConfigService configService; - - @PostMapping("/create") - @ApiOperation("创建参数配置") - @PreAuthorize("@ss.hasPermission('infra:config:create')") - public CommonResult createConfig(@Valid @RequestBody InfConfigCreateReqVO reqVO) { - return success(configService.createConfig(reqVO)); - } - - @PutMapping("/update") - @ApiOperation("修改参数配置") - @PreAuthorize("@ss.hasPermission('infra:config:update')") - public CommonResult updateConfig(@Valid @RequestBody InfConfigUpdateReqVO reqVO) { - configService.updateConfig(reqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除参数配置") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('infra:config:delete')") - public CommonResult deleteConfig(@RequestParam("id") Long id) { - configService.deleteConfig(id); - return success(true); - } - - @GetMapping(value = "/get") - @ApiOperation("获得参数配置") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('infra:config:query')") - public CommonResult getConfig(@RequestParam("id") Long id) { - return success(InfConfigConvert.INSTANCE.convert(configService.getConfig(id))); - } - - @GetMapping(value = "/get-value-by-key") - @ApiOperation(value = "根据参数键名查询参数值", notes = "敏感配置,不允许返回给前端") - @ApiImplicitParam(name = "key", value = "参数键", required = true, example = "yunai.biz.username", dataTypeClass = String.class) - public CommonResult getConfigKey(@RequestParam("key") String key) { - InfConfigDO config = configService.getConfigByKey(key); - if (config == null) { - return null; - } - if (config.getSensitive()) { - throw exception(CONFIG_GET_VALUE_ERROR_IF_SENSITIVE); - } - return success(config.getValue()); - } - - @GetMapping("/page") - @ApiOperation("获取参数配置分页") - @PreAuthorize("@ss.hasPermission('infra:config:query')") - public CommonResult> getConfigPage(@Valid InfConfigPageReqVO reqVO) { - PageResult page = configService.getConfigPage(reqVO); - return success(InfConfigConvert.INSTANCE.convertPage(page)); - } - - @GetMapping("/export") - @ApiOperation("导出参数配置") - @PreAuthorize("@ss.hasPermission('infra:config:export')") - @OperateLog(type = EXPORT) - public void exportSysConfig(@Valid InfConfigExportReqVO reqVO, - HttpServletResponse response) throws IOException { - List list = configService.getConfigList(reqVO); - // 拼接数据 - List datas = InfConfigConvert.INSTANCE.convertList(list); - // 输出 - ExcelUtils.write(response, "参数配置.xls", "数据", InfConfigExcelVO.class, datas); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigBaseVO.java deleted file mode 100644 index c8034e4..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigBaseVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.config.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 参数配置 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class InfConfigBaseVO { - - @ApiModelProperty(value = "参数分组", required = true, example = "biz") - @NotEmpty(message = "参数分组不能为空") - @Size(max = 50, message = "参数名称不能超过50个字符") - private String group; - - @ApiModelProperty(value = "参数名称", required = true, example = "数据库名") - @NotBlank(message = "参数名称不能为空") - @Size(max = 100, message = "参数名称不能超过100个字符") - private String name; - - @ApiModelProperty(value = "参数键值", required = true, example = "1024") - @NotBlank(message = "参数键值不能为空") - @Size(max = 500, message = "参数键值长度不能超过500个字符") - private String value; - - @ApiModelProperty(value = "是否敏感", required = true, example = "true") - @NotNull(message = "是否敏感不能为空") - private Boolean sensitive; - - @ApiModelProperty(value = "备注", example = "备注一下很帅气!") - private String remark; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigCreateReqVO.java deleted file mode 100644 index 7b0bcfb..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigCreateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.config.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; - -@ApiModel("参数配置创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class InfConfigCreateReqVO extends InfConfigBaseVO { - - @ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username") - @NotBlank(message = "参数键名长度不能为空") - @Size(max = 100, message = "参数键名长度不能超过100个字符") - private String key; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExcelVO.java deleted file mode 100644 index 622034f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExcelVO.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.config.vo; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * 参数配置 Excel 导出响应 VO - */ -@Data -public class InfConfigExcelVO { - - @ExcelProperty("参数配置序号") - private Long id; - - @ExcelProperty("参数键名") - private String key; - - @ExcelProperty("参数分组") - private String group; - - @ExcelProperty("参数名称") - private String name; - - @ExcelProperty("参数键值") - private String value; - - @ExcelProperty(value = "参数类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.CONFIG_TYPE) - private Integer type; - - @ExcelProperty(value = "是否敏感", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.BOOLEAN_STRING) - private Boolean sensitive; - - @ExcelProperty("备注") - private String remark; - - @ExcelProperty("创建时间") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExportReqVO.java deleted file mode 100644 index 1e43758..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExportReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.config.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("参数配置导出 Request VO") -@Data -public class InfConfigExportReqVO { - - @ApiModelProperty(value = "参数名称", example = "模糊匹配") - private String name; - - @ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配") - private String key; - - @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举") - private Integer type; - - @ApiModelProperty(value = "开始时间", example = "2020-10-24 00:00:00") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束时间", example = "2020-10-24 23:59:59") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigPageReqVO.java deleted file mode 100644 index a862f35..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigPageReqVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.config.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("参数配置分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfConfigPageReqVO extends PageParam { - - @ApiModelProperty(value = "参数名称", example = "模糊匹配") - private String name; - - @ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配") - private String key; - - @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举") - private Integer type; - - @ApiModelProperty(value = "开始时间", example = "2020-10-24 00:00:00") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束时间", example = "2020-10-24 23:59:59") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigRespVO.java deleted file mode 100644 index 10673e2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigRespVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.config.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; -import java.util.Date; - -@ApiModel("参数配置信息 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class InfConfigRespVO extends InfConfigBaseVO { - - @ApiModelProperty(value = "参数配置序号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username") - @NotBlank(message = "参数键名长度不能为空") - @Size(max = 100, message = "参数键名长度不能超过100个字符") - private String key; - - @ApiModelProperty(value = "参数类型", required = true, example = "1", notes = "参见 SysConfigTypeEnum 枚举") - private Integer type; - - @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java deleted file mode 100644 index 478f308..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.config.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@ApiModel("参数配置创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfConfigUpdateReqVO extends InfConfigBaseVO { - - @ApiModelProperty(value = "参数配置序号", required = true, example = "1024") - @NotNull(message = "参数配置编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java deleted file mode 100644 index 1271e1b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/doc/InfDbDocController.java +++ /dev/null @@ -1,150 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.doc; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.IdUtil; -import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; -import cn.smallbun.screw.core.Configuration; -import cn.smallbun.screw.core.engine.EngineConfig; -import cn.smallbun.screw.core.engine.EngineFileType; -import cn.smallbun.screw.core.engine.EngineTemplateType; -import cn.smallbun.screw.core.execute.DocumentationExecute; -import cn.smallbun.screw.core.process.ProcessConfig; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import java.io.File; -import java.io.IOException; -import java.util.Collections; - -@Api(tags = "数据库文档") -@RestController -@RequestMapping("/infra/db-doc") -public class InfDbDocController { - - @Resource - private DataSourceProperties dataSourceProperties; - - private static final String FILE_OUTPUT_DIR = System.getProperty("java.io.tmpdir") + File.separator - + "db-doc"; - private static final String DOC_FILE_NAME = "数据库文档"; - private static final String DOC_VERSION = "1.0.0"; - private static final String DOC_DESCRIPTION = "文档描述"; - - @GetMapping("/export-html") - @ApiOperation("导出 html 格式的数据文档") - @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) - public void exportHtml(@RequestParam(defaultValue = "true") Boolean deleteFile, - HttpServletResponse response) throws IOException { - doExportFile(EngineFileType.HTML, deleteFile, response); - } - - @GetMapping("/export-word") - @ApiOperation("导出 word 格式的数据文档") - @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) - public void exportWord(@RequestParam(defaultValue = "true") Boolean deleteFile, - HttpServletResponse response) throws IOException { - doExportFile(EngineFileType.WORD, deleteFile, response); - } - - @GetMapping("/export-markdown") - @ApiOperation("导出 markdown 格式的数据文档") - @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) - public void exportMarkdown(@RequestParam(defaultValue = "true") Boolean deleteFile, - HttpServletResponse response) throws IOException { - doExportFile(EngineFileType.MD, deleteFile, response); - } - - private void doExportFile(EngineFileType fileOutputType, Boolean deleteFile, - HttpServletResponse response) throws IOException { - String docFileName = DOC_FILE_NAME + "_" + IdUtil.fastSimpleUUID(); - String filePath = doExportFile(fileOutputType, docFileName); - String downloadFileName = DOC_FILE_NAME + fileOutputType.getFileSuffix(); //下载后的文件名 - try { - // 读取,返回 - ServletUtils.writeAttachment(response, downloadFileName, FileUtil.readBytes(filePath)); - } finally { - handleDeleteFile(deleteFile, filePath); - } - } - - /** - * 输出文件,返回文件路径 - * - * @param fileOutputType 文件类型 - * @param fileName 文件名, 无需 ".docx" 等文件后缀 - * @return 生成的文件所在路径 - */ - private String doExportFile(EngineFileType fileOutputType, String fileName) { - try (HikariDataSource dataSource = buildDataSource()) { - // 创建 screw 的配置 - Configuration config = Configuration.builder() - .version(DOC_VERSION) // 版本 - .description(DOC_DESCRIPTION) // 描述 - .dataSource(dataSource) // 数据源 - .engineConfig(buildEngineConfig(fileOutputType, fileName)) // 引擎配置 - .produceConfig(buildProcessConfig()) // 处理配置 - .build(); - - // 执行 screw,生成数据库文档 - new DocumentationExecute(config).execute(); - - return FILE_OUTPUT_DIR + File.separator + fileName + fileOutputType.getFileSuffix(); - } - } - - private void handleDeleteFile(Boolean deleteFile, String filePath) { - if (!deleteFile) { - return; - } - FileUtil.del(filePath); - } - - /** - * 创建数据源 - */ - // TODO 芋艿:screw 暂时不支持 druid,尴尬 - private HikariDataSource buildDataSource() { - // 创建 HikariConfig 配置类 - HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setJdbcUrl(dataSourceProperties.getUrl()); - hikariConfig.setUsername(dataSourceProperties.getUsername()); - hikariConfig.setPassword(dataSourceProperties.getPassword()); - hikariConfig.addDataSourceProperty("useInformationSchema", "true"); // 设置可以获取 tables remarks 信息 - // 创建数据源 - return new HikariDataSource(hikariConfig); - } - - /** - * 创建 screw 的引擎配置 - */ - private static EngineConfig buildEngineConfig(EngineFileType fileOutputType, String docFileName) { - return EngineConfig.builder() - .fileOutputDir(FILE_OUTPUT_DIR) // 生成文件路径 - .openOutputDir(false) // 打开目录 - .fileType(fileOutputType) // 文件类型 - .produceType(EngineTemplateType.freemarker) // 文件类型 - .fileName(docFileName) // 自定义文件名称 - .build(); - } - - /** - * 创建 screw 的处理配置,一般可忽略 - * 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置 - */ - private static ProcessConfig buildProcessConfig() { - return ProcessConfig.builder() - .ignoreTablePrefix(Collections.singletonList("QRTZ_")) // 忽略表前缀 - .build(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/InfFileController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/InfFileController.java deleted file mode 100644 index dbbfd7f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/InfFileController.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.file; - -import cn.hutool.core.io.IoUtil; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFilePageReqVO; -import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFileRespVO; -import cn.iocoder.dashboard.modules.infra.convert.file.InfFileConvert; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.dashboard.modules.infra.service.file.InfFileService; -import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "文件存储") -@RestController -@RequestMapping("/infra/file") -@Validated -@Slf4j -public class InfFileController { - - @Resource - private InfFileService fileService; - - @PostMapping("/upload") - @ApiOperation("上传文件") - @ApiImplicitParams({ - @ApiImplicitParam(name = "file", value = "文件附件", required = true, dataTypeClass = MultipartFile.class), - @ApiImplicitParam(name = "path", value = "文件路径", required = false, example = "yudaoyuanma.png", dataTypeClass = String.class) - }) - public CommonResult uploadFile(@RequestParam("file") MultipartFile file, - @RequestParam("path") String path) throws IOException { - return success(fileService.createFile(path, IoUtil.readBytes(file.getInputStream()))); - } - - @DeleteMapping("/delete") - @ApiOperation("删除文件") - @ApiImplicitParam(name = "id", value = "编号", required = true) - @PreAuthorize("@ss.hasPermission('infra:file:delete')") - public CommonResult deleteFile(@RequestParam("id") String id) { - fileService.deleteFile(id); - return success(true); - } - - @GetMapping("/get/{path}") - @ApiOperation("下载文件") - @ApiImplicitParam(name = "path", value = "文件附件", required = true, dataTypeClass = MultipartFile.class) - public void getFile(HttpServletResponse response, @PathVariable("path") String path) throws IOException { - InfFileDO file = fileService.getFile(path); - if (file == null) { - log.warn("[getFile][path({}) 文件不存在]", path); - response.setStatus(HttpStatus.NOT_FOUND.value()); - return; - } - ServletUtils.writeAttachment(response, path, file.getContent()); - } - - @GetMapping("/page") - @ApiOperation("获得文件分页") - @PreAuthorize("@ss.hasPermission('infra:file:query')") - public CommonResult> getFilePage(@Valid InfFilePageReqVO pageVO) { - PageResult pageResult = fileService.getFilePage(pageVO); - return success(InfFileConvert.INSTANCE.convertPage(pageResult)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFilePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFilePageReqVO.java deleted file mode 100644 index 41f792d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFilePageReqVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.file.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("文件分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfFilePageReqVO extends PageParam { - - @ApiModelProperty(value = "文件路径", example = "yudao", notes = "模糊匹配") - private String id; - - @ApiModelProperty(value = "文件类型", example = "jpg", notes = "模糊匹配") - private String type; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束创建时间") - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFileRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFileRespVO.java deleted file mode 100644 index e78074d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/file/vo/InfFileRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.file.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -@ApiModel(value = "文件 Response VO", description = "不返回 content 字段,太大") -@Data -public class InfFileRespVO { - - @ApiModelProperty(value = "文件路径", required = true, example = "yudao.jpg") - private String id; - - @ApiModelProperty(value = "文件类型", required = true, example = "jpg") - private String type; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobController.java deleted file mode 100644 index 83af689..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobController.java +++ /dev/null @@ -1,145 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.framework.quartz.core.util.CronUtils; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.*; -import cn.iocoder.dashboard.modules.infra.convert.job.InfJobConvert; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO; -import cn.iocoder.dashboard.modules.infra.service.job.InfJobService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import org.quartz.SchedulerException; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "定时任务") -@RestController -@RequestMapping("/infra/job") -@Validated -public class InfJobController { - - @Resource - private InfJobService jobService; - - @PostMapping("/create") - @ApiOperation("创建定时任务") - @PreAuthorize("@ss.hasPermission('infra:job:create')") - public CommonResult createJob(@Valid @RequestBody InfJobCreateReqVO createReqVO) - throws SchedulerException { - return success(jobService.createJob(createReqVO)); - } - - @PutMapping("/update") - @ApiOperation("更新定时任务") - @PreAuthorize("@ss.hasPermission('infra:job:update')") - public CommonResult updateJob(@Valid @RequestBody InfJobUpdateReqVO updateReqVO) - throws SchedulerException { - jobService.updateJob(updateReqVO); - return success(true); - } - - @PutMapping("/update-status") - @ApiOperation("更新定时任务的状态") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class), - @ApiImplicitParam(name = "status", value = "状态", required = true, example = "1", dataTypeClass = Integer.class), - }) - @PreAuthorize("@ss.hasPermission('infra:job:update')") - public CommonResult updateJobStatus(@RequestParam(value = "id") Long id, @RequestParam("status") Integer status) - throws SchedulerException { - jobService.updateJobStatus(id, status); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除定时任务") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('infra:job:delete')") - public CommonResult deleteJob(@RequestParam("id") Long id) - throws SchedulerException { - jobService.deleteJob(id); - return success(true); - } - - @PutMapping("/trigger") - @ApiOperation("触发定时任务") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('infra:job:trigger')") - public CommonResult triggerJob(@RequestParam("id") Long id) throws SchedulerException { - jobService.triggerJob(id); - return success(true); - } - - @GetMapping("/get") - @ApiOperation("获得定时任务") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult getJob(@RequestParam("id") Long id) { - InfJobDO job = jobService.getJob(id); - return success(InfJobConvert.INSTANCE.convert(job)); - } - - @GetMapping("/list") - @ApiOperation("获得定时任务列表") - @ApiImplicitParam(name = "ids", value = "编号列表", required = true, dataTypeClass = List.class) - @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult> getJobList(@RequestParam("ids") Collection ids) { - List list = jobService.getJobList(ids); - return success(InfJobConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/page") - @ApiOperation("获得定时任务分页") - @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult> getJobPage(@Valid InfJobPageReqVO pageVO) { - PageResult pageResult = jobService.getJobPage(pageVO); - return success(InfJobConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @ApiOperation("导出定时任务 Excel") - @PreAuthorize("@ss.hasPermission('infra:job:export')") - @OperateLog(type = EXPORT) - public void exportJobExcel(@Valid InfJobExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = jobService.getJobList(exportReqVO); - // 导出 Excel - List datas = InfJobConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "定时任务.xls", "数据", InfJobExcelVO.class, datas); - } - - @GetMapping("/get_next_times") - @ApiOperation("获得定时任务的下 n 次执行时间") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class), - @ApiImplicitParam(name = "count", value = "数量", example = "5", dataTypeClass = Long.class) - }) - @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult> getJobNextTimes(@RequestParam("id") Long id, - @RequestParam(value = "count", required = false, defaultValue = "5") Integer count) { - InfJobDO job = jobService.getJob(id); - if (job == null) { - return success(Collections.emptyList()); - } - return success(CronUtils.getNextTimes(job.getCronExpression(), count)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobLogController.java deleted file mode 100644 index 717ceb0..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/InfJobLogController.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogExcelVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogRespVO; -import cn.iocoder.dashboard.modules.infra.convert.job.InfJobLogConvert; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobLogDO; -import cn.iocoder.dashboard.modules.infra.service.job.InfJobLogService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "定时任务日志") -@RestController -@RequestMapping("/infra/job-log") -@Validated -public class InfJobLogController { - - @Resource - private InfJobLogService jobLogService; - - @GetMapping("/get") - @ApiOperation("获得定时任务日志") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult getJobLog(@RequestParam("id") Long id) { - InfJobLogDO jobLog = jobLogService.getJobLog(id); - return success(InfJobLogConvert.INSTANCE.convert(jobLog)); - } - - @GetMapping("/list") - @ApiOperation("获得定时任务日志列表") - @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) - @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult> getJobLogList(@RequestParam("ids") Collection ids) { - List list = jobLogService.getJobLogList(ids); - return success(InfJobLogConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/page") - @ApiOperation("获得定时任务日志分页") - @PreAuthorize("@ss.hasPermission('infra:job:query')") - public CommonResult> getJobLogPage(@Valid InfJobLogPageReqVO pageVO) { - PageResult pageResult = jobLogService.getJobLogPage(pageVO); - return success(InfJobLogConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @ApiOperation("导出定时任务日志 Excel") - @PreAuthorize("@ss.hasPermission('infra:job:export')") - @OperateLog(type = EXPORT) - public void exportJobLogExcel(@Valid InfJobLogExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = jobLogService.getJobLogList(exportReqVO); - // 导出 Excel - List datas = InfJobLogConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "任务日志.xls", "数据", InfJobLogExcelVO.class, datas); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobBaseVO.java deleted file mode 100644 index 2df3ad8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobBaseVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.job; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** -* 定时任务 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class InfJobBaseVO { - - @ApiModelProperty(value = "任务名称", required = true, example = "测试任务") - @NotNull(message = "任务名称不能为空") - private String name; - - @ApiModelProperty(value = "处理器的参数", example = "yudao") - private String handlerParam; - - @ApiModelProperty(value = "CRON 表达式", required = true, example = "0/10 * * * * ? *") - @NotNull(message = "CRON 表达式不能为空") - private String cronExpression; - - @ApiModelProperty(value = "重试次数", required = true, example = "3") - @NotNull(message = "重试次数不能为空") - private Integer retryCount; - - @ApiModelProperty(value = "重试间隔", required = true, example = "1000") - @NotNull(message = "重试间隔不能为空") - private Integer retryInterval; - - @ApiModelProperty(value = "监控超时时间", example = "1000") - private Integer monitorTimeout; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java deleted file mode 100644 index a8ba55d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.job; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@ApiModel("定时任务创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfJobCreateReqVO extends InfJobBaseVO { - - @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob") - @NotNull(message = "处理器的名字不能为空") - private String handlerName; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobExcelVO.java deleted file mode 100644 index 1488642..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobExcelVO.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.job; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.infra.enums.InfDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * 定时任务 Excel VO - * - * @author 芋道源码 - */ -@Data -public class InfJobExcelVO { - - @ExcelProperty("任务编号") - private Long id; - - @ExcelProperty("任务名称") - private String name; - - @ExcelProperty(value = "任务状态", converter = DictConvert.class) - @DictFormat(InfDictTypeConstants.JOB_STATUS) - private Integer status; - - @ExcelProperty("处理器的名字") - private String handlerName; - - @ExcelProperty("处理器的参数") - private String handlerParam; - - @ExcelProperty("CRON 表达式") - private String cronExpression; - - @ExcelProperty("最后一次执行的开始时间") - private Date executeBeginTime; - - @ExcelProperty("最后一次执行的结束时间") - private Date executeEndTime; - - @ExcelProperty("上一次触发时间") - private Date firePrevTime; - - @ExcelProperty("下一次触发时间") - private Date fireNextTime; - - @ExcelProperty("监控超时时间") - private Integer monitorTimeout; - - @ExcelProperty("创建时间") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobExportReqVO.java deleted file mode 100644 index a0fe9f3..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobExportReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.job; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@ApiModel(value = "定时任务 Excel 导出 Request VO", description = "参数和 InfJobPageReqVO 是一致的") -@Data -public class InfJobExportReqVO { - - @ApiModelProperty(value = "任务名称", example = "测试任务", notes = "模糊匹配") - private String name; - - @ApiModelProperty(value = "任务状态", example = "1", notes = "参见 InfJobStatusEnum 枚举") - private Integer status; - - @ApiModelProperty(value = "处理器的名字", example = "sysUserSessionTimeoutJob", notes = "模糊匹配") - private String handlerName; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobPageReqVO.java deleted file mode 100644 index 6baf46e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobPageReqVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.job; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("定时任务分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfJobPageReqVO extends PageParam { - - @ApiModelProperty(value = "任务名称", example = "测试任务", notes = "模糊匹配") - private String name; - - @ApiModelProperty(value = "任务状态", example = "1", notes = "参见 InfJobStatusEnum 枚举") - private Integer status; - - @ApiModelProperty(value = "处理器的名字", example = "sysUserSessionTimeoutJob", notes = "模糊匹配") - private String handlerName; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobRespVO.java deleted file mode 100644 index c23eb8b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobRespVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.job; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; -import java.util.Date; - -@ApiModel("定时任务 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfJobRespVO extends InfJobBaseVO { - - @ApiModelProperty(value = "任务编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "任务状态", required = true, example = "1") - private Integer status; - - @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob") - @NotNull(message = "处理器的名字不能为空") - private String handlerName; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java deleted file mode 100644 index 1316667..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.job; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@ApiModel("定时任务更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfJobUpdateReqVO extends InfJobBaseVO { - - @ApiModelProperty(value = "任务编号", required = true, example = "1024") - @NotNull(message = "任务编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java deleted file mode 100644 index 5ae2795..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.log; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.NotNull; -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** -* 定时任务日志 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class InfJobLogBaseVO { - - @ApiModelProperty(value = "任务编号", required = true, example = "1024") - @NotNull(message = "任务编号不能为空") - private Long jobId; - - @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob") - @NotNull(message = "处理器的名字不能为空") - private String handlerName; - - @ApiModelProperty(value = "处理器的参数", example = "yudao") - private String handlerParam; - - @ApiModelProperty(value = "第几次执行", required = true, example = "1") - @NotNull(message = "第几次执行不能为空") - private Integer executeIndex; - - @ApiModelProperty(value = "开始执行时间", required = true) - @NotNull(message = "开始执行时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束执行时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - - @ApiModelProperty(value = "执行时长", example = "123") - private Integer duration; - - @ApiModelProperty(value = "任务状态", required = true, example = "1", notes = "参见 InfJobLogStatusEnum 枚举") - @NotNull(message = "任务状态不能为空") - private Integer status; - - @ApiModelProperty(value = "结果数据", example = "执行成功") - private String result; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java deleted file mode 100644 index 58a58d6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.log; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.infra.enums.InfDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * 定时任务 Excel VO - * - * @author 芋艿 - */ -@Data -public class InfJobLogExcelVO { - - @ExcelProperty("日志编号") - private Long id; - - @ExcelProperty("任务编号") - private Long jobId; - - @ExcelProperty("处理器的名字") - private String handlerName; - - @ExcelProperty("处理器的参数") - private String handlerParam; - - @ExcelProperty("第几次执行") - private Integer executeIndex; - - @ExcelProperty("开始执行时间") - private Date beginTime; - - @ExcelProperty("结束执行时间") - private Date endTime; - - @ExcelProperty("执行时长") - private Integer duration; - - @ExcelProperty(value = "任务状态", converter = DictConvert.class) - @DictFormat(InfDictTypeConstants.JOB_STATUS) - private Integer status; - - @ExcelProperty("结果数据") - private String result; - - @ExcelProperty("创建时间") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java deleted file mode 100644 index 4bbf562..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.log; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel(value = "定时任务 Excel 导出 Request VO", description = "参数和 InfJobLogPageReqVO 是一致的") -@Data -public class InfJobLogExportReqVO { - - @ApiModelProperty(value = "任务编号", example = "10") - private Long jobId; - - @ApiModelProperty(value = "处理器的名字", notes = "模糊匹配") - private String handlerName; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始执行时间") - private Date beginTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束执行时间") - private Date endTime; - - @ApiModelProperty(value = "任务状态", notes = "参见 InfJobLogStatusEnum 枚举") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java deleted file mode 100644 index 4784cb6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.log; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("定时任务日志分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfJobLogPageReqVO extends PageParam { - - @ApiModelProperty(value = "任务编号", example = "10") - private Long jobId; - - @ApiModelProperty(value = "处理器的名字", notes = "模糊匹配") - private String handlerName; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始执行时间") - private Date beginTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束执行时间") - private Date endTime; - - @ApiModelProperty(value = "任务状态", notes = "参见 InfJobLogStatusEnum 枚举") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogRespVO.java deleted file mode 100644 index 72587f5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/job/vo/log/InfJobLogRespVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.job.vo.log; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("定时任务日志 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfJobLogRespVO extends InfJobLogBaseVO { - - @ApiModelProperty(value = "日志编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/InfApiAccessLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/InfApiAccessLogController.java deleted file mode 100644 index 1ca75db..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/InfApiAccessLogController.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExcelVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogRespVO; -import cn.iocoder.dashboard.modules.infra.convert.logger.InfApiAccessLogConvert; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; -import cn.iocoder.dashboard.modules.infra.service.logger.InfApiAccessLogService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "API 访问日志") -@RestController -@RequestMapping("/infra/api-access-log") -@Validated -public class InfApiAccessLogController { - - @Resource - private InfApiAccessLogService apiAccessLogService; - - @GetMapping("/page") - @ApiOperation("获得API 访问日志分页") - @PreAuthorize("@ss.hasPermission('infra:api-access-log:query')") - public CommonResult> getApiAccessLogPage(@Valid InfApiAccessLogPageReqVO pageVO) { - PageResult pageResult = apiAccessLogService.getApiAccessLogPage(pageVO); - return success(InfApiAccessLogConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @ApiOperation("导出API 访问日志 Excel") - @PreAuthorize("@ss.hasPermission('infra:api-access-log:export')") - @OperateLog(type = EXPORT) - public void exportApiAccessLogExcel(@Valid InfApiAccessLogExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = apiAccessLogService.getApiAccessLogList(exportReqVO); - // 导出 Excel - List datas = InfApiAccessLogConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "API 访问日志.xls", "数据", InfApiAccessLogExcelVO.class, datas); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/InfApiErrorLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/InfApiErrorLogController.java deleted file mode 100644 index ff25f33..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/InfApiErrorLogController.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExcelVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogRespVO; -import cn.iocoder.dashboard.modules.infra.convert.logger.InfApiErrorLogConvert; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; -import cn.iocoder.dashboard.modules.infra.service.logger.InfApiErrorLogService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Api(tags = "API 错误日志") -@RestController -@RequestMapping("/infra/api-error-log") -@Validated -public class InfApiErrorLogController { - - @Resource - private InfApiErrorLogService apiErrorLogService; - - @PutMapping("/update-status") - @ApiOperation("更新 API 错误日志的状态") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class), - @ApiImplicitParam(name = "processStatus", value = "处理状态", required = true, example = "1", dataTypeClass = Integer.class) - }) - @PreAuthorize("@ss.hasPermission('infra:api-error-log:update-status')") - public CommonResult updateApiErrorLogProcess(@RequestParam("id") Long id, - @RequestParam("processStatus") Integer processStatus) { - apiErrorLogService.updateApiErrorLogProcess(id, processStatus, getLoginUserId()); - return success(true); - } - - @GetMapping("/page") - @ApiOperation("获得 API 错误日志分页") - @PreAuthorize("@ss.hasPermission('infra:api-error-log:query')") - public CommonResult> getApiErrorLogPage(@Valid InfApiErrorLogPageReqVO pageVO) { - PageResult pageResult = apiErrorLogService.getApiErrorLogPage(pageVO); - return success(InfApiErrorLogConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @ApiOperation("导出 API 错误日志 Excel") - @PreAuthorize("@ss.hasPermission('infra:api-error-log:export')") - @OperateLog(type = EXPORT) - public void exportApiErrorLogExcel(@Valid InfApiErrorLogExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = apiErrorLogService.getApiErrorLogList(exportReqVO); - // 导出 Excel - List datas = InfApiErrorLogConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "API 错误日志.xls", "数据", InfApiErrorLogExcelVO.class, datas); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java deleted file mode 100644 index 5dcfbd9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.NotNull; -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** -* API 访问日志 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class InfApiAccessLogBaseVO { - - @ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002") - @NotNull(message = "链路追踪编号不能为空") - private String traceId; - - @ApiModelProperty(value = "用户编号", required = true, example = "666") - @NotNull(message = "用户编号不能为空") - private Long userId; - - @ApiModelProperty(value = "用户类型", required = true, example = "2", notes = "参见 UserTypeEnum 枚举") - @NotNull(message = "用户类型不能为空") - private Integer userType; - - @ApiModelProperty(value = "应用名", required = true, example = "dashboard") - @NotNull(message = "应用名不能为空") - private String applicationName; - - @ApiModelProperty(value = "请求方法名", required = true, example = "GET") - @NotNull(message = "请求方法名不能为空") - private String requestMethod; - - @ApiModelProperty(value = "请求地址", required = true, example = "/xxx/yyy") - @NotNull(message = "请求地址不能为空") - private String requestUrl; - - @ApiModelProperty(value = "请求参数") - private String requestParams; - - @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") - @NotNull(message = "用户 IP不能为空") - private String userIp; - - @ApiModelProperty(value = "浏览器 UA", required = true, example = "Mozilla/5.0") - @NotNull(message = "浏览器 UA不能为空") - private String userAgent; - - @ApiModelProperty(value = "开始请求时间", required = true) - @NotNull(message = "开始请求时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束请求时间", required = true) - @NotNull(message = "结束请求时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - - @ApiModelProperty(value = "执行时长", required = true, example = "100") - @NotNull(message = "执行时长不能为空") - private Integer duration; - - @ApiModelProperty(value = "结果码", required = true, example = "0") - @NotNull(message = "结果码不能为空") - private Integer resultCode; - - @ApiModelProperty(value = "结果提示", example = "芋道源码,牛逼!") - private String resultMsg; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java deleted file mode 100644 index be9ec35..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * API 访问日志 Excel VO - * - * @author 芋道源码 - */ -@Data -public class InfApiAccessLogExcelVO { - - @ExcelProperty("日志主键") - private Long id; - - @ExcelProperty("链路追踪编号") - private String traceId; - - @ExcelProperty("用户编号") - private Long userId; - - @ExcelProperty(value = "用户类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.USER_TYPE) - private Integer userType; - - @ExcelProperty("应用名") - private String applicationName; - - @ExcelProperty("请求方法名") - private String requestMethod; - - @ExcelProperty("请求地址") - private String requestUrl; - - @ExcelProperty("请求参数") - private String requestParams; - - @ExcelProperty("用户 IP") - private String userIp; - - @ExcelProperty("浏览器 UA") - private String userAgent; - - @ExcelProperty("开始请求时间") - private Date beginTime; - - @ExcelProperty("结束请求时间") - private Date endTime; - - @ExcelProperty("执行时长") - private Integer duration; - - @ExcelProperty("结果码") - private Integer resultCode; - - @ExcelProperty("结果提示") - private String resultMsg; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java deleted file mode 100644 index 43f852e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel(value = "API 访问日志 Excel 导出 Request VO", description = "参数和 InfApiAccessLogPageReqVO 是一致的") -@Data -public class InfApiAccessLogExportReqVO { - - @ApiModelProperty(value = "用户编号", example = "666") - private Long userId; - - @ApiModelProperty(value = "用户类型", example = "2") - private Integer userType; - - @ApiModelProperty(value = "应用名", example = "dashboard") - private String applicationName; - - @ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配") - private String requestUrl; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始开始请求时间") - private Date beginBeginTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束开始请求时间") - private Date endBeginTime; - - @ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒") - private Integer duration; - - @ApiModelProperty(value = "结果码", example = "0") - private Integer resultCode; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java deleted file mode 100644 index 14973d8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("API 访问日志分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfApiAccessLogPageReqVO extends PageParam { - - @ApiModelProperty(value = "用户编号", example = "666") - private Long userId; - - @ApiModelProperty(value = "用户类型", example = "2") - private Integer userType; - - @ApiModelProperty(value = "应用名", example = "dashboard") - private String applicationName; - - @ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配") - private String requestUrl; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始开始请求时间") - private Date beginBeginTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束开始请求时间") - private Date endBeginTime; - - @ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒") - private Integer duration; - - @ApiModelProperty(value = "结果码", example = "0") - private Integer resultCode; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java deleted file mode 100644 index d3300c8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("API 访问日志 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfApiAccessLogRespVO extends InfApiAccessLogBaseVO { - - @ApiModelProperty(value = "日志主键", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java deleted file mode 100644 index 5e521a5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java +++ /dev/null @@ -1,96 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.NotNull; -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -/** -* API 错误日志 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class InfApiErrorLogBaseVO { - - @ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002") - @NotNull(message = "链路追踪编号不能为空") - private String traceId; - - @ApiModelProperty(value = "用户编号", required = true, example = "666") - @NotNull(message = "用户编号不能为空") - private Integer userId; - - @ApiModelProperty(value = "用户类型", required = true, example = "1") - @NotNull(message = "用户类型不能为空") - private Integer userType; - - @ApiModelProperty(value = "应用名", required = true, example = "dashboard") - @NotNull(message = "应用名不能为空") - private String applicationName; - - @ApiModelProperty(value = "请求方法名", required = true, example = "GET") - @NotNull(message = "请求方法名不能为空") - private String requestMethod; - - @ApiModelProperty(value = "请求地址", required = true, example = "/xx/yy") - @NotNull(message = "请求地址不能为空") - private String requestUrl; - - @ApiModelProperty(value = "请求参数", required = true) - @NotNull(message = "请求参数不能为空") - private String requestParams; - - @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") - @NotNull(message = "用户 IP不能为空") - private String userIp; - - @ApiModelProperty(value = "浏览器 UA", required = true, example = "Mozilla/5.0") - @NotNull(message = "浏览器 UA不能为空") - private String userAgent; - - @ApiModelProperty(value = "异常发生时间", required = true) - @NotNull(message = "异常发生时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date exceptionTime; - - @ApiModelProperty(value = "异常名", required = true) - @NotNull(message = "异常名不能为空") - private String exceptionName; - - @ApiModelProperty(value = "异常导致的消息", required = true) - @NotNull(message = "异常导致的消息不能为空") - private String exceptionMessage; - - @ApiModelProperty(value = "异常导致的根消息", required = true) - @NotNull(message = "异常导致的根消息不能为空") - private String exceptionRootCauseMessage; - - @ApiModelProperty(value = "异常的栈轨迹", required = true) - @NotNull(message = "异常的栈轨迹不能为空") - private String exceptionStackTrace; - - @ApiModelProperty(value = "异常发生的类全名", required = true) - @NotNull(message = "异常发生的类全名不能为空") - private String exceptionClassName; - - @ApiModelProperty(value = "异常发生的类文件", required = true) - @NotNull(message = "异常发生的类文件不能为空") - private String exceptionFileName; - - @ApiModelProperty(value = "异常发生的方法名", required = true) - @NotNull(message = "异常发生的方法名不能为空") - private String exceptionMethodName; - - @ApiModelProperty(value = "异常发生的方法所在行", required = true) - @NotNull(message = "异常发生的方法所在行不能为空") - private Integer exceptionLineNumber; - - @ApiModelProperty(value = "处理状态", required = true, example = "0") - @NotNull(message = "处理状态不能为空") - private Integer processStatus; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java deleted file mode 100644 index 858be0a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.infra.enums.InfDictTypeConstants; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * API 错误日志 Excel VO - * - * @author 芋道源码 - */ -@Data -public class InfApiErrorLogExcelVO { - - @ExcelProperty("编号") - private Integer id; - - @ExcelProperty("链路追踪编号") - private String traceId; - - @ExcelProperty("用户编号") - private Integer userId; - - @ExcelProperty(value = "用户类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.USER_TYPE) - private Integer userType; - - @ExcelProperty("应用名") - private String applicationName; - - @ExcelProperty("请求方法名") - private String requestMethod; - - @ExcelProperty("请求地址") - private String requestUrl; - - @ExcelProperty("请求参数") - private String requestParams; - - @ExcelProperty("用户 IP") - private String userIp; - - @ExcelProperty("浏览器 UA") - private String userAgent; - - @ExcelProperty("异常发生时间") - private Date exceptionTime; - - @ExcelProperty("异常名") - private String exceptionName; - - @ExcelProperty("异常导致的消息") - private String exceptionMessage; - - @ExcelProperty("异常导致的根消息") - private String exceptionRootCauseMessage; - - @ExcelProperty("异常的栈轨迹") - private String exceptionStackTrace; - - @ExcelProperty("异常发生的类全名") - private String exceptionClassName; - - @ExcelProperty("异常发生的类文件") - private String exceptionFileName; - - @ExcelProperty("异常发生的方法名") - private String exceptionMethodName; - - @ExcelProperty("异常发生的方法所在行") - private Integer exceptionLineNumber; - - @ExcelProperty("创建时间") - private Date createTime; - - @ExcelProperty(value = "处理状态", converter = DictConvert.class) - @DictFormat(InfDictTypeConstants.API_ERROR_LOG_PROCESS_STATUS) - private Integer processStatus; - - @ExcelProperty("处理时间") - private Date processTime; - - @ExcelProperty("处理用户编号") - private Integer processUserId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java deleted file mode 100644 index 1225e9d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel(value = "API 错误日志 Excel 导出 Request VO", description = "参数和 InfApiErrorLogPageReqVO 是一致的") -@Data -public class InfApiErrorLogExportReqVO { - - @ApiModelProperty(value = "用户编号", example = "666") - private Long userId; - - @ApiModelProperty(value = "用户类型", example = "1") - private Integer userType; - - @ApiModelProperty(value = "应用名", example = "dashboard") - private String applicationName; - - @ApiModelProperty(value = "请求地址", example = "/xx/yy") - private String requestUrl; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始异常发生时间") - private Date beginExceptionTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束异常发生时间") - private Date endExceptionTime; - - @ApiModelProperty(value = "处理状态", example = "0") - private Integer processStatus; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java deleted file mode 100644 index b03fc22..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("API 错误日志分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfApiErrorLogPageReqVO extends PageParam { - - @ApiModelProperty(value = "用户编号", example = "666") - private Long userId; - - @ApiModelProperty(value = "用户类型", example = "1") - private Integer userType; - - @ApiModelProperty(value = "应用名", example = "dashboard") - private String applicationName; - - @ApiModelProperty(value = "请求地址", example = "/xx/yy") - private String requestUrl; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始异常发生时间") - private Date beginExceptionTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束异常发生时间") - private Date endExceptionTime; - - @ApiModelProperty(value = "处理状态", example = "0") - private Integer processStatus; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java deleted file mode 100644 index 9ac3154..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("API 错误日志 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfApiErrorLogRespVO extends InfApiErrorLogBaseVO { - - @ApiModelProperty(value = "编号", required = true, example = "1024") - private Integer id; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - - @ApiModelProperty(value = "处理时间", required = true) - private Date processTime; - - @ApiModelProperty(value = "处理用户编号", example = "233") - private Integer processUserId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.http b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.http deleted file mode 100644 index 1c474e9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.http +++ /dev/null @@ -1,7 +0,0 @@ -### 请求 /infra/redis/get-monitor-info 接口 => 成功 -GET {{baseUrl}}/infra/redis/get-monitor-info -Authorization: Bearer {{token}} - -### 请求 /infra/redis/get-key-list 接口 => 成功 -GET {{baseUrl}}/infra/redis/get-key-list -Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java deleted file mode 100644 index dcc49a7..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.redis; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; -import cn.iocoder.yudao.framework.redis.core.RedisKeyRegistry; -import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisKeyRespVO; -import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisMonitorRespVO; -import cn.iocoder.dashboard.modules.infra.convert.redis.RedisConvert; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.data.redis.connection.RedisServerCommands; -import org.springframework.data.redis.core.RedisCallback; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Properties; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "Redis 监控") -@RestController -@RequestMapping("/infra/redis") -public class RedisController { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - @GetMapping("/get-monitor-info") - @ApiOperation("获得 Redis 监控信息") - @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')") - public CommonResult getRedisMonitorInfo() { - // 获得 Redis 统计信息 - Properties info = stringRedisTemplate.execute((RedisCallback) RedisServerCommands::info); - Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize); - Properties commandStats = stringRedisTemplate.execute(( - RedisCallback) connection -> connection.info("commandstats")); - assert commandStats != null; // 断言,避免警告 - // 拼接结果返回 - return success(RedisConvert.INSTANCE.build(info, dbSize, commandStats)); - } - - @GetMapping("/get-key-list") - @ApiOperation("获得 Redis Key 列表") - @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") - public CommonResult> getKeyList() { - List keyDefines = RedisKeyRegistry.list(); - return success(RedisConvert.INSTANCE.convertList(keyDefines)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java deleted file mode 100644 index 3ea923c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.redis.vo; - -import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; - -import java.time.Duration; - -@ApiModel("Redis Key 信息 Response VO") -@Data -@Builder -@AllArgsConstructor -public class InfRedisKeyRespVO { - - @ApiModelProperty(value = "login_user:%s", required = true, example = "String") - private String keyTemplate; - - @ApiModelProperty(value = "Key 类型的枚举", required = true, example = "String") - private RedisKeyDefine.KeyTypeEnum keyType; - - @ApiModelProperty(value = "Value 类型", required = true, example = "java.lang.String") - private Class valueType; - - @ApiModelProperty(value = "超时类型", required = true, example = "1") - private RedisKeyDefine.TimeoutTypeEnum timeoutType; - - @ApiModelProperty(value = "过期时间,单位:毫秒", required = true, example = "1024") - private Duration timeout; - - @ApiModelProperty(value = "备注", required = true, example = "啦啦啦啦~") - private String memo; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java deleted file mode 100644 index 35389c7..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.controller.redis.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; - -import java.util.List; -import java.util.Properties; - -@ApiModel("Redis 监控信息 Response VO") -@Data -@Builder -@AllArgsConstructor -public class InfRedisMonitorRespVO { - - @ApiModelProperty(value = "Redis info 指令结果", required = true, notes = "具体字段,查看 Redis 文档") - private Properties info; - - @ApiModelProperty(value = "Redis key 数量", required = true, example = "1024") - private Long dbSize; - - @ApiModelProperty(value = "CommandStat 数组", required = true) - private List commandStats; - - @ApiModel("Redis 命令统计结果") - @Data - @Builder - @AllArgsConstructor - public static class CommandStat { - - @ApiModelProperty(value = "Redis 命令", required = true, example = "get") - private String command; - - @ApiModelProperty(value = "调用次数", required = true, example = "1024") - private Integer calls; - - @ApiModelProperty(value = "消耗 CPU 秒数", required = true, example = "666") - private Integer usec; - - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/config/InfConfigConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/config/InfConfigConvert.java deleted file mode 100644 index 3ab729c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/config/InfConfigConvert.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.convert.config; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigExcelVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigRespVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface InfConfigConvert { - - InfConfigConvert INSTANCE = Mappers.getMapper(InfConfigConvert.class); - - PageResult convertPage(PageResult page); - - InfConfigRespVO convert(InfConfigDO bean); - - InfConfigDO convert(InfConfigCreateReqVO bean); - - InfConfigDO convert(InfConfigUpdateReqVO bean); - - List convertList(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/file/InfFileConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/file/InfFileConvert.java deleted file mode 100644 index 6e22a5e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/file/InfFileConvert.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.convert.file; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFileRespVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface InfFileConvert { - - InfFileConvert INSTANCE = Mappers.getMapper(InfFileConvert.class); - - InfFileRespVO convert(InfFileDO bean); - - PageResult convertPage(PageResult page); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/job/InfJobConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/job/InfJobConvert.java deleted file mode 100644 index 6e6f2d8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/job/InfJobConvert.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.convert.job; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobExcelVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobRespVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 定时任务 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface InfJobConvert { - - InfJobConvert INSTANCE = Mappers.getMapper(InfJobConvert.class); - - InfJobDO convert(InfJobCreateReqVO bean); - - InfJobDO convert(InfJobUpdateReqVO bean); - - InfJobRespVO convert(InfJobDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/job/InfJobLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/job/InfJobLogConvert.java deleted file mode 100644 index e6f60ff..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/job/InfJobLogConvert.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.convert.job; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogExcelVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogRespVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobLogDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 定时任务日志 Convert - * - * @author 芋艿 - */ -@Mapper -public interface InfJobLogConvert { - - InfJobLogConvert INSTANCE = Mappers.getMapper(InfJobLogConvert.class); - - InfJobLogRespVO convert(InfJobLogDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/logger/InfApiAccessLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/logger/InfApiAccessLogConvert.java deleted file mode 100644 index 54dce31..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/logger/InfApiAccessLogConvert.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.convert.logger; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExcelVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogRespVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * API 访问日志 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface InfApiAccessLogConvert { - - InfApiAccessLogConvert INSTANCE = Mappers.getMapper(InfApiAccessLogConvert.class); - - InfApiAccessLogDO convert(ApiAccessLogCreateDTO bean); - - InfApiAccessLogRespVO convert(InfApiAccessLogDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/logger/InfApiErrorLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/logger/InfApiErrorLogConvert.java deleted file mode 100644 index 91ecb45..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/logger/InfApiErrorLogConvert.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.convert.logger; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExcelVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogRespVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * API 错误日志 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface InfApiErrorLogConvert { - - InfApiErrorLogConvert INSTANCE = Mappers.getMapper(InfApiErrorLogConvert.class); - - InfApiErrorLogDO convert(ApiErrorLogCreateDTO bean); - - InfApiErrorLogRespVO convert(InfApiErrorLogDO bean); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/package-info.java deleted file mode 100644 index 6be6252..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 POJO 类的实体转换 - * - * 目前使用 MapStruct 框架 - */ -package cn.iocoder.dashboard.modules.infra.convert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/redis/RedisConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/redis/RedisConvert.java deleted file mode 100644 index c539e1a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/redis/RedisConvert.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.convert.redis; - -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; -import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisKeyRespVO; -import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisMonitorRespVO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - -@Mapper -public interface RedisConvert { - - RedisConvert INSTANCE = Mappers.getMapper(RedisConvert.class); - - default InfRedisMonitorRespVO build(Properties info, Long dbSize, Properties commandStats) { - InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize) - .commandStats(new ArrayList<>(commandStats.size())).build(); - commandStats.forEach((key, value) -> { - respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder() - .command(StrUtil.subAfter((String) key, "cmdstat_", false)) - .calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ","))) - .usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ","))) - .build()); - }); - return respVO; - } - - List convertList(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md deleted file mode 100644 index 8153487..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/config/InfConfigDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/config/InfConfigDO.java deleted file mode 100644 index 770a778..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/config/InfConfigDO.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.dataobject.config; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -/** - * 参数配置表 - * - * @author ruoyi - */ -@TableName("inf_config") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfConfigDO extends BaseDO { - - /** - * 参数主键 - */ - @TableId - private Long id; - /** - * 参数分组 - */ - @TableField("`group`") - private String group; - /** - * 参数名称 - */ - private String name; - /** - * 参数键名 - */ - @TableField("`key`") - private String key; - /** - * 参数键值 - */ - private String value; - /** - * 参数类型 - * - * 枚举 {@link InfConfigTypeEnum} - */ - @TableField("`type`") - private Integer type; - /** - * 是否敏感 - * - * 对于敏感配置,需要管理权限才能查看 - */ - @TableField("`sensitive`") - private Boolean sensitive; - /** - * 备注 - */ - private String remark; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/file/InfFileDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/file/InfFileDO.java deleted file mode 100644 index 7f517ce..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/file/InfFileDO.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.dataobject.file; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.io.InputStream; - -/** - * 文件表 - * - * @author 芋道源码 - */ -@Data -@TableName("inf_file") -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class InfFileDO extends BaseDO { - - /** - * 文件路径 - */ - @TableId(type = IdType.INPUT) - private String id; - /** - * 文件类型 - * - * 通过 {@link cn.hutool.core.io.FileTypeUtil#getType(InputStream)} 获取 - */ - @TableField(value = "`type`") - private String type; - /** - * 文件内容 - */ - private byte[] content; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobDO.java deleted file mode 100644 index 7fc0ef4..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobDO.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.dataobject.job; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 定时任务 DO - * - * @author 芋道源码 - */ -@TableName("inf_job") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class InfJobDO extends BaseDO { - - /** - * 任务编号 - */ - @TableId - private Long id; - /** - * 任务名称 - */ - private String name; - /** - * 任务状态 - * - * 枚举 {@link InfJobStatusEnum} - */ - private Integer status; - /** - * 处理器的名字 - */ - private String handlerName; - /** - * 处理器的参数 - */ - private String handlerParam; - /** - * CRON 表达式 - */ - private String cronExpression; - - // ========== 重试相关字段 ========== - /** - * 重试次数 - * 如果不重试,则设置为 0 - */ - private Integer retryCount; - /** - * 重试间隔,单位:毫秒 - * 如果没有间隔,则设置为 0 - */ - private Integer retryInterval; - - // ========== 监控相关字段 ========== - /** - * 监控超时时间,单位:毫秒 - * 为空时,表示不监控 - * - * 注意,这里的超时的目的,不是进行任务的取消,而是告警任务的执行时间过长 - */ - private Integer monitorTimeout; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobLogDO.java deleted file mode 100644 index 49d76e0..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/job/InfJobLogDO.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.dataobject.job; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; -import cn.iocoder.dashboard.modules.infra.enums.job.InfJobLogStatusEnum; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.util.Date; - -/** - * 定时任务的执行日志 - * - * @author 芋道源码 - */ -@TableName("inf_job_log") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class InfJobLogDO extends BaseDO { - - /** - * 日志编号 - */ - private Long id; - /** - * 任务编号 - * - * 关联 {@link InfJobDO#getId()} - */ - private Long jobId; - /** - * 处理器的名字 - * - * 冗余字段 {@link InfJobDO#getHandlerName()} - */ - private String handlerName; - /** - * 处理器的参数 - * - * 冗余字段 {@link InfJobDO#getHandlerParam()} - */ - private String handlerParam; - /** - * 第几次执行 - * - * 用于区分是不是重试执行。如果是重试执行,则 index 大于 1 - */ - private Integer executeIndex; - - /** - * 开始执行时间 - */ - private Date beginTime; - /** - * 结束执行时间 - */ - private Date endTime; - /** - * 执行时长,单位:毫秒 - */ - private Integer duration; - /** - * 状态 - * - * 枚举 {@link InfJobLogStatusEnum} - */ - private Integer status; - /** - * 结果数据 - * - * 成功时,使用 {@link JobHandler#execute(String)} 的结果 - * 失败时,使用 {@link JobHandler#execute(String)} 的异常堆栈 - */ - private String result; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java deleted file mode 100644 index 957937e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java +++ /dev/null @@ -1,107 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.dataobject.logger; - -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.util.Date; - -/** - * API 访问日志 - * - * @author 芋道源码 - */ -@TableName("inf_api_access_log") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class InfApiAccessLogDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Integer id; - /** - * 链路追踪编号 - * - * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 - */ - private String traceId; - /** - * 用户编号 - */ - private Long userId; - /** - * 用户类型 - * - * 枚举 {@link UserTypeEnum} - */ - private Integer userType; - /** - * 应用名 - * - * 目前读取 `spring.application.name` 配置项 - */ - private String applicationName; - - // ========== 请求相关字段 ========== - - /** - * 请求方法名 - */ - private String requestMethod; - /** - * 访问地址 - */ - private String requestUrl; - /** - * 请求参数 - * - * query: Query String - * body: Quest Body - */ - private String requestParams; - /** - * 用户 IP - */ - private String userIp; - /** - * 浏览器 UA - */ - private String userAgent; - - // ========== 执行相关字段 ========== - - /** - * 开始请求时间 - */ - private Date beginTime; - /** - * 结束请求时间 - */ - private Date endTime; - /** - * 执行时长,单位:毫秒 - */ - private Integer duration; - /** - * 结果码 - * - * 目前使用的 {@link CommonResult#getCode()} 属性 - */ - private Integer resultCode; - /** - * 结果提示 - * - * 目前使用的 {@link CommonResult#getMsg()} 属性 - */ - private String resultMsg; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java deleted file mode 100644 index 5ac169c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java +++ /dev/null @@ -1,153 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.dataobject.logger; - -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.util.Date; - -/** - * API 异常数据 - * - * @author 芋道源码 - */ -@TableName("inf_api_error_log") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class InfApiErrorLogDO extends BaseDO { - - /** - * 编号 - */ - private Long id; - /** - * 用户编号 - */ - private Long userId; - /** - * 链路追踪编号 - * - * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 - */ - private String traceId; - /** - * 用户类型 - * - * 枚举 {@link UserTypeEnum} - */ - private Integer userType; - /** - * 应用名 - * - * 目前读取 spring.application.name - */ - private String applicationName; - - // ========== 请求相关字段 ========== - - /** - * 请求方法名 - */ - private String requestMethod; - /** - * 访问地址 - */ - private String requestUrl; - /** - * 请求参数 - * - * query: Query String - * body: Quest Body - */ - private String requestParams; - /** - * 用户 IP - */ - private String userIp; - /** - * 浏览器 UA - */ - private String userAgent; - - // ========== 异常相关字段 ========== - - /** - * 异常发生时间 - */ - private Date exceptionTime; - /** - * 异常名 - * - * {@link Throwable#getClass()} 的类全名 - */ - private String exceptionName; - /** - * 异常导致的消息 - * - * {@link cn.hutool.core.exceptions.ExceptionUtil#getMessage(Throwable)} - */ - private String exceptionMessage; - /** - * 异常导致的根消息 - * - * {@link cn.hutool.core.exceptions.ExceptionUtil#getRootCauseMessage(Throwable)} - */ - private String exceptionRootCauseMessage; - /** - * 异常的栈轨迹 - * - * {@link org.apache.commons.lang3.exception.ExceptionUtils#getStackTrace(Throwable)} - */ - private String exceptionStackTrace; - /** - * 异常发生的类全名 - * - * {@link StackTraceElement#getClassName()} - */ - private String exceptionClassName; - /** - * 异常发生的类文件 - * - * {@link StackTraceElement#getFileName()} - */ - private String exceptionFileName; - /** - * 异常发生的方法名 - * - * {@link StackTraceElement#getMethodName()} - */ - private String exceptionMethodName; - /** - * 异常发生的方法所在行 - * - * {@link StackTraceElement#getLineNumber()} - */ - private Integer exceptionLineNumber; - - // ========== 处理相关字段 ========== - - /** - * 处理状态 - * - * 枚举 {@link InfApiErrorLogProcessStatusEnum} - */ - private Integer processStatus; - /** - * 处理时间 - */ - private Date processTime; - /** - * 处理用户编号 - * - * 关联 {@link SysUserDO#getId()} - */ - private Long processUserId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigDAOImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigDAOImpl.java deleted file mode 100644 index d6a5019..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigDAOImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.mysql.config; - -import cn.iocoder.yudao.framework.apollo.internals.ConfigFrameworkDAO; -import cn.iocoder.yudao.framework.apollo.internals.dto.ConfigRespDTO; -import org.springframework.jdbc.core.BeanPropertyRowMapper; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DriverManagerDataSource; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.util.Date; -import java.util.List; - -/** - * ConfigFrameworkDAO 实现类 - * - * @author 芋道源码 - */ -public class InfConfigDAOImpl implements ConfigFrameworkDAO { - - private final JdbcTemplate jdbcTemplate; - - public InfConfigDAOImpl(String jdbcUrl, String username, String password) { - DataSource dataSource = new DriverManagerDataSource(jdbcUrl, username, password); - this.jdbcTemplate = new JdbcTemplate(dataSource); - } - - @Override - public boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { - return jdbcTemplate.query("SELECT id FROM inf_config WHERE update_time > ? LIMIT 1", - ResultSet::next, maxUpdateTime); - } - - @Override - public List selectList() { - return jdbcTemplate.query("SELECT `key`, `value`, update_time, deleted FROM inf_config", new BeanPropertyRowMapper<>(ConfigRespDTO.class)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigMapper.java deleted file mode 100644 index ed78df1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.mysql.config; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface InfConfigMapper extends BaseMapperX { - - default InfConfigDO selectByKey(String key) { - return selectOne(new QueryWrapper().eq("`key`", key)); - } - - default PageResult selectPage(InfConfigPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("name", reqVO.getName()) - .likeIfPresent("`key`", reqVO.getKey()) - .eqIfPresent("`type`", reqVO.getType()) - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); - } - - default List selectList(InfConfigExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .likeIfPresent("name", reqVO.getName()) - .likeIfPresent("`key`", reqVO.getKey()) - .eqIfPresent("`type`", reqVO.getType()) - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/file/InfFileMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/file/InfFileMapper.java deleted file mode 100644 index 392d849..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/file/InfFileMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.mysql.file; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFilePageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface InfFileMapper extends BaseMapperX { - - default Integer selectCountById(String id) { - return selectCount("id", id); - } - - default PageResult selectPage(InfFilePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("id", reqVO.getId()) - .likeIfPresent("type", reqVO.getType()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc("create_time")); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/job/InfJobLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/job/InfJobLogMapper.java deleted file mode 100644 index 322713c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/job/InfJobLogMapper.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.mysql.job; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobLogDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 任务日志 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface InfJobLogMapper extends BaseMapperX { - - default PageResult selectPage(InfJobLogPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .eqIfPresent("job_id", reqVO.getJobId()) - .likeIfPresent("handler_name", reqVO.getHandlerName()) - .geIfPresent("begin_time", reqVO.getBeginTime()) - .leIfPresent("end_time", reqVO.getEndTime()) - .eqIfPresent("status", reqVO.getStatus()) - .orderByDesc("id") // ID 倒序 - ); - } - - default List selectList(InfJobLogExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .eqIfPresent("job_id", reqVO.getJobId()) - .likeIfPresent("handler_name", reqVO.getHandlerName()) - .geIfPresent("begin_time", reqVO.getBeginTime()) - .leIfPresent("end_time", reqVO.getEndTime()) - .eqIfPresent("status", reqVO.getStatus()) - .orderByDesc("id") // ID 倒序 - ); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/job/InfJobMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/job/InfJobMapper.java deleted file mode 100644 index b7a1137..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/job/InfJobMapper.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.mysql.job; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 定时任务 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface InfJobMapper extends BaseMapperX { - - default InfJobDO selectByHandlerName(String handlerName) { - return selectOne("handler_name", handlerName); - } - - default PageResult selectPage(InfJobPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("name", reqVO.getName()) - .eqIfPresent("status", reqVO.getStatus()) - .likeIfPresent("handler_name", reqVO.getHandlerName()) - ); - } - - default List selectList(InfJobExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .likeIfPresent("name", reqVO.getName()) - .eqIfPresent("status", reqVO.getStatus()) - .likeIfPresent("handler_name", reqVO.getHandlerName()) - ); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java deleted file mode 100644 index 568dffe..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.mysql.logger; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * API 访问日志 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface InfApiAccessLogMapper extends BaseMapperX { - - default PageResult selectPage(InfApiAccessLogPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .eqIfPresent("user_id", reqVO.getUserId()) - .eqIfPresent("user_type", reqVO.getUserType()) - .eqIfPresent("application_name", reqVO.getApplicationName()) - .likeIfPresent("request_url", reqVO.getRequestUrl()) - .betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime()) - .geIfPresent("duration", reqVO.getDuration()) - .eqIfPresent("result_code", reqVO.getResultCode()) - .orderByDesc("id") - ); - } - - default List selectList(InfApiAccessLogExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .eqIfPresent("user_id", reqVO.getUserId()) - .eqIfPresent("user_type", reqVO.getUserType()) - .eqIfPresent("application_name", reqVO.getApplicationName()) - .likeIfPresent("request_url", reqVO.getRequestUrl()) - .betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime()) - .geIfPresent("duration", reqVO.getDuration()) - .eqIfPresent("result_code", reqVO.getResultCode()) - .orderByDesc("id") - ); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java deleted file mode 100644 index 29550e6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.dal.mysql.logger; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * API 错误日志 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface InfApiErrorLogMapper extends BaseMapperX { - - default PageResult selectPage(InfApiErrorLogPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .eqIfPresent("user_id", reqVO.getUserId()) - .eqIfPresent("user_type", reqVO.getUserType()) - .eqIfPresent("application_name", reqVO.getApplicationName()) - .likeIfPresent("request_url", reqVO.getRequestUrl()) - .betweenIfPresent("exception_time", reqVO.getBeginExceptionTime(), reqVO.getEndExceptionTime()) - .eqIfPresent("process_status", reqVO.getProcessStatus()) - .orderByDesc("id") - ); - } - - default List selectList(InfApiErrorLogExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .eqIfPresent("user_id", reqVO.getUserId()) - .eqIfPresent("user_type", reqVO.getUserType()) - .eqIfPresent("application_name", reqVO.getApplicationName()) - .likeIfPresent("request_url", reqVO.getRequestUrl()) - .betweenIfPresent("exception_time", reqVO.getBeginExceptionTime(), reqVO.getEndExceptionTime()) - .eqIfPresent("process_status", reqVO.getProcessStatus()) - .orderByDesc("id") - ); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfDictTypeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfDictTypeConstants.java deleted file mode 100644 index d229ec9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfDictTypeConstants.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.enums; - -/** - * Infra 字典类型的枚举类 - * - * @author 芋道源码 - */ -public interface InfDictTypeConstants { - - String REDIS_TIMEOUT_TYPE = "inf_redis_timeout_type"; // Redis 超时类型 - - String JOB_STATUS = "inf_job_status"; // 定时任务状态的枚举 - String JOB_LOG_STATUS = "inf_job_log_status"; // 定时任务日志状态的枚举 - - String API_ERROR_LOG_PROCESS_STATUS = "inf_api_error_log_process_status"; // API 错误日志的处理状态的枚举 - - String ERROR_CODE_TYPE = "inf_error_code_type"; // 错误码的类型枚举 - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfErrorCodeConstants.java deleted file mode 100644 index aa6b522..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfErrorCodeConstants.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.enums; - -import cn.iocoder.yudao.framework.common.exception.ErrorCode; - -/** - * Infra 错误码枚举类 - * - * infra 系统,使用 1-001-000-000 段 - */ -public interface InfErrorCodeConstants { - - // ========== 参数配置 1001000000 ========== - ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1001000001, "参数配置不存在"); - ErrorCode CONFIG_KEY_DUPLICATE = new ErrorCode(1001000002, "参数配置 key 重复"); - ErrorCode CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE = new ErrorCode(1001000003, "不能删除类型为系统内置的参数配置"); - ErrorCode CONFIG_GET_VALUE_ERROR_IF_SENSITIVE = new ErrorCode(1001000004, "不允许获取敏感配置到前端"); - - // ========== 定时任务 1001001000 ========== - ErrorCode JOB_NOT_EXISTS = new ErrorCode(1001001000, "定时任务不存在"); - ErrorCode JOB_HANDLER_EXISTS = new ErrorCode(1001001001, "定时任务的处理器已经存在"); - ErrorCode JOB_CHANGE_STATUS_INVALID = new ErrorCode(1001001002, "只允许修改为开启或者关闭状态"); - ErrorCode JOB_CHANGE_STATUS_EQUALS = new ErrorCode(1001001003, "定时任务已经处于该状态,无需修改"); - ErrorCode JOB_UPDATE_ONLY_NORMAL_STATUS = new ErrorCode(1001001004, "只有开启状态的任务,才可以修改"); - ErrorCode JOB_CRON_EXPRESSION_VALID = new ErrorCode(1001001005, "CRON 表达式不正确"); - - // ========== API 错误日志 1001002000 ========== - ErrorCode API_ERROR_LOG_NOT_FOUND = new ErrorCode(1001002000, "API 错误日志不存在"); - ErrorCode API_ERROR_LOG_PROCESSED = new ErrorCode(1001002001, "API 错误日志已处理"); - - // ========== 文件 1001003000 ========== - ErrorCode FILE_NOT_EXISTS = new ErrorCode(1001003000, "文件不存在"); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/config/InfConfigTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/config/InfConfigTypeEnum.java deleted file mode 100644 index 315da6f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/config/InfConfigTypeEnum.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.enums.config; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum InfConfigTypeEnum { - - /** - * 系统配置 - */ - SYSTEM(1), - /** - * 自定义配置 - */ - CUSTOM(2); - - private final Integer type; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/job/InfJobLogStatusEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/job/InfJobLogStatusEnum.java deleted file mode 100644 index fe0339f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/job/InfJobLogStatusEnum.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.enums.job; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 任务日志的状态枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum InfJobLogStatusEnum { - - RUNNING(0), // 运行中 - SUCCESS(1), // 成功 - FAILURE(2); // 失败 - - /** - * 状态 - */ - private final Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/job/InfJobStatusEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/job/InfJobStatusEnum.java deleted file mode 100644 index 0fb1a39..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/job/InfJobStatusEnum.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.enums.job; - -import com.google.common.collect.Sets; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Collections; -import java.util.Set; - -import static org.quartz.impl.jdbcjobstore.Constants.*; - -/** - * 任务状态的枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum InfJobStatusEnum { - - /** - * 初始化中 - */ - INIT(0, Collections.emptySet()), - /** - * 开启 - */ - NORMAL(1, Sets.newHashSet(STATE_WAITING, STATE_ACQUIRED, STATE_BLOCKED)), - /** - * 暂停 - */ - STOP(2, Sets.newHashSet(STATE_PAUSED, STATE_PAUSED_BLOCKED)); - - /** - * 状态 - */ - private final Integer status; - /** - * 对应的 Quartz 触发器的状态集合 - */ - private final Set quartzStates; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java deleted file mode 100644 index 4525874..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.enums.logger; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * API 异常数据的处理状态 - * - * @author 芋道源码 - */ -@AllArgsConstructor -@Getter -public enum InfApiErrorLogProcessStatusEnum { - - INIT(0, "未处理"), - DONE(1, "已处理"), - IGNORE(2, "已忽略"); - - /** - * 状态 - */ - private final Integer status; - /** - * 资源类型名 - */ - private final String name; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/config/FileConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/config/FileConfiguration.java deleted file mode 100644 index ef3532d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/config/FileConfiguration.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.framework.file.config; - -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -/** - * 文件 配置类 - */ -@Configuration -@EnableConfigurationProperties(FileProperties.class) -public class FileConfiguration { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/config/FileProperties.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/config/FileProperties.java deleted file mode 100644 index ad14835..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/config/FileProperties.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.framework.file.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.validation.annotation.Validated; - -import javax.validation.constraints.NotNull; - -@ConfigurationProperties(prefix = "yudao.file") -@Validated -@Data -public class FileProperties { - - /** - * 对应 InfFileController 的 getFile 方法 - */ - @NotNull(message = "基础文件路径不能为空") - private String basePath; - - // TODO 七牛、等等 - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/package-info.java deleted file mode 100644 index 0816a33..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/file/package-info.java +++ /dev/null @@ -1,16 +0,0 @@ -/** - * 文件的存储,推荐使用七牛、阿里云、华为云、腾讯云等文件服务 - * - * 在不采用云服务的情况下,我们有几种技术选型: - * 方案 1. 使用自建的文件服务,例如说 minIO、FastDFS 等等 - * 方案 2. 使用服务器的文件系统存储 - * 方案 3. 使用数据库进行存储 - * - * 如果考虑额外在搭建服务,推荐方案 1。 - * 对于方案 2 来说,如果要实现文件存储的高可用,需要多台服务器之间做实时同步,可以基于 rsync + inotify 来做 - * 对于方案 3 的话,实现起来最简单,但是数据库本身不适合存储海量的文件 - * - * 综合考虑,暂时使用方案 3 的方式,比较适合这样一个 all in one 的项目。 - * 随着文件的量级大了之后,还是推荐采用云服务。 - */ -package cn.iocoder.dashboard.modules.infra.framework.file; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/package-info.java deleted file mode 100644 index 9018262..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 infra 模块的 framework 封装 - * - * @author 芋道源码 - */ -package cn.iocoder.dashboard.modules.infra.framework; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java deleted file mode 100644 index a47493c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.mq.consumer.config; - -import cn.iocoder.yudao.framework.apollo.internals.DBConfigRepository; -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.infra.mq.message.config.InfConfigRefreshMessage; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * 针对 {@link InfConfigRefreshMessage} 的消费者 - * - * @author 芋道源码 - */ -@Component -@Slf4j -public class InfConfigRefreshConsumer extends AbstractChannelMessageListener { - - @Override - public void onMessage(InfConfigRefreshMessage message) { - log.info("[onMessage][收到 Config 刷新消息]"); - DBConfigRepository.noticeSync(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/consumer/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/consumer/package-info.java deleted file mode 100644 index 301ea9a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/consumer/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.mq.consumer; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/message/config/InfConfigRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/message/config/InfConfigRefreshMessage.java deleted file mode 100644 index 729cbde..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/message/config/InfConfigRefreshMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.mq.message.config; - -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; -import lombok.Data; - -/** - * 配置数据刷新 Message - */ -@Data -public class InfConfigRefreshMessage implements ChannelMessage { - - @Override - public String getChannel() { - return "infra.config.refresh"; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/message/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/message/package-info.java deleted file mode 100644 index 5c63e49..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/message/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.mq.message; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/producer/config/InfConfigProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/producer/config/InfConfigProducer.java deleted file mode 100644 index 6e54b04..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/producer/config/InfConfigProducer.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.mq.producer.config; - -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.infra.mq.message.config.InfConfigRefreshMessage; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * Config 配置相关消息的 Producer - */ -@Component -public class InfConfigProducer { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 发送 {@link InfConfigRefreshMessage} 消息 - */ - public void sendConfigRefreshMessage() { - InfConfigRefreshMessage message = new InfConfigRefreshMessage(); - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/producer/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/producer/package-info.java deleted file mode 100644 index 0895cd9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/mq/producer/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.mq.producer; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/package-info.java deleted file mode 100644 index 341d2be..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * infra 包下,我们放基础设施的运维与管理,支撑上层的通用与核心业务。 - * 例如说:定时任务的管理、服务器的信息等等 - * - * 缩写:inf - */ -package cn.iocoder.dashboard.modules.infra; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigService.java deleted file mode 100644 index 2f23a69..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigService.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.config; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigPageReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; - -import javax.validation.Valid; -import java.util.List; - -/** - * 参数配置 Service 接口 - * - * @author 芋道源码 - */ -public interface InfConfigService { - - /** - * 创建参数配置 - * - * @param reqVO 创建信息 - * @return 配置编号 - */ - Long createConfig(@Valid InfConfigCreateReqVO reqVO); - - /** - * 更新参数配置 - * - * @param reqVO 更新信息 - */ - void updateConfig(@Valid InfConfigUpdateReqVO reqVO); - - /** - * 删除参数配置 - * - * @param id 配置编号 - */ - void deleteConfig(Long id); - - /** - * 获得参数配置 - * - * @param id 配置编号 - * @return 参数配置 - */ - InfConfigDO getConfig(Long id); - - /** - * 根据参数键,获得参数配置 - * - * @param key 配置键 - * @return 参数配置 - */ - InfConfigDO getConfigByKey(String key); - - /** - * 获得参数配置分页列表 - * - * @param reqVO 分页条件 - * @return 分页列表 - */ - PageResult getConfigPage(@Valid InfConfigPageReqVO reqVO); - - /** - * 获得参数配置列表 - * - * @param reqVO 列表 - * @return 列表 - */ - List getConfigList(@Valid InfConfigExportReqVO reqVO); - - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/impl/InfConfigServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/impl/InfConfigServiceImpl.java deleted file mode 100644 index 13b3315..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/config/impl/InfConfigServiceImpl.java +++ /dev/null @@ -1,132 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.config.impl; - -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigPageReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO; -import cn.iocoder.dashboard.modules.infra.convert.config.InfConfigConvert; -import cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigMapper; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; -import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum; -import cn.iocoder.dashboard.modules.infra.mq.producer.config.InfConfigProducer; -import cn.iocoder.dashboard.modules.infra.service.config.InfConfigService; -import com.google.common.annotations.VisibleForTesting; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; - -import java.util.List; - -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.*; - -/** - * 参数配置 Service 实现类 - */ -@Service -@Slf4j -@Validated -public class InfConfigServiceImpl implements InfConfigService { - - @Resource - private InfConfigMapper configMapper; - - @Resource - private InfConfigProducer configProducer; - - @Override - public Long createConfig(InfConfigCreateReqVO reqVO) { - // 校验正确性 - checkCreateOrUpdate(null, reqVO.getKey()); - // 插入参数配置 - InfConfigDO config = InfConfigConvert.INSTANCE.convert(reqVO); - config.setType(InfConfigTypeEnum.CUSTOM.getType()); - configMapper.insert(config); - // 发送刷新消息 - configProducer.sendConfigRefreshMessage(); - return config.getId(); - } - - @Override - public void updateConfig(InfConfigUpdateReqVO reqVO) { - // 校验正确性 - checkCreateOrUpdate(reqVO.getId(), null); // 不允许更新 key - // 更新参数配置 - InfConfigDO updateObj = InfConfigConvert.INSTANCE.convert(reqVO); - configMapper.updateById(updateObj); - // 发送刷新消息 - configProducer.sendConfigRefreshMessage(); - } - - @Override - public void deleteConfig(Long id) { - // 校验配置存在 - InfConfigDO config = checkConfigExists(id); - // 内置配置,不允许删除 - if (InfConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { - throw ServiceExceptionUtil.exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); - } - // 删除 - configMapper.deleteById(id); - // 发送刷新消息 - configProducer.sendConfigRefreshMessage(); - } - - @Override - public InfConfigDO getConfig(Long id) { - return configMapper.selectById(id); - } - - @Override - public InfConfigDO getConfigByKey(String key) { - return configMapper.selectByKey(key); - } - - @Override - public PageResult getConfigPage(InfConfigPageReqVO reqVO) { - return configMapper.selectPage(reqVO); - } - - @Override - public List getConfigList(InfConfigExportReqVO reqVO) { - return configMapper.selectList(reqVO); - } - - private void checkCreateOrUpdate(Long id, String key) { - // 校验自己存在 - checkConfigExists(id); - // 校验参数配置 key 的唯一性 - checkConfigKeyUnique(id, key); - } - - @VisibleForTesting - public InfConfigDO checkConfigExists(Long id) { - if (id == null) { - return null; - } - InfConfigDO config = configMapper.selectById(id); - if (config == null) { - throw ServiceExceptionUtil.exception(CONFIG_NOT_EXISTS); - } - return config; - } - - @VisibleForTesting - public void checkConfigKeyUnique(Long id, String key) { - InfConfigDO config = configMapper.selectByKey(key); - if (config == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的参数配置 - if (id == null) { - throw ServiceExceptionUtil.exception(CONFIG_KEY_DUPLICATE); - } - if (!config.getId().equals(id)) { - throw ServiceExceptionUtil.exception(CONFIG_KEY_DUPLICATE); - } - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileService.java deleted file mode 100644 index 67bfb5a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileService.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.file; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFilePageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; - -/** - * 文件 Service 接口 - * - * @author 芋道源码 - */ -public interface InfFileService { - - /** - * 保存文件,并返回文件的访问路径 - * - * @param path 文件路径 - * @param content 文件内容 - * @return 文件路径 - */ - String createFile(String path, byte[] content); - - /** - * 删除文件 - * - * @param id 编号 - */ - void deleteFile(String id); - - /** - * 获得文件 - * - * @param path 文件路径 - * @return 文件 - */ - InfFileDO getFile(String path); - - /** - * 获得文件分页 - * - * @param pageReqVO 分页查询 - * @return 文件分页 - */ - PageResult getFilePage(InfFilePageReqVO pageReqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/impl/InfFileServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/impl/InfFileServiceImpl.java deleted file mode 100644 index 9b22733..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/file/impl/InfFileServiceImpl.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.file.impl; - -import cn.hutool.core.io.FileTypeUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.framework.file.config.FileProperties; -import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFilePageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.file.InfFileMapper; -import cn.iocoder.dashboard.modules.infra.service.file.InfFileService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.io.ByteArrayInputStream; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.FILE_NOT_EXISTS; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS; - -/** - * 文件 Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class InfFileServiceImpl implements InfFileService { - - @Resource - private InfFileMapper fileMapper; - - @Resource - private FileProperties fileProperties; - - @Override - public String createFile(String path, byte[] content) { - if (fileMapper.selectCountById(path) > 0) { - throw exception(FILE_PATH_EXISTS); - } - // 保存到数据库 - InfFileDO file = new InfFileDO(); - file.setId(path); - file.setType(FileTypeUtil.getType(new ByteArrayInputStream(content))); - file.setContent(content); - fileMapper.insert(file); - // 拼接路径返回 - return fileProperties.getBasePath() + path; - } - - @Override - public void deleteFile(String id) { - // 校验存在 - this.validateFileExists(id); - // 更新 - fileMapper.deleteById(id); - } - - private void validateFileExists(String id) { - if (fileMapper.selectById(id) == null) { - throw exception(FILE_NOT_EXISTS); - } - } - - @Override - public InfFileDO getFile(String path) { - return fileMapper.selectById(path); - } - - @Override - public PageResult getFilePage(InfFilePageReqVO pageReqVO) { - return fileMapper.selectPage(pageReqVO); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobLogService.java deleted file mode 100644 index 97fb19a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobLogService.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.job; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.quartz.core.service.JobLogFrameworkService; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobLogDO; - -import java.util.Collection; -import java.util.List; - -/** - * Job 日志 Service 接口 - * - * @author 芋道源码 - */ -public interface InfJobLogService extends JobLogFrameworkService { - - /** - * 获得定时任务 - * - * @param id 编号 - * @return 定时任务 - */ - InfJobLogDO getJobLog(Long id); - - /** - * 获得定时任务列表 - * - * @param ids 编号 - * @return 定时任务列表 - */ - List getJobLogList(Collection ids); - - /** - * 获得定时任务分页 - * - * @param pageReqVO 分页查询 - * @return 定时任务分页 - */ - PageResult getJobLogPage(InfJobLogPageReqVO pageReqVO); - - /** - * 获得定时任务列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 定时任务分页 - */ - List getJobLogList(InfJobLogExportReqVO exportReqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobService.java deleted file mode 100644 index 45acad3..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobService.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.job; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobPageReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO; -import org.quartz.SchedulerException; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 定时任务 Service 接口 - * - * @author 芋道源码 - */ -public interface InfJobService { - - /** - * 创建定时任务 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createJob(@Valid InfJobCreateReqVO createReqVO) throws SchedulerException; - - /** - * 更新定时任务 - * - * @param updateReqVO 更新信息 - */ - void updateJob(@Valid InfJobUpdateReqVO updateReqVO) throws SchedulerException; - - /** - * 更新定时任务的状态 - * - * @param id 任务编号 - * @param status 状态 - */ - void updateJobStatus(Long id, Integer status) throws SchedulerException; - - /** - * 触发定时任务 - * - * @param id 任务编号 - */ - void triggerJob(Long id) throws SchedulerException; - - /** - * 删除定时任务 - * - * @param id 编号 - */ - void deleteJob(Long id) throws SchedulerException; - - /** - * 获得定时任务 - * - * @param id 编号 - * @return 定时任务 - */ - InfJobDO getJob(Long id); - - /** - * 获得定时任务列表 - * - * @param ids 编号 - * @return 定时任务列表 - */ - List getJobList(Collection ids); - - /** - * 获得定时任务分页 - * - * @param pageReqVO 分页查询 - * @return 定时任务分页 - */ - PageResult getJobPage(InfJobPageReqVO pageReqVO); - - /** - * 获得定时任务列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 定时任务分页 - */ - List getJobList(InfJobExportReqVO exportReqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobLogServiceImpl.java deleted file mode 100644 index 1343e9d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobLogServiceImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.job.impl; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobLogDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobLogMapper; -import cn.iocoder.dashboard.modules.infra.enums.job.InfJobLogStatusEnum; -import cn.iocoder.dashboard.modules.infra.service.job.InfJobLogService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.Date; -import java.util.List; - -/** - * Job 日志 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -@Slf4j -public class InfJobLogServiceImpl implements InfJobLogService { - - @Resource - private InfJobLogMapper jobLogMapper; - - @Override - public Long createJobLog(Long jobId, Date beginTime, String jobHandlerName, String jobHandlerParam, Integer executeIndex) { - InfJobLogDO log = InfJobLogDO.builder().jobId(jobId).handlerName(jobHandlerName).handlerParam(jobHandlerParam).executeIndex(executeIndex) - .beginTime(beginTime).status(InfJobLogStatusEnum.RUNNING.getStatus()).build(); - jobLogMapper.insert(log); - return log.getId(); - } - - @Override - @Async - public void updateJobLogResultAsync(Long logId, Date endTime, Integer duration, boolean success, String result) { - try { - InfJobLogDO updateObj = InfJobLogDO.builder().id(logId).endTime(endTime).duration(duration) - .status(success ? InfJobLogStatusEnum.SUCCESS.getStatus() : InfJobLogStatusEnum.FAILURE.getStatus()).result(result).build(); - jobLogMapper.updateById(updateObj); - } catch (Exception ex) { - log.error("[updateJobLogResultAsync][logId({}) endTime({}) duration({}) success({}) result({})]", - logId, endTime, duration, success, result); - } - } - - @Override - public InfJobLogDO getJobLog(Long id) { - return jobLogMapper.selectById(id); - } - - @Override - public List getJobLogList(Collection ids) { - return jobLogMapper.selectBatchIds(ids); - } - - @Override - public PageResult getJobLogPage(InfJobLogPageReqVO pageReqVO) { - return jobLogMapper.selectPage(pageReqVO); - } - - @Override - public List getJobLogList(InfJobLogExportReqVO exportReqVO) { - return jobLogMapper.selectList(exportReqVO); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java deleted file mode 100644 index 055d7ef..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/job/impl/InfJobServiceImpl.java +++ /dev/null @@ -1,174 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.job.impl; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; -import cn.iocoder.yudao.framework.quartz.core.util.CronUtils; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobPageReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.dashboard.modules.infra.convert.job.InfJobConvert; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobMapper; -import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum; -import cn.iocoder.dashboard.modules.infra.service.job.InfJobService; -import org.quartz.SchedulerException; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.containsAny; - -/** - * 定时任务 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class InfJobServiceImpl implements InfJobService { - - @Resource - private InfJobMapper jobMapper; - - @Resource - private SchedulerManager schedulerManager; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createJob(InfJobCreateReqVO createReqVO) throws SchedulerException { - validateCronExpression(createReqVO.getCronExpression()); - // 校验唯一性 - if (jobMapper.selectByHandlerName(createReqVO.getHandlerName()) != null) { - throw exception(JOB_HANDLER_EXISTS); - } - // 插入 - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.INIT.getStatus()); - fillJobMonitorTimeoutEmpty(job); - jobMapper.insert(job); - - // 添加 Job 到 Quartz 中 - schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), - createReqVO.getRetryCount(), createReqVO.getRetryInterval()); - // 更新 - InfJobDO updateObj = InfJobDO.builder().id(job.getId()).status(InfJobStatusEnum.NORMAL.getStatus()).build(); - jobMapper.updateById(updateObj); - - // 返回 - return job.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateJob(InfJobUpdateReqVO updateReqVO) throws SchedulerException { - validateCronExpression(updateReqVO.getCronExpression()); - // 校验存在 - InfJobDO job = this.validateJobExists(updateReqVO.getId()); - // 只有开启状态,才可以修改.原因是,如果出暂停状态,修改 Quartz Job 时,会导致任务又开始执行 - if (!job.getStatus().equals(InfJobStatusEnum.NORMAL.getStatus())) { - throw exception(JOB_UPDATE_ONLY_NORMAL_STATUS); - } - // 更新 - InfJobDO updateObj = InfJobConvert.INSTANCE.convert(updateReqVO); - fillJobMonitorTimeoutEmpty(updateObj); - jobMapper.updateById(updateObj); - - // 更新 Job 到 Quartz 中 - schedulerManager.updateJob(job.getHandlerName(), updateReqVO.getHandlerParam(), updateReqVO.getCronExpression(), - updateReqVO.getRetryCount(), updateReqVO.getRetryInterval()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateJobStatus(Long id, Integer status) throws SchedulerException { - // 校验 status - if (!containsAny(status, InfJobStatusEnum.NORMAL.getStatus(), InfJobStatusEnum.STOP.getStatus())) { - throw exception(JOB_CHANGE_STATUS_INVALID); - } - // 校验存在 - InfJobDO job = this.validateJobExists(id); - // 校验是否已经为当前状态 - if (job.getStatus().equals(status)) { - throw exception(JOB_CHANGE_STATUS_EQUALS); - } - // 更新 Job 状态 - InfJobDO updateObj = InfJobDO.builder().id(id).status(status).build(); - jobMapper.updateById(updateObj); - - // 更新状态 Job 到 Quartz 中 - if (InfJobStatusEnum.NORMAL.getStatus().equals(status)) { // 开启 - schedulerManager.resumeJob(job.getHandlerName()); - } else { // 暂停 - schedulerManager.pauseJob(job.getHandlerName()); - } - } - - @Override - public void triggerJob(Long id) throws SchedulerException { - // 校验存在 - InfJobDO job = this.validateJobExists(id); - - // 触发 Quartz 中的 Job - schedulerManager.triggerJob(job.getId(), job.getHandlerName(), job.getHandlerParam()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteJob(Long id) throws SchedulerException { - // 校验存在 - InfJobDO job = this.validateJobExists(id); - // 更新 - jobMapper.deleteById(id); - - // 删除 Job 到 Quartz 中 - schedulerManager.deleteJob(job.getHandlerName()); - } - - private InfJobDO validateJobExists(Long id) { - InfJobDO job = jobMapper.selectById(id); - if (job == null) { - throw exception(JOB_NOT_EXISTS); - } - return job; - } - - private void validateCronExpression(String cronExpression) { - if (!CronUtils.isValid(cronExpression)) { - throw exception(JOB_CRON_EXPRESSION_VALID); - } - } - - @Override - public InfJobDO getJob(Long id) { - return jobMapper.selectById(id); - } - - @Override - public List getJobList(Collection ids) { - return jobMapper.selectBatchIds(ids); - } - - @Override - public PageResult getJobPage(InfJobPageReqVO pageReqVO) { - return jobMapper.selectPage(pageReqVO); - } - - @Override - public List getJobList(InfJobExportReqVO exportReqVO) { - return jobMapper.selectList(exportReqVO); - } - - private static void fillJobMonitorTimeoutEmpty(InfJobDO job) { - if (job.getMonitorTimeout() == null) { - job.setMonitorTimeout(0); - } - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogService.java deleted file mode 100644 index d657ae7..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogService.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.logger; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; - -import java.util.List; - -/** - * API 访问日志 Service 接口 - * - * @author 芋道源码 - */ -public interface InfApiAccessLogService extends ApiAccessLogFrameworkService { - - /** - * 获得 API 访问日志分页 - * - * @param pageReqVO 分页查询 - * @return API 访问日志分页 - */ - PageResult getApiAccessLogPage(InfApiAccessLogPageReqVO pageReqVO); - - /** - * 获得 API 访问日志列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return API 访问日志分页 - */ - List getApiAccessLogList(InfApiAccessLogExportReqVO exportReqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogService.java deleted file mode 100644 index 2a6278c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogService.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.logger; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; - -import java.util.List; - -/** - * API 错误日志 Service 接口 - * - * @author 芋道源码 - */ -public interface InfApiErrorLogService extends ApiErrorLogFrameworkService { - - /** - * 获得 API 错误日志分页 - * - * @param pageReqVO 分页查询 - * @return API 错误日志分页 - */ - PageResult getApiErrorLogPage(InfApiErrorLogPageReqVO pageReqVO); - - /** - * 获得 API 错误日志列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return API 错误日志分页 - */ - List getApiErrorLogList(InfApiErrorLogExportReqVO exportReqVO); - - /** - * 更新 API 错误日志已处理 - * - * @param id API 日志编号 - * @param processStatus 处理结果 - * @param processUserId 处理人 - */ - void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java deleted file mode 100644 index 35f73b8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.logger.impl; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.convert.logger.InfApiAccessLogConvert; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.logger.InfApiAccessLogMapper; -import cn.iocoder.dashboard.modules.infra.service.logger.InfApiAccessLogService; -import org.springframework.scheduling.annotation.Async; -import org.springframework.scheduling.annotation.AsyncResult; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.List; -import java.util.concurrent.Future; - -/** - * API 访问日志 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class InfApiAccessLogServiceImpl implements InfApiAccessLogService { - - @Resource - private InfApiAccessLogMapper apiAccessLogMapper; - - @Override - @Async - public Future createApiAccessLogAsync(ApiAccessLogCreateDTO createDTO) { - // 插入 - InfApiAccessLogDO apiAccessLog = InfApiAccessLogConvert.INSTANCE.convert(createDTO); - int insert = apiAccessLogMapper.insert(apiAccessLog); - return new AsyncResult<>(insert == 1); - } - - @Override - public PageResult getApiAccessLogPage(InfApiAccessLogPageReqVO pageReqVO) { - return apiAccessLogMapper.selectPage(pageReqVO); - } - - @Override - public List getApiAccessLogList(InfApiAccessLogExportReqVO exportReqVO) { - return apiAccessLogMapper.selectList(exportReqVO); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java deleted file mode 100644 index 7ce523c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.logger.impl; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.convert.logger.InfApiErrorLogConvert; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.logger.InfApiErrorLogMapper; -import cn.iocoder.dashboard.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; -import cn.iocoder.dashboard.modules.infra.service.logger.InfApiErrorLogService; -import org.springframework.scheduling.annotation.Async; -import org.springframework.scheduling.annotation.AsyncResult; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.List; -import java.util.concurrent.Future; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_PROCESSED; - -/** - * API 错误日志 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class InfApiErrorLogServiceImpl implements InfApiErrorLogService { - - @Resource - private InfApiErrorLogMapper apiErrorLogMapper; - - @Override - @Async - public Future createApiErrorLogAsync(ApiErrorLogCreateDTO createDTO) { - InfApiErrorLogDO apiErrorLog = InfApiErrorLogConvert.INSTANCE.convert(createDTO); - apiErrorLog.setProcessStatus(InfApiErrorLogProcessStatusEnum.INIT.getStatus()); - int insert = apiErrorLogMapper.insert(apiErrorLog); - return new AsyncResult<>(insert == 1); - } - - @Override - public PageResult getApiErrorLogPage(InfApiErrorLogPageReqVO pageReqVO) { - return apiErrorLogMapper.selectPage(pageReqVO); - } - - @Override - public List getApiErrorLogList(InfApiErrorLogExportReqVO exportReqVO) { - return apiErrorLogMapper.selectList(exportReqVO); - } - - @Override - public void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId) { - InfApiErrorLogDO errorLog = apiErrorLogMapper.selectById(id); - if (errorLog == null) { - throw exception(API_ERROR_LOG_NOT_FOUND); - } - if (!InfApiErrorLogProcessStatusEnum.INIT.getStatus().equals(errorLog.getProcessStatus())) { - throw exception(API_ERROR_LOG_PROCESSED); - } - // 标记处理 - apiErrorLogMapper.updateById(InfApiErrorLogDO.builder().id(id).processStatus(processStatus) - .processUserId(processUserId).processTime(new Date()).build()); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.http b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.http deleted file mode 100644 index 125a368..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.http +++ /dev/null @@ -1,22 +0,0 @@ -### 请求 /login 接口 => 成功 -POST {{baseUrl}}/login -Content-Type: application/json - -{ - "username": "admin", - "password": "admin123", - "uuid": "9b2ffbc1-7425-4155-9894-9d5c08541d62", - "code": "1024" -} - -### 请求 /get-permission-info 接口 => 成功 -GET {{baseUrl}}/get-permission-info -Authorization: Bearer {{token}} - -### 请求 /list-menus 接口 => 成功 -GET {{baseUrl}}/list-menus -Authorization: Bearer {{token}} - -### 请求 /druid/xxx 接口 => 失败 TODO 临时测试 -GET http://127.0.0.1:8080/druid/123 -Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java deleted file mode 100644 index 8aee702..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java +++ /dev/null @@ -1,90 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.auth; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthLoginRespVO; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; -import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; -import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService; -import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; -import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import cn.iocoder.yudao.framework.common.util.collection.SetUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserRoleIds; -import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; -import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUserAgent; - -@Api(tags = "认证") -@RestController -@RequestMapping("/") -@Validated -public class SysAuthController { - - @Resource - private SysAuthService authService; - @Resource - private SysUserService userService; - @Resource - private SysRoleService roleService; - @Resource - private SysPermissionService permissionService; - - @PostMapping("/login") - @ApiOperation("使用账号密码登录") - @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 - public CommonResult login(@RequestBody @Valid SysAuthLoginReqVO reqVO) { - String token = authService.login(reqVO, getClientIP(), getUserAgent()); - // 返回结果 - return success(SysAuthLoginRespVO.builder().token(token).build()); - } - - @GetMapping("/get-permission-info") - @ApiOperation("获取登陆用户的权限信息") - public CommonResult getPermissionInfo() { - // 获得用户信息 - SysUserDO user = userService.getUser(getLoginUserId()); - if (user == null) { - return null; - } - // 获得角色列表 - List roleList = roleService.getRolesFromCache(getLoginUserRoleIds()); - // 获得菜单列表 - List menuList = permissionService.getRoleMenusFromCache( - getLoginUserRoleIds(), // 注意,基于登陆的角色,因为后续的权限判断也是基于它 - SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()), - SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); - // 拼接结果返回 - return success(SysAuthConvert.INSTANCE.convert(user, roleList, menuList)); - } - - @GetMapping("list-menus") - @ApiOperation("获得登陆用户的菜单列表") - public CommonResult> getMenus() { - // 获得用户拥有的菜单列表 - List menuList = permissionService.getRoleMenusFromCache( - getLoginUserRoleIds(), // 注意,基于登陆的角色,因为后续的权限判断也是基于它 - SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型 - SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的 - // 转换成 Tree 结构返回 - return success(SysAuthConvert.INSTANCE.buildMenuTree(menuList)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java deleted file mode 100644 index 7439bec..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.auth; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; -import cn.iocoder.dashboard.modules.system.convert.auth.SysUserSessionConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService; -import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; - -@Api(tags = "用户 Session") -@RestController -@RequestMapping("/system/user-session") -public class SysUserSessionController { - - @Resource - private SysUserSessionService userSessionService; - @Resource - private SysUserService userService; - @Resource - private SysDeptService deptService; - - @GetMapping("/page") - @ApiOperation("获得 Session 分页列表") - @PreAuthorize("@ss.hasPermission('system:user-session:page')") - public CommonResult> getUserSessionPage(@Validated SysUserSessionPageReqVO reqVO) { - // 获得 Session 分页 - PageResult pageResult = userSessionService.getUserSessionPage(reqVO); - - // 获得拼接需要的数据 - Map userMap = userService.getUserMap( - convertList(pageResult.getList(), SysUserSessionDO::getUserId)); - Map deptMap = deptService.getDeptMap( - convertList(userMap.values(), SysUserDO::getDeptId)); - // 拼接结果返回 - List sessionList = new ArrayList<>(pageResult.getList().size()); - pageResult.getList().forEach(session -> { - SysUserSessionPageItemRespVO respVO = SysUserSessionConvert.INSTANCE.convert(session); - sessionList.add(respVO); - // 设置用户账号 - MapUtils.findAndThen(userMap, session.getUserId(), user -> { - respVO.setUsername(user.getUsername()); - // 设置用户部门 - MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> respVO.setDeptName(dept.getName())); - }); - }); - return success(new PageResult<>(sessionList, pageResult.getTotal())); - } - - @DeleteMapping("/delete") - @ApiOperation("删除 Session") - @ApiImplicitParam(name = "id", value = "Session 编号", required = true, dataTypeClass = String.class, - example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7") - @PreAuthorize("@ss.hasPermission('system:user-session:delete')") - public CommonResult deleteUserSession(@RequestParam("id") String id) { - userSessionService.deleteUserSession(id); - return success(true); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java deleted file mode 100644 index e3842ac..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.auth.vo.auth; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.Pattern; - -@ApiModel("账号密码登陆 Request VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class SysAuthLoginReqVO { - - @ApiModelProperty(value = "账号", required = true, example = "yudaoyuanma") - @NotEmpty(message = "登陆账号不能为空") - @Length(min = 4, max = 16, message = "账号长度为 4-16 位") - @Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母") - private String username; - - @ApiModelProperty(value = "密码", required = true, example = "buzhidao") - @NotEmpty(message = "密码不能为空") - @Length(min = 4, max = 16, message = "密码长度为 4-16 位") - private String password; - - @ApiModelProperty(value = "验证码", required = true, example = "1024") - @NotEmpty(message = "验证码不能为空") - private String code; - - @ApiModelProperty(value = "验证码的唯一标识", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") - @NotEmpty(message = "唯一标识不能为空") - private String uuid; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java deleted file mode 100644 index 47e0872..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.auth.vo.auth; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@ApiModel("账号密码登陆 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class SysAuthLoginRespVO { - - @ApiModelProperty(value = "token", required = true, example = "yudaoyuanma") - private String token; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java deleted file mode 100644 index 28eadb4..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.auth.vo.auth; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@ApiModel("登陆用户的菜单信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class SysAuthMenuRespVO { - - @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") - private Long id; - - @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") - private Long parentId; - - @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") - private String name; - - @ApiModelProperty(value = "路由地址", example = "post", notes = "仅菜单类型为菜单或者目录时,才需要传") - private String path; - - @ApiModelProperty(value = "组件路径", example = "system/post/index", notes = "仅菜单类型为菜单时,才需要传") - private String component; - - @ApiModelProperty(value = "菜单图标", example = "/menu/list", notes = "仅菜单类型为菜单或者目录时,才需要传") - private String icon; - - /** - * 子路由 - */ - private List children; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java deleted file mode 100644 index c4cfa8b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.auth.vo.auth; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.Set; - -@ApiModel(value = "登陆用户的权限信息 Response VO", description = "额外包括用户信息和角色列表") -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class SysAuthPermissionInfoRespVO { - - @ApiModelProperty(value = "用户信息", required = true) - private UserVO user; - - @ApiModelProperty(value = "角色标识数组", required = true) - private Set roles; - - @ApiModelProperty(value = "操作权限数组", required = true) - private Set permissions; - - @ApiModel("用户信息 VO") - @Data - @NoArgsConstructor - @AllArgsConstructor - @Builder - public static class UserVO { - - @ApiModelProperty(value = "用户昵称", required = true, example = "芋道源码") - private String nickname; - - @ApiModelProperty(value = "用户头像", required = true, example = "http://www.iocoder.cn/xx.jpg") - private String avatar; - - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java deleted file mode 100644 index 7ff9e86..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.auth.vo.session; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.Date; - -@ApiModel(value = "用户在线 Session Response VO", description = "相比用户基本信息来说,会多部门、用户账号等信息") -@Data -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -public class SysUserSessionPageItemRespVO extends PageParam { - - @ApiModelProperty(value = "Session 编号", required = true, example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7") - private String id; - - @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") - private String userIp; - - @ApiModelProperty(value = "浏览器 UserAgent", required = true, example = "Mozilla/5.0") - private String userAgent; - - @ApiModelProperty(value = "登陆时间", required = true) - private Date createTime; - - @ApiModelProperty(value = "用户账号", required = true, example = "yudao") - private String username; - - @ApiModelProperty(value = "部门名称", example = "研发部") - private String deptName; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java deleted file mode 100644 index 66cc6c4..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.auth.vo.session; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("在线用户 Session 分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysUserSessionPageReqVO extends PageParam { - - @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模糊匹配") - private String userIp; - - @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") - private String username; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.http b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.http deleted file mode 100644 index 0b1cf85..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.http +++ /dev/null @@ -1,2 +0,0 @@ -### 请求 /captcha/get-image 接口 => 成功 -GET {{baseUrl}}/system/captcha/get-image diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.java deleted file mode 100644 index 95f27c7..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/SysCaptchaController.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.common; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.dashboard.modules.system.controller.common.vo.SysCaptchaImageRespVO; -import cn.iocoder.dashboard.modules.system.service.common.SysCaptchaService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "验证码") -@RestController -@RequestMapping("/system/captcha") -public class SysCaptchaController { - - @Resource - private SysCaptchaService captchaService; - - @GetMapping("/get-image") - @ApiOperation("生成图片验证码") - public CommonResult getCaptchaImage() { - return success(captchaService.getCaptchaImage()); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/vo/SysCaptchaImageRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/vo/SysCaptchaImageRespVO.java deleted file mode 100644 index 3af4e41..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/common/vo/SysCaptchaImageRespVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.common.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@ApiModel("验证码图片 Response VO") -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SysCaptchaImageRespVO { - - @ApiModelProperty(value = "uuid", required = true, example = "1b3b7d00-83a8-4638-9e37-d67011855968", notes = "通过该 uuid 作为该验证码的标识") - private String uuid; - - @ApiModelProperty(value = "图片", required = true, notes = "验证码的图片内容,使用 Base64 编码") - private String img; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysDeptController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysDeptController.java deleted file mode 100644 index 786997f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysDeptController.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.*; -import cn.iocoder.dashboard.modules.system.convert.dept.SysDeptConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.Comparator; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "部门") -@RestController -@RequestMapping("/system/dept") -@Validated -public class SysDeptController { - - @Resource - private SysDeptService deptService; - - @PostMapping("create") - @ApiOperation("创建部门") - @PreAuthorize("@ss.hasPermission('system:dept:create')") - public CommonResult createDept(@Valid @RequestBody SysDeptCreateReqVO reqVO) { - Long deptId = deptService.createDept(reqVO); - return success(deptId); - } - - @PutMapping("update") - @ApiOperation("更新部门") - @PreAuthorize("@ss.hasPermission('system:dept:update')") - public CommonResult updateDept(@Valid @RequestBody SysDeptUpdateReqVO reqVO) { - deptService.updateDept(reqVO); - return success(true); - } - - @DeleteMapping("delete") - @ApiOperation("删除部门") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:dept:delete')") - public CommonResult deleteDept(@RequestParam("id") Long id) { - deptService.deleteDept(id); - return success(true); - } - - @GetMapping("/list") - @ApiOperation("获取部门列表") - @PreAuthorize("@ss.hasPermission('system:dept:query')") - public CommonResult> listDepts(SysDeptListReqVO reqVO) { - List list = deptService.getSimpleDepts(reqVO); - list.sort(Comparator.comparing(SysDeptDO::getSort)); - return success(SysDeptConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/list-all-simple") - @ApiOperation(value = "获取部门精简信息列表", notes = "只包含被开启的部门,主要用于前端的下拉选项") - public CommonResult> getSimpleDepts() { - // 获得部门列表,只要开启状态的 - SysDeptListReqVO reqVO = new SysDeptListReqVO(); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - List list = deptService.getSimpleDepts(reqVO); - // 排序后,返回给前端 - list.sort(Comparator.comparing(SysDeptDO::getSort)); - return success(SysDeptConvert.INSTANCE.convertList02(list)); - } - - @GetMapping("/get") - @ApiOperation("获得部门信息") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:dept:query')") - public CommonResult getDept(@RequestParam("id") Long id) { - return success(SysDeptConvert.INSTANCE.convert(deptService.getDept(id))); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysPostController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysPostController.java deleted file mode 100644 index c9b621d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysPostController.java +++ /dev/null @@ -1,99 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.*; -import cn.iocoder.dashboard.modules.system.convert.dept.SysPostConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.dashboard.modules.system.service.dept.SysPostService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "岗位") -@RestController -@RequestMapping("/system/post") -@Valid -public class SysPostController { - - @Resource - private SysPostService postService; - - @PostMapping("/create") - @ApiOperation("创建岗位") - @PreAuthorize("@ss.hasPermission('system:post:create')") - public CommonResult createPost(@Valid @RequestBody SysPostCreateReqVO reqVO) { - Long postId = postService.createPost(reqVO); - return success(postId); - } - - @PutMapping("/update") - @ApiOperation("修改岗位") - @PreAuthorize("@ss.hasPermission('system:post:update')") - public CommonResult updatePost(@Valid @RequestBody SysPostUpdateReqVO reqVO) { - postService.updatePost(reqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除岗位") - @PreAuthorize("@ss.hasPermission('system:post:delete')") - public CommonResult deletePost(@RequestParam("id") Long id) { - postService.deletePost(id); - return success(true); - } - - @GetMapping(value = "/get") - @ApiOperation("获得岗位信息") - @ApiImplicitParam(name = "id", value = "岗位编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:post:query')") - public CommonResult getPost(@RequestParam("id") Long id) { - return success(SysPostConvert.INSTANCE.convert(postService.getPost(id))); - } - - @GetMapping("/list-all-simple") - @ApiOperation(value = "获取岗位精简信息列表", notes = "只包含被开启的岗位,主要用于前端的下拉选项") - public CommonResult> getSimplePosts() { - // 获得岗位列表,只要开启状态的 - List list = postService.getPosts(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); - // 排序后,返回给前端 - list.sort(Comparator.comparing(SysPostDO::getSort)); - return success(SysPostConvert.INSTANCE.convertList02(list)); - } - - @GetMapping("/page") - @ApiOperation("获得岗位分页列表") - @PreAuthorize("@ss.hasPermission('system:post:query')") - public CommonResult> getPostPage(@Validated SysPostPageReqVO reqVO) { - return success(SysPostConvert.INSTANCE.convertPage(postService.getPostPage(reqVO))); - } - - @GetMapping("/export") - @ApiOperation("岗位管理") - @PreAuthorize("@ss.hasPermission('system:post:export')") - @OperateLog(type = EXPORT) - public void export(HttpServletResponse response, @Validated SysPostExportReqVO reqVO) throws IOException { - List posts = postService.getPosts(reqVO); - List data = SysPostConvert.INSTANCE.convertList03(posts); - // 输出 - ExcelUtils.write(response, "岗位数据.xls", "岗位列表", SysPostExcelVO.class, data); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java deleted file mode 100644 index 9c54c16..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.dept; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 部门 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class SysDeptBaseVO { - - @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") - @NotBlank(message = "部门名称不能为空") - @Size(max = 30, message = "部门名称长度不能超过30个字符") - private String name; - - @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") - @NotNull(message = "父菜单 ID 不能为空") - private Long parentId; - - @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotNull(message = "显示顺序不能为空") - private Integer sort; - - @ApiModelProperty(value = "负责人", example = "芋道") - private String leader; - - @ApiModelProperty(value = "联系电话", example = "15601691000") - @Size(max = 11, message = "联系电话长度不能超过11个字符") - private String phone; - - @ApiModelProperty(value = "邮箱", example = "yudao@iocoder.cn") - @Email(message = "邮箱格式不正确") - @Size(max = 50, message = "邮箱长度不能超过50个字符") - private String email; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") - @NotNull(message = "状态不能为空") -// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java deleted file mode 100644 index 6ea550c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.dept; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("部门创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysDeptCreateReqVO extends SysDeptBaseVO { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java deleted file mode 100644 index c4d1b17..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.dept; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@ApiModel("部门列表 Request VO") -@Data -public class SysDeptListReqVO { - - @ApiModelProperty(value = "部门名称", example = "芋道", notes = "模糊匹配") - private String name; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptRespVO.java deleted file mode 100644 index f5fa1b2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.dept; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.Date; - -@ApiModel("部门信息 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysDeptRespVO extends SysDeptBaseVO { - - @ApiModelProperty(value = "部门编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java deleted file mode 100644 index fb6f47f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.dept; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@ApiModel("部门精简信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SysDeptSimpleRespVO { - - @ApiModelProperty(value = "部门编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "部门名称", required = true, example = "芋道") - private String name; - - @ApiModelProperty(value = "父部门 ID", required = true, example = "1024") - private Long parentId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java deleted file mode 100644 index e64b421..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.dept; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotNull; - -@ApiModel("部门更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysDeptUpdateReqVO extends SysDeptBaseVO { - - @ApiModelProperty(value = "部门编号", required = true, example = "1024") - @NotNull(message = "部门编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java deleted file mode 100644 index 2b90c10..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.post; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 岗位 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class SysPostBaseVO { - - @ApiModelProperty(value = "岗位名称", required = true, example = "小博主") - @NotBlank(message = "岗位名称不能为空") - @Size(max = 50, message = "岗位名称长度不能超过50个字符") - private String name; - - @ApiModelProperty(value = "岗位编码", required = true, example = "yudao") - @NotBlank(message = "岗位编码不能为空") - @Size(max = 64, message = "岗位编码长度不能超过64个字符") - private String code; - - @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotNull(message = "显示顺序不能为空") - private Integer sort; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @ApiModelProperty(value = "备注", example = "快乐的备注") - private String remark; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java deleted file mode 100644 index a4bd900..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.post; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("岗位创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysPostCreateReqVO extends SysPostBaseVO { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostExcelVO.java deleted file mode 100644 index b77b1d2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostExcelVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.post; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -/** - * 岗位 Excel 导出响应 VO - */ -@Data -public class SysPostExcelVO { - - @ExcelProperty("岗位序号") - private Long id; - - @ExcelProperty("岗位编码") - private String code; - - @ExcelProperty("岗位名称") - private String name; - - @ExcelProperty("岗位排序") - private Integer sort; - - @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) - private String status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostExportReqVO.java deleted file mode 100644 index 8e66825..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostExportReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.post; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@ApiModel(value = "岗位导出 Request VO", description = "参数和 SysPostExcelVO 是一致的") -@Data -public class SysPostExportReqVO { - - @ApiModelProperty(value = "岗位编码", example = "yudao", notes = "模糊匹配") - private String code; - - @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") - private String name; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostListReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostListReqVO.java deleted file mode 100644 index 223fa20..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostListReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.post; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("岗位列表 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysPostListReqVO extends SysPostBaseVO { - - @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") - private String name; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostPageReqVO.java deleted file mode 100644 index b2d7ea6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostPageReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.post; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("岗位分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysPostPageReqVO extends PageParam { - - @ApiModelProperty(value = "岗位编码", example = "yudao", notes = "模糊匹配") - private String code; - - @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") - private String name; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostRespVO.java deleted file mode 100644 index fb18068..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.post; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.Date; - -@ApiModel("岗位信息 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysPostRespVO extends SysPostBaseVO { - - @ApiModelProperty(value = "岗位序号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java deleted file mode 100644 index 312d1b9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.post; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@ApiModel("岗位精简信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SysPostSimpleRespVO { - - @ApiModelProperty(value = "岗位编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "岗位名称", required = true, example = "芋道") - private String name; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java deleted file mode 100644 index 50562ba..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dept.vo.post; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotNull; - -@ApiModel("岗位更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysPostUpdateReqVO extends SysPostBaseVO { - - @ApiModelProperty(value = "岗位编号", required = true, example = "1024") - @NotNull(message = "岗位编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.http b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.http deleted file mode 100644 index f7890dc..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.http +++ /dev/null @@ -1,3 +0,0 @@ -### 请求 /menu/list 接口 => 成功 -GET {{baseUrl}}/system/dict-data/list-all-simple -Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.java deleted file mode 100644 index b09cf2a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.java +++ /dev/null @@ -1,95 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.*; -import cn.iocoder.dashboard.modules.system.convert.dict.SysDictDataConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; -import cn.iocoder.dashboard.modules.system.service.dict.SysDictDataService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "字典数据") -@RestController -@RequestMapping("/system/dict-data") -@Validated -public class SysDictDataController { - - @Resource - private SysDictDataService dictDataService; - - @PostMapping("/create") - @ApiOperation("新增字典数据") - @PreAuthorize("@ss.hasPermission('system:dict:create')") - public CommonResult createDictData(@Valid @RequestBody SysDictDataCreateReqVO reqVO) { - Long dictDataId = dictDataService.createDictData(reqVO); - return success(dictDataId); - } - - @PutMapping("update") - @ApiOperation("修改字典数据") - @PreAuthorize("@ss.hasPermission('system:dict:update')") - public CommonResult updateDictData(@Valid @RequestBody SysDictDataUpdateReqVO reqVO) { - dictDataService.updateDictData(reqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除字典数据") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:dict:delete')") - public CommonResult deleteDictData(Long id) { - dictDataService.deleteDictData(id); - return success(true); - } - - @GetMapping("/list-all-simple") - @ApiOperation(value = "获得全部字典数据列表", notes = "一般用于管理后台缓存字典数据在本地") - // 无需添加权限认证,因为前端全局都需要 - public CommonResult> getSimpleDictDatas() { - List list = dictDataService.getDictDatas(); - return success(SysDictDataConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/page") - @ApiOperation("/获得字典类型的分页列表") - @PreAuthorize("@ss.hasPermission('system:dict:query')") - public CommonResult> getDictTypePage(@Valid SysDictDataPageReqVO reqVO) { - return success(SysDictDataConvert.INSTANCE.convertPage(dictDataService.getDictDataPage(reqVO))); - } - - @GetMapping(value = "/get") - @ApiOperation("/查询字典数据详细") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:dict:query')") - public CommonResult getDictData(@RequestParam("id") Long id) { - return success(SysDictDataConvert.INSTANCE.convert(dictDataService.getDictData(id))); - } - - @GetMapping("/export") - @ApiOperation("导出字典数据") - @PreAuthorize("@ss.hasPermission('system:dict:export')") - @OperateLog(type = EXPORT) - public void export(HttpServletResponse response, @Valid SysDictDataExportReqVO reqVO) throws IOException { - List list = dictDataService.getDictDatas(reqVO); - List data = SysDictDataConvert.INSTANCE.convertList02(list); - // 输出 - ExcelUtils.write(response, "字典数据.xls", "数据列表", SysDictDataExcelVO.class, data); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictTypeController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictTypeController.java deleted file mode 100644 index 8aedd65..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictTypeController.java +++ /dev/null @@ -1,95 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.*; -import cn.iocoder.dashboard.modules.system.convert.dict.SysDictTypeConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.dashboard.modules.system.service.dict.SysDictTypeService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "字典类型") -@RestController -@RequestMapping("/system/dict-type") -@Validated -public class SysDictTypeController { - - @Resource - private SysDictTypeService dictTypeService; - - @PostMapping("/create") - @ApiOperation("创建字典类型") - @PreAuthorize("@ss.hasPermission('system:dict:create')") - public CommonResult createDictType(@Valid @RequestBody SysDictTypeCreateReqVO reqVO) { - Long dictTypeId = dictTypeService.createDictType(reqVO); - return success(dictTypeId); - } - - @PutMapping("/update") - @ApiOperation("修改字典类型") - @PreAuthorize("@ss.hasPermission('system:dict:update')") - public CommonResult updateDictType(@Valid @RequestBody SysDictTypeUpdateReqVO reqVO) { - dictTypeService.updateDictType(reqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除字典类型") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:dict:delete')") - public CommonResult deleteDictType(Long id) { - dictTypeService.deleteDictType(id); - return success(true); - } - - @ApiOperation("/获得字典类型的分页列表") - @GetMapping("/page") - @PreAuthorize("@ss.hasPermission('system:dict:quey')") - public CommonResult> pageDictTypes(@Valid SysDictTypePageReqVO reqVO) { - return success(SysDictTypeConvert.INSTANCE.convertPage(dictTypeService.getDictTypePage(reqVO))); - } - - @ApiOperation("/查询字典类型详细") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @GetMapping(value = "/get") - @PreAuthorize("@ss.hasPermission('system:dict:quey')") - public CommonResult getDictType(@RequestParam("id") Long id) { - return success(SysDictTypeConvert.INSTANCE.convert(dictTypeService.getDictType(id))); - } - - @GetMapping("/list-all-simple") - @ApiOperation(value = "获得全部字典类型列表", notes = "包括开启 + 禁用的字典类型,主要用于前端的下拉选项") - // 无需添加权限认证,因为前端全局都需要 - public CommonResult> listSimpleDictTypes() { - List list = dictTypeService.getDictTypeList(); - return success(SysDictTypeConvert.INSTANCE.convertList(list)); - } - - @ApiOperation("导出数据类型") - @GetMapping("/export") - @PreAuthorize("@ss.hasPermission('system:dict:quey')") - @OperateLog(type = EXPORT) - public void export(HttpServletResponse response, @Valid SysDictTypeExportReqVO reqVO) throws IOException { - List list = dictTypeService.getDictTypeList(reqVO); - List data = SysDictTypeConvert.INSTANCE.convertList02(list); - // 输出 - ExcelUtils.write(response, "字典类型.xls", "类型列表", SysDictTypeExcelVO.class, data); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java deleted file mode 100644 index b034d95..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.data; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 字典数据 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class SysDictDataBaseVO { - - @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotNull(message = "显示顺序不能为空") - private Integer sort; - - @ApiModelProperty(value = "字典标签", required = true, example = "芋道") - @NotBlank(message = "字典标签不能为空") - @Size(max = 100, message = "字典标签长度不能超过100个字符") - private String label; - - @ApiModelProperty(value = "字典值", required = true, example = "iocoder") - @NotBlank(message = "字典键值不能为空") - @Size(max = 100, message = "字典键值长度不能超过100个字符") - private String value; - - @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") - @NotBlank(message = "字典类型不能为空") - @Size(max = 100, message = "字典类型长度不能超过100个字符") - private String dictType; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") - @NotNull(message = "状态不能为空") -// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}") - private Integer status; - - @ApiModelProperty(value = "备注", example = "我是一个角色") - private String remark; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java deleted file mode 100644 index abae7dc..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.data; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("字典数据创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysDictDataCreateReqVO extends SysDictDataBaseVO { - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java deleted file mode 100644 index ef1d62a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.data; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -/** - * 字典数据 Excel 导出响应 VO - */ -@Data -public class SysDictDataExcelVO { - - @ExcelProperty("字典编码") - private Long id; - - @ExcelProperty("字典排序") - private Integer sort; - - @ExcelProperty("字典标签") - private String label; - - @ExcelProperty("字典键值") - private String value; - - @ExcelProperty("字典类型") - private String dictType; - - @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java deleted file mode 100644 index f05c124..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.data; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.Size; - -@ApiModel("字典类型导出 Request VO") -@Data -public class SysDictDataExportReqVO { - - @ApiModelProperty(value = "字典标签", example = "芋道") - @Size(max = 100, message = "字典标签长度不能超过100个字符") - private String label; - - @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") - @Size(max = 100, message = "字典类型类型长度不能超过100个字符") - private String dictType; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java deleted file mode 100644 index bebcc32..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.data; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.Size; - -@ApiModel("字典类型分页列表 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysDictDataPageReqVO extends PageParam { - - @ApiModelProperty(value = "字典标签", example = "芋道") - @Size(max = 100, message = "字典标签长度不能超过100个字符") - private String label; - - @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") - @Size(max = 100, message = "字典类型类型长度不能超过100个字符") - private String dictType; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataRespVO.java deleted file mode 100644 index cb2595c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.data; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.Date; - -@ApiModel("字典数据信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -public class SysDictDataRespVO extends SysDictDataBaseVO { - - @ApiModelProperty(value = "字典数据编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java deleted file mode 100644 index a9e5aae..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.data; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@ApiModel("数据字典精简 Response VO") -@Data -public class SysDictDataSimpleRespVO { - - @ApiModelProperty(value = "字典类型", required = true, example = "gender") - private String dictType; - - @ApiModelProperty(value = "字典键值", required = true, example = "1") - private String value; - - @ApiModelProperty(value = "字典标签", required = true, example = "男") - private String label; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java deleted file mode 100644 index 1d79f19..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.data; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotNull; - -@ApiModel("字典数据更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysDictDataUpdateReqVO extends SysDictDataBaseVO { - - @ApiModelProperty(value = "字典数据编号", required = true, example = "1024") - @NotNull(message = "字典数据编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java deleted file mode 100644 index 306ede7..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.type; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 字典类型 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class SysDictTypeBaseVO { - - @ApiModelProperty(value = "字典名称", required = true, example = "性别") - @NotBlank(message = "字典名称不能为空") - @Size(max = 100, message = "字典类型名称长度不能超过100个字符") - private String name; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") - @NotNull(message = "状态不能为空") - private Integer status; - - @ApiModelProperty(value = "备注", example = "快乐的备注") - private String remark; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java deleted file mode 100644 index 747ad19..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.type; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -@ApiModel("字典类型创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysDictTypeCreateReqVO extends SysDictTypeBaseVO { - - @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") - @NotNull(message = "字典类型不能为空") - @Size(max = 100, message = "字典类型类型长度不能超过100个字符") - private String type; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java deleted file mode 100644 index 391489f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.type; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -/** - * 字典类型 Excel 导出响应 VO - */ -@Data -public class SysDictTypeExcelVO { - - @ExcelProperty("字典主键") - private Long id; - - @ExcelProperty("字典名称") - private String name; - - @ExcelProperty("字典类型") - private String type; - - @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java deleted file mode 100644 index 5a3033c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.type; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("字典类型分页列表 Request VO") -@Data -public class SysDictTypeExportReqVO { - - @ApiModelProperty(value = "字典类型名称", example = "芋道", notes = "模糊匹配") - private String name; - - @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") - private String type; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束创建时间") - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java deleted file mode 100644 index 57b59c5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.type; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.Size; -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("字典类型分页列表 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysDictTypePageReqVO extends PageParam { - - @ApiModelProperty(value = "字典类型名称", example = "芋道", notes = "模糊匹配") - private String name; - - @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") - @Size(max = 100, message = "字典类型类型长度不能超过100个字符") - private String type; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束创建时间") - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java deleted file mode 100644 index d9a5f80..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.type; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.Date; - -@ApiModel("字典类型信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -public class SysDictTypeRespVO extends SysDictTypeBaseVO { - - @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") - private String type; - - @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java deleted file mode 100644 index 382544b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.type; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@ApiModel("字典类型精简信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SysDictTypeSimpleRespVO { - - @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "字典类型名称", required = true, example = "芋道") - private String name; - - @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") - private String type; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java deleted file mode 100644 index d779952..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.dict.vo.type; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotNull; - -@ApiModel("字典类型更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysDictTypeUpdateReqVO extends SysDictTypeBaseVO { - - @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") - @NotNull(message = "字典类型编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.http b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.http deleted file mode 100644 index 76226d1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.http +++ /dev/null @@ -1,12 +0,0 @@ -### -POST {{baseUrl}}/inra/error-code/create -Authorization: Bearer {{token}} -Content-Type:application/json - -{ - "code": 200, - "message": "成功", - "group": "test", - "type": 1 -} - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.java deleted file mode 100644 index 711c4ff..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.errorcode; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.convert.errorcode.SysErrorCodeConvert; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.*; -import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; -import cn.iocoder.dashboard.modules.system.service.errorcode.SysErrorCodeService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "错误码") -@RestController -@RequestMapping("/system/error-code") -@Validated -public class SysErrorCodeController { - - @Resource - private SysErrorCodeService errorCodeService; - - @PostMapping("/create") - @ApiOperation("创建错误码") - @PreAuthorize("@ss.hasPermission('system:error-code:create')") - public CommonResult createErrorCode(@Valid @RequestBody SysErrorCodeCreateReqVO createReqVO) { - return success(errorCodeService.createErrorCode(createReqVO)); - } - - @PutMapping("/update") - @ApiOperation("更新错误码") - @PreAuthorize("@ss.hasPermission('system:error-code:update')") - public CommonResult updateErrorCode(@Valid @RequestBody SysErrorCodeUpdateReqVO updateReqVO) { - errorCodeService.updateErrorCode(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除错误码") - @ApiImplicitParam(name = "id", value = "编号", required = true) - @PreAuthorize("@ss.hasPermission('system:error-code:delete')") - public CommonResult deleteErrorCode(@RequestParam("id") Long id) { - errorCodeService.deleteErrorCode(id); - return success(true); - } - - @GetMapping("/get") - @ApiOperation("获得错误码") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:error-code:query')") - public CommonResult getErrorCode(@RequestParam("id") Long id) { - SysErrorCodeDO errorCode = errorCodeService.getErrorCode(id); - return success(SysErrorCodeConvert.INSTANCE.convert(errorCode)); - } - - @GetMapping("/page") - @ApiOperation("获得错误码分页") - @PreAuthorize("@ss.hasPermission('system:error-code:query')") - public CommonResult> getErrorCodePage(@Valid SysErrorCodePageReqVO pageVO) { - PageResult pageResult = errorCodeService.getErrorCodePage(pageVO); - return success(SysErrorCodeConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @ApiOperation("导出错误码 Excel") - @PreAuthorize("@ss.hasPermission('system:error-code:export')") - @OperateLog(type = EXPORT) - public void exportErrorCodeExcel(@Valid SysErrorCodeExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = errorCodeService.getErrorCodeList(exportReqVO); - // 导出 Excel - List datas = SysErrorCodeConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "错误码.xls", "数据", SysErrorCodeExcelVO.class, datas); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java deleted file mode 100644 index 235ba88..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.errorcode.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** -* 错误码 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class SysErrorCodeBaseVO { - - @ApiModelProperty(value = "应用名", required = true, example = "dashboard") - @NotNull(message = "应用名不能为空") - private String applicationName; - - @ApiModelProperty(value = "错误码编码", required = true, example = "1234") - @NotNull(message = "错误码编码不能为空") - private Integer code; - - @ApiModelProperty(value = "错误码错误提示", required = true, example = "帅气") - @NotNull(message = "错误码错误提示不能为空") - private String message; - - @ApiModelProperty(value = "备注", example = "哈哈哈") - private String memo; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java deleted file mode 100644 index 7daedf7..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.errorcode.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("错误码创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysErrorCodeCreateReqVO extends SysErrorCodeBaseVO { - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java deleted file mode 100644 index 8ba6d8d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.errorcode.vo; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.infra.enums.InfDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * 错误码 Excel VO - * - * @author 芋道源码 - */ -@Data -public class SysErrorCodeExcelVO { - - @ExcelProperty("错误码编号") - private Long id; - - @ExcelProperty(value = "错误码类型", converter = DictConvert.class) - @DictFormat(InfDictTypeConstants.ERROR_CODE_TYPE) - private Integer type; - - @ExcelProperty("应用名") - private String applicationName; - - @ExcelProperty("错误码编码") - private Integer code; - - @ExcelProperty("错误码错误提示") - private String message; - - @ExcelProperty("备注") - private String memo; - - @ExcelProperty("创建时间") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java deleted file mode 100644 index 6c8aa09..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.errorcode.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel(value = "错误码 Excel 导出 Request VO", description = "参数和 InfErrorCodePageReqVO 是一致的") -@Data -public class SysErrorCodeExportReqVO { - - @ApiModelProperty(value = "错误码类型", example = "1") - private Integer type; - - @ApiModelProperty(value = "应用名", example = "dashboard") - private String applicationName; - - @ApiModelProperty(value = "错误码编码", example = "1234") - private Integer code; - - @ApiModelProperty(value = "错误码错误提示", example = "帅气") - private String message; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束创建时间") - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java deleted file mode 100644 index 1bdbf98..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.errorcode.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("错误码分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysErrorCodePageReqVO extends PageParam { - - @ApiModelProperty(value = "错误码类型", example = "1", notes = "参见 SysErrorCodeTypeEnum 枚举类") - private Integer type; - - @ApiModelProperty(value = "应用名", example = "dashboard") - private String applicationName; - - @ApiModelProperty(value = "错误码编码", example = "1234") - private Integer code; - - @ApiModelProperty(value = "错误码错误提示", example = "帅气") - private String message; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束创建时间") - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java deleted file mode 100644 index ef0e804..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.errorcode.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("错误码 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysErrorCodeRespVO extends SysErrorCodeBaseVO { - - @ApiModelProperty(value = "错误码编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "错误码类型", required = true, example = "1", notes = "参见 SysErrorCodeTypeEnum 枚举类") - private Integer type; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java deleted file mode 100644 index 1659b47..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.errorcode.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@ApiModel("错误码更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysErrorCodeUpdateReqVO extends SysErrorCodeBaseVO { - - @ApiModelProperty(value = "错误码编号", required = true, example = "1024") - @NotNull(message = "错误码编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysLoginLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysLoginLogController.java deleted file mode 100644 index 8109460..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysLoginLogController.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogRespVO; -import cn.iocoder.dashboard.modules.system.convert.logger.SysLoginLogConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.dashboard.modules.system.service.logger.SysLoginLogService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "登陆日志") -@RestController -@RequestMapping("/system/login-log") -@Validated -public class SysLoginLogController { - - @Resource - private SysLoginLogService loginLogService; - - @GetMapping("/page") - @ApiOperation("获得登陆日志分页列表") - @PreAuthorize("@ss.hasPermission('system:login-log:query')") - public CommonResult> getLoginLogPage(@Valid SysLoginLogPageReqVO reqVO) { - PageResult page = loginLogService.getLoginLogPage(reqVO); - return CommonResult.success(SysLoginLogConvert.INSTANCE.convertPage(page)); - } - - @GetMapping("/export") - @ApiOperation("导出登陆日志 Excel") - @PreAuthorize("@ss.hasPermission('system:login-log:export')") - @OperateLog(type = EXPORT) - public void exportLoginLog(HttpServletResponse response, @Valid SysLoginLogExportReqVO reqVO) throws IOException { - List list = loginLogService.getLoginLogList(reqVO); - // 拼接数据 - List data = SysLoginLogConvert.INSTANCE.convertList(list); - // 输出 - ExcelUtils.write(response, "登陆日志.xls", "数据列表", SysLoginLogExcelVO.class, data); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.http b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.http deleted file mode 100644 index 3b88719..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.http +++ /dev/null @@ -1,3 +0,0 @@ -### 请求 /system/operate-log/demo 接口 => 成功 -GET {{baseUrl}}/system/operate-log/demo -Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.java deleted file mode 100644 index bb2fa41..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogRespVO; -import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.service.logger.SysOperateLogService; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "操作日志") -@RestController -@RequestMapping("/system/operate-log") -@Validated -public class SysOperateLogController { - - @Resource - private SysOperateLogService operateLogService; - @Resource - private SysUserService userService; - - @GetMapping("/page") - @ApiOperation("查看操作日志分页列表") - @PreAuthorize("@ss.hasPermission('system:operate-log:query')") - public CommonResult> pageOperateLog(@Valid SysOperateLogPageReqVO reqVO) { - PageResult pageResult = operateLogService.getOperateLogPage(reqVO); - - // 获得拼接需要的数据 - Collection userIds = CollectionUtils.convertList(pageResult.getList(), SysOperateLogDO::getUserId); - Map userMap = userService.getUserMap(userIds); - // 拼接数据 - List list = new ArrayList<>(pageResult.getList().size()); - pageResult.getList().forEach(operateLog -> { - SysOperateLogRespVO respVO = SysOperateLogConvert.INSTANCE.convert(operateLog); - list.add(respVO); - // 拼接用户信息 - MapUtils.findAndThen(userMap, operateLog.getUserId(), user -> respVO.setUserNickname(user.getNickname())); - }); - return success(new PageResult<>(list, pageResult.getTotal())); - } - - @ApiOperation("导出操作日志") - @GetMapping("/export") - @PreAuthorize("@ss.hasPermission('system:operate-log:export')") - @OperateLog(type = EXPORT) - public void exportOperateLog(HttpServletResponse response, @Valid SysOperateLogExportReqVO reqVO) throws IOException { - List list = operateLogService.getOperateLogs(reqVO); - - // 获得拼接需要的数据 - Collection userIds = CollectionUtils.convertList(list, SysOperateLogDO::getUserId); - Map userMap = userService.getUserMap(userIds); - // 拼接数据 - List excelDataList = SysOperateLogConvert.INSTANCE.convertList(list, userMap); - // 输出 - ExcelUtils.write(response, "操作日志.xls", "数据列表", SysOperateLogExcelVO.class, excelDataList); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java deleted file mode 100644 index c5dd34e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 登陆日志 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class SysLoginLogBaseVO { - - @ApiModelProperty(value = "日志类型", required = true, example = "1", notes = "参见 SysLoginLogTypeEnum 枚举类") - @NotNull(message = "日志类型不能为空") - private Integer logType; - - @ApiModelProperty(value = "链路追踪编号", required = true, example = "89aca178-a370-411c-ae02-3f0d672be4ab") - @NotEmpty(message = "链路追踪编号不能为空") - private String traceId; - - @ApiModelProperty(value = "用户账号", required = true, example = "yudao") - @NotBlank(message = "用户账号不能为空") - @Size(max = 30, message = "用户账号长度不能超过30个字符") - private String username; - - @ApiModelProperty(value = "登陆结果", required = true, example = "1", notes = "参见 SysLoginResultEnum 枚举类") - @NotNull(message = "登陆结果不能为空") - private Integer result; - - @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") - @NotEmpty(message = "用户 IP 不能为空") - private String userIp; - - @ApiModelProperty(value = "浏览器 UserAgent", required = true, example = "Mozilla/5.0") - @NotEmpty(message = "浏览器 UserAgent 不能为空") - private String userAgent; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java deleted file mode 100644 index 78a0c45..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel(value = "登陆日志创建 Request VO", - description = "暂时提供给前端,仅仅后端记录登陆日志时,进行使用") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysLoginLogCreateReqVO extends SysLoginLogBaseVO { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java deleted file mode 100644 index bf23e3a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * 登陆日志 Excel 导出响应 VO - */ -@Data -public class SysLoginLogExcelVO { - - @ExcelProperty("日志主键") - private Long id; - - @ExcelProperty("用户账号") - private String username; - - @ExcelProperty(value = "登陆结果", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.LOGIN_RESULT) - private Integer result; - - @ExcelProperty("登陆 IP") - private String userIp; - - @ExcelProperty("浏览器 UA") - private String userAgent; - - @ExcelProperty("登陆时间") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java deleted file mode 100644 index 9390d41..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("登陆日志分页列表 Request VO") -@Data -public class SysLoginLogExportReqVO { - - @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模拟匹配") - private String userIp; - - @ApiModelProperty(value = "用户账号", example = "芋道", notes = "模拟匹配") - private String username; - - @ApiModelProperty(value = "操作状态", example = "true") - private Boolean status; - - @ApiModelProperty(value = "开始时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java deleted file mode 100644 index 4becbc9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("登陆日志分页列表 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysLoginLogPageReqVO extends PageParam { - - @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模拟匹配") - private String userIp; - - @ApiModelProperty(value = "用户账号", example = "芋道", notes = "模拟匹配") - private String username; - - @ApiModelProperty(value = "操作状态", example = "true") - private Boolean status; - - @ApiModelProperty(value = "开始时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java deleted file mode 100644 index f9e2664..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("登陆日志 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysLoginLogRespVO extends SysLoginLogBaseVO { - - @ApiModelProperty(value = "日志编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "登陆时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java deleted file mode 100644 index bcdce0f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Date; -import java.util.Map; - -/** - * 操作日志 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class SysOperateLogBaseVO { - - @ApiModelProperty(value = "链路追踪编号", required = true, example = "89aca178-a370-411c-ae02-3f0d672be4ab") - @NotEmpty(message = "链路追踪编号不能为空") - private String traceId; - - @ApiModelProperty(value = "用户编号", required = true, example = "1024") - @NotNull(message = "用户编号不能为空") - private Long userId; - - @ApiModelProperty(value = "操作模块", required = true, example = "订单") - @NotEmpty(message = "操作模块不能为空") - private String module; - - @ApiModelProperty(value = "操作名", required = true, example = "创建订单") - @NotEmpty(message = "操作名") - private String name; - - @ApiModelProperty(value = "操作分类", required = true, example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") - @NotNull(message = "操作分类不能为空") - private Integer type; - - @ApiModelProperty(value = "操作明细", example = "修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。") - private String content; - - @ApiModelProperty(value = "拓展字段", example = "{'orderId': 1}") - private Map exts; - - @ApiModelProperty(value = "请求方法名", required = true, example = "GET") - @NotEmpty(message = "请求方法名不能为空") - private String requestMethod; - - @ApiModelProperty(value = "请求地址", required = true, example = "/xxx/yyy") - @NotEmpty(message = "请求地址不能为空") - private String requestUrl; - - @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") - @NotEmpty(message = "用户 IP 不能为空") - private String userIp; - - @ApiModelProperty(value = "浏览器 UserAgent", required = true, example = "Mozilla/5.0") - @NotEmpty(message = "浏览器 UserAgent 不能为空") - private String userAgent; - - @ApiModelProperty(value = "Java 方法名", required = true, example = "cn.iocoder.dashboard.UserController.save(...)") - @NotEmpty(message = "Java 方法名不能为空") - private String javaMethod; - - @ApiModelProperty(value = "Java 方法的参数") - private String javaMethodArgs; - - @ApiModelProperty(value = "开始时间", required = true) - @NotNull(message = "开始时间不能为空") - private Date startTime; - - @ApiModelProperty(value = "执行时长,单位:毫秒", required = true) - @NotNull(message = "执行时长不能为空") - private Integer duration; - - @ApiModelProperty(value = "结果码", required = true) - @NotNull(message = "结果码不能为空") - private Integer resultCode; - - @ApiModelProperty(value = "结果提示") - private String resultMsg; - - @ApiModelProperty(value = "结果数据") - private String resultData; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java deleted file mode 100644 index d24704f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * 操作日志 Excel 导出响应 VO - */ -@Data -public class SysOperateLogExcelVO { - - @ExcelProperty("日志编号") - private Long id; - - @ExcelProperty("操作模块") - private String module; - - @ExcelProperty("操作名") - private String name; - - @ExcelProperty(value = "操作类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.OPERATE_TYPE) - private String type; - - @ExcelProperty("操作人") - private String userNickname; - - @ExcelProperty(value = "操作结果") // 成功 or 失败 - private String successStr; - - @ExcelProperty("操作日志") - private Date startTime; - - @ExcelProperty("执行时长") - private Integer duration; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java deleted file mode 100644 index ae03dee..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("操作日志分页列表 Request VO") -@Data -public class SysOperateLogExportReqVO { - - @ApiModelProperty(value = "操作模块", example = "订单", notes = "模拟匹配") - private String module; - - @ApiModelProperty(value = "用户昵称", example = "芋道", notes = "模拟匹配") - private String userNickname; - - @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") - private Integer type; - - @ApiModelProperty(value = "操作状态", example = "true") - private Boolean success; - - @ApiModelProperty(value = "开始时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java deleted file mode 100644 index bd127c3..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("操作日志分页列表 Request VO") -@Data -public class SysOperateLogPageReqVO extends PageParam { - - @ApiModelProperty(value = "操作模块", example = "订单", notes = "模拟匹配") - private String module; - - @ApiModelProperty(value = "用户昵称", example = "芋道", notes = "模拟匹配") - private String userNickname; - - @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") - private Integer type; - - @ApiModelProperty(value = "操作状态", example = "true") - private Boolean success; - - @ApiModelProperty(value = "开始时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java deleted file mode 100644 index 2ebdfef..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("操作日志 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysOperateLogRespVO extends SysOperateLogBaseVO { - - @ApiModelProperty(value = "日志编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") - private String userNickname; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/SysNoticeController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/SysNoticeController.java deleted file mode 100644 index 59366b9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/SysNoticeController.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.notice; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeRespVO; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.convert.notice.SysNoticeConvert; -import cn.iocoder.dashboard.modules.system.service.notice.SysNoticeService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "通知公告") -@RestController -@RequestMapping("/system/notice") -@Validated -public class SysNoticeController { - - @Resource - private SysNoticeService noticeService; - - @PostMapping("/create") - @ApiOperation("创建通知公告") - @PreAuthorize("@ss.hasPermission('system:notice:create')") - public CommonResult createNotice(@Valid @RequestBody SysNoticeCreateReqVO reqVO) { - Long noticeId = noticeService.createNotice(reqVO); - return success(noticeId); - } - - @PutMapping("/update") - @ApiOperation("修改通知公告") - @PreAuthorize("@ss.hasPermission('system:notice:update')") - public CommonResult updateNotice(@Valid @RequestBody SysNoticeUpdateReqVO reqVO) { - noticeService.updateNotice(reqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除通知公告") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:notice:delete')") - public CommonResult deleteNotice(@RequestParam("id") Long id) { - noticeService.deleteNotice(id); - return success(true); - } - - @GetMapping("/page") - @ApiOperation("获取通知公告列表") - @PreAuthorize("@ss.hasPermission('system:notice:quey')") - public CommonResult> pageNotices(@Validated SysNoticePageReqVO reqVO) { - return success(SysNoticeConvert.INSTANCE.convertPage(noticeService.pageNotices(reqVO))); - } - - @GetMapping("/get") - @ApiOperation("获得通知公告") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:notice:quey')") - public CommonResult getNotice(@RequestParam("id") Long id) { - return success(SysNoticeConvert.INSTANCE.convert(noticeService.getNotice(id))); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeBaseVO.java deleted file mode 100644 index 5fc4f90..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeBaseVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.notice.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 通知公告 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class SysNoticeBaseVO { - - @ApiModelProperty(value = "公告标题", required = true, example = "小博主") - @NotBlank(message = "公告标题不能为空") - @Size(max = 50, message = "公告标题不能超过50个字符") - private String title; - - @ApiModelProperty(value = "公告标题", required = true, example = "小博主") - @NotNull(message = "公告类型不能为空") - private Integer type; - - @ApiModelProperty(value = "公告内容", required = true, example = "半生编码") - private String content; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java deleted file mode 100644 index 1a18114..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.notice.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("通知公告创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysNoticeCreateReqVO extends SysNoticeBaseVO { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticePageReqVO.java deleted file mode 100644 index 871f388..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticePageReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.notice.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("通知公告分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysNoticePageReqVO extends PageParam { - - @ApiModelProperty(value = "通知公告名称", example = "芋道", notes = "模糊匹配") - private String title; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeRespVO.java deleted file mode 100644 index afca87f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.notice.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.Date; - -@ApiModel("通知公告信息 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysNoticeRespVO extends SysNoticeBaseVO { - - @ApiModelProperty(value = "通知公告序号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java deleted file mode 100644 index fffe4b8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.notice.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotNull; - -@ApiModel("岗位公告更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysNoticeUpdateReqVO extends SysNoticeBaseVO { - - @ApiModelProperty(value = "岗位公告编号", required = true, example = "1024") - @NotNull(message = "岗位公告编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.http b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.http deleted file mode 100644 index c073f7b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.http +++ /dev/null @@ -1,3 +0,0 @@ -### 请求 /menu/list 接口 => 成功 -GET {{baseUrl}}/system/menu/list -Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.java deleted file mode 100644 index 3a9d79e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.*; -import cn.iocoder.dashboard.modules.system.convert.permission.SysMenuConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.Comparator; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "菜单") -@RestController -@RequestMapping("/system/menu") -@Validated -public class SysMenuController { - - @Resource - private SysMenuService menuService; - - @PostMapping("/create") - @ApiOperation("创建菜单") - @PreAuthorize("@ss.hasPermission('system:menu:create')") - public CommonResult createMenu(@Valid @RequestBody SysMenuCreateReqVO reqVO) { - Long menuId = menuService.createMenu(reqVO); - return success(menuId); - } - - @PutMapping("/update") - @ApiOperation("修改菜单") - @PreAuthorize("@ss.hasPermission('system:menu:update')") - public CommonResult updateMenu(@Valid @RequestBody SysMenuUpdateReqVO reqVO) { - menuService.updateMenu(reqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除菜单") - @ApiImplicitParam(name = "id", value = "角色编号", required= true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:menu:delete')") - public CommonResult deleteMenu(@RequestParam("id") Long id) { - menuService.deleteMenu(id); - return success(true); - } - - @GetMapping("/list") - @ApiOperation("获取菜单列表") - @PreAuthorize("@ss.hasPermission('system:menu:query')") - public CommonResult> getMenus(SysMenuListReqVO reqVO) { - List list = menuService.getMenus(reqVO); - list.sort(Comparator.comparing(SysMenuDO::getSort)); - return success(SysMenuConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/list-all-simple") - @ApiOperation(value = "获取菜单精简信息列表", notes = "只包含被开启的菜单,主要用于前端的下拉选项") - public CommonResult> getSimpleMenus() { - // 获得菜单列表,只要开启状态的 - SysMenuListReqVO reqVO = new SysMenuListReqVO(); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - List list = menuService.getMenus(reqVO); - // 排序后,返回个诶前端 - list.sort(Comparator.comparing(SysMenuDO::getSort)); - return success(SysMenuConvert.INSTANCE.convertList02(list)); - } - - @GetMapping("/get") - @ApiOperation("获取菜单信息") - @PreAuthorize("@ss.hasPermission('system:menu:query')") - public CommonResult getMenu(Long id) { - SysMenuDO menu = menuService.getMenu(id); - return success(SysMenuConvert.INSTANCE.convert(menu)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysPermissionController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysPermissionController.java deleted file mode 100644 index f4ca7eb..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysPermissionController.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.permission.SysPermissionAssignRoleDataScopeReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.permission.SysPermissionAssignRoleMenuReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.permission.SysPermissionAssignUserRoleReqVO; -import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.Set; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -/** - * 权限 Controller,提供赋予用户、角色的权限的 API 接口 - * - * @author 芋道源码 - */ -@Api(tags = "权限") -@RestController -@RequestMapping("/system/permission") -public class SysPermissionController { - - @Resource - private SysPermissionService permissionService; - - @ApiOperation("获得角色拥有的菜单编号") - @ApiImplicitParam(name = "roleId", value = "角色编号", required = true, dataTypeClass = Long.class) - @GetMapping("/list-role-resources") -// @RequiresPermissions("system:permission:assign-role-menu") - public CommonResult> listRoleMenus(Long roleId) { - return success(permissionService.listRoleMenuIds(roleId)); - } - - @PostMapping("/assign-role-menu") - @ApiOperation("赋予角色菜单") -// @RequiresPermissions("system:permission:assign-role-resource") - public CommonResult assignRoleMenu(@Validated @RequestBody SysPermissionAssignRoleMenuReqVO reqVO) { - permissionService.assignRoleMenu(reqVO.getRoleId(), reqVO.getMenuIds()); - return success(true); - } - - @PostMapping("/assign-role-data-scope") - @ApiOperation("赋予角色数据权限") -// @RequiresPermissions("system:permission:assign-role-data-scope") - public CommonResult assignRoleDataScope( - @Validated @RequestBody SysPermissionAssignRoleDataScopeReqVO reqVO) { - permissionService.assignRoleDataScope(reqVO.getRoleId(), reqVO.getDataScope(), reqVO.getDataScopeDeptIds()); - return success(true); - } - - @ApiOperation("获得管理员拥有的角色编号列表") - @ApiImplicitParam(name = "userId", value = "用户编号", required = true, dataTypeClass = Long.class) - @GetMapping("/list-user-roles") -// @RequiresPermissions("system:permission:assign-user-role") - public CommonResult> listAdminRoles(@RequestParam("userId") Long userId) { - return success(permissionService.listUserRoleIs(userId)); - } - - @ApiOperation("赋予用户角色") - @PostMapping("/assign-user-role") -// @RequiresPermissions("system:permission:assign-user-role") - public CommonResult assignUserRole(@Validated @RequestBody SysPermissionAssignUserRoleReqVO reqVO) { - permissionService.assignUserRole(reqVO.getUserId(), reqVO.getRoleIds()); - return success(true); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.http b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.http deleted file mode 100644 index 4e150ac..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.http +++ /dev/null @@ -1,41 +0,0 @@ -### /role/create 成功 -POST {{baseUrl}}/system/role/create -Authorization: Bearer {{token}} -Content-Type: application/json - -{ - "name": "测试角色", - "code": "test", - "sort": 0 -} - -### /role/update 成功 -POST {{baseUrl}}/system/role/update -Authorization: Bearer {{token}} -Content-Type: application/json - - -{ - "id": 100, - "name": "测试角色", - "code": "test", - "sort": 10 -} -### /resource/delete 成功 -POST {{baseUrl}}/system/role/delete -Content-Type: application/x-www-form-urlencoded -Authorization: Bearer {{token}} - -roleId=14 - -### /role/get 成功 -GET {{baseUrl}}/system/role/get?id=100 -Content-Type: application/x-www-form-urlencoded -Authorization: Bearer {{token}} - -### /role/page 成功 -GET {{baseUrl}}/system/role/page?pageNo=1&pageSize=10 -Authorization: Bearer {{token}} - -### - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.java deleted file mode 100644 index bd4aa70..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.java +++ /dev/null @@ -1,106 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.*; -import cn.iocoder.dashboard.modules.system.convert.permission.SysRoleConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "角色") -@RestController -@RequestMapping("/system/role") -@Validated -public class SysRoleController { - - @Resource - private SysRoleService roleService; - - @PostMapping("/create") - @ApiOperation("创建角色") - @PreAuthorize("@ss.hasPermission('system:role:create')") - public CommonResult createRole(@Valid @RequestBody SysRoleCreateReqVO reqVO) { - return success(roleService.createRole(reqVO)); - } - - @PutMapping("/update") - @ApiOperation("修改角色") - @PreAuthorize("@ss.hasPermission('system:role:update')") - public CommonResult updateRole(@Valid @RequestBody SysRoleUpdateReqVO reqVO) { - roleService.updateRole(reqVO); - return success(true); - } - - @PutMapping("/update-status") - @ApiOperation("修改角色状态") - @PreAuthorize("@ss.hasPermission('system:role:update')") - public CommonResult updateRoleStatus(@Valid @RequestBody SysRoleUpdateStatusReqVO reqVO) { - roleService.updateRoleStatus(reqVO.getId(), reqVO.getStatus()); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除角色") - @ApiImplicitParam(name = "id", value = "角色编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:role:delete')") - public CommonResult deleteRole(@RequestParam("id") Long id) { - roleService.deleteRole(id); - return success(true); - } - - @GetMapping("/get") - @ApiOperation("获得角色信息") - @PreAuthorize("@ss.hasPermission('system:role:query')") - public CommonResult getRole(@RequestParam("id") Long id) { - SysRoleDO role = roleService.getRole(id); - return success(SysRoleConvert.INSTANCE.convert(role)); - } - - @GetMapping("/page") - @ApiOperation("获得角色分页") - @PreAuthorize("@ss.hasPermission('system:role:query')") - public CommonResult> getRolePage(SysRolePageReqVO reqVO) { - return success(roleService.getRolePage(reqVO)); - } - - @GetMapping("/list-all-simple") - @ApiOperation(value = "获取角色精简信息列表", notes = "只包含被开启的角色,主要用于前端的下拉选项") - public CommonResult> getSimpleRoles() { - // 获得角色列表,只要开启状态的 - List list = roleService.getRoles(Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); - // 排序后,返回个诶前端 - list.sort(Comparator.comparing(SysRoleDO::getSort)); - return success(SysRoleConvert.INSTANCE.convertList02(list)); - } - - @GetMapping("/export") - @OperateLog(type = EXPORT) - @PreAuthorize("@ss.hasPermission('system:role:export')") - public void export(HttpServletResponse response, @Validated SysRoleExportReqVO reqVO) throws IOException { - List list = roleService.getRoles(reqVO); - List data = SysRoleConvert.INSTANCE.convertList03(list); - // 输出 - ExcelUtils.write(response, "角色数据.xls", "角色列表", SysRoleExcelVO.class, data); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java deleted file mode 100644 index c69cec5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.menu; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 菜单 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class SysMenuBaseVO { - - @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") - @NotBlank(message = "菜单名称不能为空") - @Size(max = 50, message = "菜单名称长度不能超过50个字符") - private String name; - - @ApiModelProperty(value = "权限标识", example = "sys:menu:add", notes = "仅菜单类型为按钮时,才需要传递") - @Size(max = 100) - private String permission; - - @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 SysMenuTypeEnum 枚举类") - @NotNull(message = "菜单类型不能为空") - private Integer type; - - @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotNull(message = "显示顺序不能为空") - private Integer sort; - - @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") - @NotNull(message = "父菜单 ID 不能为空") - private Long parentId; - - @ApiModelProperty(value = "路由地址", example = "post", notes = "仅菜单类型为菜单或者目录时,才需要传") - @Size(max = 200, message = "路由地址不能超过200个字符") - private String path; - - @ApiModelProperty(value = "菜单图标", example = "/menu/list", notes = "仅菜单类型为菜单或者目录时,才需要传") - private String icon; - - @ApiModelProperty(value = "组件路径", example = "system/post/index", notes = "仅菜单类型为菜单时,才需要传") - @Size(max = 200, message = "组件路径不能超过255个字符") - private String component; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") - @NotNull(message = "状态不能为空") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java deleted file mode 100644 index 8fba89a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.menu; - -import io.swagger.annotations.ApiModel; -import lombok.*; - -@ApiModel("菜单创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysMenuCreateReqVO extends SysMenuBaseVO { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java deleted file mode 100644 index 3990a9c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.menu; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@ApiModel("菜单列表 Request VO") -@Data -public class SysMenuListReqVO { - - @ApiModelProperty(value = "菜单名称", example = "芋道", notes = "模糊匹配") - private String name; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuRespVO.java deleted file mode 100644 index ef1e7ac..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuRespVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.menu; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.Date; - -@ApiModel("菜单信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -public class SysMenuRespVO extends SysMenuBaseVO { - - @ApiModelProperty(value = "菜单编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java deleted file mode 100644 index 121afe5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.menu; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@ApiModel("菜单精简信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SysMenuSimpleRespVO { - - @ApiModelProperty(value = "菜单编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") - private String name; - - @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") - private Long parentId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java deleted file mode 100644 index 44f181e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.menu; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.*; - -import javax.validation.constraints.NotNull; - -@ApiModel("菜单更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysMenuUpdateReqVO extends SysMenuBaseVO { - - @ApiModelProperty(value = "菜单编号", required = true, example = "1024") - @NotNull(message = "菜单编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java deleted file mode 100644 index c713043..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.permission; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.Collections; -import java.util.Set; - -@ApiModel("赋予角色数据权限 Request VO") -@Data -public class SysPermissionAssignRoleDataScopeReqVO { - - @ApiModelProperty(value = "角色编号", required = true, example = "1") - @NotNull(message = "角色编号不能为空") - private Long roleId; - - @ApiModelProperty(value = "数据范围", required = true, example = "1", notes = "参见 SysDataScopeEnum 枚举类") - @NotNull(message = "数据范围不能为空") -// TODO 这里要多一个枚举校验 - private Integer dataScope; - - @ApiModelProperty(value = "部门编号列表", example = "1,3,5", notes = "只有范围类型为 DEPT_CUSTOM 时,该字段才需要") - private Set dataScopeDeptIds = Collections.emptySet(); // 兜底 - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java deleted file mode 100644 index 4d50572..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.permission; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.Collections; -import java.util.Set; - -@ApiModel("赋予角色菜单 Request VO") -@Data -public class SysPermissionAssignRoleMenuReqVO { - - @ApiModelProperty(value = "角色编号", required = true, example = "1") - @NotNull(message = "角色编号不能为空") - private Long roleId; - - @ApiModelProperty(value = "菜单编号列表", example = "1,3,5") - private Set menuIds = Collections.emptySet(); // 兜底 - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java deleted file mode 100644 index 259336b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.permission; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.Collections; -import java.util.Set; - -@ApiModel("赋予用户角色 Request VO") -@Data -public class SysPermissionAssignUserRoleReqVO { - - @ApiModelProperty(value = "角色编号", required = true, example = "1") - @NotNull(message = "角色编号不能为空") - private Long userId; - - @ApiModelProperty(value = "角色编号列表", example = "1,3,5") - private Set roleIds = Collections.emptySet(); // 兜底 - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java deleted file mode 100644 index ade6991..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.role; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 角色 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class SysRoleBaseVO { - - @ApiModelProperty(value = "角色名称", required = true, example = "管理员") - @NotBlank(message = "角色名称不能为空") - @Size(max = 30, message = "角色名称长度不能超过30个字符") - private String name; - - @NotBlank(message = "角色标志不能为空") - @Size(max = 100, message = "角色标志长度不能超过100个字符") - @ApiModelProperty(value = "角色编码", required = true, example = "ADMIN") - private String code; - - @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotNull(message = "显示顺序不能为空") - private Integer sort; - - @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "见 SysRoleTypeEnum 枚举") - private Integer type; - - @ApiModelProperty(value = "备注", example = "我是一个角色") - private String remark; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java deleted file mode 100644 index 870dcce..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.role; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@ApiModel("角色创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysRoleCreateReqVO extends SysRoleBaseVO { - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleExcelVO.java deleted file mode 100644 index 8ef2a0b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleExcelVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.role; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -/** - * 角色 Excel 导出响应 VO - */ -@Data -public class SysRoleExcelVO { - - @ExcelProperty("角色序号") - private Long id; - - @ExcelProperty("角色名称") - private String name; - - @ExcelProperty("角色标志") - private String code; - - @ExcelProperty("角色排序") - private Integer sort; - - @ExcelProperty("数据范围") - private Integer dataScope; - - @ExcelProperty(value = "角色状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) - private String status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java deleted file mode 100644 index a08c6a6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.role; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("角色分页 Request VO") -@Data -public class SysRoleExportReqVO { - - @ApiModelProperty(value = "角色名称", example = "芋道", notes = "模糊匹配") - private String name; - - @ApiModelProperty(value = "角色标识", example = "yudao", notes = "模糊匹配") - private String code; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @ApiModelProperty(value = "开始时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRolePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRolePageReqVO.java deleted file mode 100644 index e5a6993..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRolePageReqVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.role; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("角色分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysRolePageReqVO extends PageParam { - - @ApiModelProperty(value = "角色名称", example = "芋道", notes = "模糊匹配") - private String name; - - @ApiModelProperty(value = "角色标识", example = "yudao", notes = "模糊匹配") - private String code; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @ApiModelProperty(value = "开始时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleRespVO.java deleted file mode 100644 index bb5e3cc..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleRespVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.role; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.Date; -import java.util.Set; - -@ApiModel("角色信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -public class SysRoleRespVO extends SysRoleBaseVO { - - @ApiModelProperty(value = "角色编号", required = true, example = "1") - private Long id; - - @ApiModelProperty(value = "数据范围", required = true, example = "1", notes = "参见 DataScopeEnum 枚举类") - private Integer dataScope; - - @ApiModelProperty(value = "数据范围(指定部门数组)", example = "1") - private Set dataScopeDeptIds; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "参见 SysRoleTypeEnum 枚举类") - private Integer type; - - @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java deleted file mode 100644 index 6ac990c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.role; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@ApiModel("角色精简信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SysRoleSimpleRespVO { - - @ApiModelProperty(value = "角色编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "角色名称", required = true, example = "芋道") - private String name; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java deleted file mode 100644 index d35f930..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.role; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotNull; - -@ApiModel("角色更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysRoleUpdateReqVO extends SysRoleBaseVO { - - @ApiModelProperty(value = "角色编号", required = true, example = "1024") - @NotNull(message = "角色编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java deleted file mode 100644 index 8783015..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.permission.vo.role; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@ApiModel("角色更新状态 Request VO") -@Data -public class SysRoleUpdateStatusReqVO { - - @ApiModelProperty(value = "角色编号", required = true, example = "1024") - @NotNull(message = "角色编号不能为空") - private Long id; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") - @NotNull(message = "状态不能为空") -// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsCallbackController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsCallbackController.java deleted file mode 100644 index 3562621..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsCallbackController.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms; - -import cn.hutool.core.util.URLUtil; -import cn.hutool.extra.servlet.ServletUtil; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.framework.sms.core.enums.SmsChannelEnum; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "短信回调") -@RestController -@RequestMapping("/system/sms/callback") -public class SmsCallbackController { - - @Resource - private SysSmsService smsService; - - @PostMapping("/sms/yunpian") - @ApiOperation(value = "云片短信的回调", notes = "参见 https://www.yunpian.com/official/document/sms/zh_cn/domestic_push_report 文档") - @ApiImplicitParam(name = "sms_status", value = "发送状态", required = true, example = "[{具体内容}]", dataTypeClass = Long.class) - @OperateLog(enable = false) - public String receiveYunpianSmsStatus(@RequestParam("sms_status") String smsStatus) throws Throwable { - String text = URLUtil.decode(smsStatus); // decode 解码参数,因为它被 encode - smsService.receiveSmsStatus(SmsChannelEnum.YUN_PIAN.getCode(), text); - return "SUCCESS"; // 约定返回 SUCCESS 为成功 - } - - @PostMapping("/sms/aliyun") - @ApiOperation(value = "阿里云短信的回调", notes = "参见 https://help.aliyun.com/document_detail/120998.html 文档") - @OperateLog(enable = false) - public CommonResult receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable { - String text = ServletUtil.getBody(request); - smsService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text); - return success(true); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsChannelController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsChannelController.java deleted file mode 100644 index e87da99..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsChannelController.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.*; -import cn.iocoder.dashboard.modules.system.convert.sms.SysSmsChannelConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.Comparator; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "短信渠道") -@RestController -@RequestMapping("system/sms-channel") -public class SysSmsChannelController { - - @Resource - private SysSmsChannelService smsChannelService; - - @PostMapping("/create") - @ApiOperation("创建短信渠道") - @PreAuthorize("@ss.hasPermission('system:sms-channel:create')") - public CommonResult createSmsChannel(@Valid @RequestBody SysSmsChannelCreateReqVO createReqVO) { - return success(smsChannelService.createSmsChannel(createReqVO)); - } - - @PutMapping("/update") - @ApiOperation("更新短信渠道") - @PreAuthorize("@ss.hasPermission('system:sms-channel:update')") - public CommonResult updateSmsChannel(@Valid @RequestBody SysSmsChannelUpdateReqVO updateReqVO) { - smsChannelService.updateSmsChannel(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除短信渠道") - @ApiImplicitParam(name = "id", value = "编号", required = true) - @PreAuthorize("@ss.hasPermission('system:sms-channel:delete')") - public CommonResult deleteSmsChannel(@RequestParam("id") Long id) { - smsChannelService.deleteSmsChannel(id); - return success(true); - } - - @GetMapping("/get") - @ApiOperation("获得短信渠道") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") - public CommonResult getSmsChannel(@RequestParam("id") Long id) { - SysSmsChannelDO smsChannel = smsChannelService.getSmsChannel(id); - return success(SysSmsChannelConvert.INSTANCE.convert(smsChannel)); - } - - @GetMapping("/page") - @ApiOperation("获得短信渠道分页") - @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") - public CommonResult> getSmsChannelPage(@Valid SysSmsChannelPageReqVO pageVO) { - PageResult pageResult = smsChannelService.getSmsChannelPage(pageVO); - return success(SysSmsChannelConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/list-all-simple") - @ApiOperation(value = "获得短信渠道精简列表", notes = "包含被禁用的短信渠道") - public CommonResult> getSimpleSmsChannels() { - List list = smsChannelService.getSmsChannelList(); - // 排序后,返回给前端 - list.sort(Comparator.comparing(SysSmsChannelDO::getId)); - return success(SysSmsChannelConvert.INSTANCE.convertList03(list)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsLogController.java deleted file mode 100644 index f576396..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsLogController.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExcelVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogRespVO; -import cn.iocoder.dashboard.modules.system.convert.sms.SysSmsLogConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "短信日志") -@RestController -@RequestMapping("/system/sms-log") -@Validated -public class SysSmsLogController { - - @Resource - private SysSmsLogService smsLogService; - - @GetMapping("/page") - @ApiOperation("获得短信日志分页") - @PreAuthorize("@ss.hasPermission('system:sms-log:query')") - public CommonResult> getSmsLogPage(@Valid SysSmsLogPageReqVO pageVO) { - PageResult pageResult = smsLogService.getSmsLogPage(pageVO); - return success(SysSmsLogConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @ApiOperation("导出短信日志 Excel") - @PreAuthorize("@ss.hasPermission('system:sms-log:export')") - @OperateLog(type = EXPORT) - public void exportSmsLogExcel(@Valid SysSmsLogExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = smsLogService.getSmsLogList(exportReqVO); - // 导出 Excel - List datas = SysSmsLogConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "短信日志.xls", "数据", SysSmsLogExcelVO.class, datas); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsTemplateController.http b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsTemplateController.http deleted file mode 100644 index d5441d0..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsTemplateController.http +++ /dev/null @@ -1,12 +0,0 @@ -### 请求 /menu/list 接口 => 成功 -POST {{baseUrl}}/system/sms-template/send-sms -Authorization: Bearer {{token}} -Content-Type: application/json - -{ - "code": "test_01", - "params": { - "key01": "value01", - "key02": "value02" - } -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsTemplateController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsTemplateController.java deleted file mode 100644 index e53b747..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsTemplateController.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.*; -import cn.iocoder.dashboard.modules.system.convert.sms.SysSmsTemplateConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api("短信模板") -@RestController -@RequestMapping("/system/sms-template") -public class SysSmsTemplateController { - - @Resource - private SysSmsTemplateService smsTemplateService; - @Resource - private SysSmsService smsService; - - @PostMapping("/create") - @ApiOperation("创建短信模板") - @PreAuthorize("@ss.hasPermission('system:sms-template:create')") - public CommonResult createSmsTemplate(@Valid @RequestBody SysSmsTemplateCreateReqVO createReqVO) { - return success(smsTemplateService.createSmsTemplate(createReqVO)); - } - - @PutMapping("/update") - @ApiOperation("更新短信模板") - @PreAuthorize("@ss.hasPermission('system:sms-template:update')") - public CommonResult updateSmsTemplate(@Valid @RequestBody SysSmsTemplateUpdateReqVO updateReqVO) { - smsTemplateService.updateSmsTemplate(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除短信模板") - @ApiImplicitParam(name = "id", value = "编号", required = true) - @PreAuthorize("@ss.hasPermission('system:sms-template:delete')") - public CommonResult deleteSmsTemplate(@RequestParam("id") Long id) { - smsTemplateService.deleteSmsTemplate(id); - return success(true); - } - - @GetMapping("/get") - @ApiOperation("获得短信模板") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:sms-template:query')") - public CommonResult getSmsTemplate(@RequestParam("id") Long id) { - SysSmsTemplateDO smsTemplate = smsTemplateService.getSmsTemplate(id); - return success(SysSmsTemplateConvert.INSTANCE.convert(smsTemplate)); - } - - @GetMapping("/page") - @ApiOperation("获得短信模板分页") - @PreAuthorize("@ss.hasPermission('system:sms-template:query')") - public CommonResult> getSmsTemplatePage(@Valid SysSmsTemplatePageReqVO pageVO) { - PageResult pageResult = smsTemplateService.getSmsTemplatePage(pageVO); - return success(SysSmsTemplateConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @ApiOperation("导出短信模板 Excel") - @PreAuthorize("@ss.hasPermission('system:sms-template:export')") - @OperateLog(type = EXPORT) - public void exportSmsTemplateExcel(@Valid SysSmsTemplateExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = smsTemplateService.getSmsTemplateList(exportReqVO); - // 导出 Excel - List datas = SysSmsTemplateConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "短信模板.xls", "数据", SysSmsTemplateExcelVO.class, datas); - } - - @PostMapping("/send-sms") - @ApiOperation("发送短信") - @PreAuthorize("@ss.hasPermission('system:sms-template:send-sms')") - public CommonResult sendSms(@Valid @RequestBody SysSmsTemplateSendReqVO sendReqVO) { - return success(smsService.sendSingleSms(sendReqVO.getMobile(), null, null, - sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java deleted file mode 100644 index 9959b8a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.channel; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.hibernate.validator.constraints.URL; - -import javax.validation.constraints.NotNull; - -/** -* 短信渠道 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class SysSmsChannelBaseVO { - - @ApiModelProperty(value = "短信签名", required = true, example = "芋道源码") - @NotNull(message = "短信签名不能为空") - private String signature; - - @ApiModelProperty(value = "启用状态", required = true, example = "1") - @NotNull(message = "启用状态不能为空") - private Integer status; - - @ApiModelProperty(value = "备注", example = "好吃!") - private String remark; - - @ApiModelProperty(value = "短信 API 的账号", required = true, example = "yudao") - @NotNull(message = "短信 API 的账号不能为空") - private String apiKey; - - @ApiModelProperty(value = "短信 API 的秘钥", example = "yuanma") - private String apiSecret; - - @ApiModelProperty(value = "短信发送回调 URL", example = "http://www.iocoder.cn") - @URL(message = "回调 URL 格式不正确") - private String callbackUrl; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java deleted file mode 100644 index a21cbb7..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.channel; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@ApiModel("短信渠道创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysSmsChannelCreateReqVO extends SysSmsChannelBaseVO { - - @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类") - @NotNull(message = "渠道编码不能为空") - private String code; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java deleted file mode 100644 index 161d853..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.channel; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("短信渠道分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysSmsChannelPageReqVO extends PageParam { - - @ApiModelProperty(value = "任务状态", example = "1") - private Integer status; - - @ApiModelProperty(value = "短信签名", example = "芋道源码", notes = "模糊匹配") - private String signature; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束创建时间") - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java deleted file mode 100644 index 2077068..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.channel; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("短信渠道 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysSmsChannelRespVO extends SysSmsChannelBaseVO { - - @ApiModelProperty(value = "编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类") - private String code; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java deleted file mode 100644 index b7d8416..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.channel; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@ApiModel("短信渠道精简 Response VO") -@Data -public class SysSmsChannelSimpleRespVO { - - @ApiModelProperty(value = "编号", required = true, example = "1024") - @NotNull(message = "编号不能为空") - private Long id; - - @ApiModelProperty(value = "短信签名", required = true, example = "芋道源码") - @NotNull(message = "短信签名不能为空") - private String signature; - - @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类") - private String code; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java deleted file mode 100644 index 66ab794..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.channel; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@ApiModel("短信渠道更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysSmsChannelUpdateReqVO extends SysSmsChannelBaseVO { - - @ApiModelProperty(value = "编号", required = true, example = "1024") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java deleted file mode 100644 index 3df7b8e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java +++ /dev/null @@ -1,100 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.log; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.framework.excel.core.convert.JsonConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; -import java.util.Map; - -/** - * 短信日志 Excel VO - * - * @author 芋道源码 - */ -@Data -public class SysSmsLogExcelVO { - - @ExcelProperty("编号") - private Long id; - - @ExcelProperty("短信渠道编号") - private Long channelId; - - @ExcelProperty("短信渠道编码") - private String channelCode; - - @ExcelProperty("模板编号") - private Long templateId; - - @ExcelProperty("模板编码") - private String templateCode; - - @ExcelProperty(value = "短信类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.SMS_TEMPLATE_TYPE) - private Integer templateType; - - @ExcelProperty("短信内容") - private String templateContent; - - @ExcelProperty(value = "短信参数", converter = JsonConvert.class) - private Map templateParams; - - @ExcelProperty("短信 API 的模板编号") - private String apiTemplateId; - - @ExcelProperty("手机号") - private String mobile; - - @ExcelProperty("用户编号") - private Long userId; - - @ExcelProperty(value = "用户类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.USER_TYPE) - private Integer userType; - - @ExcelProperty(value = "发送状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.SMS_SEND_STATUS) - private Integer sendStatus; - - @ExcelProperty("发送时间") - private Date sendTime; - - @ExcelProperty("发送结果的编码") - private Integer sendCode; - - @ExcelProperty("发送结果的提示") - private String sendMsg; - - @ExcelProperty("短信 API 发送结果的编码") - private String apiSendCode; - - @ExcelProperty("短信 API 发送失败的提示") - private String apiSendMsg; - - @ExcelProperty("短信 API 发送返回的唯一请求 ID") - private String apiRequestId; - - @ExcelProperty("短信 API 发送返回的序号") - private String apiSerialNo; - - @ExcelProperty(value = "接收状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.SMS_RECEIVE_STATUS) - private Integer receiveStatus; - - @ExcelProperty("接收时间") - private Date receiveTime; - - @ExcelProperty("API 接收结果的编码") - private String apiReceiveCode; - - @ExcelProperty("API 接收结果的说明") - private String apiReceiveMsg; - - @ExcelProperty("创建时间") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java deleted file mode 100644 index 15f1dd6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.log; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel(value = "短信日志 Excel 导出 Request VO", description = "参数和 SysSmsLogPageReqVO 是一致的") -@Data -public class SysSmsLogExportReqVO { - - @ApiModelProperty(value = "短信渠道编号", example = "10") - private Long channelId; - - @ApiModelProperty(value = "模板编号", example = "20") - private Long templateId; - - @ApiModelProperty(value = "手机号", example = "15601691300") - private String mobile; - - @ApiModelProperty(value = "发送状态", example = "1") - private Integer sendStatus; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始发送时间") - private Date beginSendTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束发送时间") - private Date endSendTime; - - @ApiModelProperty(value = "接收状态", example = "0") - private Integer receiveStatus; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始接收时间") - private Date beginReceiveTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束接收时间") - private Date endReceiveTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java deleted file mode 100644 index ec080bc..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.log; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("短信日志分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysSmsLogPageReqVO extends PageParam { - - @ApiModelProperty(value = "短信渠道编号", example = "10") - private Long channelId; - - @ApiModelProperty(value = "模板编号", example = "20") - private Long templateId; - - @ApiModelProperty(value = "手机号", example = "15601691300") - private String mobile; - - @ApiModelProperty(value = "发送状态", example = "1", notes = "参见 SysSmsSendStatusEnum 枚举类") - private Integer sendStatus; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始发送时间") - private Date beginSendTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束发送时间") - private Date endSendTime; - - @ApiModelProperty(value = "接收状态", example = "0", notes = "参见 SysSmsReceiveStatusEnum 枚举类") - private Integer receiveStatus; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始接收时间") - private Date beginReceiveTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束接收时间") - private Date endReceiveTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java deleted file mode 100644 index 423a579..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.log; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; -import java.util.Map; - -@ApiModel("短信日志 Response VO") -@Data -public class SysSmsLogRespVO { - - @ApiModelProperty(value = "编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "短信渠道编号", required = true, example = "10") - private Long channelId; - - @ApiModelProperty(value = "短信渠道编码", required = true, example = "ALIYUN") - private String channelCode; - - @ApiModelProperty(value = "模板编号", required = true, example = "20") - private Long templateId; - - @ApiModelProperty(value = "模板编码", required = true, example = "test-01") - private String templateCode; - - @ApiModelProperty(value = "短信类型", required = true, example = "1") - private Integer templateType; - - @ApiModelProperty(value = "短信内容", required = true, example = "你好,你的验证码是 1024") - private String templateContent; - - @ApiModelProperty(value = "短信参数", required = true, example = "name,code") - private Map templateParams; - - @ApiModelProperty(value = "短信 API 的模板编号", required = true, example = "SMS_207945135") - private String apiTemplateId; - - @ApiModelProperty(value = "手机号", required = true, example = "15601691300") - private String mobile; - - @ApiModelProperty(value = "用户编号", example = "10") - private Long userId; - - @ApiModelProperty(value = "用户类型", example = "1") - private Integer userType; - - @ApiModelProperty(value = "发送状态", required = true, example = "1") - private Integer sendStatus; - - @ApiModelProperty(value = "发送时间") - private Date sendTime; - - @ApiModelProperty(value = "发送结果的编码", example = "0") - private Integer sendCode; - - @ApiModelProperty(value = "发送结果的提示", example = "成功") - private String sendMsg; - - @ApiModelProperty(value = "短信 API 发送结果的编码", example = "SUCCESS") - private String apiSendCode; - - @ApiModelProperty(value = "短信 API 发送失败的提示", example = "成功") - private String apiSendMsg; - - @ApiModelProperty(value = "短信 API 发送返回的唯一请求 ID", example = "3837C6D3-B96F-428C-BBB2-86135D4B5B99") - private String apiRequestId; - - @ApiModelProperty(value = "短信 API 发送返回的序号", example = "62923244790") - private String apiSerialNo; - - @ApiModelProperty(value = "接收状态", required = true, example = "0") - private Integer receiveStatus; - - @ApiModelProperty(value = "接收时间") - private Date receiveTime; - - @ApiModelProperty(value = "API 接收结果的编码", example = "DELIVRD") - private String apiReceiveCode; - - @ApiModelProperty(value = "API 接收结果的说明", example = "用户接收成功") - private String apiReceiveMsg; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java deleted file mode 100644 index 584050d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.template; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** -* 短信模板 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class SysSmsTemplateBaseVO { - - @ApiModelProperty(value = "短信类型", required = true, example = "1", notes = "参见 SysSmsTemplateTypeEnum 枚举类") - @NotNull(message = "短信类型不能为空") - private Integer type; - - @ApiModelProperty(value = "开启状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") - @NotNull(message = "开启状态不能为空") - private Integer status; - - @ApiModelProperty(value = "模板编码", required = true, example = "test_01") - @NotNull(message = "模板编码不能为空") - private String code; - - @ApiModelProperty(value = "模板名称", required = true, example = "yudao") - @NotNull(message = "模板名称不能为空") - private String name; - - @ApiModelProperty(value = "模板内容", required = true, example = "你好,{name}。你长的太{like}啦!") - @NotNull(message = "模板内容不能为空") - private String content; - - @ApiModelProperty(value = "备注", example = "哈哈哈") - private String remark; - - @ApiModelProperty(value = "短信 API 的模板编号", required = true, example = "4383920") - @NotNull(message = "短信 API 的模板编号不能为空") - private String apiTemplateId; - - @ApiModelProperty(value = "短信渠道编号", required = true, example = "10") - @NotNull(message = "短信渠道编号不能为空") - private Long channelId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java deleted file mode 100644 index 8f84755..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.template; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("短信模板创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysSmsTemplateCreateReqVO extends SysSmsTemplateBaseVO { - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java deleted file mode 100644 index aab91e7..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.template; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * 短信模板 Excel VO - * - * @author 芋道源码 - */ -@Data -public class SysSmsTemplateExcelVO { - - @ExcelProperty("编号") - private Long id; - - @ExcelProperty(value = "短信签名", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.SMS_TEMPLATE_TYPE) - private Integer type; - - @ExcelProperty(value = "开启状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) - private Integer status; - - @ExcelProperty("模板编码") - private String code; - - @ExcelProperty("模板名称") - private String name; - - @ExcelProperty("模板内容") - private String content; - - @ExcelProperty("备注") - private String remark; - - @ExcelProperty("短信 API 的模板编号") - private String apiTemplateId; - - @ExcelProperty("短信渠道编号") - private Long channelId; - - @ExcelProperty(value = "短信渠道编码", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.SMS_CHANNEL_CODE) - private String channelCode; - - @ExcelProperty("创建时间") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java deleted file mode 100644 index 96500bf..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.template; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel(value = "短信模板 Excel 导出 Request VO", description = "参数和 SysSmsTemplatePageReqVO 是一致的") -@Data -public class SysSmsTemplateExportReqVO { - - @ApiModelProperty(value = "短信签名", example = "1") - private Integer type; - - @ApiModelProperty(value = "开启状态", example = "1") - private Integer status; - - @ApiModelProperty(value = "模板编码", example = "test_01", notes = "模糊匹配") - private String code; - - @ApiModelProperty(value = "模板内容", example = "你好,{name}。你长的太{like}啦!", notes = "模糊匹配") - private String content; - - @ApiModelProperty(value = "短信 API 的模板编号", example = "4383920", notes = "模糊匹配") - private String apiTemplateId; - - @ApiModelProperty(value = "短信渠道编号", example = "10") - private Long channelId; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束创建时间") - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java deleted file mode 100644 index 6a72e3e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.template; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("短信模板分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysSmsTemplatePageReqVO extends PageParam { - - @ApiModelProperty(value = "短信签名", example = "1") - private Integer type; - - @ApiModelProperty(value = "开启状态", example = "1") - private Integer status; - - @ApiModelProperty(value = "模板编码", example = "test_01", notes = "模糊匹配") - private String code; - - @ApiModelProperty(value = "模板内容", example = "你好,{name}。你长的太{like}啦!", notes = "模糊匹配") - private String content; - - @ApiModelProperty(value = "短信 API 的模板编号", example = "4383920", notes = "模糊匹配") - private String apiTemplateId; - - @ApiModelProperty(value = "短信渠道编号", example = "10") - private Long channelId; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束创建时间") - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java deleted file mode 100644 index fda5848..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.template; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; -import java.util.List; - -@ApiModel("短信模板 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysSmsTemplateRespVO extends SysSmsTemplateBaseVO { - - @ApiModelProperty(value = "编号", required = true, example = "1024") - private Long id; - - @ApiModelProperty(value = "短信渠道编码", required = true, example = "ALIYUN") - private String channelCode; - - @ApiModelProperty(value = "参数数组", example = "name,code") - private List params; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java deleted file mode 100644 index 2857ee5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.template; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.Map; - -@ApiModel("短信模板的发送 Request VO") -@Data -public class SysSmsTemplateSendReqVO { - - @ApiModelProperty(value = "手机号", required = true, example = "15601691300") - @NotNull(message = "手机号不能为空") - private String mobile; - - @ApiModelProperty(value = "模板编码", required = true, example = "test_01") - @NotNull(message = "模板编码不能为空") - private String templateCode; - - @ApiModelProperty(value = "模板参数") - private Map templateParams; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java deleted file mode 100644 index 9b3aba8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.sms.vo.template; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@ApiModel("短信模板更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysSmsTemplateUpdateReqVO extends SysSmsTemplateBaseVO { - - @ApiModelProperty(value = "编号", required = true, example = "1024") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.http b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.http deleted file mode 100644 index 8728375..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.http +++ /dev/null @@ -1,3 +0,0 @@ -### 请求 /system/user/page 接口 => 没有权限 -GET {{baseUrl}}/system/user/page?pageNo=1&pageSize=10 -Authorization: Bearer test104 # 使用测试账号 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java deleted file mode 100644 index 07ea900..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java +++ /dev/null @@ -1,174 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; -import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum; -import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "用户") -@RestController -@RequestMapping("/system/user") -@Validated -public class SysUserController { - - @Resource - private SysUserService userService; - @Resource - private SysDeptService deptService; - - @PostMapping("/create") - @ApiOperation("新增用户") - @PreAuthorize("@ss.hasPermission('system:user:create')") - public CommonResult createUser(@Valid @RequestBody SysUserCreateReqVO reqVO) { - Long id = userService.createUser(reqVO); - return success(id); - } - - @PutMapping("update") - @ApiOperation("修改用户") - @PreAuthorize("@ss.hasPermission('system:user:update')") - public CommonResult updateUser(@Valid @RequestBody SysUserUpdateReqVO reqVO) { - userService.updateUser(reqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除用户") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:user:delete')") - public CommonResult deleteUser(@RequestParam("id") Long id) { - userService.deleteUser(id); - return success(true); - } - - @PutMapping("/update-password") - @ApiOperation("重置用户密码") - @PreAuthorize("@ss.hasPermission('system:user:update-password')") - public CommonResult updateUserPassword(@Valid @RequestBody SysUserUpdatePasswordReqVO reqVO) { - userService.updateUserPassword(reqVO.getId(), reqVO.getPassword()); - return success(true); - } - - @PutMapping("/update-status") - @ApiOperation("修改用户状态") - @PreAuthorize("@ss.hasPermission('system:user:update')") - public CommonResult updateUserStatus(@Valid @RequestBody SysUserUpdateStatusReqVO reqVO) { - userService.updateUserStatus(reqVO.getId(), reqVO.getStatus()); - return success(true); - } - - @GetMapping("/page") - @ApiOperation("获得用户分页列表") - @PreAuthorize("@ss.hasPermission('system:user:list')") - public CommonResult> getUserPage(@Valid SysUserPageReqVO reqVO) { - // 获得用户分页列表 - PageResult pageResult = userService.getUserPage(reqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(new PageResult<>(pageResult.getTotal())); // 返回空 - } - - // 获得拼接需要的数据 - Collection deptIds = CollectionUtils.convertList(pageResult.getList(), SysUserDO::getDeptId); - Map deptMap = deptService.getDeptMap(deptIds); - // 拼接结果返回 - List userList = new ArrayList<>(pageResult.getList().size()); - pageResult.getList().forEach(user -> { - SysUserPageItemRespVO respVO = SysUserConvert.INSTANCE.convert(user); - respVO.setDept(SysUserConvert.INSTANCE.convert(deptMap.get(user.getDeptId()))); - userList.add(respVO); - }); - return success(new PageResult<>(userList, pageResult.getTotal())); - } - - @GetMapping("/get") - @ApiOperation("获得用户详情") - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('system:user:query')") - public CommonResult getInfo(@RequestParam("id") Long id) { - return success(SysUserConvert.INSTANCE.convert(userService.getUser(id))); - } - - @GetMapping("/export") - @ApiOperation("导出用户") - @PreAuthorize("@ss.hasPermission('system:user:export')") - @OperateLog(type = EXPORT) - public void exportUsers(@Validated SysUserExportReqVO reqVO, - HttpServletResponse response) throws IOException { - // 获得用户列表 - List users = userService.getUsers(reqVO); - - // 获得拼接需要的数据 - Collection deptIds = CollectionUtils.convertList(users, SysUserDO::getDeptId); - Map deptMap = deptService.getDeptMap(deptIds); - // 拼接数据 - List excelUsers = new ArrayList<>(users.size()); - users.forEach(user -> { - SysUserExcelVO excelVO = SysUserConvert.INSTANCE.convert02(user); - MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> { - excelVO.setDeptName(dept.getName()); - excelVO.setDeptLeader(dept.getLeader()); - }); - excelUsers.add(excelVO); - }); - - // 输出 - ExcelUtils.write(response, "用户数据.xls", "用户列表", SysUserExcelVO.class, excelUsers); - } - - @GetMapping("/get-import-template") - @ApiOperation("获得导入用户模板") - public void importTemplate(HttpServletResponse response) throws IOException { - // 手动创建导出 demo - List list = Arrays.asList( - SysUserImportExcelVO.builder().username("yudao").deptId(1L).email("yudao@iocoder.cn").mobile("15601691300") - .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SysSexEnum.MALE.getSex()).build(), - SysUserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") - .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SysSexEnum.FEMALE.getSex()).build() - ); - - // 输出 - ExcelUtils.write(response, "用户导入模板.xls", "用户列表", SysUserImportExcelVO.class, list); - } - - @PostMapping("/import") - @ApiOperation("导入用户") - @ApiImplicitParams({ - @ApiImplicitParam(name = "file", value = "Excel 文件", required = true, dataTypeClass = MultipartFile.class), - @ApiImplicitParam(name = "updateSupport", value = "是否支持更新,默认为 false", example = "true", dataTypeClass = Boolean.class) - }) - @PreAuthorize("@ss.hasPermission('system:user:import')") - public CommonResult importExcel(@RequestParam("file") MultipartFile file, - @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { - List list = ExcelUtils.raed(file, SysUserImportExcelVO.class); - return success(userService.importUsers(list, updateSupport)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java deleted file mode 100644 index 60e51ee..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java +++ /dev/null @@ -1,102 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileRespVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; -import cn.iocoder.dashboard.modules.system.service.dept.SysPostService; -import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; -import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.annotation.Resource; -import javax.validation.Valid; -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY; - -/** - * @author niudehua - */ -@Api(tags = "用户个人中心") -@RestController -@RequestMapping("/system/user/profile") -@Validated -@Slf4j -public class SysUserProfileController { - - @Resource - private SysUserService userService; - @Resource - private SysDeptService deptService; - @Resource - private SysPostService postService; - @Resource - private SysPermissionService permissionService; - @Resource - private SysRoleService roleService; - - @GetMapping("/get") - @ApiOperation("获得登录用户信息") - public CommonResult profile() { - // 获得用户基本信息 - SysUserDO user = userService.getUser(getLoginUserId()); - SysUserProfileRespVO resp = SysUserConvert.INSTANCE.convert03(user); - // 获得用户角色 - List userRoles = roleService.getRolesFromCache(permissionService.listUserRoleIs(user.getId())); - resp.setRoles(SysUserConvert.INSTANCE.convertList(userRoles)); - // 获得部门信息 - if (user.getDeptId() != null) { - SysDeptDO dept = deptService.getDept(user.getDeptId()); - resp.setDept(SysUserConvert.INSTANCE.convert02(dept)); - } - // 获得岗位信息 - if (CollUtil.isNotEmpty(user.getPostIds())) { - List posts = postService.getPosts(user.getPostIds()); - resp.setPosts(SysUserConvert.INSTANCE.convertList02(posts)); - } - return success(resp); - } - - @PutMapping("/update") - @ApiOperation("修改用户个人信息") - public CommonResult updateUserProfile(@Valid @RequestBody SysUserProfileUpdateReqVO reqVO) { - userService.updateUserProfile(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/update-password") - @ApiOperation("修改用户个人密码") - public CommonResult updateUserProfilePassword(@Valid @RequestBody SysUserProfileUpdatePasswordReqVO reqVO) { - userService.updateUserPassword(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/upload-avatar") - @ApiOperation("上传用户个人头像") - public CommonResult updateUserAvatar(@RequestParam("avatarFile") MultipartFile file) throws IOException { - if (file.isEmpty()) { - throw ServiceExceptionUtil.exception(FILE_IS_EMPTY); - } - userService.updateUserAvatar(getLoginUserId(), file.getInputStream()); - return success(true); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java deleted file mode 100644 index de264b1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.profile; - -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserBaseVO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.Date; -import java.util.List; - - -@Data -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -@AllArgsConstructor -@ApiModel("用户个人中心信息 Response VO") -public class SysUserProfileRespVO extends SysUserBaseVO { - - @ApiModelProperty(value = "用户编号", required = true, example = "1") - private Long id; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @ApiModelProperty(value = "最后登陆 IP", required = true, example = "192.168.1.1") - private String loginIp; - - @ApiModelProperty(value = "最后登录时间", required = true, example = "时间戳格式") - private Date loginDate; - - @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") - private Date createTime; - - /** - * 所属角色 - */ - private List roles; - - /** - * 所在部门 - */ - private Dept dept; - - /** - * 所属岗位数组 - */ - private List posts; - - @ApiModel("角色") - @Data - public static class Role { - - @ApiModelProperty(value = "角色编号", required = true, example = "1") - private Long id; - - @ApiModelProperty(value = "角色名称", required = true, example = "普通角色") - private String name; - - } - - @ApiModel("部门") - @Data - public static class Dept { - - @ApiModelProperty(value = "部门编号", required = true, example = "1") - private Long id; - - @ApiModelProperty(value = "部门名称", required = true, example = "研发部") - private String name; - - } - - @ApiModel("岗位") - @Data - public static class Post { - - @ApiModelProperty(value = "岗位编号", required = true, example = "1") - private Long id; - - @ApiModelProperty(value = "岗位名称", required = true, example = "开发") - private String name; - - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java deleted file mode 100644 index 6ff5648..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.profile; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotEmpty; - -@ApiModel("用户个人中心更新密码 Request VO") -@Data -public class SysUserProfileUpdatePasswordReqVO { - - @ApiModelProperty(value = "旧密码", required = true, example = "123456") - @NotEmpty(message = "旧密码不能为空") - @Length(min = 4, max = 16, message = "密码长度为 4-16 位") - private String oldPassword; - - @ApiModelProperty(value = "新密码", required = true, example = "654321") - @NotEmpty(message = "新密码不能为空") - @Length(min = 4, max = 16, message = "密码长度为 4-16 位") - private String newPassword; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java deleted file mode 100644 index 95051f0..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.profile; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.Email; -import javax.validation.constraints.Size; - -@ApiModel("用户个人信息更新 Request VO") -@Data -public class SysUserProfileUpdateReqVO { - - @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") - @Size(max = 30, message = "用户昵称长度不能超过30个字符") - private String nickname; - - @ApiModelProperty(value = "用户邮箱", example = "yudao@iocoder.cn") - @Email(message = "邮箱格式不正确") - @Size(max = 50, message = "邮箱长度不能超过 50 个字符") - private String email; - - @ApiModelProperty(value = "手机号码", example = "15601691300") - @Length(min = 11, max = 11, message = "手机号长度必须 11 位") - private String mobile; - - @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类") - private Integer sex; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserBaseVO.java deleted file mode 100644 index 4fe0f9b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserBaseVO.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; -import java.util.Set; - -/** - * 用户 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class SysUserBaseVO { - - @ApiModelProperty(value = "用户账号", required = true, example = "yudao") - @NotBlank(message = "用户账号不能为空") - @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") - private String username; - - @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") - @Size(max = 30, message = "用户昵称长度不能超过30个字符") - private String nickname; - - @ApiModelProperty(value = "备注", example = "我是一个用户") - private String remark; - - @ApiModelProperty(value = "部门ID", example = "我是一个用户") - private Long deptId; - - @ApiModelProperty(value = "岗位编号数组", example = "1") - private Set postIds; - - @ApiModelProperty(value = "用户邮箱", example = "yudao@iocoder.cn") - @Email(message = "邮箱格式不正确") - @Size(max = 50, message = "邮箱长度不能超过 50 个字符") - private String email; - - @ApiModelProperty(value = "手机号码", example = "15601691300") - @Length(min = 11, max = 11, message = "手机号长度必须 11 位") - private String mobile; - - @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类") - private Integer sex; - - @ApiModelProperty(value = "用户头像", example = "http://www.iocoder.cn/xxx.png") - private String avatar; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserCreateReqVO.java deleted file mode 100644 index 76be8ff..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserCreateReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotEmpty; - -@ApiModel("用户创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysUserCreateReqVO extends SysUserBaseVO { - - @ApiModelProperty(value = "密码", required = true, example = "123456") - @NotEmpty(message = "密码不能为空") - @Length(min = 4, max = 16, message = "密码长度为 4-16 位") - private String password; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserExcelVO.java deleted file mode 100644 index db5d058..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserExcelVO.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * 用户 Excel 导出 VO - */ -@Data -public class SysUserExcelVO { - - @ExcelProperty("用户编号") - private Long id; - - @ExcelProperty("用户名称") - private String username; - - @ExcelProperty("用户昵称") - private String nickname; - - @ExcelProperty("用户邮箱") - private String email; - - @ExcelProperty("手机号码") - private String mobile; - - @ExcelProperty(value = "用户性别", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.USER_SEX) - private Integer sex; - - @ExcelProperty(value = "帐号状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) - private Integer status; - - @ExcelProperty("最后登录IP") - private String loginIp; - - @ExcelProperty("最后登录时间") - private Date loginDate; - - @ExcelProperty("部门名称") - private String deptName; - - @ExcelProperty("部门负责人") - private String deptLeader; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserExportReqVO.java deleted file mode 100644 index 00559b2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserExportReqVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel(value = "用户导出 Request VO", description = "参数和 SysUserPageReqVO 是一致的") -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SysUserExportReqVO { - - @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") - private String username; - - @ApiModelProperty(value = "手机号码", example = "yudao", notes = "模糊匹配") - private String mobile; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @ApiModelProperty(value = "开始时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - - @ApiModelProperty(value = "部门编号", example = "1024", notes = "同时筛选子部门") - private Long deptId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportExcelVO.java deleted file mode 100644 index 25b8f3a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportExcelVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 用户 Excel 导入 VO - */ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class SysUserImportExcelVO { - - @ExcelProperty("登录名称") - private String username; - - @ExcelProperty("用户名称") - private String nickname; - - @ExcelProperty("部门编号") - private Long deptId; - - @ExcelProperty("用户邮箱") - private String email; - - @ExcelProperty("手机号码") - private String mobile; - - @ExcelProperty(value = "用户性别", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.USER_SEX) - private Integer sex; - - @ExcelProperty(value = "账号状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportRespVO.java deleted file mode 100644 index 551eeb1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Builder; -import lombok.Data; - -import java.util.List; -import java.util.Map; - -@ApiModel("用户导入 Response VO") -@Data -@Builder -public class SysUserImportRespVO { - - @ApiModelProperty(value = "创建成功的用户名数组", required = true) - private List createUsernames; - - @ApiModelProperty(value = "更新成功的用户名数组", required = true) - private List updateUsernames; - - @ApiModelProperty(value = "导入失败的用户集合", required = true, notes = "key 为用户名,value 为失败原因") - private Map failureUsernames; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java deleted file mode 100644 index dc6963c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@ApiModel(value = "用户分页时的信息 Response VO", description = "相比用户基本信息来说,会多部门信息") -@Data -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -public class SysUserPageItemRespVO extends SysUserRespVO { - - /** - * 所在部门 - */ - private Dept dept; - - @ApiModel("部门") - @Data - public static class Dept { - - @ApiModelProperty(value = "部门编号", required = true, example = "1") - private Long id; - - @ApiModelProperty(value = "部门名称", required = true, example = "研发部") - private String name; - - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserPageReqVO.java deleted file mode 100644 index 9dd9a95..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserPageReqVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("用户分页 Request VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -public class SysUserPageReqVO extends PageParam { - - @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") - private String username; - - @ApiModelProperty(value = "手机号码", example = "yudao", notes = "模糊匹配") - private String mobile; - - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @ApiModelProperty(value = "开始时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginTime; - - @ApiModelProperty(value = "结束时间", example = "2020-10-24") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; - - @ApiModelProperty(value = "部门编号", example = "1024", notes = "同时筛选子部门") - private Long deptId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserRespVO.java deleted file mode 100644 index fa23351..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserRespVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.*; - -import java.util.Date; - -@ApiModel("用户信息 Response VO") -@Data -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = true) -public class SysUserRespVO extends SysUserBaseVO { - - @ApiModelProperty(value = "用户编号", required = true, example = "1") - private Long id; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") - private Integer status; - - @ApiModelProperty(value = "最后登陆 IP", required = true, example = "192.168.1.1") - private String loginIp; - - @ApiModelProperty(value = "最后登录时间", required = true, example = "时间戳格式") - private Date loginDate; - - @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java deleted file mode 100644 index 10fa4a0..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -@ApiModel("用户更新密码 Request VO") -@Data -public class SysUserUpdatePasswordReqVO { - - @ApiModelProperty(value = "用户编号", required = true, example = "1024") - @NotNull(message = "用户编号不能为空") - private Long id; - - @ApiModelProperty(value = "密码", required = true, example = "123456") - @NotEmpty(message = "密码不能为空") - @Length(min = 4, max = 16, message = "密码长度为 4-16 位") - private String password; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java deleted file mode 100644 index 8c2bb9a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotNull; - -@ApiModel("用户更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysUserUpdateReqVO extends SysUserBaseVO { - - @ApiModelProperty(value = "用户编号", required = true, example = "1024") - @NotNull(message = "用户编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java deleted file mode 100644 index bd4e1bb..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@ApiModel("用户更新状态 Request VO") -@Data -public class SysUserUpdateStatusReqVO { - - @ApiModelProperty(value = "用户编号", required = true, example = "1024") - @NotNull(message = "角色编号不能为空") - private Long id; - - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") - @NotNull(message = "状态不能为空") -// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}") - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java deleted file mode 100644 index f29c17e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.auth; - -import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.enums.permission.MenuIdEnum; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.factory.Mappers; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -@Mapper -public interface SysAuthConvert { - - SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class); - - @Mapping(source = "updateTime", target = "updateTime", ignore = true) - // 字段相同,但是含义不同,忽略 - LoginUser convert(SysUserDO bean); - - default SysAuthPermissionInfoRespVO convert(SysUserDO user, List roleList, List menuList) { - return SysAuthPermissionInfoRespVO.builder() - .user(SysAuthPermissionInfoRespVO.UserVO.builder().nickname(user.getNickname()).avatar(user.getAvatar()).build()) - .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getCode)) - .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPermission)) - .build(); - } - - SysAuthMenuRespVO convertTreeNode(SysMenuDO menu); - - LoginUser convert(SysUserProfileUpdateReqVO reqVO); - - LoginUser convert(SysUserProfileUpdatePasswordReqVO reqVO); - - /** - * 将菜单列表,构建成菜单树 - * - * @param menuList 菜单列表 - * @return 菜单树 - */ - default List buildMenuTree(List menuList) { - // 排序,保证菜单的有序性 - menuList.sort(Comparator.comparing(SysMenuDO::getSort)); - // 构建菜单树 - // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。 - Map treeNodeMap = new LinkedHashMap<>(); - menuList.forEach(menu -> treeNodeMap.put(menu.getId(), SysAuthConvert.INSTANCE.convertTreeNode(menu))); - // 处理父子关系 - treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(MenuIdEnum.ROOT.getId())).forEach(childNode -> { - // 获得父节点 - SysAuthMenuRespVO parentNode = treeNodeMap.get(childNode.getParentId()); - if (parentNode == null) { - LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]", - childNode.getId(), childNode.getParentId()); - return; - } - // 将自己添加到父节点中 - if (parentNode.getChildren() == null) { - parentNode.setChildren(new ArrayList<>()); - } - parentNode.getChildren().add(childNode); - }); - // 获得到所有的根节点 - return CollectionUtils.filterList(treeNodeMap.values(), node -> MenuIdEnum.ROOT.getId().equals(node.getParentId())); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysUserSessionConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysUserSessionConvert.java deleted file mode 100644 index 3b3eae3..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysUserSessionConvert.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.auth; - -import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.auth.SysUserSessionDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface SysUserSessionConvert { - - SysUserSessionConvert INSTANCE = Mappers.getMapper(SysUserSessionConvert.class); - - SysUserSessionPageItemRespVO convert(SysUserSessionDO session); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/common/SysCaptchaConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/common/SysCaptchaConvert.java deleted file mode 100644 index 992c9c9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/common/SysCaptchaConvert.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.common; - -import cn.hutool.captcha.AbstractCaptcha; -import cn.hutool.captcha.ICaptcha; -import cn.iocoder.dashboard.modules.system.controller.common.vo.SysCaptchaImageRespVO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface SysCaptchaConvert { - - SysCaptchaConvert INSTANCE = Mappers.getMapper(SysCaptchaConvert.class); - - default SysCaptchaImageRespVO convert(String uuid, AbstractCaptcha captcha) { - return SysCaptchaImageRespVO.builder().uuid(uuid).img(captcha.getImageBase64()).build(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysDeptConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysDeptConvert.java deleted file mode 100644 index f114c3a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysDeptConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.dept; - -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptRespVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptSimpleRespVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysDeptConvert { - - SysDeptConvert INSTANCE = Mappers.getMapper(SysDeptConvert.class); - - List convertList(List list); - - List convertList02(List list); - - SysDeptRespVO convert(SysDeptDO bean); - - SysDeptDO convert(SysDeptCreateReqVO bean); - - SysDeptDO convert(SysDeptUpdateReqVO bean); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysPostConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysPostConvert.java deleted file mode 100644 index 8b84d9c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysPostConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.dept; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.*; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysPostConvert { - - SysPostConvert INSTANCE = Mappers.getMapper(SysPostConvert.class); - - List convertList02(List list); - - PageResult convertPage(PageResult page); - - SysPostRespVO convert(SysPostDO id); - - SysPostDO convert(SysPostCreateReqVO bean); - - SysPostDO convert(SysPostUpdateReqVO reqVO); - - List convertList03(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictDataConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictDataConvert.java deleted file mode 100644 index e90f143..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictDataConvert.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.dict; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.*; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface SysDictDataConvert { - - SysDictDataConvert INSTANCE = Mappers.getMapper(SysDictDataConvert.class); - - List convertList(List list); - - SysDictDataRespVO convert(SysDictDataDO bean); - - PageResult convertPage(PageResult page); - - SysDictDataDO convert(SysDictDataUpdateReqVO bean); - - SysDictDataDO convert(SysDictDataCreateReqVO bean); - - List convertList02(List bean); - - DictDataRespDTO convert02(SysDictDataDO bean); - - List convertList03(Collection list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictTypeConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictTypeConvert.java deleted file mode 100644 index 8b89ab1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictTypeConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.dict; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.*; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysDictTypeConvert { - - SysDictTypeConvert INSTANCE = Mappers.getMapper(SysDictTypeConvert.class); - - PageResult convertPage(PageResult bean); - - SysDictTypeRespVO convert(SysDictTypeDO bean); - - SysDictTypeDO convert(SysDictTypeCreateReqVO bean); - - SysDictTypeDO convert(SysDictTypeUpdateReqVO bean); - - List convertList(List list); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/errorcode/SysErrorCodeConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/errorcode/SysErrorCodeConvert.java deleted file mode 100644 index 118d4d5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/errorcode/SysErrorCodeConvert.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.errorcode; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeExcelVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeRespVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 错误码 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface SysErrorCodeConvert { - - SysErrorCodeConvert INSTANCE = Mappers.getMapper(SysErrorCodeConvert.class); - - SysErrorCodeDO convert(SysErrorCodeCreateReqVO bean); - - SysErrorCodeDO convert(SysErrorCodeUpdateReqVO bean); - - SysErrorCodeRespVO convert(SysErrorCodeDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - - SysErrorCodeDO convert(ErrorCodeAutoGenerateReqDTO bean); - - List convertList03(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysLoginLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysLoginLogConvert.java deleted file mode 100644 index 1ac3018..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysLoginLogConvert.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.logger; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogRespVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysLoginLogConvert { - - SysLoginLogConvert INSTANCE = Mappers.getMapper(SysLoginLogConvert.class); - - SysLoginLogDO convert(SysLoginLogCreateReqVO bean); - - PageResult convertPage(PageResult page); - - List convertList(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysOperateLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysOperateLogConvert.java deleted file mode 100644 index f1875af..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysOperateLogConvert.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.logger; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogRespVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; - -@Mapper -public interface SysOperateLogConvert { - - SysOperateLogConvert INSTANCE = Mappers.getMapper(SysOperateLogConvert.class); - - SysOperateLogDO convert(OperateLogCreateReqDTO bean); - - PageResult convertPage(PageResult page); - - SysOperateLogRespVO convert(SysOperateLogDO bean); - - default List convertList(List list, Map userMap) { - return list.stream().map(operateLog -> { - SysOperateLogExcelVO excelVO = convert02(operateLog); - MapUtils.findAndThen(userMap, operateLog.getId(), user -> excelVO.setUserNickname(user.getNickname())); - excelVO.setSuccessStr(SUCCESS.getCode().equals(operateLog.getResultCode()) ? "成功" : "失败"); - return excelVO; - }).collect(Collectors.toList()); - } - - SysOperateLogExcelVO convert02(SysOperateLogDO bean); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/notice/SysNoticeConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/notice/SysNoticeConvert.java deleted file mode 100644 index 4bebe82..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/notice/SysNoticeConvert.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.notice; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeRespVO; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.notice.SysNoticeDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -@Mapper -public interface SysNoticeConvert { - - SysNoticeConvert INSTANCE = Mappers.getMapper(SysNoticeConvert.class); - - PageResult convertPage(PageResult page); - - SysNoticeRespVO convert(SysNoticeDO bean); - - SysNoticeDO convert(SysNoticeUpdateReqVO bean); - - SysNoticeDO convert(SysNoticeCreateReqVO bean); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/package-info.java deleted file mode 100644 index 89deac9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 POJO 类的实体转换 - * - * 目前使用 MapStruct 框架 - */ -package cn.iocoder.dashboard.modules.system.convert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysMenuConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysMenuConvert.java deleted file mode 100644 index 3d5b222..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysMenuConvert.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.permission; - -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuRespVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuSimpleRespVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysMenuConvert { - - SysMenuConvert INSTANCE = Mappers.getMapper(SysMenuConvert.class); - - List convertList(List list); - - SysMenuDO convert(SysMenuCreateReqVO bean); - - SysMenuDO convert(SysMenuUpdateReqVO bean); - - SysMenuRespVO convert(SysMenuDO bean); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysRoleConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysRoleConvert.java deleted file mode 100644 index 0201ae6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysRoleConvert.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.permission; - -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.*; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysRoleConvert { - - SysRoleConvert INSTANCE = Mappers.getMapper(SysRoleConvert.class); - - SysRoleDO convert(SysRoleUpdateReqVO bean); - - SysRoleRespVO convert(SysRoleDO bean); - - SysRoleDO convert(SysRoleCreateReqVO bean); - - List convertList02(List list); - - List convertList03(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsChannelConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsChannelConvert.java deleted file mode 100644 index 4236565..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsChannelConvert.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.sms; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelRespVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelSimpleRespVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 短信渠道 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface SysSmsChannelConvert { - - SysSmsChannelConvert INSTANCE = Mappers.getMapper(SysSmsChannelConvert.class); - - SysSmsChannelDO convert(SysSmsChannelCreateReqVO bean); - - SysSmsChannelDO convert(SysSmsChannelUpdateReqVO bean); - - SysSmsChannelRespVO convert(SysSmsChannelDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - - List convertList03(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsLogConvert.java deleted file mode 100644 index 72018cd..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsLogConvert.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.sms; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExcelVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogRespVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 短信日志 Convert - * - * @author 芋道源码 - */ -@Mapper -public interface SysSmsLogConvert { - - SysSmsLogConvert INSTANCE = Mappers.getMapper(SysSmsLogConvert.class); - - SysSmsLogRespVO convert(SysSmsLogDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsTemplateConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsTemplateConvert.java deleted file mode 100644 index 2a93cc2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsTemplateConvert.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.sms; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExcelVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateRespVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysSmsTemplateConvert { - - SysSmsTemplateConvert INSTANCE = Mappers.getMapper(SysSmsTemplateConvert.class); - - SysSmsTemplateDO convert(SysSmsTemplateCreateReqVO bean); - - SysSmsTemplateDO convert(SysSmsTemplateUpdateReqVO bean); - - SysSmsTemplateRespVO convert(SysSmsTemplateDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java deleted file mode 100644 index fd4a8b9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.iocoder.dashboard.modules.system.convert.user; - -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileRespVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -@Mapper -public interface SysUserConvert { - - SysUserConvert INSTANCE = Mappers.getMapper(SysUserConvert.class); - - SysUserPageItemRespVO convert(SysUserDO bean); - - SysUserPageItemRespVO.Dept convert(SysDeptDO bean); - - SysUserDO convert(SysUserCreateReqVO bean); - - SysUserDO convert(SysUserUpdateReqVO bean); - - SysUserExcelVO convert02(SysUserDO bean); - - SysUserDO convert(SysUserImportExcelVO bean); - - SysUserProfileRespVO convert03(SysUserDO bean); - - List convertList(List list); - - SysUserProfileRespVO.Dept convert02(SysDeptDO bean); - - SysUserDO convert(SysUserProfileUpdateReqVO bean); - - SysUserDO convert(SysUserProfileUpdatePasswordReqVO bean); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md deleted file mode 100644 index 8153487..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/auth/SysUserSessionDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/auth/SysUserSessionDO.java deleted file mode 100644 index 4fa45e1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/auth/SysUserSessionDO.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.auth; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.Date; - -/** - * 在线用户表 - * - * 我们已经将 {@link LoginUser} 缓存在 Redis 当中。 - * 这里额外存储在线用户到 MySQL 中,目的是为了方便管理界面可以灵活查询。 - * 同时,通过定时轮询 SysUserSessionDO 表,可以主动删除 Redis 的缓存,因为 Redis 的过期删除是延迟的。 - * - * @author 芋道源码 - */ -@TableName(value = "sys_user_session", autoResultMap = true) -@Data -@Builder -@EqualsAndHashCode(callSuper = true) -public class SysUserSessionDO extends BaseDO { - - /** - * 会话编号, 即 sessionId - */ - @TableId(type = IdType.INPUT) - private String id; - /** - * 用户编号 - * - * 关联 {@link SysUserDO#getId()} - */ - private Long userId; - - /** - * 用户账号 - * - * 冗余,因为账号可以变更 - */ - private String username; - - /** - * 用户 IP - */ - private String userIp; - /** - * 浏览器 UA - */ - private String userAgent; - /** - * 会话超时时间 - */ - private Date sessionTimeout; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dept/SysDeptDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dept/SysDeptDO.java deleted file mode 100644 index 901e8ce..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dept/SysDeptDO.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.dept; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 部门表 - * - * @author ruoyi - */ -@TableName("sys_dept") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysDeptDO extends BaseDO { - - /** - * 部门ID - */ - @TableId - private Long id; - /** - * 部门名称 - */ - private String name; - /** - * 父部门ID - * - * 关联 {@link #id} - */ - private Long parentId; - /** - * 显示顺序 - */ - private Integer sort; - /** - * 负责人 - */ - private String leader; - /** - * 联系电话 - */ - private String phone; - /** - * 邮箱 - */ - private String email; - /** - * 部门状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dept/SysPostDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dept/SysPostDO.java deleted file mode 100644 index 3cb2d84..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dept/SysPostDO.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.dept; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 岗位表 - * - * @author ruoyi - */ -@TableName("sys_post") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysPostDO extends BaseDO { - - /** - * 岗位序号 - */ - @TableId - private Long id; - - /** - * 岗位名称 - */ - private String name; - /** - * 岗位编码 - */ - private String code; - /** - * 岗位排序 - */ - private Integer sort; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 备注 - */ - private String remark; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictDataDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictDataDO.java deleted file mode 100644 index b58129f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictDataDO.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.dict; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 字典数据表 - * - * @author ruoyi - */ -@TableName("sys_dict_data") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysDictDataDO extends BaseDO { - - /** - * 字典数据编号 - */ - @TableId - private Long id; - /** - * 字典排序 - */ - private Integer sort; - /** - * 字典标签 - */ - private String label; - /** - * 字典值 - */ - private String value; - /** - * 字典类型 - * - * 冗余 {@link SysDictDataDO#getDictType()} - */ - private String dictType; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 备注 - */ - private String remark; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictTypeDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictTypeDO.java deleted file mode 100644 index 256a8ac..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/dict/SysDictTypeDO.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.dict; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 字典类型表 - * - * @author ruoyi - */ -@TableName("sys_dict_type") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SysDictTypeDO extends BaseDO { - - /** - * 字典主键 - */ - @TableId - private Long id; - /** - * 字典名称 - */ - private String name; - /** - * 字典类型 - */ - @TableField("`type`") - private String type; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 备注 - */ - private String remark; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java deleted file mode 100644 index 9e1e207..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.enums.errorcode.SysErrorCodeTypeEnum; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -/** - * 错误码表 - * - * @author 芋道源码 - */ -@TableName(value = "sys_error_code") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysErrorCodeDO extends BaseDO { - - /** - * 错误码编号,自增 - */ - @TableId - private Long id; - /** - * 错误码类型 - * - * 枚举 {@link SysErrorCodeTypeEnum} - */ - private Integer type; - /** - * 应用名 - */ - private String applicationName; - /** - * 错误码编码 - */ - private Integer code; - /** - * 错误码错误提示 - */ - private String message; - /** - * 错误码备注 - */ - private String memo; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/logger/SysLoginLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/logger/SysLoginLogDO.java deleted file mode 100644 index 9fc6bac..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/logger/SysLoginLogDO.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.logger; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginResultEnum; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -/** - * 登陆日志表 - * - * 注意,包括登陆和登出两种行为 - * - * @author ruoyi - */ -@TableName("sys_login_log") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysLoginLogDO extends BaseDO { - - /** - * 日志主键 - */ - private Long id; - /** - * 日志类型 - * - * 枚举 {@link SysLoginLogTypeEnum} - */ - private Integer logType; - /** - * 链路追踪编号 - */ - private String traceId; - /** - * 用户账号 - * - * 冗余,因为账号可以变更 - */ - private String username; - /** - * 登陆结果 - * - * 枚举 {@link SysLoginResultEnum} - */ - private Integer result; - /** - * 用户 IP - */ - private String userIp; - /** - * 浏览器 UA - */ - private String userAgent; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/logger/SysOperateLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/logger/SysOperateLogDO.java deleted file mode 100644 index 2143851..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/logger/SysOperateLogDO.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.logger; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.Date; -import java.util.Map; - -/** - * 操作日志表 - * - * @author 芋道源码 - */ -@TableName(value = "sys_operate_log", autoResultMap = true) -@Data -@EqualsAndHashCode(callSuper = true) -public class SysOperateLogDO extends BaseDO { - - /** - * {@link #javaMethodArgs} 的最大长度 - */ - public static final Integer JAVA_METHOD_ARGS_MAX_LENGTH = 8000; - - /** - * {@link #resultData} 的最大长度 - */ - public static final Integer RESULT_MAX_LENGTH = 4000; - - /** - * 日志主键 - */ - @TableId - private Long id; - /** - * 链路追踪编号 - * - * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 - */ - private String traceId; - /** - * 用户编号 - * - * {@link SysUserDO#getId()} - */ - private Long userId; - /** - * 操作模块 - */ - private String module; - /** - * 操作名 - */ - private String name; - /** - * 操作分类 - * - * 枚举 {@link OperateTypeEnum} - */ - @TableField("operate_type") - private Integer type; - /** - * 操作内容,记录整个操作的明细 - * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。 - */ - private String content; - /** - * 拓展字段,有些复杂的业务,需要记录一些字段 - * 例如说,记录订单编号,则可以添加 key 为 "orderId",value 为订单编号 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private Map exts; - - /** - * 请求方法名 - */ - private String requestMethod; - /** - * 请求地址 - */ - private String requestUrl; - /** - * 用户 IP - */ - private String userIp; - /** - * 浏览器 UA - */ - private String userAgent; - - /** - * Java 方法名 - */ - private String javaMethod; - /** - * Java 方法的参数 - * - * 实际格式为 Map - * 不使用 @TableField(typeHandler = FastjsonTypeHandler.class) 注解的原因是,数据库存储有长度限制,会进行裁剪,会导致 JSON 反序列化失败 - * 其中,key 为参数名,value 为参数值 - */ - private String javaMethodArgs; - /** - * 开始时间 - */ - private Date startTime; - /** - * 执行时长,单位:毫秒 - */ - private Integer duration; - /** - * 结果码 - * - * 目前使用的 {@link CommonResult#getCode()} 属性 - */ - private Integer resultCode; - /** - * 结果提示 - * - * 目前使用的 {@link CommonResult#getMsg()} 属性 - */ - private String resultMsg; - /** - * 结果数据 - * - * 如果是对象,则使用 JSON 格式化 - */ - private String resultData; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/notice/SysNoticeDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/notice/SysNoticeDO.java deleted file mode 100644 index 600610e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/notice/SysNoticeDO.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.notice; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.enums.notice.SysNoticeTypeEnum; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 通知公告表 - * - * @author ruoyi - */ -@TableName("sys_notice") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysNoticeDO extends BaseDO { - - /** - * 公告ID - */ - private Long id; - /** - * 公告标题 - */ - private String title; - /** - * 公告类型 - * - * 枚举 {@link SysNoticeTypeEnum} - */ - @TableField("notice_type") - private Integer type; - /** - * 公告内容 - */ - private String content; - /** - * 公告状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysMenuDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysMenuDO.java deleted file mode 100644 index 1a706d6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysMenuDO.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.permission; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 菜单 DO - * - * @author ruoyi - */ -@TableName("sys_menu") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysMenuDO extends BaseDO { - - /** - * 菜单ID - */ - @TableId - private Long id; - /** - * 菜单名称 - */ - private String name; - /** - * 权限标识 - * - * 一般格式为:${系统}:${模块}:${操作} - * 例如说:system:admin:add,即 system 服务的添加管理员。 - * - * 当我们把该 SysMenuDO 赋予给角色后,意味着该角色有该资源: - * - 对于后端,配合 @PreAuthorize 注解,配置 API 接口需要该权限,从而对 API 接口进行权限控制。 - * - 对于前端,配合前端标签,配置按钮是否展示,避免用户没有该权限时,结果可以看到该操作。 - */ - private String permission; - /** - * 菜单类型 - * - * 枚举 {@link MenuTypeEnum} - */ - @TableField("menu_type") - private Integer type; - /** - * 显示顺序 - */ - private Integer sort; - /** - * 父菜单ID - */ - private Long parentId; - /** - * 路由地址 - */ - private String path; - /** - * 菜单图标 - */ - private String icon; - /** - * 组件路径 - */ - private String component; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysRoleDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysRoleDO.java deleted file mode 100644 index e6dfd74..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysRoleDO.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.permission; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; -import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; -import cn.iocoder.dashboard.modules.system.enums.permission.RoleCodeEnum; -import cn.iocoder.dashboard.modules.system.enums.permission.SysRoleTypeEnum; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.Set; - -/** - * 角色 DO - * - * @author ruoyi - */ -@TableName(value = "sys_role", autoResultMap = true) -@Data -@EqualsAndHashCode(callSuper = true) -public class SysRoleDO extends BaseDO { - - /** - * 角色ID - */ - @TableId - private Long id; - /** - * 角色名称 - */ - private String name; - /** - * 角色标识 - * - * 枚举 {@link RoleCodeEnum} - */ - private String code; - /** - * 角色排序 - */ - private Integer sort; - /** - * 角色状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 角色类型 - * - * 枚举 {@link SysRoleTypeEnum} - */ - private Integer type; - /** - * 备注 - */ - private String remark; - - /** - * 数据范围 - * - * 枚举 {@link DataScopeEnum} - */ - private Integer dataScope; - /** - * 数据范围(指定部门数组) - * - * 适用于 {@link #dataScope} 的值为 {@link DataScopeEnum#DEPT_CUSTOM} 时 - */ - @TableField(typeHandler = JsonLongSetTypeHandler.class) - private Set dataScopeDeptIds; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysRoleMenuDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysRoleMenuDO.java deleted file mode 100644 index 08afe01..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysRoleMenuDO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.permission; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 角色和菜单关联 - * - * @author ruoyi - */ -@TableName("sys_role_menu") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysRoleMenuDO extends BaseDO { - - /** - * 自增主键 - */ - @TableId - private Long id; - /** - * 角色ID - */ - private Long roleId; - /** - * 菜单ID - */ - private Long menuId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysUserRoleDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysUserRoleDO.java deleted file mode 100644 index b97c9b4..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/permission/SysUserRoleDO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.permission; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 用户和角色关联 - * - * @author ruoyi - */ -@TableName("sys_user_role") -@Data -@EqualsAndHashCode(callSuper = true) -public class SysUserRoleDO extends BaseDO { - - /** - * 自增主键 - */ - @TableId - private Long id; - /** - * 用户 ID - */ - private Long userId; - /** - * 角色 ID - */ - private Long roleId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsChannelDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsChannelDO.java deleted file mode 100644 index befc9b9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsChannelDO.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.sms; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.sms.core.enums.SmsChannelEnum; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -/** - * 短信渠道 DO - * - * @author zzf - * @since 2021-01-25 - */ -@TableName(value = "sys_sms_channel", autoResultMap = true) -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysSmsChannelDO extends BaseDO { - - /** - * 渠道编号 - */ - private Long id; - /** - * 短信签名 - */ - private String signature; - /** - * 渠道编码 - * - * 枚举 {@link SmsChannelEnum} - */ - private String code; - /** - * 启用状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 备注 - */ - private String remark; - /** - * 短信 API 的账号 - */ - private String apiKey; - /** - * 短信 API 的秘钥 - */ - private String apiSecret; - /** - * 短信发送回调 URL - */ - private String callbackUrl; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsLogDO.java deleted file mode 100644 index 782d004..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsLogDO.java +++ /dev/null @@ -1,173 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.sms; - -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; -import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsReceiveStatusEnum; -import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.*; - -import java.util.Date; -import java.util.Map; - -/** - * 短信日志 DO - * - * @author zzf - * @since 2021-01-25 - */ -@TableName(value = "sys_sms_log", autoResultMap = true) -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class SysSmsLogDO extends BaseDO { - - /** - * 自增编号 - */ - private Long id; - - // ========= 渠道相关字段 ========= - - /** - * 短信渠道编号 - * - * 关联 {@link SysSmsChannelDO#getId()} - */ - private Long channelId; - /** - * 短信渠道编码 - * - * 冗余 {@link SysSmsChannelDO#getCode()} - */ - private String channelCode; - - // ========= 模板相关字段 ========= - - /** - * 模板编号 - * - * 关联 {@link SysSmsTemplateDO#getId()} - */ - private Long templateId; - /** - * 模板编码 - * - * 冗余 {@link SysSmsTemplateDO#getCode()} - */ - private String templateCode; - /** - * 短信类型 - * - * 冗余 {@link SysSmsTemplateDO#getType()} - */ - private Integer templateType; - /** - * 基于 {@link SysSmsTemplateDO#getContent()} 格式化后的内容 - */ - private String templateContent; - /** - * 基于 {@link SysSmsTemplateDO#getParams()} 输入后的参数 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private Map templateParams; - /** - * 短信 API 的模板编号 - * - * 冗余 {@link SysSmsTemplateDO#getApiTemplateId()} - */ - private String apiTemplateId; - - // ========= 手机相关字段 ========= - - /** - * 手机号 - */ - private String mobile; - /** - * 用户编号 - */ - private Long userId; - /** - * 用户类型 - * - * 枚举 {@link UserTypeEnum} - */ - private Integer userType; - - // ========= 发送相关字段 ========= - - /** - * 发送状态 - * - * 枚举 {@link SysSmsSendStatusEnum} - */ - private Integer sendStatus; - /** - * 发送时间 - */ - private Date sendTime; - /** - * 发送结果的编码 - * - * 枚举 {@link SmsFrameworkErrorCodeConstants} - */ - private Integer sendCode; - /** - * 发送结果的提示 - * - * 一般情况下,使用 {@link SmsFrameworkErrorCodeConstants} - * 异常情况下,通过格式化 Exception 的提示存储 - */ - private String sendMsg; - /** - * 短信 API 发送结果的编码 - * - * 由于第三方的错误码可能是字符串,所以使用 String 类型 - */ - private String apiSendCode; - /** - * 短信 API 发送失败的提示 - */ - private String apiSendMsg; - /** - * 短信 API 发送返回的唯一请求 ID - * - * 用于和短信 API 进行定位于排错 - */ - private String apiRequestId; - /** - * 短信 API 发送返回的序号 - * - * 用于和短信 API 平台的发送记录关联 - */ - private String apiSerialNo; - - // ========= 接收相关字段 ========= - - /** - * 接收状态 - * - * 枚举 {@link SysSmsReceiveStatusEnum} - */ - private Integer receiveStatus; - /** - * 接收时间 - */ - private Date receiveTime; - /** - * 短信 API 接收结果的编码 - */ - private String apiReceiveCode; - /** - * 短信 API 接收结果的提示 - */ - private String apiReceiveMsg; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java deleted file mode 100644 index 3af1e67..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.sms; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.List; - -/** - * 短信模板 DO - * - * @author zzf - * @since 2021-01-25 - */ -@TableName(value = "sys_sms_template", autoResultMap = true) -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysSmsTemplateDO extends BaseDO { - - /** - * 自增编号 - */ - private Long id; - - // ========= 模板相关字段 ========= - - /** - * 短信类型 - * - * 枚举 {@link SysSmsTemplateTypeEnum} - */ - private Integer type; - /** - * 启用状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 模板编码,保证唯一 - */ - private String code; - /** - * 模板名称 - */ - private String name; - /** - * 模板内容 - * - * 内容的参数,使用 {} 包括,例如说 {name} - */ - private String content; - /** - * 参数数组(自动根据内容生成) - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List params; - /** - * 备注 - */ - private String remark; - /** - * 短信 API 的模板编号 - */ - private String apiTemplateId; - - // ========= 渠道相关字段 ========= - - /** - * 短信渠道编号 - * - * 关联 {@link SysSmsChannelDO#getId()} - */ - private Long channelId; - /** - * 短信渠道编码 - * - * 冗余 {@link SysSmsChannelDO#getCode()} - */ - private String channelCode; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/user/SysUserDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/user/SysUserDO.java deleted file mode 100644 index 782ed59..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/user/SysUserDO.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.dataobject.user; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; -import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -import java.util.Date; -import java.util.Set; - -/** - * 用户 DO - * - * @author ruoyi - */ -@TableName(value = "sys_user", autoResultMap = true) -@Data -@EqualsAndHashCode(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SysUserDO extends BaseDO { - - /** - * 用户ID - */ - @TableId - private Long id; - /** - * 用户账号 - */ - private String username; - /** - * 加密后的密码 - * - * 因为目前使用 {@link BCryptPasswordEncoder} 加密器,所以无需自己处理 salt 盐 - */ - private String password; - /** - * 用户昵称 - */ - private String nickname; - /** - * 备注 - */ - private String remark; - /** - * 部门ID - */ - private Long deptId; - /** - * 岗位编号数组 - */ - @TableField(typeHandler = JsonLongSetTypeHandler.class) - private Set postIds; - /** - * 用户邮箱 - */ - private String email; - /** - * 手机号码 - */ - private String mobile; - /** - * 用户性别 - * - * 枚举类 {@link SysSexEnum} - */ - private Integer sex; - /** - * 用户头像 - */ - private String avatar; - /** - * 帐号状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 最后登录IP - */ - private String loginIp; - /** - * 最后登录时间 - */ - private Date loginDate; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/auth/SysUserSessionMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/auth/SysUserSessionMapper.java deleted file mode 100644 index ed53d35..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/auth/SysUserSessionMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.auth; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.auth.SysUserSessionDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.Date; -import java.util.List; - -@Mapper -public interface SysUserSessionMapper extends BaseMapperX { - - default PageResult selectPage(SysUserSessionPageReqVO reqVO, Collection userIds) { - return selectPage(reqVO, new QueryWrapperX() - .inIfPresent("user_id", userIds) - .likeIfPresent("user_ip", reqVO.getUserIp())); - } - - default List selectListBySessionTimoutLt() { - return selectList(new QueryWrapperX().lt("session_timeout",new Date())); - } -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dept/SysDeptMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dept/SysDeptMapper.java deleted file mode 100644 index bbca887..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dept/SysDeptMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.dept; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Date; -import java.util.List; - -@Mapper -public interface SysDeptMapper extends BaseMapperX { - - default List selectList(SysDeptListReqVO reqVO) { - return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) - .eqIfPresent("status", reqVO.getStatus())); - } - - default SysDeptDO selectByParentIdAndName(Long parentId, String name) { - return selectOne(new QueryWrapper().eq("parent_id", parentId) - .eq("name", name)); - } - - default Integer selectCountByParentId(Long parentId) { - return selectCount(new QueryWrapper().eq("parent_id", parentId)); - } - - default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { - return selectOne(new QueryWrapper().select("id") - .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dept/SysPostMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dept/SysPostMapper.java deleted file mode 100644 index db85d8f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dept/SysPostMapper.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.dept; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface SysPostMapper extends BaseMapperX { - - default List selectList(Collection ids, Collection statuses) { - return selectList(new QueryWrapperX().inIfPresent("id", ids) - .inIfPresent("status", statuses)); - } - - default PageResult selectPage(SysPostPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("code", reqVO.getCode()) - .likeIfPresent("name", reqVO.getName()) - .eqIfPresent("status", reqVO.getStatus())); - } - - default List selectList(SysPostExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .likeIfPresent("code", reqVO.getCode()) - .likeIfPresent("name", reqVO.getName()) - .eqIfPresent("status", reqVO.getStatus())); - } - - default SysPostDO selectByName(String name) { - return selectOne(new QueryWrapper().eq("name", name)); - } - - default SysPostDO selectByCode(String code) { - return selectOne(new QueryWrapper().eq("code", code)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictDataMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictDataMapper.java deleted file mode 100644 index 57b736a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictDataMapper.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.dict; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Date; -import java.util.List; - -@Mapper -public interface SysDictDataMapper extends BaseMapperX { - - default SysDictDataDO selectByDictTypeAndValue(String dictType, String value) { - return selectOne(new QueryWrapper().eq("dict_type", dictType) - .eq("value", value)); - } - - default int selectCountByDictType(String dictType) { - return selectCount("dict_type", dictType); - } - - default PageResult selectPage(SysDictDataPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("label", reqVO.getLabel()) - .likeIfPresent("dict_type", reqVO.getDictType()) - .eqIfPresent("status", reqVO.getStatus()) - .orderByAsc("dict_type", "sort")); - } - - default List selectList(SysDictDataExportReqVO reqVO) { - return selectList(new QueryWrapperX().likeIfPresent("label", reqVO.getLabel()) - .likeIfPresent("dict_type", reqVO.getDictType()) - .eqIfPresent("status", reqVO.getStatus())); - } - - default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { - return selectOne(new QueryWrapper().select("id") - .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictTypeMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictTypeMapper.java deleted file mode 100644 index 2ace162..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dict/SysDictTypeMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.dict; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface SysDictTypeMapper extends BaseMapperX { - - default PageResult selectPage(SysDictTypePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("name", reqVO.getName()) - .likeIfPresent("`type`", reqVO.getType()) - .eqIfPresent("status", reqVO.getStatus()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())); - } - - default List selectList(SysDictTypeExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .likeIfPresent("name", reqVO.getName()) - .likeIfPresent("`type`", reqVO.getType()) - .eqIfPresent("status", reqVO.getStatus()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())); - } - - default SysDictTypeDO selectByType(String type) { - return selectOne(new QueryWrapperX().eq("`type`", type)); - } - - default SysDictTypeDO selectByName(String name) { - return selectOne(new QueryWrapperX().eq("name", name)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java deleted file mode 100644 index 3be6195..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.errorcode; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.Date; -import java.util.List; - -@Mapper -public interface SysErrorCodeMapper extends BaseMapperX { - - default PageResult selectPage(SysErrorCodePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .eqIfPresent("type", reqVO.getType()) - .likeIfPresent("application_name", reqVO.getApplicationName()) - .eqIfPresent("code", reqVO.getCode()) - .likeIfPresent("message", reqVO.getMessage()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByAsc("application_name", "code")); - } - - default List selectList(SysErrorCodeExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .eqIfPresent("type", reqVO.getType()) - .likeIfPresent("application_name", reqVO.getApplicationName()) - .eqIfPresent("code", reqVO.getCode()) - .likeIfPresent("message", reqVO.getMessage()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByAsc("application_name", "code")); - } - - default List selectListByCodes(Collection codes) { - return selectList(new QueryWrapper().in("code", codes)); - } - - default SysErrorCodeDO selectByCode(Integer code) { - return selectOne(new QueryWrapper().eq("code", code)); - } - - default List selectListByApplicationNameAndUpdateTimeGt(String applicationName, Date minUpdateTime) { - return selectList(new QueryWrapperX().eq("application_name", applicationName) - .gtIfPresent("update_time", minUpdateTime)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/logger/SysLoginLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/logger/SysLoginLogMapper.java deleted file mode 100644 index 174de74..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/logger/SysLoginLogMapper.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.logger; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginResultEnum; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface SysLoginLogMapper extends BaseMapperX { - - default PageResult selectPage(SysLoginLogPageReqVO reqVO) { - QueryWrapperX query = new QueryWrapperX() - .likeIfPresent("user_ip", reqVO.getUserIp()) - .likeIfPresent("username", reqVO.getUsername()) - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()); - if (Boolean.TRUE.equals(reqVO.getStatus())) { - query.eq("result", SysLoginResultEnum.SUCCESS.getResult()); - } else if (Boolean.FALSE.equals(reqVO.getStatus())) { - query.gt("result", SysLoginResultEnum.SUCCESS.getResult()); - } - query.orderByDesc("id"); // 降序 - return selectPage(reqVO, query); - } - - default List selectList(SysLoginLogExportReqVO reqVO) { - QueryWrapperX query = new QueryWrapperX() - .likeIfPresent("user_ip", reqVO.getUserIp()) - .likeIfPresent("username", reqVO.getUsername()) - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()); - if (Boolean.TRUE.equals(reqVO.getStatus())) { - query.eq("result", SysLoginResultEnum.SUCCESS.getResult()); - } else if (Boolean.FALSE.equals(reqVO.getStatus())) { - query.gt("result", SysLoginResultEnum.SUCCESS.getResult()); - } - query.orderByDesc("id"); // 降序 - return selectList(query); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/logger/SysOperateLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/logger/SysOperateLogMapper.java deleted file mode 100644 index 61d97e6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/logger/SysOperateLogMapper.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.logger; - -import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface SysOperateLogMapper extends BaseMapperX { - - default PageResult selectPage(SysOperateLogPageReqVO reqVO, Collection userIds) { - QueryWrapperX query = new QueryWrapperX() - .likeIfPresent("module", reqVO.getModule()) - .inIfPresent("user_id", userIds) - .eqIfPresent("operate_type", reqVO.getType()) - .betweenIfPresent("start_time", reqVO.getBeginTime(), reqVO.getEndTime()); - if (Boolean.TRUE.equals(reqVO.getSuccess())) { - query.eq("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); - } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { - query.gt("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); - } - query.orderByDesc("id"); // 降序 - return selectPage(reqVO, query); - } - - default List selectList(SysOperateLogExportReqVO reqVO, Collection userIds) { - QueryWrapperX query = new QueryWrapperX() - .likeIfPresent("module", reqVO.getModule()) - .inIfPresent("user_id", userIds) - .eqIfPresent("operate_type", reqVO.getType()) - .betweenIfPresent("start_time", reqVO.getBeginTime(), reqVO.getEndTime()); - if (Boolean.TRUE.equals(reqVO.getSuccess())) { - query.eq("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); - } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { - query.gt("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); - } - query.orderByDesc("id"); // 降序 - return selectList(query); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/notice/SysNoticeMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/notice/SysNoticeMapper.java deleted file mode 100644 index a89f97b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/notice/SysNoticeMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.notice; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.notice.SysNoticeDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface SysNoticeMapper extends BaseMapperX { - - default PageResult selectPage(SysNoticePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("title", reqVO.getTitle()) - .eqIfPresent("status", reqVO.getStatus())); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysMenuMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysMenuMapper.java deleted file mode 100644 index 9e2d625..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysMenuMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.permission; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Date; -import java.util.List; - -@Mapper -public interface SysMenuMapper extends BaseMapperX { - - default SysMenuDO selectByParentIdAndName(Long parentId, String name) { - return selectOne(new QueryWrapper().eq("parent_id", parentId) - .eq("name", name)); - } - - default Integer selectCountByParentId(Long parentId) { - return selectCount(new QueryWrapper().eq("parent_id", parentId)); - } - - default List selectList(SysMenuListReqVO reqVO) { - return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) - .eqIfPresent("status", reqVO.getStatus())); - } - - default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { - return selectOne(new QueryWrapper().select("id") - .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMapper.java deleted file mode 100644 index 25161f2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMapper.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.permission; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; -import org.springframework.lang.Nullable; - -import java.util.Collection; -import java.util.Date; -import java.util.List; - -@Mapper -public interface SysRoleMapper extends BaseMapperX { - - default PageResult selectPage(SysRolePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX().likeIfPresent("name", reqVO.getName()) - .likeIfPresent("code", reqVO.getCode()) - .eqIfPresent("status", reqVO.getStatus()) - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); - } - - default List listRoles(SysRoleExportReqVO reqVO) { - return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) - .likeIfPresent("code", reqVO.getCode()) - .eqIfPresent("status", reqVO.getStatus()) - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); - } - - default SysRoleDO selectByName(String name) { - return selectOne(new QueryWrapperX().eq("name", name)); - } - - default SysRoleDO selectByCode(String code) { - return selectOne(new QueryWrapperX().eq("code", code)); - } - - default List selectListByStatus(@Nullable Collection statuses) { - return selectList(new QueryWrapperX().in("status", statuses)); - } - - default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { - return selectOne(new QueryWrapper().select("id") - .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMenuMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMenuMapper.java deleted file mode 100644 index 6483528..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMenuMapper.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.permission; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleMenuDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; - -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; - -@Mapper -public interface SysRoleMenuMapper extends BaseMapperX { - - default List selectListByRoleId(Long roleId) { - return selectList(new QueryWrapper().eq("role_id", roleId)); - } - - default void insertList(Long roleId, Collection menuIds) { - List list = menuIds.stream().map(menuId -> { - SysRoleMenuDO entity = new SysRoleMenuDO(); - entity.setRoleId(roleId); - entity.setMenuId(menuId); - return entity; - }).collect(Collectors.toList()); - // TODO 芋艿,mybatis plus 增加批量插入的功能 - list.forEach(this::insert); - } - - default void deleteListByRoleIdAndMenuIds(Long roleId, Collection menuIds) { - delete(new QueryWrapper().eq("role_id", roleId) - .in("menu_id", menuIds)); - } - - default void deleteListByMenuId(Long menuId) { - delete(new QueryWrapper().eq("menu_id", menuId)); - } - - default void deleteListByRoleId(Long roleId) { - delete(new QueryWrapper().eq("role_id", roleId)); - } - - @Select("SELECT id FROM sys_role_menu WHERE update_time > #{maxUpdateTime} LIMIT 1") - Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysUserRoleMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysUserRoleMapper.java deleted file mode 100644 index 26a16b0..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysUserRoleMapper.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.permission; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysUserRoleDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; - -@Mapper -public interface SysUserRoleMapper extends BaseMapperX { - - default List selectListByUserId(Long userId) { - return selectList(new QueryWrapper().eq("user_id", userId)); - } - - default void insertList(Long userId, Collection roleIds) { - List list = roleIds.stream().map(roleId -> { - SysUserRoleDO entity = new SysUserRoleDO(); - entity.setUserId(userId); - entity.setRoleId(roleId); - return entity; - }).collect(Collectors.toList()); - // TODO 芋艿,mybatis plus 增加批量插入的功能 - list.forEach(this::insert); - } - - default void deleteListByUserIdAndRoleIdIds(Long userId, Collection roleIds) { - delete(new QueryWrapper().eq("user_id", userId) - .in("role_id", roleIds)); - } - - default void deleteListByUserId(Long userId) { - delete(new QueryWrapper().eq("user_id", userId)); - } - - default void deleteListByRoleId(Long roleId) { - delete(new QueryWrapper().eq("role_id", roleId)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsChannelMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsChannelMapper.java deleted file mode 100644 index faa8180..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsChannelMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.sms; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; - -import java.util.Date; - -@Mapper -public interface SysSmsChannelMapper extends BaseMapperX { - - default PageResult selectPage(SysSmsChannelPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("signature", reqVO.getSignature()) - .eqIfPresent("status", reqVO.getStatus()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc("id")); - } - - @Select("SELECT id FROM sys_sms_channel WHERE update_time > #{maxUpdateTime} LIMIT 1") - Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsLogMapper.java deleted file mode 100644 index 0a22ef6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsLogMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.sms; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface SysSmsLogMapper extends BaseMapperX { - - default PageResult selectPage(SysSmsLogPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .eqIfPresent("channel_id", reqVO.getChannelId()) - .eqIfPresent("template_id", reqVO.getTemplateId()) - .likeIfPresent("mobile", reqVO.getMobile()) - .eqIfPresent("send_status", reqVO.getSendStatus()) - .betweenIfPresent("send_time", reqVO.getBeginSendTime(), reqVO.getEndSendTime()) - .eqIfPresent("receive_status", reqVO.getReceiveStatus()) - .betweenIfPresent("receive_time", reqVO.getBeginReceiveTime(), reqVO.getEndReceiveTime()) - .orderByDesc("id")); - } - - default List selectList(SysSmsLogExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .eqIfPresent("channel_id", reqVO.getChannelId()) - .eqIfPresent("template_id", reqVO.getTemplateId()) - .likeIfPresent("mobile", reqVO.getMobile()) - .eqIfPresent("send_status", reqVO.getSendStatus()) - .betweenIfPresent("send_time", reqVO.getBeginSendTime(), reqVO.getEndSendTime()) - .eqIfPresent("receive_status", reqVO.getReceiveStatus()) - .betweenIfPresent("receive_time", reqVO.getBeginReceiveTime(), reqVO.getEndReceiveTime()) - .orderByDesc("id")); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java deleted file mode 100644 index 7b3608f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.sms; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; - -import java.util.Date; -import java.util.List; - -@Mapper -public interface SysSmsTemplateMapper extends BaseMapperX { - - default SysSmsTemplateDO selectByCode(String code) { - return selectOne("code", code); - } - - default PageResult selectPage(SysSmsTemplatePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .eqIfPresent("type", reqVO.getType()) - .eqIfPresent("status", reqVO.getStatus()) - .likeIfPresent("code", reqVO.getCode()) - .likeIfPresent("content", reqVO.getContent()) - .likeIfPresent("api_template_id", reqVO.getApiTemplateId()) - .eqIfPresent("channel_id", reqVO.getChannelId()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc("id")); - } - - default List selectList(SysSmsTemplateExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .eqIfPresent("type", reqVO.getType()) - .eqIfPresent("status", reqVO.getStatus()) - .likeIfPresent("code", reqVO.getCode()) - .likeIfPresent("content", reqVO.getContent()) - .likeIfPresent("api_template_id", reqVO.getApiTemplateId()) - .eqIfPresent("channel_id", reqVO.getChannelId()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc("id")); - } - - default Integer selectCountByChannelId(Long channelId) { - return selectCount("channel_id", channelId); - } - - @Select("SELECT id FROM sys_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1") - Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/user/SysUserMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/user/SysUserMapper.java deleted file mode 100644 index 579bef5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/user/SysUserMapper.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.mysql.user; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface SysUserMapper extends BaseMapperX { - - default SysUserDO selectByUsername(String username) { - return selectOne(new QueryWrapper().eq("username", username)); - } - - default SysUserDO selectByMobile(String mobile) { - return selectOne(new QueryWrapper().eq("mobile", mobile)); - } - - default SysUserDO selectByEmail(String email) { - return selectOne(new QueryWrapper().eq("email", email)); - } - - default PageResult selectPage(SysUserPageReqVO reqVO, Collection deptIds) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("username", reqVO.getUsername()) - .likeIfPresent("mobile", reqVO.getMobile()) - .eqIfPresent("status", reqVO.getStatus()) - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()) - .inIfPresent("dept_id", deptIds)); - } - - default List selectList(SysUserExportReqVO reqVO, Collection deptIds) { - return selectList(new QueryWrapperX().likeIfPresent("username", reqVO.getUsername()) - .likeIfPresent("mobile", reqVO.getMobile()) - .eqIfPresent("status", reqVO.getStatus()) - .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()) - .inIfPresent("dept_id", deptIds)); - } - - default List selectListByNickname(String nickname) { - return selectList(new QueryWrapperX().like("nickname", nickname)); - } - - default List selectListByUsername(String username) { - return selectList(new QueryWrapperX().like("username", username)); - } - -} - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java deleted file mode 100644 index e69de29..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java +++ /dev/null diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/SysRedisKeyConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/SysRedisKeyConstants.java deleted file mode 100644 index e935174..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/SysRedisKeyConstants.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.redis; - -import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; -import cn.iocoder.yudao.framework.security.core.LoginUser; - -import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING; - -/** - * System Redis Key 枚举类 - * - * @author 芋道源码 - */ -public interface SysRedisKeyConstants { - - RedisKeyDefine LOGIN_USER = new RedisKeyDefine("登陆用户的缓存", - "login_user:%s", // 参数为 sessionId - STRING, LoginUser.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); - - RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("验证码的缓存", - "captcha_code:%s", // 参数为 uuid - STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/auth/SysLoginUserRedisDAO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/auth/SysLoginUserRedisDAO.java deleted file mode 100644 index 15ebad2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/auth/SysLoginUserRedisDAO.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.redis.auth; - -import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Repository; - -import javax.annotation.Resource; -import java.time.Duration; - -import static cn.iocoder.dashboard.modules.system.dal.redis.SysRedisKeyConstants.LOGIN_USER; - -/** - * {@link LoginUser} 的 RedisDAO - * - * @author 芋道源码 - */ -@Repository -public class SysLoginUserRedisDAO { - - @Resource - private StringRedisTemplate stringRedisTemplate; - @Resource - private SysUserSessionService sysUserSessionService; - - public LoginUser get(String sessionId) { - String redisKey = formatKey(sessionId); - return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(redisKey), LoginUser.class); - } - - public void set(String sessionId, LoginUser loginUser) { - String redisKey = formatKey(sessionId); - stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(loginUser), - Duration.ofMillis(sysUserSessionService.getSessionTimeoutMillis())); - } - - public void delete(String sessionId) { - String redisKey = formatKey(sessionId); - stringRedisTemplate.delete(redisKey); - } - - private static String formatKey(String sessionId) { - return String.format(LOGIN_USER.getKeyTemplate(), sessionId); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/common/SysCaptchaRedisDAO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/common/SysCaptchaRedisDAO.java deleted file mode 100644 index 520b484..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/common/SysCaptchaRedisDAO.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.dashboard.modules.system.dal.redis.common; - -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Repository; - -import javax.annotation.Resource; -import java.time.Duration; - -import static cn.iocoder.dashboard.modules.system.dal.redis.SysRedisKeyConstants.CAPTCHA_CODE; - -/** - * 验证码的 Redis DAO - * - * @author 芋道源码 - */ -@Repository -public class SysCaptchaRedisDAO { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - public String get(String uuid) { - String redisKey = formatKey(uuid); - return stringRedisTemplate.opsForValue().get(redisKey); - } - - public void set(String uuid, String code, Duration timeout) { - String redisKey = formatKey(uuid); - stringRedisTemplate.opsForValue().set(redisKey, code, timeout); - } - - public void delete(String uuid) { - String redisKey = formatKey(uuid); - stringRedisTemplate.delete(redisKey); - } - - private static String formatKey(String uuid) { - return String.format(CAPTCHA_CODE.getKeyTemplate(), uuid); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysDictTypeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysDictTypeConstants.java deleted file mode 100644 index 69bdc06..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysDictTypeConstants.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums; - -/** - * System 字典类型的枚举类 - * - * @author 芋道源码 - */ -public interface SysDictTypeConstants { - - String USER_TYPE = "user_type"; // 用户类型 - String COMMON_STATUS = "sys_common_status"; // 系统状态 - - String USER_SEX = "sys_user_sex"; // 用户性别 - String OPERATE_TYPE = "sys_operate_type"; // 操作类型 - String LOGIN_RESULT = "sys_login_result"; // 登陆结果 - String CONFIG_TYPE = "sys_config_type"; // 参数配置类型 - String BOOLEAN_STRING = "sys_boolean_string"; // Boolean 是否类型 - - String SMS_CHANNEL_CODE = "sys_sms_channel_code"; // 短信渠道编码 - String SMS_TEMPLATE_TYPE = "sys_sms_template_type"; // 短信模板类型 - String SMS_SEND_STATUS = "sys_sms_send_status"; // 短信发送状态 - String SMS_RECEIVE_STATUS = "sys_sms_receive_status"; // 短信接收状态 - - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java deleted file mode 100644 index 5cf7ee2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums; - -import cn.iocoder.yudao.framework.common.exception.ErrorCode; - -/** - * System 错误码枚举类 - * - * system 系统,使用 1-002-000-000 段 - */ -public interface SysErrorCodeConstants { - - // ========== AUTH 模块 1002000000 ========== - ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1002000000, "登录失败,账号密码不正确"); - ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1002000001, "登录失败,账号被禁用"); - ErrorCode AUTH_LOGIN_FAIL_UNKNOWN = new ErrorCode(1002000002, "登录失败"); // 登陆失败的兜底,位置原因 - ErrorCode AUTH_LOGIN_CAPTCHA_NOT_FOUND = new ErrorCode(1002000003, "验证码不存在"); - ErrorCode AUTH_LOGIN_CAPTCHA_CODE_ERROR = new ErrorCode(1002000004, "验证码不正确"); - - // ========== TOKEN 模块 1002001000 ========== - ErrorCode TOKEN_EXPIRED = new ErrorCode(1002001000, "Token 已经过期"); - ErrorCode TOKEN_PARSE_FAIL = new ErrorCode(1002001001, "Token 解析失败"); - - // ========== 菜单模块 1002002000 ========== - ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1002002000, "已经存在该名字的菜单"); - ErrorCode MENU_PARENT_NOT_EXISTS = new ErrorCode(1002002001, "父菜单不存在"); - ErrorCode MENU_PARENT_ERROR = new ErrorCode(1002002002, "不能设置自己为父菜单"); - ErrorCode MENU_NOT_EXISTS = new ErrorCode(1002002003, "菜单不存在"); - ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1002002004, "存在子菜单,无法删除"); - ErrorCode MENU_PARENT_NOT_DIR_OR_MENU = new ErrorCode(1002002005, "父菜单的类型必须是目录或者菜单"); - - // ========== 角色模块 1002003000 ========== - ErrorCode ROLE_NOT_EXISTS = new ErrorCode(1002003000, "角色不存在"); - ErrorCode ROLE_NAME_DUPLICATE = new ErrorCode(1002003001, "已经存在名为【{}】的角色"); - ErrorCode ROLE_CODE_DUPLICATE = new ErrorCode(1002003002, "已经存在编码为【{}】的角色"); - ErrorCode ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE = new ErrorCode(1002003004, "不能操作类型为系统内置的角色"); - - // ========== 用户模块 1002004000 ========== - ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1002004000, "用户账号已经存在"); - ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1002004001, "手机号已经存在"); - ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1002004002, "邮箱已经存在"); - ErrorCode USER_NOT_EXISTS = new ErrorCode(1002004003, "用户不存在"); - ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1002004004, "导入用户数据不能为空!"); - ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1002004005, "用户密码校验失败"); - - // ========== 部门模块 1002005000 ========== - ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1002004001, "已经存在该名字的部门"); - ErrorCode DEPT_PARENT_NOT_EXITS = new ErrorCode(1002004002,"父级部门不存在"); - ErrorCode DEPT_NOT_FOUND = new ErrorCode(1002004003, "当前部门不存在"); - ErrorCode DEPT_EXITS_CHILDREN = new ErrorCode(1002004004, "存在子部门,无法删除"); - ErrorCode DEPT_PARENT_ERROR = new ErrorCode(1002004005, "不能设置自己为父部门"); - ErrorCode DEPT_EXISTS_USER = new ErrorCode(1002004006, "部门中存在员工,无法删除"); - ErrorCode DEPT_NOT_ENABLE = new ErrorCode(1002004007, "部门不处于开启状态,不允许选择"); - ErrorCode DEPT_PARENT_IS_CHILD = new ErrorCode(1002004008, "不能设置自己的子部门为父部门"); - - // ========== 岗位模块 1002005000 ========== - ErrorCode POST_NOT_FOUND = new ErrorCode(1002005001, "当前岗位不存在"); - ErrorCode POST_NOT_ENABLE = new ErrorCode(1002005002, "岗位({}) 不处于开启状态,不允许选择"); - ErrorCode POST_NAME_DUPLICATE = new ErrorCode(1002005001, "已经存在该名字的岗位"); - ErrorCode POST_CODE_DUPLICATE = new ErrorCode(1002005001, "已经存在该标识的岗位"); - - // ========== 字典类型 1002006000 ========== - ErrorCode DICT_TYPE_NOT_EXISTS = new ErrorCode(1002006001, "当前字典类型不存在"); - ErrorCode DICT_TYPE_NOT_ENABLE = new ErrorCode(1002006002, "字典类型不处于开启状态,不允许选择"); - ErrorCode DICT_TYPE_NAME_DUPLICATE = new ErrorCode(1002006003, "已经存在该名字的字典类型"); - ErrorCode DICT_TYPE_TYPE_DUPLICATE = new ErrorCode(1002006004, "已经存在该类型的字典类型"); - ErrorCode DICT_TYPE_HAS_CHILDREN = new ErrorCode(1002006004, "无法删除,该字典类型还有字典数据"); - - // ========== 字典数据 1002007000 ========== - ErrorCode DICT_DATA_NOT_EXISTS = new ErrorCode(1002007001, "当前字典数据不存在"); - ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1002007002, "字典数据不处于开启状态,不允许选择"); - ErrorCode DICT_DATA_VALUE_DUPLICATE = new ErrorCode(1002007003, "已经存在该值的字典数据"); - - // ========== 通知公告 1002008000 ========== - ErrorCode NOTICE_NOT_FOUND = new ErrorCode(1002008001, "当前通知公告不存在"); - - // ========== 文件 1002009000 ========== - ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在"); - ErrorCode FILE_UPLOAD_FAILED = new ErrorCode(1002009002, "文件上传失败"); - ErrorCode FILE_IS_EMPTY= new ErrorCode(1002009003, "文件为空"); - - // ========== 短信渠道 1002011000 ========== - ErrorCode SMS_CHANNEL_NOT_EXISTS = new ErrorCode(1002011000, "短信渠道不存在"); - ErrorCode SMS_CHANNEL_DISABLE = new ErrorCode(1002011001, "短信渠道不处于开启状态,不允许选择"); - ErrorCode SMS_CHANNEL_HAS_CHILDREN = new ErrorCode(1002011002, "无法删除,该短信渠道还有短信模板"); - - // ========== 短信模板 1002011000 ========== - ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(1002011000, "短信模板不存在"); - ErrorCode SMS_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1002011001, "已经存在编码为【{}】的短信模板"); - - // ========== 短信发送 1002012000 ========== - ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002012000, "手机号不存在"); - ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002012001, "模板参数({})缺失"); - - // ========== 错误码模块 1002013000 ========== - ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1002013000, "错误码不存在"); - ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1002013001, "已经存在编码为【{}】的错误码"); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/common/SysSexEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/common/SysSexEnum.java deleted file mode 100644 index 63dec92..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/common/SysSexEnum.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.common; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 性别的枚举值 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum SysSexEnum { - - MALE(1), // 男 - FEMALE(2); // 女 - - /** - * 性别 - */ - private final Integer sex; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/dept/DeptIdEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/dept/DeptIdEnum.java deleted file mode 100644 index 583ba1a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/dept/DeptIdEnum.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.dept; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 部门编号枚举 - */ -@Getter -@AllArgsConstructor -public enum DeptIdEnum { - - /** - * 根节点 - */ - ROOT(0L); - - private final Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java deleted file mode 100644 index f541650..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.errorcode; - -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * 错误码的类型枚举 - * - * @author dylan - */ -@AllArgsConstructor -@Getter -public enum SysErrorCodeTypeEnum implements IntArrayValuable { - - /** - * 自动生成 - */ - AUTO_GENERATION(1), - /** - * 手动编辑 - */ - MANUAL_OPERATION(2); - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysErrorCodeTypeEnum::getType).toArray(); - - /** - * 类型 - */ - private final Integer type; - - @Override - public int[] array() { - return ARRAYS; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginLogTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginLogTypeEnum.java deleted file mode 100644 index 81a48e7..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginLogTypeEnum.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.logger; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 登陆日志的类型枚举 - */ -@Getter -@AllArgsConstructor -public enum SysLoginLogTypeEnum { - - LOGIN_USERNAME(100), // 使用账号登录 - - LOGOUT_SELF(200), // 自己主动登出 - LOGOUT_TIMEOUT(201), // 超时登出 - LOGOUT_DELETE(202), // 强制退出 - ; - - /** - * 日志类型 - */ - private final Integer type; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginResultEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginResultEnum.java deleted file mode 100644 index 96887fb..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginResultEnum.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.logger; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 登陆结果的枚举类 - */ -@Getter -@AllArgsConstructor -public enum SysLoginResultEnum { - - SUCCESS(0), // 成功 - BAD_CREDENTIALS(10), // 账号或密码不正确 - USER_DISABLED(20), // 用户被禁用 - CAPTCHA_NOT_FOUND(30), // 验证码不存在 - CAPTCHA_CODE_ERROR(31), // 验证码不正确 - - UNKNOWN_ERROR(100), // 未知异常 - ; - - /** - * 结果 - */ - private final Integer result; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/notice/SysNoticeTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/notice/SysNoticeTypeEnum.java deleted file mode 100644 index 86a3fea..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/notice/SysNoticeTypeEnum.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.notice; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 通知类型 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum SysNoticeTypeEnum { - - NOTICE(1), - ANNOUNCEMENT(2); - - /** - * 类型 - */ - private final Integer type; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/MenuIdEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/MenuIdEnum.java deleted file mode 100644 index 4a1d7c2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/MenuIdEnum.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.permission; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * Menu 编号枚举 - */ -@Getter -@AllArgsConstructor -public enum MenuIdEnum { - - /** - * 根节点 - */ - ROOT(0L); - - private final Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/MenuTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/MenuTypeEnum.java deleted file mode 100644 index a50f0f1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/MenuTypeEnum.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.permission; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 菜单类型枚举类 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum MenuTypeEnum { - - DIR(1), // 目录 - MENU(2), // 菜单 - BUTTON(3) // 按钮 - ; - - /** - * 类型 - */ - private final Integer type; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/RoleCodeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/RoleCodeEnum.java deleted file mode 100644 index 9af9516..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/RoleCodeEnum.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.permission; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 角色标识枚举 - */ -@Getter -@AllArgsConstructor -public enum RoleCodeEnum { - - ADMIN("admin"), // 超级管理员 - ; - - /** - * 角色编码 - */ - private final String key; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/SysRoleTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/SysRoleTypeEnum.java deleted file mode 100644 index 2a33e26..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/SysRoleTypeEnum.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.permission; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum SysRoleTypeEnum { - - /** - * 内置角色 - */ - SYSTEM(1), - /** - * 自定义角色 - */ - CUSTOM(2); - - private final Integer type; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsReceiveStatusEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsReceiveStatusEnum.java deleted file mode 100644 index 8802388..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsReceiveStatusEnum.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.sms; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 短信的接收状态枚举 - * - * @author 芋道源码 - * @date 2021/2/1 13:39 - */ -@Getter -@AllArgsConstructor -public enum SysSmsReceiveStatusEnum { - - INIT(0), // 初始化 - SUCCESS(10), // 接收成功 - FAILURE(20), // 接收失败 - ; - - private final int status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsSendStatusEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsSendStatusEnum.java deleted file mode 100644 index 1d505ee..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsSendStatusEnum.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.sms; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 短信的发送状态枚举 - * - * @author zzf - * @date 2021/2/1 13:39 - */ -@Getter -@AllArgsConstructor -public enum SysSmsSendStatusEnum { - - INIT(0), // 初始化 - SUCCESS(10), // 发送成功 - FAILURE(20), // 发送失败 - IGNORE(30), // 忽略,即不发送 - ; - - private final int status; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsTemplateTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsTemplateTypeEnum.java deleted file mode 100644 index 8ff9c49..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsTemplateTypeEnum.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.sms; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 短信的模板类型枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum SysSmsTemplateTypeEnum { - - VERIFICATION_CODE(1), // 验证码 - NOTICE(2), // 通知 - PROMOTION(3), // 营销 - ; - - /** - * 类型 - */ - private final int type; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/config/CaptchaConfig.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/config/CaptchaConfig.java deleted file mode 100644 index 4df03f8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/config/CaptchaConfig.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.iocoder.dashboard.modules.system.framework.captcha.config; - -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableConfigurationProperties(CaptchaProperties.class) -public class CaptchaConfig { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/config/CaptchaProperties.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/config/CaptchaProperties.java deleted file mode 100644 index c3e466d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/config/CaptchaProperties.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.dashboard.modules.system.framework.captcha.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.validation.annotation.Validated; - -import javax.validation.constraints.NotNull; -import java.time.Duration; - -@ConfigurationProperties(prefix = "yudao.captcha") -@Validated -@Data -public class CaptchaProperties { - - /** - * 验证码的过期时间 - */ - @NotNull(message = "验证码的过期时间不为空") - private Duration timeout; - /** - * 验证码的高度 - */ - @NotNull(message = "验证码的高度不能为空") - private Integer height; - /** - * 验证码的宽度 - */ - @NotNull(message = "验证码的宽度不能为空") - private Integer width; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/package-info.java deleted file mode 100644 index 9c4e944..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/captcha/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 基于 Hutool captcha 库,实现验证码功能 - */ -package cn.iocoder.dashboard.modules.system.framework.captcha; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/config/CodegenConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/config/CodegenConfiguration.java deleted file mode 100644 index 26faf29..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/config/CodegenConfiguration.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.iocoder.dashboard.modules.system.framework.codegen.config; - -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableConfigurationProperties(CodegenProperties.class) -public class CodegenConfiguration { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/config/CodegenProperties.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/config/CodegenProperties.java deleted file mode 100644 index 7e174f5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/config/CodegenProperties.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.dashboard.modules.system.framework.codegen.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.validation.annotation.Validated; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Collection; - -@ConfigurationProperties(prefix = "yudao.codegen") -@Validated -@Data -public class CodegenProperties { - - /** - * 生成的 Java 代码的基础包 - */ - @NotNull(message = "Java 代码的基础包不能为空") - private String basePackage; - - /** - * 数据库名数组 - */ - @NotEmpty(message = "数据库不能为空") - private Collection dbSchemas; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/package-info.java deleted file mode 100644 index 2be2578..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/codegen/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 代码生成器 - */ -package cn.iocoder.dashboard.modules.system.framework.codegen; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/package-info.java deleted file mode 100644 index 3d233e1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 system 模块的 framework 封装 - * - * @author 芋道源码 - */ -package cn.iocoder.dashboard.modules.system.framework; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/job/auth/SysUserSessionTimeoutJob.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/job/auth/SysUserSessionTimeoutJob.java deleted file mode 100644 index 0d028ee..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/job/auth/SysUserSessionTimeoutJob.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.dashboard.modules.system.job.auth; - -import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; -import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 用户 Session 超时 Job - * - * @author 願 - */ -@Component -@Slf4j -public class SysUserSessionTimeoutJob implements JobHandler { - - @Resource - private SysUserSessionService sysUserSessionService; - - @Override - public String execute(String param) throws Exception { - // 执行过期 - Long timeoutCount = sysUserSessionService.clearSessionTimeout(); - // 返回结果,记录每次的超时数量 - return String.format("移除在线会话数量为 %s 个", timeoutCount); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/job/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/job/package-info.java deleted file mode 100644 index de70499..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/job/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.dashboard.modules.system.job; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java deleted file mode 100644 index 8ad82e8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.dept; - -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.dept.SysDeptRefreshMessage; -import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 针对 {@link SysDeptRefreshMessage} 的消费者 - * - * @author 芋道源码 - */ -@Component -@Slf4j -public class SysDeptRefreshConsumer extends AbstractChannelMessageListener { - - @Resource - private SysDeptService deptService; - - @Override - public void onMessage(SysDeptRefreshMessage message) { - log.info("[onMessage][收到 Dept 刷新消息]"); - deptService.initLocalCache(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java deleted file mode 100644 index d929641..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.dict; - -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.dict.SysDictDataRefreshMessage; -import cn.iocoder.dashboard.modules.system.service.dict.SysDictDataService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 针对 {@link SysDictDataRefreshMessage} 的消费者 - * - * @author 芋道源码 - */ -@Component -@Slf4j -public class SysDictDataRefreshConsumer extends AbstractChannelMessageListener { - - @Resource - private SysDictDataService dictDataService; - - @Override - public void onMessage(SysDictDataRefreshMessage message) { - log.info("[onMessage][收到 DictData 刷新消息]"); - dictDataService.initLocalCache(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/mail/SysMailSendConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/mail/SysMailSendConsumer.java deleted file mode 100644 index 72cb8f2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/mail/SysMailSendConsumer.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.mail; - -import cn.iocoder.yudao.framework.redis.core.stream.AbstractStreamMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.mail.SysMailSendMessage; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -public class SysMailSendConsumer extends AbstractStreamMessageListener { - - @Override - public void onMessage(SysMailSendMessage message) { - log.info("[onMessage][消息内容({})]", message); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java deleted file mode 100644 index 044f126..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.permission; - -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysMenuRefreshMessage; -import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 针对 {@link SysMenuRefreshMessage} 的消费者 - * - * @author 芋道源码 - */ -@Component -@Slf4j -public class SysMenuRefreshConsumer extends AbstractChannelMessageListener { - - @Resource - private SysMenuService menuService; - - @Override - public void onMessage(SysMenuRefreshMessage message) { - log.info("[onMessage][收到 Menu 刷新消息]"); - menuService.initLocalCache(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java deleted file mode 100644 index 6295f33..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.permission; - -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; -import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 针对 {@link SysRoleMenuRefreshMessage} 的消费者 - * - * @author 芋道源码 - */ -@Component -@Slf4j -public class SysRoleMenuRefreshConsumer extends AbstractChannelMessageListener { - - @Resource - private SysPermissionService permissionService; - - @Override - public void onMessage(SysRoleMenuRefreshMessage message) { - log.info("[onMessage][收到 Role 与 Menu 的关联刷新消息]"); - permissionService.initLocalCache(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java deleted file mode 100644 index 022daae..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.permission; - -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleRefreshMessage; -import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 针对 {@link SysRoleRefreshMessage} 的消费者 - * - * @author 芋道源码 - */ -@Component -@Slf4j -public class SysRoleRefreshConsumer extends AbstractChannelMessageListener { - - @Resource - private SysRoleService roleService; - - @Override - public void onMessage(SysRoleRefreshMessage message) { - log.info("[onMessage][收到 Role 刷新消息]"); - roleService.initLocalCache(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java deleted file mode 100644 index 3d93ac5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.sms; - -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsChannelRefreshMessage; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 针对 {@link SysSmsChannelRefreshMessage} 的消费者 - * - * @author 芋道源码 - */ -@Component -@Slf4j -public class SysSmsChannelRefreshConsumer extends AbstractChannelMessageListener { - - @Resource - private SysSmsChannelService smsChannelService; - - @Override - public void onMessage(SysSmsChannelRefreshMessage message) { - log.info("[onMessage][收到 SmsChannel 刷新消息]"); - smsChannelService.initSmsClients(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsSendConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsSendConsumer.java deleted file mode 100644 index 80864ae..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsSendConsumer.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.sms; - -import cn.iocoder.yudao.framework.redis.core.stream.AbstractStreamMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 针对 {@link SysSmsSendMessage} 的消费者 - * - * @author zzf - * @date 2021/3/9 16:35 - */ -@Component -@Slf4j -public class SysSmsSendConsumer extends AbstractStreamMessageListener { - - @Resource - private SysSmsService smsService; - - @Override - public void onMessage(SysSmsSendMessage message) { - log.info("[onMessage][消息内容({})]", message); - smsService.doSendSms(message); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java deleted file mode 100644 index 7d117eb..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.consumer.sms; - -import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; -import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 针对 {@link SysSmsTemplateRefreshMessage} 的消费者 - * - * @author 芋道源码 - */ -@Component -@Slf4j -public class SysSmsTemplateRefreshConsumer extends AbstractChannelMessageListener { - - @Resource - private SysSmsTemplateService smsTemplateService; - - @Override - public void onMessage(SysSmsTemplateRefreshMessage message) { - log.info("[onMessage][收到 SmsTemplate 刷新消息]"); - smsTemplateService.initLocalCache(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dept/SysDeptRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dept/SysDeptRefreshMessage.java deleted file mode 100644 index 22cdbda..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dept/SysDeptRefreshMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.message.dept; - -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; -import lombok.Data; - -/** - * 部门数据刷新 Message - */ -@Data -public class SysDeptRefreshMessage implements ChannelMessage { - - @Override - public String getChannel() { - return "system.dept.refresh"; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dict/SysDictDataRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dict/SysDictDataRefreshMessage.java deleted file mode 100644 index c88c7d5..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/dict/SysDictDataRefreshMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.message.dict; - -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; -import lombok.Data; - -/** - * 字典数据数据刷新 Message - */ -@Data -public class SysDictDataRefreshMessage implements ChannelMessage { - - @Override - public String getChannel() { - return "system.dict-data.refresh"; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/mail/SysMailSendMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/mail/SysMailSendMessage.java deleted file mode 100644 index 6a56f7d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/mail/SysMailSendMessage.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.message.mail; - -import cn.iocoder.yudao.framework.redis.core.stream.StreamMessage; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.Map; - -/** - * 邮箱发送消息 - * - * @author 芋道源码 - */ -@Data -public class SysMailSendMessage implements StreamMessage { - - /** - * 邮箱地址 - */ - @NotNull(message = "邮箱地址不能为空") - private String address; - /** - * 短信模板编号 - */ - @NotNull(message = "短信模板编号不能为空") - private String templateCode; - /** - * 短信模板参数 - */ - private Map templateParams; - - /** - * 用户编号,允许空 - */ - private Integer userId; - /** - * 用户类型,允许空 - */ - private Integer userType; - - @Override - public String getStreamKey() { - return "system.mail.send"; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysMenuRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysMenuRefreshMessage.java deleted file mode 100644 index 753cc2e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysMenuRefreshMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.message.permission; - -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; -import lombok.Data; - -/** - * 菜单数据刷新 Message - */ -@Data -public class SysMenuRefreshMessage implements ChannelMessage { - - @Override - public String getChannel() { - return "system.menu.refresh"; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java deleted file mode 100644 index e32c5e0..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.message.permission; - -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; -import lombok.Data; - -/** - * 角色与菜单数据刷新 Message - */ -@Data -public class SysRoleMenuRefreshMessage implements ChannelMessage { - - @Override - public String getChannel() { - return "system.role-menu.refresh"; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleRefreshMessage.java deleted file mode 100644 index 0dc9c5d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/permission/SysRoleRefreshMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.message.permission; - -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; -import lombok.Data; - -/** - * 角色数据刷新 Message - */ -@Data -public class SysRoleRefreshMessage implements ChannelMessage { - - @Override - public String getChannel() { - return "system.role.refresh"; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java deleted file mode 100644 index aaef601..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.message.sms; - -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; -import lombok.Data; - -/** - * 短信渠道的数据刷新 Message - */ -@Data -public class SysSmsChannelRefreshMessage implements ChannelMessage { - - @Override - public String getChannel() { - return "system.sms-channel.refresh"; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsSendMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsSendMessage.java deleted file mode 100644 index 3d3efda..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsSendMessage.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.message.sms; - -import cn.iocoder.yudao.framework.common.core.KeyValue; -import cn.iocoder.yudao.framework.redis.core.stream.StreamMessage; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 短信发送消息 - * - * @author 芋道源码 - */ -@Data -public class SysSmsSendMessage implements StreamMessage { - - /** - * 短信日志编号 - */ - @NotNull(message = "短信日志编号不能为空") - private Long logId; - /** - * 手机号 - */ - @NotNull(message = "手机号不能为空") - private String mobile; - /** - * 短信渠道编号 - */ - @NotNull(message = "短信渠道编号不能为空") - private Long channelId; - /** - * 短信 API 的模板编号 - */ - @NotNull(message = "短信 API 的模板编号不能为空") - private String apiTemplateId; - /** - * 短信模板参数 - */ - private List> templateParams; - - @Override - public String getStreamKey() { - return "system.sms.send"; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java deleted file mode 100644 index 927d0b8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.message.sms; - -import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; -import lombok.Data; - -/** - * 短信模板的数据刷新 Message - */ -@Data -public class SysSmsTemplateRefreshMessage implements ChannelMessage { - - @Override - public String getChannel() { - return "system.sms-template.refresh"; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dept/SysDeptProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dept/SysDeptProducer.java deleted file mode 100644 index 2fe137c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dept/SysDeptProducer.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.dept; - -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.message.dept.SysDeptRefreshMessage; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * Dept 部门相关消息的 Producer - */ -@Component -public class SysDeptProducer { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 发送 {@link SysDeptRefreshMessage} 消息 - */ - public void sendDeptRefreshMessage() { - SysDeptRefreshMessage message = new SysDeptRefreshMessage(); - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dict/SysDictDataProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dict/SysDictDataProducer.java deleted file mode 100644 index 8eb415b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/dict/SysDictDataProducer.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.dict; - -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.message.dict.SysDictDataRefreshMessage; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * DictData 字典数据相关消息的 Producer - */ -@Component -public class SysDictDataProducer { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 发送 {@link SysDictDataRefreshMessage} 消息 - */ - public void sendDictDataRefreshMessage() { - SysDictDataRefreshMessage message = new SysDictDataRefreshMessage(); - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysMenuProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysMenuProducer.java deleted file mode 100644 index 8818b40..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysMenuProducer.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.permission; - -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysMenuRefreshMessage; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * Menu 菜单相关消息的 Producer - */ -@Component -public class SysMenuProducer { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 发送 {@link SysMenuRefreshMessage} 消息 - */ - public void sendMenuRefreshMessage() { - SysMenuRefreshMessage message = new SysMenuRefreshMessage(); - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysPermissionProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysPermissionProducer.java deleted file mode 100644 index 64440a8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysPermissionProducer.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.permission; - -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * Permission 权限相关消息的 Producer - */ -@Component -public class SysPermissionProducer { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 发送 {@link SysRoleMenuRefreshMessage} 消息 - */ - public void sendRoleMenuRefreshMessage() { - SysRoleMenuRefreshMessage message = new SysRoleMenuRefreshMessage(); - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysRoleProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysRoleProducer.java deleted file mode 100644 index e95b64f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/permission/SysRoleProducer.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.permission; - -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.message.permission.SysRoleRefreshMessage; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * Role 角色相关消息的 Producer - * - * @author 芋道源码 - */ -@Component -public class SysRoleProducer { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 发送 {@link SysRoleRefreshMessage} 消息 - */ - public void sendRoleRefreshMessage() { - SysRoleRefreshMessage message = new SysRoleRefreshMessage(); - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SysSmsProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SysSmsProducer.java deleted file mode 100644 index 246ad31..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SysSmsProducer.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.iocoder.dashboard.modules.system.mq.producer.sms; - -import cn.iocoder.yudao.framework.common.core.KeyValue; -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsChannelRefreshMessage; -import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage; -import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - -/** - * Sms 短信相关消息的 Producer - * - * @author zzf - * @date 2021/3/9 16:35 - */ -@Slf4j -@Component -public class SysSmsProducer { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - /** - * 发送 {@link SysSmsSendMessage} 消息 - * - * @param logId 短信日志编号 - * @param mobile 手机号 - * @param channelId 渠道编号 - * @param apiTemplateId 短信模板编号 - * @param templateParams 短信模板参数 - */ - public void sendSmsSendMessage(Long logId, String mobile, - Long channelId, String apiTemplateId, List> templateParams) { - SysSmsSendMessage message = new SysSmsSendMessage().setLogId(logId).setMobile(mobile); - message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams); - RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message); - } - - /** - * 发送 {@link SysSmsChannelRefreshMessage} 消息 - */ - public void sendSmsChannelRefreshMessage() { - SysSmsChannelRefreshMessage message = new SysSmsChannelRefreshMessage(); - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); - } - - /** - * 发送 {@link SysSmsTemplateRefreshMessage} 消息 - */ - public void sendSmsTemplateRefreshMessage() { - SysSmsTemplateRefreshMessage message = new SysSmsTemplateRefreshMessage(); - RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/package-info.java deleted file mode 100644 index 54c955b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * system 包下,我们放通用业务,支撑上层的核心业务。 - * 例如说:用户、部门、权限、数据字典等等 - * - * 缩写:sys - */ -package cn.iocoder.dashboard.modules.system; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthService.java deleted file mode 100644 index e51c09d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthService.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.auth; - -import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; - -/** - * 认证 Service 接口 - * - * 提供用户的账号密码登陆、token 的校验等认证相关的功能 - * - * @author 芋道源码 - */ -public interface SysAuthService extends SecurityAuthFrameworkService { - - /** - * 登陆用户 - * - * @param reqVO 登陆信息 - * @param userIp 用户 IP - * @param userAgent 用户 UA - * @return 身份令牌,使用 JWT 方式 - */ - String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionService.java deleted file mode 100644 index 54c9470..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionService.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.auth; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.auth.SysUserSessionDO; - -/** - * 在线用户 Session Service 接口 - * - * @author 芋道源码 - */ -public interface SysUserSessionService { - - /** - * 创建在线用户 Session - * - * @param loginUser 登陆用户 - * @param userIp 用户 IP - * @param userAgent 用户 UA - * @return Session 编号 - */ - String createUserSession(LoginUser loginUser, String userIp, String userAgent); - - /** - * 刷新在线用户 Session 的更新时间 - * - * @param sessionId Session 编号 - * @param loginUser 登陆用户 - */ - void refreshUserSession(String sessionId, LoginUser loginUser); - - /** - * 删除在线用户 Session - * - * @param sessionId Session 编号 - */ - void deleteUserSession(String sessionId); - - /** - * 获得 Session 编号对应的在线用户 - * - * @param sessionId Session 编号 - * @return 在线用户 - */ - LoginUser getLoginUser(String sessionId); - - /** - * 获得 Session 超时时间,单位:毫秒 - * - * @return 超时时间 - */ - Long getSessionTimeoutMillis(); - - /** - * 获得在线用户分页列表 - * - * @param reqVO 分页条件 - * @return 份额与列表 - */ - PageResult getUserSessionPage(SysUserSessionPageReqVO reqVO); - - /** - * 移除超时的在线用户 - * - * @return {@link Long } 移出的超时用户数量 - **/ - long clearSessionTimeout(); -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java deleted file mode 100644 index 11d6f5f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java +++ /dev/null @@ -1,218 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.auth.impl; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; -import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService; -import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService; -import cn.iocoder.dashboard.modules.system.service.common.SysCaptchaService; -import cn.iocoder.dashboard.modules.system.service.logger.SysLoginLogService; -import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Lazy; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.DisabledException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; -import org.springframework.util.Assert; - -import javax.annotation.Resource; -import java.util.Set; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static java.util.Collections.singleton; - -/** - * Auth Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Slf4j -public class SysAuthServiceImpl implements SysAuthService { - - @Resource - @Lazy // 延迟加载,因为存在相互依赖的问题 - private AuthenticationManager authenticationManager; - @Resource - private SysUserService userService; - @Resource - private SysPermissionService permissionService; - @Resource - private SysCaptchaService captchaService; - @Resource - private SysLoginLogService loginLogService; - @Resource - private SysUserSessionService userSessionService; - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - // 获取 username 对应的 SysUserDO - SysUserDO user = userService.getUserByUsername(username); - if (user == null) { - throw new UsernameNotFoundException(username); - } - // 创建 LoginUser 对象 - return SysAuthConvert.INSTANCE.convert(user); - } - - @Override - public LoginUser mockLogin(Long userId) { - // 获取用户编号对应的 SysUserDO - SysUserDO user = userService.getUser(userId); - if (user == null) { - throw new UsernameNotFoundException(String.valueOf(userId)); - } - // 创建 LoginUser 对象 - LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user); - loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表 - return loginUser; - } - - @Override - public String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent) { - // 判断验证码是否正确 - this.verifyCaptcha(reqVO.getUsername(), reqVO.getUuid(), reqVO.getCode()); - - // 使用账号密码,进行登陆。 - LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword()); - loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表 - - // 缓存登陆用户到 Redis 中,返回 sessionId 编号 - return userSessionService.createUserSession(loginUser, userIp, userAgent); - } - - private void verifyCaptcha(String username, String captchaUUID, String captchaCode) { - String code = captchaService.getCaptchaCode(captchaUUID); - // 验证码不存在 - if (code == null) { - // 创建登陆失败日志(验证码不存在) - this.createLoginLog(username, SysLoginResultEnum.CAPTCHA_NOT_FOUND); - throw ServiceExceptionUtil.exception(AUTH_LOGIN_CAPTCHA_NOT_FOUND); - } - // 验证码不正确 - if (!code.equals(captchaCode)) { - // 创建登陆失败日志(验证码不正确) - this.createLoginLog(username, SysLoginResultEnum.CAPTCHA_CODE_ERROR); - throw ServiceExceptionUtil.exception(AUTH_LOGIN_CAPTCHA_CODE_ERROR); - } - // 正确,所以要删除下验证码 - captchaService.deleteCaptchaCode(captchaUUID); - } - - private LoginUser login0(String username, String password) { - // 用户验证 - Authentication authentication; - try { - // 调用 Spring Security 的 AuthenticationManager#authenticate(...) 方法,使用账号密码进行认证 - // 在其内部,会调用到 loadUserByUsername 方法,获取 User 信息 - authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); - } catch (BadCredentialsException badCredentialsException) { - this.createLoginLog(username, SysLoginResultEnum.BAD_CREDENTIALS); - throw exception(AUTH_LOGIN_BAD_CREDENTIALS); - } catch (DisabledException disabledException) { - this.createLoginLog(username, SysLoginResultEnum.USER_DISABLED); - throw exception(AUTH_LOGIN_USER_DISABLED); - } catch (AuthenticationException authenticationException) { - log.error("[login0][username({}) 发生未知异常]", username, authenticationException); - this.createLoginLog(username, SysLoginResultEnum.UNKNOWN_ERROR); - throw exception(AUTH_LOGIN_FAIL_UNKNOWN); - } - // 登陆成功 - Assert.notNull(authentication.getPrincipal(), "Principal 不会为空"); - this.createLoginLog(username, SysLoginResultEnum.SUCCESS); - return (LoginUser) authentication.getPrincipal(); - } - - private void createLoginLog(String username, SysLoginResultEnum loginResult) { - SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO(); - reqVO.setLogType(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()); - reqVO.setTraceId(TracerUtils.getTraceId()); - reqVO.setUsername(username); - reqVO.setUserAgent(ServletUtils.getUserAgent()); - reqVO.setUserIp(ServletUtils.getClientIP()); - reqVO.setResult(loginResult.getResult()); - loginLogService.createLoginLog(reqVO); - } - - /** - * 获得 User 拥有的角色编号数组 - * - * @param userId 用户编号 - * @return 角色编号数组 - */ - private Set getUserRoleIds(Long userId) { - return permissionService.getUserRoleIds(userId, singleton(CommonStatusEnum.ENABLE.getStatus())); - } - - @Override - public void logout(String token) { - // 查询用户信息 - LoginUser loginUser = userSessionService.getLoginUser(token); - if (loginUser == null) { - return; - } - // 删除 session - userSessionService.deleteUserSession(token); - // 记录登出日子和 - this.createLogoutLog(loginUser.getUsername()); - } - - private void createLogoutLog(String username) { - SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO(); - reqVO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType()); - reqVO.setTraceId(TracerUtils.getTraceId()); - reqVO.setUsername(username); - reqVO.setUserAgent(ServletUtils.getUserAgent()); - reqVO.setUserIp(ServletUtils.getClientIP()); - reqVO.setResult(SysLoginResultEnum.SUCCESS.getResult()); - loginLogService.createLoginLog(reqVO); - } - - @Override - public LoginUser verifyTokenAndRefresh(String token) { - // 获得 LoginUser - LoginUser loginUser = userSessionService.getLoginUser(token); - if (loginUser == null) { - return null; - } - // 刷新 LoginUser 缓存 - this.refreshLoginUserCache(token, loginUser); - return loginUser; - } - - private void refreshLoginUserCache(String token, LoginUser loginUser) { - // 每 1/3 的 Session 超时时间,刷新 LoginUser 缓存 - if (System.currentTimeMillis() - loginUser.getUpdateTime().getTime() < - userSessionService.getSessionTimeoutMillis() / 3) { - return; - } - - // 重新加载 SysUserDO 信息 - SysUserDO user = userService.getUser(loginUser.getId()); - if (user == null || CommonStatusEnum.DISABLE.getStatus().equals(user.getStatus())) { - throw exception(TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登陆界面 - } - - // 刷新 LoginUser 缓存 - loginUser.setDeptId(user.getDeptId()); - loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); - userSessionService.refreshUserSession(token, loginUser); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java deleted file mode 100644 index d04ccc4..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java +++ /dev/null @@ -1,151 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.auth.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.security.config.SecurityProperties; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.auth.SysUserSessionMapper; -import cn.iocoder.dashboard.modules.system.dal.redis.auth.SysLoginUserRedisDAO; -import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService; -import cn.iocoder.dashboard.modules.system.service.logger.SysLoginLogService; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import com.google.common.collect.Lists; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.time.Duration; -import java.util.*; -import java.util.stream.Collectors; - -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; - -/** - * 在线用户 Session Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class SysUserSessionServiceImpl implements SysUserSessionService { - - @Resource - private SecurityProperties securityProperties; - @Resource - private SysLoginUserRedisDAO loginUserRedisDAO; - @Resource - private SysUserSessionMapper userSessionMapper; - @Resource - private SysUserService userService; - @Resource - private SysLoginLogService loginLogService; - - @Override - public String createUserSession(LoginUser loginUser, String userIp, String userAgent) { - // 生成 Session 编号 - String sessionId = generateSessionId(); - // 写入 Redis 缓存 - loginUser.setUpdateTime(new Date()); - loginUserRedisDAO.set(sessionId, loginUser); - // 写入 DB 中 - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) - .userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).username(loginUser.getUsername()) - .sessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))) - .build(); - userSessionMapper.insert(userSession); - // 返回 Session 编号 - return sessionId; - } - - @Override - public void refreshUserSession(String sessionId, LoginUser loginUser) { - // 写入 Redis 缓存 - loginUser.setUpdateTime(new Date()); - loginUserRedisDAO.set(sessionId, loginUser); - // 更新 DB 中 - SysUserSessionDO updateObj = SysUserSessionDO.builder().id(sessionId).build(); - updateObj.setUsername(loginUser.getUsername()); - updateObj.setUpdateTime(new Date()); - updateObj.setSessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))); - userSessionMapper.updateById(updateObj); - } - - @Override - public void deleteUserSession(String sessionId) { - // 删除 Redis 缓存 - loginUserRedisDAO.delete(sessionId); - // 删除 DB 记录 - userSessionMapper.deleteById(sessionId); - } - - @Override - public LoginUser getLoginUser(String sessionId) { - return loginUserRedisDAO.get(sessionId); - } - - @Override - public Long getSessionTimeoutMillis() { - return securityProperties.getSessionTimeout().toMillis(); - } - - @Override - public PageResult getUserSessionPage(SysUserSessionPageReqVO reqVO) { - // 处理基于用户昵称的查询 - Collection userIds = null; - if (StrUtil.isNotEmpty(reqVO.getUsername())) { - userIds = convertSet(userService.getUsersByUsername(reqVO.getUsername()), SysUserDO::getId); - if (CollUtil.isEmpty(userIds)) { - return PageResult.empty(); - } - } - return userSessionMapper.selectPage(reqVO, userIds); - } - - @Override - public long clearSessionTimeout() { - // 获取db里已经超时的用户列表 - List sessionTimeoutDOS = userSessionMapper.selectListBySessionTimoutLt(); - Map timeoutSessionDOMap = sessionTimeoutDOS - .stream() - .filter(sessionDO -> loginUserRedisDAO.get(sessionDO.getId()) == null) - .collect(Collectors.toMap(SysUserSessionDO::getId, o -> o)); - // 确认已经超时,按批次移出在线用户列表 - if (CollUtil.isNotEmpty(timeoutSessionDOMap)) { - Lists.partition(new ArrayList<>(timeoutSessionDOMap.keySet()), 100).forEach(userSessionMapper::deleteBatchIds); - //记录用户超时退出日志 - createTimeoutLogoutLog(timeoutSessionDOMap.values()); - } - return timeoutSessionDOMap.size(); - } - - private void createTimeoutLogoutLog(Collection timeoutSessionDOS) { - for (SysUserSessionDO timeoutSessionDO : timeoutSessionDOS) { - SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO(); - reqVO.setLogType(SysLoginLogTypeEnum.LOGOUT_TIMEOUT.getType()); - reqVO.setTraceId(TracerUtils.getTraceId()); - reqVO.setUsername(timeoutSessionDO.getUsername()); - reqVO.setUserAgent(timeoutSessionDO.getUserAgent()); - reqVO.setUserIp(timeoutSessionDO.getUserIp()); - reqVO.setResult(SysLoginResultEnum.SUCCESS.getResult()); - loginLogService.createLoginLog(reqVO); - } - } - - /** - * 生成 Session 编号,目前采用 UUID 算法 - * - * @return Session 编号 - */ - private static String generateSessionId() { - return IdUtil.fastSimpleUUID(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaService.java deleted file mode 100644 index a86b406..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaService.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.common; - -import cn.iocoder.dashboard.modules.system.controller.common.vo.SysCaptchaImageRespVO; - -/** - * 验证码 Service 接口 - */ -public interface SysCaptchaService { - - /** - * 获得验证码图片 - * - * @return 验证码图片 - */ - SysCaptchaImageRespVO getCaptchaImage(); - - /** - * 获得 uuid 对应的验证码 - * - * @param uuid 验证码编号 - * @return 验证码 - */ - String getCaptchaCode(String uuid); - - /** - * 删除 uuid 对应的验证码 - * - * @param uuid 验证码编号 - */ - void deleteCaptchaCode(String uuid); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/common/impl/SysCaptchaServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/common/impl/SysCaptchaServiceImpl.java deleted file mode 100644 index f3be748..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/common/impl/SysCaptchaServiceImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.common.impl; - -import cn.hutool.captcha.CaptchaUtil; -import cn.hutool.captcha.CircleCaptcha; -import cn.hutool.core.util.IdUtil; -import cn.iocoder.dashboard.modules.system.framework.captcha.config.CaptchaProperties; -import cn.iocoder.dashboard.modules.system.controller.common.vo.SysCaptchaImageRespVO; -import cn.iocoder.dashboard.modules.system.convert.common.SysCaptchaConvert; -import cn.iocoder.dashboard.modules.system.dal.redis.common.SysCaptchaRedisDAO; -import cn.iocoder.dashboard.modules.system.service.common.SysCaptchaService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -/** - * 验证码 Service 实现类 - */ -@Service -public class SysCaptchaServiceImpl implements SysCaptchaService { - - @Resource - private CaptchaProperties captchaProperties; - - @Resource - private SysCaptchaRedisDAO captchaRedisDAO; - - @Override - public SysCaptchaImageRespVO getCaptchaImage() { - // 生成验证码 - CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight()); - // 缓存到 Redis 中 - String uuid = IdUtil.fastSimpleUUID(); - captchaRedisDAO.set(uuid, captcha.getCode(), captchaProperties.getTimeout()); - // 返回 - return SysCaptchaConvert.INSTANCE.convert(uuid, captcha); - } - - @Override - public String getCaptchaCode(String uuid) { - return captchaRedisDAO.get(uuid); - } - - @Override - public void deleteCaptchaCode(String uuid) { - captchaRedisDAO.delete(uuid); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptService.java deleted file mode 100644 index 85d5451..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptService.java +++ /dev/null @@ -1,96 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dept; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -/** - * 部门 Service 接口 - * - * @author 芋道源码 - */ -public interface SysDeptService { - - /** - * 初始化部门的本地缓存 - */ - void initLocalCache(); - - /** - * 创建部门 - * - * @param reqVO 部门信息 - * @return 部门编号 - */ - Long createDept(SysDeptCreateReqVO reqVO); - - /** - * 更新部门 - * - * @param reqVO 部门信息 - */ - void updateDept(SysDeptUpdateReqVO reqVO); - - /** - * 删除部门 - * - * @param id 部门编号 - */ - void deleteDept(Long id); - - /** - * 获得指定编号的部门列表 - * - * @param ids 部门编号数组 - * @return 部门列表 - */ - List getSimpleDepts(Collection ids); - - /** - * 获得指定编号的部门 Map - * - * @param ids 部门编号数组 - * @return 部门 Map - */ - default Map getDeptMap(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyMap(); - } - List list = getSimpleDepts(ids); - return CollectionUtils.convertMap(list, SysDeptDO::getId); - } - - /** - * 筛选部门列表 - * - * @param reqVO 筛选条件请求 VO - * @return 部门列表 - */ - List getSimpleDepts(SysDeptListReqVO reqVO); - - /** - * 获得部门信息 - * - * @param id 部门编号 - * @return 部门信息 - */ - SysDeptDO getDept(Long id); - - /** - * 获得所有子部门,从缓存中 - * - * @param parentId 部门编号 - * @param recursive 是否递归获取所有 - * @return 子部门列表 - */ - List getDeptsByParentIdFromCache(Long parentId, boolean recursive); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostService.java deleted file mode 100644 index 5d1326d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostService.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dept; - -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; -import org.springframework.lang.Nullable; - -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; - -/** - * 岗位 Service 接口 - * - * @author 芋道源码 - */ -public interface SysPostService { - - /** - * 创建岗位 - * - * @param reqVO 岗位信息 - * @return 岗位编号 - */ - Long createPost(SysPostCreateReqVO reqVO); - - /** - * 更新岗位 - * - * @param reqVO 岗位信息 - */ - void updatePost(SysPostUpdateReqVO reqVO); - - /** - * 删除岗位信息 - * - * @param id 岗位编号 - */ - void deletePost(Long id); - - /** - * 获得岗位列表 - * - * @param ids 岗位编号数组。如果为空,不进行筛选 - * @return 部门列表 - */ - default List getPosts(@Nullable Collection ids) { - return getPosts(ids, asSet(CommonStatusEnum.ENABLE.getStatus(), CommonStatusEnum.DISABLE.getStatus())); - } - - /** - * 获得符合条件的岗位列表 - * - * @param ids 岗位编号数组。如果为空,不进行筛选 - * @param statuses 状态数组。如果为空,不进行筛选 - * @return 部门列表 - */ - List getPosts(@Nullable Collection ids, @Nullable Collection statuses); - - /** - * 获得岗位分页列表 - * - * @param reqVO 分页条件 - * @return 部门分页列表 - */ - PageResult getPostPage(SysPostPageReqVO reqVO); - - /** - * 获得岗位列表 - * - * @param reqVO 查询条件 - * @return 部门列表 - */ - List getPosts(SysPostExportReqVO reqVO); - - /** - * 获得岗位信息 - * - * @param id 岗位编号 - * @return 岗位信息 - */ - SysPostDO getPost(Long id); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java deleted file mode 100644 index 7ddeb2a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java +++ /dev/null @@ -1,274 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dept.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; -import cn.iocoder.dashboard.modules.system.convert.dept.SysDeptConvert; -import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysDeptMapper; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.dashboard.modules.system.enums.dept.DeptIdEnum; -import cn.iocoder.dashboard.modules.system.mq.producer.dept.SysDeptProducer; -import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.*; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; - -/** - * 部门 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -@Slf4j -public class SysDeptServiceImpl implements SysDeptService { - - /** - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 - */ - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; - - /** - * 部门缓存 - * key:部门编号 {@link SysDeptDO#getId()} - * - * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 - */ - @SuppressWarnings("FieldCanBeLocal") - private volatile Map deptCache; - /** - * 父部门缓存 - * key:部门编号 {@link SysDeptDO#getParentId()} - * value: 直接子部门列表 - * - * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 - */ - private volatile Multimap parentDeptCache; - /** - * 缓存部门的最大更新时间,用于后续的增量轮询,判断是否有更新 - */ - private volatile Date maxUpdateTime; - - @Resource - private SysDeptMapper deptMapper; - - @Resource - private SysDeptProducer deptProducer; - - @Override - @PostConstruct - public synchronized void initLocalCache() { - // 获取部门列表,如果有更新 - List deptList = this.loadDeptIfUpdate(maxUpdateTime); - if (CollUtil.isEmpty(deptList)) { - return; - } - - // 构建缓存 - ImmutableMap.Builder builder = ImmutableMap.builder(); - ImmutableMultimap.Builder parentBuilder = ImmutableMultimap.builder(); - deptList.forEach(sysRoleDO -> { - builder.put(sysRoleDO.getId(), sysRoleDO); - parentBuilder.put(sysRoleDO.getParentId(), sysRoleDO); - }); - // 设置缓存 - deptCache = builder.build(); - parentDeptCache = parentBuilder.build(); - assert deptList.size() > 0; // 断言,避免告警 - maxUpdateTime = deptList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); - log.info("[initLocalCache][初始化 Dept 数量为 {}]", deptList.size()); - } - - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) - public void schedulePeriodicRefresh() { - initLocalCache(); - } - - /** - * 如果部门发生变化,从数据库中获取最新的全量部门。 - * 如果未发生变化,则返回空 - * - * @param maxUpdateTime 当前部门的最大更新时间 - * @return 部门列表 - */ - private List loadDeptIfUpdate(Date maxUpdateTime) { - // 第一步,判断是否要更新。 - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 - log.info("[loadMenuIfUpdate][首次加载全量部门]"); - } else { // 判断数据库中是否有更新的部门 - if (!deptMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { - return null; - } - log.info("[loadMenuIfUpdate][增量加载全量部门]"); - } - // 第二步,如果有更新,则从数据库加载所有部门 - return deptMapper.selectList(); - } - - @Override - public Long createDept(SysDeptCreateReqVO reqVO) { - // 校验正确性 - checkCreateOrUpdate(null, reqVO.getParentId(), reqVO.getName()); - // 插入部门 - SysDeptDO dept = SysDeptConvert.INSTANCE.convert(reqVO); - deptMapper.insert(dept); - // 发送刷新消息 - deptProducer.sendDeptRefreshMessage(); - return dept.getId(); - } - - @Override - public void updateDept(SysDeptUpdateReqVO reqVO) { - // 校验正确性 - checkCreateOrUpdate(reqVO.getId(), reqVO.getParentId(), reqVO.getName()); - // 更新部门 - SysDeptDO updateObj = SysDeptConvert.INSTANCE.convert(reqVO); - deptMapper.updateById(updateObj); - // 发送刷新消息 - deptProducer.sendDeptRefreshMessage(); - } - - @Override - public void deleteDept(Long id) { - // 校验是否存在 - checkDeptExists(id); - // 校验是否有子部门 - if (deptMapper.selectCountByParentId(id) > 0) { - throw ServiceExceptionUtil.exception(DEPT_EXITS_CHILDREN); - } - // 删除部门 - deptMapper.deleteById(id); - // 发送刷新消息 - deptProducer.sendDeptRefreshMessage(); - } - - @Override - public List getSimpleDepts(Collection ids) { - return deptMapper.selectBatchIds(ids); - } - - @Override - public List getSimpleDepts(SysDeptListReqVO reqVO) { - return deptMapper.selectList(reqVO); - } - - @Override - public List getDeptsByParentIdFromCache(Long parentId, boolean recursive) { - List result = new ArrayList<>(); - // 递归,简单粗暴 - this.listDeptsByParentIdFromCache(result, parentId, - recursive ? Integer.MAX_VALUE : 1, // 如果递归获取,则无限;否则,只递归 1 次 - parentDeptCache); - return result; - } - - /** - * 递归获取所有的子部门,添加到 result 结果 - * - * @param result 结果 - * @param parentId 父编号 - * @param recursiveCount 递归次数 - * @param parentDeptMap 父部门 Map,使用缓存,避免变化 - */ - private void listDeptsByParentIdFromCache(List result, Long parentId, int recursiveCount, - Multimap parentDeptMap) { - // 递归次数为 0,结束! - if (recursiveCount == 0) { - return; - } - // 获得子部门 - Collection depts = parentDeptMap.get(parentId); - if (CollUtil.isEmpty(depts)) { - return; - } - result.addAll(depts); - // 继续递归 - depts.forEach(dept -> listDeptsByParentIdFromCache(result, dept.getId(), - recursiveCount - 1, parentDeptMap)); - } - - @Override - public SysDeptDO getDept(Long id) { - return deptMapper.selectById(id); - } - - private void checkCreateOrUpdate(Long id, Long parentId, String name) { - // 校验自己存在 - checkDeptExists(id); - // 校验父部门的有效性 - checkParentDeptEnable(id, parentId); - // 校验部门名的唯一性 - checkDeptNameUnique(id, parentId, name); - } - - private void checkParentDeptEnable(Long id, Long parentId) { - if (parentId == null || DeptIdEnum.ROOT.getId().equals(parentId)) { - return; - } - // 不能设置自己为父部门 - if (parentId.equals(id)) { - throw ServiceExceptionUtil.exception(DEPT_PARENT_ERROR); - } - // 父岗位不存在 - SysDeptDO dept = deptMapper.selectById(parentId); - if (dept == null) { - throw ServiceExceptionUtil.exception(DEPT_PARENT_NOT_EXITS); - } - // 父部门被禁用 - if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { - throw ServiceExceptionUtil.exception(DEPT_NOT_ENABLE); - } - // 父部门不能是原来的子部门 - List children = this.getDeptsByParentIdFromCache(id, true); - if (children.stream().anyMatch(dept1 -> dept1.getId().equals(parentId))) { - throw ServiceExceptionUtil.exception(DEPT_PARENT_IS_CHILD); - } - } - - private void checkDeptExists(Long id) { - if (id == null) { - return; - } - SysDeptDO dept = deptMapper.selectById(id); - if (dept == null) { - throw ServiceExceptionUtil.exception(DEPT_NOT_FOUND); - } - } - - private void checkDeptNameUnique(Long id, Long parentId, String name) { - SysDeptDO menu = deptMapper.selectByParentIdAndName(parentId, name); - if (menu == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的岗位 - if (id == null) { - throw ServiceExceptionUtil.exception(DEPT_NAME_DUPLICATE); - } - if (!menu.getId().equals(id)) { - throw ServiceExceptionUtil.exception(DEPT_NAME_DUPLICATE); - } - } - -// @Override -// @DataScope(deptAlias = "d") -// public List selectDeptList(SysDept dept) -// { -// return deptMapper.selectDeptList(dept); -// } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysPostServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysPostServiceImpl.java deleted file mode 100644 index a23b419..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysPostServiceImpl.java +++ /dev/null @@ -1,128 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dept.impl; - -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; -import cn.iocoder.dashboard.modules.system.convert.dept.SysPostConvert; -import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysPostMapper; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.dashboard.modules.system.service.dept.SysPostService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; - -/** - * 岗位 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class SysPostServiceImpl implements SysPostService { - - @Resource - private SysPostMapper postMapper; - - @Override - public Long createPost(SysPostCreateReqVO reqVO) { - // 校验正确性 - this.checkCreateOrUpdate(null, reqVO.getName(), reqVO.getCode()); - // 插入岗位 - SysPostDO post = SysPostConvert.INSTANCE.convert(reqVO); - postMapper.insert(post); - return post.getId(); - } - - @Override - public void updatePost(SysPostUpdateReqVO reqVO) { - // 校验正确性 - this.checkCreateOrUpdate(reqVO.getId(), reqVO.getName(), reqVO.getCode()); - // 更新岗位 - SysPostDO updateObj = SysPostConvert.INSTANCE.convert(reqVO); - postMapper.updateById(updateObj); - } - - @Override - public void deletePost(Long id) { - // 校验是否存在 - this.checkPostExists(id); - // 删除部门 - postMapper.deleteById(id); - } - - @Override - public List getPosts(Collection ids, Collection statuses) { - return postMapper.selectList(ids, statuses); - } - - @Override - public PageResult getPostPage(SysPostPageReqVO reqVO) { - return postMapper.selectPage(reqVO); - } - - @Override - public List getPosts(SysPostExportReqVO reqVO) { - return postMapper.selectList(reqVO); - } - - @Override - public SysPostDO getPost(Long id) { - return postMapper.selectById(id); - } - - private void checkCreateOrUpdate(Long id, String name, String code) { - // 校验自己存在 - checkPostExists(id); - // 校验岗位名的唯一性 - checkPostNameUnique(id, name); - // 校验岗位编码的唯一性 - checkPostCodeUnique(id, code); - } - - private void checkPostNameUnique(Long id, String name) { - SysPostDO post = postMapper.selectByName(name); - if (post == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的岗位 - if (id == null) { - throw ServiceExceptionUtil.exception(POST_NAME_DUPLICATE); - } - if (!post.getId().equals(id)) { - throw ServiceExceptionUtil.exception(POST_NAME_DUPLICATE); - } - } - - private void checkPostCodeUnique(Long id, String code) { - SysPostDO post = postMapper.selectByCode(code); - if (post == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的岗位 - if (id == null) { - throw ServiceExceptionUtil.exception(POST_CODE_DUPLICATE); - } - if (!post.getId().equals(id)) { - throw ServiceExceptionUtil.exception(POST_CODE_DUPLICATE); - } - } - - private void checkPostExists(Long id) { - if (id == null) { - return; - } - SysPostDO post = postMapper.selectById(id); - if (post == null) { - throw ServiceExceptionUtil.exception(POST_NOT_FOUND); - } - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataService.java deleted file mode 100644 index 872fa40..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataService.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dict; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; - -import java.util.List; - -/** - * 字典数据 Service 接口 - * - * @author ruoyi - */ -public interface SysDictDataService extends DictDataFrameworkService { - - /** - * 初始化字典数据的本地缓存 - */ - void initLocalCache(); - - /** - * 创建字典数据 - * - * @param reqVO 字典数据信息 - * @return 字典数据编号 - */ - Long createDictData(SysDictDataCreateReqVO reqVO); - - /** - * 更新字典数据 - * - * @param reqVO 字典数据信息 - */ - void updateDictData(SysDictDataUpdateReqVO reqVO); - - /** - * 删除字典数据 - * - * @param id 字典数据编号 - */ - void deleteDictData(Long id); - - /** - * 获得字典数据列表 - * - * @return 字典数据全列表 - */ - List getDictDatas(); - - /** - * 获得字典数据分页列表 - * - * @param reqVO 分页请求 - * @return 字典数据分页列表 - */ - PageResult getDictDataPage(SysDictDataPageReqVO reqVO); - - /** - * 获得字典数据列表 - * - * @param reqVO 列表请求 - * @return 字典数据列表 - */ - List getDictDatas(SysDictDataExportReqVO reqVO); - - /** - * 获得字典数据详情 - * - * @param id 字典数据编号 - * @return 字典数据 - */ - SysDictDataDO getDictData(Long id); - - /** - * 获得指定字典类型的数据数量 - * - * @param dictType 字典类型 - * @return 数据数量 - */ - int countByDictType(String dictType); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeService.java deleted file mode 100644 index 5bd79cd..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeService.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dict; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; - -import java.util.List; - -/** - * 字典类型 Service 接口 - * - * @author 芋道源码 - */ -public interface SysDictTypeService { - - /** - * 创建字典类型 - * - * @param reqVO 字典类型信息 - * @return 字典类型编号 - */ - Long createDictType(SysDictTypeCreateReqVO reqVO); - - /** - * 更新字典类型 - * - * @param reqVO 字典类型信息 - */ - void updateDictType(SysDictTypeUpdateReqVO reqVO); - - /** - * 删除字典类型 - * - * @param id 字典类型编号 - */ - void deleteDictType(Long id); - - /** - * 获得字典类型分页列表 - * - * @param reqVO 分页请求 - * @return 字典类型分页列表 - */ - PageResult getDictTypePage(SysDictTypePageReqVO reqVO); - - /** - * 获得字典类型列表 - * - * @param reqVO 列表请求 - * @return 字典类型列表 - */ - List getDictTypeList(SysDictTypeExportReqVO reqVO); - - /** - * 获得字典类型详情 - * - * @param id 字典类型编号 - * @return 字典类型 - */ - SysDictTypeDO getDictType(Long id); - - /** - * 获得字典类型详情 - * - * @param type 字典类型 - * @return 字典类型详情 - */ - SysDictTypeDO getDictType(String type); - - /** - * 获得全部字典类型列表 - * - * @return 字典类型列表 - */ - List getDictTypeList(); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java deleted file mode 100644 index 58eb32e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java +++ /dev/null @@ -1,256 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dict.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; -import cn.iocoder.dashboard.modules.system.convert.dict.SysDictDataConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dict.SysDictDataMapper; -import cn.iocoder.dashboard.modules.system.mq.producer.dict.SysDictDataProducer; -import cn.iocoder.dashboard.modules.system.service.dict.SysDictDataService; -import cn.iocoder.dashboard.modules.system.service.dict.SysDictTypeService; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableTable; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.Comparator; -import java.util.Date; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; - -/** - * 字典数据 Service 实现类 - * - * @author ruoyi - */ -@Service -@Slf4j -public class SysDictDataServiceImpl implements SysDictDataService { - - /** - * 排序 dictType > sort - */ - private static final Comparator COMPARATOR_TYPE_AND_SORT = Comparator - .comparing(SysDictDataDO::getDictType) - .thenComparingInt(SysDictDataDO::getSort); - - /** - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 - */ - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; - - /** - * 字典数据缓存,第二个 key 使用 label - * - * key1:字典类型 dictType - * key2:字典标签 label - */ - private ImmutableTable labelDictDataCache; - /** - * 字典数据缓存,第二个 key 使用 value - * - * key1:字典类型 dictType - * key2:字典值 value - */ - private ImmutableTable valueDictDataCache; - /** - * 缓存字典数据的最大更新时间,用于后续的增量轮询,判断是否有更新 - */ - private volatile Date maxUpdateTime; - - @Resource - private SysDictTypeService dictTypeService; - - @Resource - private SysDictDataMapper dictDataMapper; - - @Resource - private SysDictDataProducer dictDataProducer; - - @Override - @PostConstruct - public synchronized void initLocalCache() { - // 获取字典数据列表,如果有更新 - List dataList = this.loadDictDataIfUpdate(maxUpdateTime); - if (CollUtil.isEmpty(dataList)) { - return; - } - - // 构建缓存 - ImmutableTable.Builder labelDictDataBuilder = ImmutableTable.builder(); - ImmutableTable.Builder valueDictDataBuilder = ImmutableTable.builder(); - dataList.forEach(dictData -> { - labelDictDataBuilder.put(dictData.getDictType(), dictData.getLabel(), dictData); - valueDictDataBuilder.put(dictData.getDictType(), dictData.getValue(), dictData); - }); - labelDictDataCache = labelDictDataBuilder.build(); - valueDictDataCache = valueDictDataBuilder.build(); - assert dataList.size() > 0; // 断言,避免告警 - maxUpdateTime = dataList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); - log.info("[initLocalCache][缓存字典数据,数量为:{}]", dataList.size()); - } - - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) - public void schedulePeriodicRefresh() { - initLocalCache(); - } - - /** - * 如果字典数据发生变化,从数据库中获取最新的全量字典数据。 - * 如果未发生变化,则返回空 - * - * @param maxUpdateTime 当前字典数据的最大更新时间 - * @return 字典数据列表 - */ - private List loadDictDataIfUpdate(Date maxUpdateTime) { - // 第一步,判断是否要更新。 - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 - log.info("[loadDictDataIfUpdate][首次加载全量字典数据]"); - } else { // 判断数据库中是否有更新的字典数据 - if (!dictDataMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { - return null; - } - log.info("[loadDictDataIfUpdate][增量加载全量字典数据]"); - } - // 第二步,如果有更新,则从数据库加载所有字典数据 - return dictDataMapper.selectList(); - } - - @Override - public List getDictDatas() { - List list = dictDataMapper.selectList(); - list.sort(COMPARATOR_TYPE_AND_SORT); - return list; - } - - @Override - public PageResult getDictDataPage(SysDictDataPageReqVO reqVO) { - return dictDataMapper.selectPage(reqVO); - } - - @Override - public List getDictDatas(SysDictDataExportReqVO reqVO) { - List list = dictDataMapper.selectList(reqVO); - list.sort(COMPARATOR_TYPE_AND_SORT); - return list; - } - - @Override - public SysDictDataDO getDictData(Long id) { - return dictDataMapper.selectById(id); - } - - @Override - public Long createDictData(SysDictDataCreateReqVO reqVO) { - // 校验正确性 - this.checkCreateOrUpdate(null, reqVO.getValue(), reqVO.getDictType()); - // 插入字典类型 - SysDictDataDO dictData = SysDictDataConvert.INSTANCE.convert(reqVO); - dictDataMapper.insert(dictData); - // 发送刷新消息 - dictDataProducer.sendDictDataRefreshMessage(); - return dictData.getId(); - } - - @Override - public void updateDictData(SysDictDataUpdateReqVO reqVO) { - // 校验正确性 - this.checkCreateOrUpdate(reqVO.getId(), reqVO.getValue(), reqVO.getDictType()); - // 更新字典类型 - SysDictDataDO updateObj = SysDictDataConvert.INSTANCE.convert(reqVO); - dictDataMapper.updateById(updateObj); - // 发送刷新消息 - dictDataProducer.sendDictDataRefreshMessage(); - } - - @Override - public void deleteDictData(Long id) { - // 校验是否存在 - this.checkDictDataExists(id); - // 删除字典数据 - dictDataMapper.deleteById(id); - // 发送刷新消息 - dictDataProducer.sendDictDataRefreshMessage(); - } - - @Override - public int countByDictType(String dictType) { - return dictDataMapper.selectCountByDictType(dictType); - } - - private void checkCreateOrUpdate(Long id, String value, String dictType) { - // 校验自己存在 - checkDictDataExists(id); - // 校验字典类型有效 - checkDictTypeValid(dictType); - // 校验字典数据的值的唯一性 - checkDictDataValueUnique(id, dictType, value); - } - - @VisibleForTesting - public void checkDictDataValueUnique(Long id, String dictType, String value) { - SysDictDataDO dictData = dictDataMapper.selectByDictTypeAndValue(dictType, value); - if (dictData == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的字典数据 - if (id == null) { - throw exception(DICT_DATA_VALUE_DUPLICATE); - } - if (!dictData.getId().equals(id)) { - throw exception(DICT_DATA_VALUE_DUPLICATE); - } - } - - @VisibleForTesting - public void checkDictDataExists(Long id) { - if (id == null) { - return; - } - SysDictDataDO dictData = dictDataMapper.selectById(id); - if (dictData == null) { - throw exception(DICT_DATA_NOT_EXISTS); - } - } - - @VisibleForTesting - public void checkDictTypeValid(String type) { - SysDictTypeDO dictType = dictTypeService.getDictType(type); - if (dictType == null) { - throw exception(DICT_TYPE_NOT_EXISTS); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(dictType.getStatus())) { - throw exception(DICT_TYPE_NOT_ENABLE); - } - } - - @Override - public DictDataRespDTO getDictDataFromCache(String type, String value) { - return SysDictDataConvert.INSTANCE.convert02(valueDictDataCache.get(type, value)); - } - - @Override - public DictDataRespDTO parseDictDataFromCache(String type, String label) { - return SysDictDataConvert.INSTANCE.convert02(labelDictDataCache.get(type, label)); - } - - @Override - public List listDictDatasFromCache(String type) { - return SysDictDataConvert.INSTANCE.convertList03(labelDictDataCache.row(type).values()); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictTypeServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictTypeServiceImpl.java deleted file mode 100644 index 88a7aa3..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictTypeServiceImpl.java +++ /dev/null @@ -1,143 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dict.impl; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.convert.dict.SysDictTypeConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dict.SysDictTypeMapper; -import cn.iocoder.dashboard.modules.system.service.dict.SysDictDataService; -import cn.iocoder.dashboard.modules.system.service.dict.SysDictTypeService; -import com.google.common.annotations.VisibleForTesting; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; - -/** - * 字典类型 Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class SysDictTypeServiceImpl implements SysDictTypeService { - - @Resource - private SysDictDataService dictDataService; - - @Resource - private SysDictTypeMapper dictTypeMapper; - - @Override - public PageResult getDictTypePage(SysDictTypePageReqVO reqVO) { - return dictTypeMapper.selectPage(reqVO); - } - - @Override - public List getDictTypeList(SysDictTypeExportReqVO reqVO) { - return dictTypeMapper.selectList(reqVO); - } - - @Override - public SysDictTypeDO getDictType(Long id) { - return dictTypeMapper.selectById(id); - } - - @Override - public SysDictTypeDO getDictType(String type) { - return dictTypeMapper.selectByType(type); - } - - @Override - public Long createDictType(SysDictTypeCreateReqVO reqVO) { - // 校验正确性 - this.checkCreateOrUpdate(null, reqVO.getName(), reqVO.getType()); - // 插入字典类型 - SysDictTypeDO dictType = SysDictTypeConvert.INSTANCE.convert(reqVO); - dictTypeMapper.insert(dictType); - return dictType.getId(); - } - - @Override - public void updateDictType(SysDictTypeUpdateReqVO reqVO) { - // 校验正确性 - this.checkCreateOrUpdate(reqVO.getId(), reqVO.getName(), null); - // 更新字典类型 - SysDictTypeDO updateObj = SysDictTypeConvert.INSTANCE.convert(reqVO); - dictTypeMapper.updateById(updateObj); - } - - @Override - public void deleteDictType(Long id) { - // 校验是否存在 - SysDictTypeDO dictType = this.checkDictTypeExists(id); - // 校验是否有字典数据 - if (dictDataService.countByDictType(dictType.getType()) > 0) { - throw exception(DICT_TYPE_HAS_CHILDREN); - } - // 删除字典类型 - dictTypeMapper.deleteById(id); - } - - @Override - public List getDictTypeList() { - return dictTypeMapper.selectList(); - } - - private void checkCreateOrUpdate(Long id, String name, String type) { - // 校验自己存在 - checkDictTypeExists(id); - // 校验字典类型的名字的唯一性 - checkDictTypeNameUnique(id, name); - // 校验字典类型的类型的唯一性 - checkDictTypeUnique(id, type); - } - - @VisibleForTesting - public void checkDictTypeNameUnique(Long id, String name) { - SysDictTypeDO dictType = dictTypeMapper.selectByName(name); - if (dictType == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 - if (id == null) { - throw exception(DICT_TYPE_NAME_DUPLICATE); - } - if (!dictType.getId().equals(id)) { - throw exception(DICT_TYPE_NAME_DUPLICATE); - } - } - - @VisibleForTesting - public void checkDictTypeUnique(Long id, String type) { - SysDictTypeDO dictType = dictTypeMapper.selectByType(type); - if (dictType == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 - if (id == null) { - throw exception(DICT_TYPE_TYPE_DUPLICATE); - } - if (!dictType.getId().equals(id)) { - throw exception(DICT_TYPE_TYPE_DUPLICATE); - } - } - - @VisibleForTesting - public SysDictTypeDO checkDictTypeExists(Long id) { - if (id == null) { - return null; - } - SysDictTypeDO dictType = dictTypeMapper.selectById(id); - if (dictType == null) { - throw exception(DICT_TYPE_NOT_EXISTS); - } - return dictType; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeService.java deleted file mode 100644 index 1fdb574..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeService.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.errorcode; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; - -import javax.validation.Valid; -import java.util.List; - -/** - * 错误码 Service 接口 - * - * @author 芋道源码 - */ -public interface SysErrorCodeService extends ErrorCodeFrameworkService { - - /** - * 创建错误码 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createErrorCode(@Valid SysErrorCodeCreateReqVO createReqVO); - - /** - * 更新错误码 - * - * @param updateReqVO 更新信息 - */ - void updateErrorCode(@Valid SysErrorCodeUpdateReqVO updateReqVO); - - /** - * 删除错误码 - * - * @param id 编号 - */ - void deleteErrorCode(Long id); - - /** - * 获得错误码 - * - * @param id 编号 - * @return 错误码 - */ - SysErrorCodeDO getErrorCode(Long id); - - /** - * 获得错误码分页 - * - * @param pageReqVO 分页查询 - * @return 错误码分页 - */ - PageResult getErrorCodePage(SysErrorCodePageReqVO pageReqVO); - - /** - * 获得错误码列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 错误码列表 - */ - List getErrorCodeList(SysErrorCodeExportReqVO exportReqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java deleted file mode 100644 index bff201e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java +++ /dev/null @@ -1,174 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.errorcode.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; -import cn.iocoder.dashboard.modules.system.convert.errorcode.SysErrorCodeConvert; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.errorcode.SysErrorCodeMapper; -import cn.iocoder.dashboard.modules.system.enums.errorcode.SysErrorCodeTypeEnum; -import cn.iocoder.dashboard.modules.system.service.errorcode.SysErrorCodeService; -import com.google.common.annotations.VisibleForTesting; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; - -/** - * 错误码 Service 实现类 - * - * @author dlyan - */ -@Service -@Validated -@Slf4j -public class SysErrorCodeServiceImpl implements SysErrorCodeService { - - @Resource - private SysErrorCodeMapper errorCodeMapper; - - @Override - public Long createErrorCode(SysErrorCodeCreateReqVO createReqVO) { - // 校验 code 重复 - validateCodeDuplicate(createReqVO.getCode(), null); - - // 插入 - SysErrorCodeDO errorCode = SysErrorCodeConvert.INSTANCE.convert(createReqVO) - .setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType()); - errorCodeMapper.insert(errorCode); - // 返回 - return errorCode.getId(); - } - - @Override - public void updateErrorCode(SysErrorCodeUpdateReqVO updateReqVO) { - // 校验存在 - this.validateErrorCodeExists(updateReqVO.getId()); - // 校验 code 重复 - validateCodeDuplicate(updateReqVO.getCode(), updateReqVO.getId()); - - // 更新 - SysErrorCodeDO updateObj = SysErrorCodeConvert.INSTANCE.convert(updateReqVO) - .setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType()); - errorCodeMapper.updateById(updateObj); - } - - @Override - public void deleteErrorCode(Long id) { - // 校验存在 - this.validateErrorCodeExists(id); - // 删除 - errorCodeMapper.deleteById(id); - } - - /** - * 校验错误码的唯一字段是否重复 - * - * 是否存在相同编码的错误码 - * - * @param code 错误码编码 - * @param id 错误码编号 - */ - @VisibleForTesting - public void validateCodeDuplicate(Integer code, Long id) { - SysErrorCodeDO errorCodeDO = errorCodeMapper.selectByCode(code); - if (errorCodeDO == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的错误码 - if (id == null) { - throw exception(ERROR_CODE_DUPLICATE); - } - if (!errorCodeDO.getId().equals(id)) { - throw exception(ERROR_CODE_DUPLICATE); - } - } - - @VisibleForTesting - public void validateErrorCodeExists(Long id) { - if (errorCodeMapper.selectById(id) == null) { - throw exception(ERROR_CODE_NOT_EXISTS); - } - } - - @Override - public SysErrorCodeDO getErrorCode(Long id) { - return errorCodeMapper.selectById(id); - } - - @Override - public PageResult getErrorCodePage(SysErrorCodePageReqVO pageReqVO) { - return errorCodeMapper.selectPage(pageReqVO); - } - - @Override - public List getErrorCodeList(SysErrorCodeExportReqVO exportReqVO) { - return errorCodeMapper.selectList(exportReqVO); - } - - @Override - @Transactional - public void autoGenerateErrorCodes(List autoGenerateDTOs) { - if (CollUtil.isEmpty(autoGenerateDTOs)) { - return; - } - // 获得错误码 - List errorCodeDOs = errorCodeMapper.selectListByCodes( - convertSet(autoGenerateDTOs, ErrorCodeAutoGenerateReqDTO::getCode)); - Map errorCodeDOMap = convertMap(errorCodeDOs, SysErrorCodeDO::getCode); - - // 遍历 autoGenerateBOs 数组,逐个插入或更新。考虑到每次量级不大,就不走批量了 - autoGenerateDTOs.forEach(autoGenerateDTO -> { - SysErrorCodeDO errorCodeDO = errorCodeDOMap.get(autoGenerateDTO.getCode()); - // 不存在,则进行新增 - if (errorCodeDO == null) { - errorCodeDO = SysErrorCodeConvert.INSTANCE.convert(autoGenerateDTO) - .setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); - errorCodeMapper.insert(errorCodeDO); - return; - } - // 存在,则进行更新。更新有三个前置条件: - // 条件 1. 只更新自动生成的错误码,即 Type 为 ErrorCodeTypeEnum.AUTO_GENERATION - if (!SysErrorCodeTypeEnum.AUTO_GENERATION.getType().equals(errorCodeDO.getType())) { - return; - } - // 条件 2. 分组 applicationName 必须匹配,避免存在错误码冲突的情况 - if (!autoGenerateDTO.getApplicationName().equals(errorCodeDO.getApplicationName())) { - log.error("[autoGenerateErrorCodes][自动创建({}/{}) 错误码失败,数据库中已经存在({}/{})]", - autoGenerateDTO.getCode(), autoGenerateDTO.getApplicationName(), - errorCodeDO.getCode(), errorCodeDO.getApplicationName()); - return; - } - // 条件 3. 错误提示语存在差异 - if (autoGenerateDTO.getMessage().equals(errorCodeDO.getMessage())) { - return; - } - // 最终匹配,进行更新 - errorCodeMapper.updateById(new SysErrorCodeDO().setId(errorCodeDO.getId()).setMessage(autoGenerateDTO.getMessage())); - }); - } - - @Override - public List getErrorCodeList(String applicationName, Date minUpdateTime) { - List errorCodeDOs = errorCodeMapper.selectListByApplicationNameAndUpdateTimeGt( - applicationName, minUpdateTime); - return SysErrorCodeConvert.INSTANCE.convertList03(errorCodeDOs); - } - -} - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogService.java deleted file mode 100644 index fb5d08c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogService.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.logger; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO; - -import java.util.List; - -/** - * 登陆日志 Service 接口 - */ -public interface SysLoginLogService { - - /** - * 创建登陆日志 - * - * @param reqVO 日志信息 - */ - void createLoginLog(SysLoginLogCreateReqVO reqVO); - - /** - * 获得登陆日志分页 - * - * @param reqVO 分页条件 - * @return 登陆日志分页 - */ - PageResult getLoginLogPage(SysLoginLogPageReqVO reqVO); - - /** - * 获得登陆日志列表 - * - * @param reqVO 列表条件 - * @return 登陆日志列表 - */ - List getLoginLogList(SysLoginLogExportReqVO reqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogService.java deleted file mode 100644 index 1397a65..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogService.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.logger; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.operatelog.core.service.OperateLogFrameworkService; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; - -import java.util.List; - -/** - * 操作日志 Service 接口 - */ -public interface SysOperateLogService extends OperateLogFrameworkService { - - /** - * 获得操作日志分页列表 - * - * @param reqVO 分页条件 - * @return 操作日志分页列表 - */ - PageResult getOperateLogPage(SysOperateLogPageReqVO reqVO); - - /** - * 获得操作日志列表 - * - * @param reqVO 列表条件 - * @return 日志列表 - */ - List getOperateLogs(SysOperateLogExportReqVO reqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysLoginLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysLoginLogServiceImpl.java deleted file mode 100644 index 7b72246..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysLoginLogServiceImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.logger.impl; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.dashboard.modules.system.convert.logger.SysLoginLogConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysLoginLogMapper; -import cn.iocoder.dashboard.modules.system.service.logger.SysLoginLogService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 登陆日志 Service 实现 - */ -@Service -public class SysLoginLogServiceImpl implements SysLoginLogService { - - @Resource - private SysLoginLogMapper loginLogMapper; - - @Override - public void createLoginLog(SysLoginLogCreateReqVO reqVO) { - SysLoginLogDO loginLog = SysLoginLogConvert.INSTANCE.convert(reqVO); - loginLogMapper.insert(loginLog); - } - - @Override - public PageResult getLoginLogPage(SysLoginLogPageReqVO reqVO) { - return loginLogMapper.selectPage(reqVO); - } - - @Override - public List getLoginLogList(SysLoginLogExportReqVO reqVO) { - return loginLogMapper.selectList(reqVO); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java deleted file mode 100644 index 04d908c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.logger.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysOperateLogMapper; -import cn.iocoder.dashboard.modules.system.service.logger.SysOperateLogService; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import cn.iocoder.yudao.framework.common.util.string.StrUtils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.scheduling.annotation.AsyncResult; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.Future; - -import static cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; -import static cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO.RESULT_MAX_LENGTH; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; - -@Service -@Slf4j -public class SysOperateLogServiceImpl implements SysOperateLogService { - - @Resource - private SysOperateLogMapper operateLogMapper; - - @Resource - private SysUserService userService; - - @Override - @Async - public Future createOperateLogAsync(OperateLogCreateReqDTO reqVO) { - boolean success = false; - try { - SysOperateLogDO logDO = SysOperateLogConvert.INSTANCE.convert(reqVO); - logDO.setJavaMethodArgs(StrUtils.maxLength(logDO.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH)); - logDO.setResultData(StrUtils.maxLength(logDO.getResultData(), RESULT_MAX_LENGTH)); - success = operateLogMapper.insert(logDO) == 1; - } catch (Throwable throwable) { - // 仅仅打印日志,不对外抛出。原因是,还是要保留现场数据。 - log.error("[createOperateLogAsync][记录操作日志异常,日志为 ({})]", reqVO, throwable); - } - return new AsyncResult<>(success); - } - - @Override - public PageResult getOperateLogPage(SysOperateLogPageReqVO reqVO) { - // 处理基于用户昵称的查询 - Collection userIds = null; - if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { - userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId); - if (CollUtil.isEmpty(userIds)) { - return PageResult.empty(); - } - } - // 查询分页 - return operateLogMapper.selectPage(reqVO, userIds); - } - - @Override - public List getOperateLogs(SysOperateLogExportReqVO reqVO) { - // 处理基于用户昵称的查询 - Collection userIds = null; - if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { - userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId); - if (CollUtil.isEmpty(userIds)) { - return Collections.emptyList(); - } - } - // 查询列表 - return operateLogMapper.selectList(reqVO, userIds); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeService.java deleted file mode 100644 index 9e41466..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeService.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.notice; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.notice.SysNoticeDO; - -/** - * 通知公告 Service 接口 - */ -public interface SysNoticeService { - - /** - * 创建岗位公告公告 - * - * @param reqVO 岗位公告公告信息 - * @return 岗位公告公告编号 - */ - Long createNotice(SysNoticeCreateReqVO reqVO); - - /** - * 更新岗位公告公告 - * - * @param reqVO 岗位公告公告信息 - */ - void updateNotice(SysNoticeUpdateReqVO reqVO); - - /** - * 删除岗位公告公告信息 - * - * @param id 岗位公告公告编号 - */ - void deleteNotice(Long id); - - /** - * 获得岗位公告公告分页列表 - * - * @param reqVO 分页条件 - * @return 部门分页列表 - */ - PageResult pageNotices(SysNoticePageReqVO reqVO); - - /** - * 获得岗位公告公告信息 - * - * @param id 岗位公告公告编号 - * @return 岗位公告公告信息 - */ - SysNoticeDO getNotice(Long id); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/impl/SysNoticeServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/impl/SysNoticeServiceImpl.java deleted file mode 100644 index d08a0fa..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/notice/impl/SysNoticeServiceImpl.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.notice.impl; - -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.convert.notice.SysNoticeConvert; -import cn.iocoder.dashboard.modules.system.dal.mysql.notice.SysNoticeMapper; -import cn.iocoder.dashboard.modules.system.dal.dataobject.notice.SysNoticeDO; -import cn.iocoder.dashboard.modules.system.service.notice.SysNoticeService; -import com.google.common.annotations.VisibleForTesting; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.NOTICE_NOT_FOUND; - -/** - * 通知公告 Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class SysNoticeServiceImpl implements SysNoticeService { - - @Resource - private SysNoticeMapper noticeMapper; - - @Override - public Long createNotice(SysNoticeCreateReqVO reqVO) { - SysNoticeDO notice = SysNoticeConvert.INSTANCE.convert(reqVO); - noticeMapper.insert(notice); - return notice.getId(); - } - - @Override - public void updateNotice(SysNoticeUpdateReqVO reqVO) { - // 校验是否存在 - this.checkNoticeExists(reqVO.getId()); - // 更新通知公告 - SysNoticeDO updateObj = SysNoticeConvert.INSTANCE.convert(reqVO); - noticeMapper.updateById(updateObj); - } - - @Override - public void deleteNotice(Long id) { - // 校验是否存在 - this.checkNoticeExists(id); - // 删除通知公告 - noticeMapper.deleteById(id); - } - - @Override - public PageResult pageNotices(SysNoticePageReqVO reqVO) { - return noticeMapper.selectPage(reqVO); - } - - @Override - public SysNoticeDO getNotice(Long id) { - return noticeMapper.selectById(id); - } - - @VisibleForTesting - public void checkNoticeExists(Long id) { - if (id == null) { - return; - } - SysNoticeDO notice = noticeMapper.selectById(id); - if (notice == null) { - throw ServiceExceptionUtil.exception(NOTICE_NOT_FOUND); - } - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuService.java deleted file mode 100644 index 6e84007..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuService.java +++ /dev/null @@ -1,100 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.permission; - -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; - -import java.util.Collection; -import java.util.List; - -/** - * 菜单 Service 接口 - * - * @author 芋道源码 - */ -public interface SysMenuService { - - /** - * 初始化菜单的本地缓存 - */ - void initLocalCache(); - - /** - * 创建菜单 - * - * @param reqVO 菜单信息 - * @return 创建出来的菜单编号 - */ - Long createMenu(SysMenuCreateReqVO reqVO); - - /** - * 更新菜单 - * - * @param reqVO 菜单信息 - */ - void updateMenu(SysMenuUpdateReqVO reqVO); - - /** - * 删除菜单 - * - * @param id 菜单编号 - */ - void deleteMenu(Long id); - - /** - * 获得所有菜单列表 - * - * @return 菜单列表 - */ - List getMenus(); - - /** - * 筛选菜单列表 - * - * @param reqVO 筛选条件请求 VO - * @return 菜单列表 - */ - List getMenus(SysMenuListReqVO reqVO); - - /** - * 获得所有菜单,从缓存中 - * - * 任一参数为空时,则返回为空 - * - * @param menuTypes 菜单类型数组 - * @param menusStatuses 菜单状态数组 - * @return 菜单列表 - */ - List listMenusFromCache(Collection menuTypes, Collection menusStatuses); - - /** - * 获得指定编号的菜单数组,从缓存中 - * - * 任一参数为空时,则返回为空 - * - * @param menuIds 菜单编号数组 - * @param menuTypes 菜单类型数组 - * @param menusStatuses 菜单状态数组 - * @return 菜单数组 - */ - List listMenusFromCache(Collection menuIds, Collection menuTypes, - Collection menusStatuses); - - /** - * 获得权限对应的菜单数组 - * - * @param permission 权限标识 - * @return 数组 - */ - List getMenuListByPermissionFromCache(String permission); - - /** - * 获得菜单 - * - * @param id 菜单编号 - * @return 菜单 - */ - SysMenuDO getMenu(Long id); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionService.java deleted file mode 100644 index ed1426c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionService.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.permission; - -import cn.iocoder.yudao.framework.security.core.service.SecurityPermissionFrameworkService; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; -import org.springframework.lang.Nullable; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -/** - * 权限 Service 接口 - * - * 提供用户-角色、角色-菜单、角色-部门的关联权限处理 - * - * @author 芋道源码 - */ -public interface SysPermissionService extends SecurityPermissionFrameworkService { - - /** - * 初始化权限的本地缓存 - */ - void initLocalCache(); - - /** - * 获得角色们拥有的菜单列表,从缓存中获取 - * - * 任一参数为空时,则返回为空 - * - * @param roleIds 角色编号数组 - * @param menuTypes 菜单类型数组 - * @param menusStatuses 菜单状态数组 - * @return 菜单列表 - */ - List getRoleMenusFromCache(Collection roleIds, Collection menuTypes, - Collection menusStatuses); - - /** - * 获得用户拥有的角色编号集合 - * - * @param userId 用户编号 - * @param roleStatuses 角色状态集合. 允许为空,为空时不过滤 - * @return 角色编号集合 - */ - Set getUserRoleIds(Long userId, @Nullable Collection roleStatuses); - - /** - * 获得角色拥有的菜单编号集合 - * - * @param roleId 角色编号 - * @return 菜单编号集合 - */ - Set listRoleMenuIds(Long roleId); - - /** - * 设置角色菜单 - * - * @param roleId 角色编号 - * @param menuIds 菜单编号集合 - */ - void assignRoleMenu(Long roleId, Set menuIds); - - /** - * 获得用户拥有的角色编号集合 - * - * @param userId 用户编号 - * @return 角色编号集合 - */ - Set listUserRoleIs(Long userId); - - /** - * 设置用户角色 - * - * @param userId 角色编号 - * @param roleIds 角色编号集合 - */ - void assignUserRole(Long userId, Set roleIds); - - /** - * 设置角色的数据权限 - * - * @param roleId 角色编号 - * @param dataScope 数据范围 - * @param dataScopeDeptIds 部门编号数组 - */ - void assignRoleDataScope(Long roleId, Integer dataScope, Set dataScopeDeptIds); - - /** - * 处理角色删除时,删除关联授权数据 - * - * @param roleId 角色编号 - */ - void processRoleDeleted(Long roleId); - - /** - * 处理菜单删除时,删除关联授权数据 - * - * @param menuId 菜单编号 - */ - void processMenuDeleted(Long menuId); - - /** - * 处理用户删除是,删除关联授权数据 - * - * @param userId 用户编号 - */ - void processUserDeleted(Long userId); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleService.java deleted file mode 100644 index 1e3fd95..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleService.java +++ /dev/null @@ -1,132 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.permission; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; -import org.springframework.lang.Nullable; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -/** - * 角色 Service 接口 - * - * @author 芋道源码 - */ -public interface SysRoleService { - - /** - * 初始化角色的本地缓存 - */ - void initLocalCache(); - - /** - * 创建角色 - * - * @param reqVO 创建角色信息 - * @return 角色编号 - */ - Long createRole(SysRoleCreateReqVO reqVO); - - /** - * 更新角色 - * - * @param reqVO 更新角色信息 - */ - void updateRole(SysRoleUpdateReqVO reqVO); - - /** - * 删除角色 - * - * @param id 角色编号 - */ - void deleteRole(Long id); - - /** - * 更新角色状态 - * - * @param id 角色编号 - * @param status 状态 - */ - void updateRoleStatus(Long id, Integer status); - - /** - * 设置角色的数据权限 - * - * @param id 角色编号 - * @param dataScope 数据范围 - * @param dataScopeDeptIds 部门编号数组 - */ - void updateRoleDataScope(Long id, Integer dataScope, Set dataScopeDeptIds); - - /** - * 获得角色,从缓存中 - * - * @param id 角色编号 - * @return 角色 - */ - SysRoleDO getRoleFromCache(Long id); - - /** - * 获得角色列表 - * - * @param statuses 筛选的状态。允许空,空时不筛选 - * @return 角色列表 - */ - List getRoles(@Nullable Collection statuses); - - /** - * 获得角色数组,从缓存中 - * - * @param ids 角色编号数组 - * @return 角色数组 - */ - List getRolesFromCache(Collection ids); - - /** - * 判断角色数组中,是否有管理员 - * - * @param roleList 角色数组 - * @return 是否有管理员 - */ - boolean hasAnyAdmin(Collection roleList); - - /** - * 判断角色编号数组中,是否有管理员 - * - * @param ids 角色编号数组 - * @return 是否有管理员 - */ - default boolean hasAnyAdmin(Set ids) { - return hasAnyAdmin(getRolesFromCache(ids)); - } - - /** - * 获得角色 - * - * @param id 角色编号 - * @return 角色 - */ - SysRoleDO getRole(Long id); - - /** - * 获得角色分页 - * - * @param reqVO 角色分页查询 - * @return 角色分页结果 - */ - PageResult getRolePage(SysRolePageReqVO reqVO); - - /** - * 获得角色列表 - * - * @param reqVO 列表查询 - * @return 角色列表 - */ - List getRoles(SysRoleExportReqVO reqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java deleted file mode 100644 index 37fc180..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java +++ /dev/null @@ -1,311 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.permission.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.dashboard.modules.system.convert.permission.SysMenuConvert; -import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysMenuMapper; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.dashboard.modules.system.enums.permission.MenuIdEnum; -import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; -import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysMenuProducer; -import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; -import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.*; -import java.util.stream.Collectors; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; - -/** - * 菜单 Service 实现 - * - * @author 芋道源码 - */ -@Service -@Slf4j -public class SysMenuServiceImpl implements SysMenuService { - - /** - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 - */ - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; - - /** - * 菜单缓存 - * key:菜单编号 - * - * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 - */ - private volatile Map menuCache; - /** - * 权限与菜单缓存 - * key:权限 {@link SysMenuDO#getPermission()} - * value:SysMenuDO 数组,因为一个权限可能对应多个 SysMenuDO 对象 - * - * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 - */ - private volatile Multimap permissionMenuCache; - /** - * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 - */ - private volatile Date maxUpdateTime; - - @Resource - private SysMenuMapper menuMapper; - @Resource - private SysPermissionService permissionService; - - @Resource - private SysMenuProducer menuProducer; - - /** - * 初始化 {@link #menuCache} 和 {@link #permissionMenuCache} 缓存 - */ - @Override - @PostConstruct - public synchronized void initLocalCache() { - // 获取菜单列表,如果有更新 - List menuList = this.loadMenuIfUpdate(maxUpdateTime); - if (CollUtil.isEmpty(menuList)) { - return; - } - - // 构建缓存 - ImmutableMap.Builder menuCacheBuilder = ImmutableMap.builder(); - ImmutableMultimap.Builder permMenuCacheBuilder = ImmutableMultimap.builder(); - menuList.forEach(menuDO -> { - menuCacheBuilder.put(menuDO.getId(), menuDO); - permMenuCacheBuilder.put(menuDO.getPermission(), menuDO); - }); - menuCache = menuCacheBuilder.build(); - permissionMenuCache = permMenuCacheBuilder.build(); - assert menuList.size() > 0; // 断言,避免告警 - maxUpdateTime = menuList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); - log.info("[initLocalCache][缓存菜单,数量为:{}]", menuList.size()); - } - - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) - public void schedulePeriodicRefresh() { - initLocalCache(); - } - - /** - * 如果菜单发生变化,从数据库中获取最新的全量菜单。 - * 如果未发生变化,则返回空 - * - * @param maxUpdateTime 当前菜单的最大更新时间 - * @return 菜单列表 - */ - private List loadMenuIfUpdate(Date maxUpdateTime) { - // 第一步,判断是否要更新。 - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 - log.info("[loadMenuIfUpdate][首次加载全量菜单]"); - } else { // 判断数据库中是否有更新的菜单 - if (!menuMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { - return null; - } - log.info("[loadMenuIfUpdate][增量加载全量菜单]"); - } - // 第二步,如果有更新,则从数据库加载所有菜单 - return menuMapper.selectList(); - } - - @Override - public Long createMenu(SysMenuCreateReqVO reqVO) { - // 校验父菜单存在 - checkParentResource(reqVO.getParentId(), null); - // 校验菜单(自己) - checkResource(reqVO.getParentId(), reqVO.getName(), null); - // 插入数据库 - SysMenuDO menu = SysMenuConvert.INSTANCE.convert(reqVO); - initMenuProperty(menu); - menuMapper.insert(menu); - // 发送刷新消息 - menuProducer.sendMenuRefreshMessage(); - // 返回 - return menu.getId(); - } - - @Override - public void updateMenu(SysMenuUpdateReqVO reqVO) { - // 校验更新的菜单是否存在 - if (menuMapper.selectById(reqVO.getId()) == null) { - throw ServiceExceptionUtil.exception(MENU_NOT_EXISTS); - } - // 校验父菜单存在 - checkParentResource(reqVO.getParentId(), reqVO.getId()); - // 校验菜单(自己) - checkResource(reqVO.getParentId(), reqVO.getName(), reqVO.getId()); - // 更新到数据库 - SysMenuDO updateObject = SysMenuConvert.INSTANCE.convert(reqVO); - initMenuProperty(updateObject); - menuMapper.updateById(updateObject); - // 发送刷新消息 - menuProducer.sendMenuRefreshMessage(); - } - - /** - * 删除菜单 - * - * @param menuId 菜单编号 - */ - @Transactional(rollbackFor = Exception.class) - public void deleteMenu(Long menuId) { - // 校验是否还有子菜单 - if (menuMapper.selectCountByParentId(menuId) > 0) { - throw ServiceExceptionUtil.exception(MENU_EXISTS_CHILDREN); - } - // 校验删除的菜单是否存在 - if (menuMapper.selectById(menuId) == null) { - throw ServiceExceptionUtil.exception(MENU_NOT_EXISTS); - } - // 标记删除 - menuMapper.deleteById(menuId); - // 删除授予给角色的权限 - permissionService.processMenuDeleted(menuId); - // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - - @Override - public void afterCommit() { - menuProducer.sendMenuRefreshMessage(); - } - - }); - } - - @Override - public List getMenus() { - return menuMapper.selectList(); - } - - @Override - public List getMenus(SysMenuListReqVO reqVO) { - return menuMapper.selectList(reqVO); - } - - @Override - public List listMenusFromCache(Collection menuTypes, Collection menusStatuses) { - // 任一一个参数为空,则返回空 - if (CollectionUtils.isAnyEmpty(menuTypes, menusStatuses)) { - return Collections.emptyList(); - } - // 创建新数组,避免缓存被修改 - return menuCache.values().stream().filter(menu -> menuTypes.contains(menu.getType()) - && menusStatuses.contains(menu.getStatus())) - .collect(Collectors.toList()); - } - - @Override - public List listMenusFromCache(Collection menuIds, Collection menuTypes, - Collection menusStatuses) { - // 任一一个参数为空,则返回空 - if (CollectionUtils.isAnyEmpty(menuIds, menuTypes, menusStatuses)) { - return Collections.emptyList(); - } - return menuCache.values().stream().filter(menu -> menuIds.contains(menu.getId()) - && menuTypes.contains(menu.getType()) - && menusStatuses.contains(menu.getStatus())) - .collect(Collectors.toList()); - } - - @Override - public List getMenuListByPermissionFromCache(String permission) { - return new ArrayList<>(permissionMenuCache.get(permission)); - } - - @Override - public SysMenuDO getMenu(Long id) { - return menuMapper.selectById(id); - } - - /** - * 校验父菜单是否合法 - * - * 1. 不能设置自己为父菜单 - * 2. 父菜单不存在 - * 3. 父菜单必须是 {@link MenuTypeEnum#MENU} 菜单类型 - * - * @param parentId 父菜单编号 - * @param childId 当前菜单编号 - */ - @VisibleForTesting - public void checkParentResource(Long parentId, Long childId) { - if (parentId == null || MenuIdEnum.ROOT.getId().equals(parentId)) { - return; - } - // 不能设置自己为父菜单 - if (parentId.equals(childId)) { - throw ServiceExceptionUtil.exception(MENU_PARENT_ERROR); - } - SysMenuDO menu = menuMapper.selectById(parentId); - // 父菜单不存在 - if (menu == null) { - throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_EXISTS); - } - // 父菜单必须是目录或者菜单类型 - if (!MenuTypeEnum.DIR.getType().equals(menu.getType()) - && !MenuTypeEnum.MENU.getType().equals(menu.getType())) { - throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_DIR_OR_MENU); - } - } - - /** - * 校验菜单是否合法 - * - * 1. 校验相同父菜单编号下,是否存在相同的菜单名 - * - * @param name 菜单名字 - * @param parentId 父菜单编号 - * @param id 菜单编号 - */ - @VisibleForTesting - public void checkResource(Long parentId, String name, Long id) { - SysMenuDO menu = menuMapper.selectByParentIdAndName(parentId, name); - if (menu == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的菜单 - if (id == null) { - throw ServiceExceptionUtil.exception(MENU_NAME_DUPLICATE); - } - if (!menu.getId().equals(id)) { - throw ServiceExceptionUtil.exception(MENU_NAME_DUPLICATE); - } - } - - /** - * 初始化菜单的通用属性。 - * - * 例如说,只有目录或者菜单类型的菜单,才设置 icon - * - * @param menu 菜单 - */ - private void initMenuProperty(SysMenuDO menu) { - // 菜单为按钮类型时,无需 component、icon、path 属性,进行置空 - if (MenuTypeEnum.BUTTON.getType().equals(menu.getType())) { - menu.setComponent(""); - menu.setIcon(""); - menu.setPath(""); - } - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java deleted file mode 100644 index 87d6d9d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java +++ /dev/null @@ -1,332 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.permission.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysRoleMenuMapper; -import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysUserRoleMapper; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleMenuDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysUserRoleDO; -import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysPermissionProducer; -import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; -import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; -import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.*; - -/** - * 权限 Service 实现类 - * - * @author 芋道源码 - */ -@Service("ss") // 使用 Spring Security 的缩写,方便食用 -@Slf4j -public class SysPermissionServiceImpl implements SysPermissionService { - - /** - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 - */ - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; - - /** - * 角色编号与菜单编号的缓存映射 - * key:角色编号 - * value:菜单编号的数组 - * - * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 - */ - private volatile Multimap roleMenuCache; - /** - * 菜单编号与角色编号的缓存映射 - * key:菜单编号 - * value:角色编号的数组 - * - * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 - */ - private volatile Multimap menuRoleCache; - /** - * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 - */ - private volatile Date maxUpdateTime; - - @Resource - private SysRoleMenuMapper roleMenuMapper; - @Resource - private SysUserRoleMapper userRoleMapper; - - @Resource - private SysRoleService roleService; - @Resource - private SysMenuService menuService; - - @Resource - private SysPermissionProducer permissionProducer; - - /** - * 初始化 {@link #roleMenuCache} 和 {@link #menuRoleCache} 缓存 - */ - @Override - @PostConstruct - public void initLocalCache() { - Date now = new Date(); - // 获取角色与菜单的关联列表,如果有更新 - List roleMenuList = this.loadRoleMenuIfUpdate(maxUpdateTime); - if (CollUtil.isEmpty(roleMenuList)) { - return; - } - - // 初始化 roleMenuCache 和 menuRoleCache 缓存 - ImmutableMultimap.Builder roleMenuCacheBuilder = ImmutableMultimap.builder(); - ImmutableMultimap.Builder menuRoleCacheBuilder = ImmutableMultimap.builder(); - roleMenuList.forEach(roleMenuDO -> { - roleMenuCacheBuilder.put(roleMenuDO.getRoleId(), roleMenuDO.getMenuId()); - menuRoleCacheBuilder.put(roleMenuDO.getMenuId(), roleMenuDO.getRoleId()); - }); - roleMenuCache = roleMenuCacheBuilder.build(); - menuRoleCache = menuRoleCacheBuilder.build(); - assert roleMenuList.size() > 0; // 断言,避免告警 - maxUpdateTime = now; - log.info("[initLocalCache][初始化角色与菜单的关联数量为 {}]", roleMenuList.size()); - } - - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) - public void schedulePeriodicRefresh() { - initLocalCache(); - } - - /** - * 如果角色与菜单的关联发生变化,从数据库中获取最新的全量角色与菜单的关联。 - * 如果未发生变化,则返回空 - * - * @param maxUpdateTime 当前角色与菜单的关联的最大更新时间 - * @return 角色与菜单的关联列表 - */ - private List loadRoleMenuIfUpdate(Date maxUpdateTime) { - // 第一步,判断是否要更新。 - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 - log.info("[loadRoleMenuIfUpdate][首次加载全量角色与菜单的关联]"); - } else { // 判断数据库中是否有更新的角色与菜单的关联 - if (Objects.isNull(roleMenuMapper.selectExistsByUpdateTimeAfter(maxUpdateTime))) { - return null; - } - log.info("[loadRoleMenuIfUpdate][增量加载全量角色与菜单的关联]"); - } - // 第二步,如果有更新,则从数据库加载所有角色与菜单的关联 - return roleMenuMapper.selectList(); - } - - @Override - public List getRoleMenusFromCache(Collection roleIds, Collection menuTypes, - Collection menusStatuses) { - // 任一一个参数为空时,不返回任何菜单 - if (CollectionUtils.isAnyEmpty(roleIds, menusStatuses, menusStatuses)) { - return Collections.emptyList(); - } - // 判断角色是否包含管理员 - List roleList = roleService.getRolesFromCache(roleIds); - boolean hasAdmin = roleService.hasAnyAdmin(roleList); - // 获得角色拥有的菜单关联 - if (hasAdmin) { // 管理员,获取到全部 - return menuService.listMenusFromCache(menuTypes, menusStatuses); - } - List menuIds = MapUtils.getList(roleMenuCache, roleIds); - return menuService.listMenusFromCache(menuIds, menuTypes, menusStatuses); - } - - @Override - public Set getUserRoleIds(Long userId, Collection roleStatuses) { - List userRoleList = userRoleMapper.selectListByUserId(userId); - // 过滤角色状态 - if (CollectionUtil.isNotEmpty(roleStatuses)) { - userRoleList.removeIf(userRoleDO -> { - SysRoleDO role = roleService.getRoleFromCache(userRoleDO.getRoleId()); - return role == null || !roleStatuses.contains(role.getStatus()); - }); - } - return CollectionUtils.convertSet(userRoleList, SysUserRoleDO::getRoleId); - } - - @Override - public Set listRoleMenuIds(Long roleId) { - // 如果是管理员的情况下,获取全部菜单编号 - SysRoleDO role = roleService.getRole(roleId); - if (roleService.hasAnyAdmin(Collections.singletonList(role))) { - return CollectionUtils.convertSet(menuService.getMenus(), SysMenuDO::getId); - } - // 如果是非管理员的情况下,获得拥有的菜单编号 - return CollectionUtils.convertSet(roleMenuMapper.selectListByRoleId(roleId), - SysRoleMenuDO::getMenuId); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void assignRoleMenu(Long roleId, Set menuIds) { - // 获得角色拥有菜单编号 - Set dbMenuIds = CollectionUtils.convertSet(roleMenuMapper.selectListByRoleId(roleId), - SysRoleMenuDO::getMenuId); - // 计算新增和删除的菜单编号 - Collection createMenuIds = CollUtil.subtract(menuIds, dbMenuIds); - Collection deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIds); - // 执行新增和删除。对于已经授权的菜单,不用做任何处理 - if (!CollectionUtil.isEmpty(createMenuIds)) { - roleMenuMapper.insertList(roleId, createMenuIds); - } - if (!CollectionUtil.isEmpty(deleteMenuIds)) { - roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds); - } - // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - - @Override - public void afterCommit() { - permissionProducer.sendRoleMenuRefreshMessage(); - } - - }); - } - - @Override - public Set listUserRoleIs(Long userId) { - return CollectionUtils.convertSet(userRoleMapper.selectListByUserId(userId), - SysUserRoleDO::getRoleId); - } - - @Override - public void assignUserRole(Long userId, Set roleIds) { - // 获得角色拥有角色编号 - Set dbRoleIds = CollectionUtils.convertSet(userRoleMapper.selectListByUserId(userId), - SysUserRoleDO::getRoleId); - // 计算新增和删除的角色编号 - Collection createRoleIds = CollUtil.subtract(roleIds, dbRoleIds); - Collection deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIds); - // 执行新增和删除。对于已经授权的角色,不用做任何处理 - if (!CollectionUtil.isEmpty(createRoleIds)) { - userRoleMapper.insertList(userId, createRoleIds); - } - if (!CollectionUtil.isEmpty(deleteMenuIds)) { - userRoleMapper.deleteListByUserIdAndRoleIdIds(userId, deleteMenuIds); - } - } - - @Override - public void assignRoleDataScope(Long roleId, Integer dataScope, Set dataScopeDeptIds) { - roleService.updateRoleDataScope(roleId, dataScope, dataScopeDeptIds); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void processRoleDeleted(Long roleId) { - // 标记删除 UserRole - userRoleMapper.deleteListByRoleId(roleId); - // 标记删除 RoleMenu - roleMenuMapper.deleteListByRoleId(roleId); - // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - - @Override - public void afterCommit() { - permissionProducer.sendRoleMenuRefreshMessage(); - } - - }); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void processMenuDeleted(Long menuId) { - roleMenuMapper.deleteListByMenuId(menuId); - // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - - @Override - public void afterCommit() { - permissionProducer.sendRoleMenuRefreshMessage(); - } - - }); - } - - @Override - public void processUserDeleted(Long userId) { - userRoleMapper.deleteListByUserId(userId); - } - - @Override - public boolean hasPermission(String permission) { - return hasAnyPermissions(permission); - } - - @Override - public boolean hasAnyPermissions(String... permissions) { - // 如果为空,说明已经有权限 - if (ArrayUtil.isEmpty(permissions)) { - return true; - } - - // 获得当前登陆的角色。如果为空,说明没有权限 - Set roleIds = SecurityFrameworkUtils.getLoginUserRoleIds(); - if (CollUtil.isEmpty(roleIds)) { - return false; - } - // 判断是否是超管。如果是,当然符合条件 - if (roleService.hasAnyAdmin(roleIds)) { - return true; - } - - // 遍历权限,判断是否有一个满足 - return Arrays.stream(permissions).anyMatch(permission -> { - List menuList = menuService.getMenuListByPermissionFromCache(permission); - // 采用严格模式,如果权限找不到对应的 Menu 的话,认为 - if (CollUtil.isEmpty(menuList)) { - return false; - } - // 获得是否拥有该权限,任一一个 - return menuList.stream().anyMatch(menu -> CollUtil.containsAny(roleIds, - menuRoleCache.get(menu.getId()))); - }); - } - - @Override - public boolean hasRole(String role) { - return hasAnyRoles(role); - } - - @Override - public boolean hasAnyRoles(String... roles) { - // 如果为空,说明已经有权限 - if (ArrayUtil.isEmpty(roles)) { - return true; - } - - // 获得当前登陆的角色。如果为空,说明没有权限 - Set roleIds = SecurityFrameworkUtils.getLoginUserRoleIds(); - if (CollUtil.isEmpty(roleIds)) { - return false; - } - // 判断是否是超管。如果是,当然符合条件 - if (roleService.hasAnyAdmin(roleIds)) { - return true; - } - Set userRoles = CollectionUtils.convertSet(roleService.getRolesFromCache(roleIds), - SysRoleDO::getCode); - return CollUtil.containsAny(userRoles, Sets.newHashSet(roles)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java deleted file mode 100644 index 3ac81b0..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java +++ /dev/null @@ -1,290 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.permission.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; -import cn.iocoder.dashboard.modules.system.convert.permission.SysRoleConvert; -import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysRoleMapper; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.dashboard.modules.system.enums.permission.RoleCodeEnum; -import cn.iocoder.dashboard.modules.system.enums.permission.SysRoleTypeEnum; -import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysRoleProducer; -import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; -import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableMap; -import lombok.extern.slf4j.Slf4j; -import org.springframework.lang.Nullable; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; -import org.springframework.util.StringUtils; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.*; -import java.util.stream.Collectors; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; - -/** - * 角色 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Slf4j -public class SysRoleServiceImpl implements SysRoleService { - - /** - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 - */ - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; - - /** - * 角色缓存 - * key:角色编号 {@link SysRoleDO#getId()} - * - * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 - */ - private volatile Map roleCache; - /** - * 缓存角色的最大更新时间,用于后续的增量轮询,判断是否有更新 - */ - private volatile Date maxUpdateTime; - - @Resource - private SysPermissionService permissionService; - - @Resource - private SysRoleMapper roleMapper; - - @Resource - private SysRoleProducer roleProducer; - - /** - * 初始化 {@link #roleCache} 缓存 - */ - @Override - @PostConstruct - public void initLocalCache() { - // 获取角色列表,如果有更新 - List roleList = this.loadRoleIfUpdate(maxUpdateTime); - if (CollUtil.isEmpty(roleList)) { - return; - } - - // 写入缓存 - ImmutableMap.Builder builder = ImmutableMap.builder(); - roleList.forEach(sysRoleDO -> builder.put(sysRoleDO.getId(), sysRoleDO)); - roleCache = builder.build(); - assert roleList.size() > 0; // 断言,避免告警 - maxUpdateTime = roleList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); - log.info("[initLocalCache][初始化 Role 数量为 {}]", roleList.size()); - } - - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) - public void schedulePeriodicRefresh() { - initLocalCache(); - } - - /** - * 如果角色发生变化,从数据库中获取最新的全量角色。 - * 如果未发生变化,则返回空 - * - * @param maxUpdateTime 当前角色的最大更新时间 - * @return 角色列表 - */ - private List loadRoleIfUpdate(Date maxUpdateTime) { - // 第一步,判断是否要更新。 - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 - log.info("[loadRoleIfUpdate][首次加载全量角色]"); - } else { // 判断数据库中是否有更新的角色 - if (!roleMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { - return null; - } - log.info("[loadRoleIfUpdate][增量加载全量角色]"); - } - // 第二步,如果有更新,则从数据库加载所有角色 - return roleMapper.selectList(); - } - - @Override - public Long createRole(SysRoleCreateReqVO reqVO) { - // 校验角色 - checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null); - // 插入到数据库 - SysRoleDO role = SysRoleConvert.INSTANCE.convert(reqVO); - role.setType(SysRoleTypeEnum.CUSTOM.getType()); - role.setStatus(CommonStatusEnum.ENABLE.getStatus()); - roleMapper.insert(role); - // 发送刷新消息 - roleProducer.sendRoleRefreshMessage(); - // 返回 - return role.getId(); - } - - @Override - public void updateRole(SysRoleUpdateReqVO reqVO) { - // 校验是否可以更新 - this.checkUpdateRole(reqVO.getId()); - // 校验角色的唯一字段是否重复 - checkDuplicateRole(reqVO.getName(), reqVO.getCode(), reqVO.getId()); - // 更新到数据库 - SysRoleDO updateObject = SysRoleConvert.INSTANCE.convert(reqVO); - roleMapper.updateById(updateObject); - // 发送刷新消息 - roleProducer.sendRoleRefreshMessage(); - } - - @Override - public void updateRoleStatus(Long id, Integer status) { - // 校验是否可以更新 - this.checkUpdateRole(id); - // 更新状态 - SysRoleDO updateObject = new SysRoleDO(); - updateObject.setId(id); - updateObject.setStatus(status); - roleMapper.updateById(updateObject); - // 发送刷新消息 - roleProducer.sendRoleRefreshMessage(); - } - - @Override - public void updateRoleDataScope(Long id, Integer dataScope, Set dataScopeDeptIds) { - // 校验是否可以更新 - checkUpdateRole(id); - // 更新数据范围 - SysRoleDO updateObject = new SysRoleDO(); - updateObject.setId(id); - updateObject.setDataScope(dataScope); - updateObject.setDataScopeDeptIds(dataScopeDeptIds); - roleMapper.updateById(updateObject); - // 发送刷新消息 - roleProducer.sendRoleRefreshMessage(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteRole(Long id) { - // 校验是否可以更新 - this.checkUpdateRole(id); - // 标记删除 - roleMapper.deleteById(id); - // 删除相关数据 - permissionService.processRoleDeleted(id); - // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - - @Override - public void afterCommit() { - roleProducer.sendRoleRefreshMessage(); - } - - }); - } - - @Override - public SysRoleDO getRoleFromCache(Long id) { - return roleCache.get(id); - } - - @Override - public List getRoles(@Nullable Collection statuses) { - return roleMapper.selectListByStatus(statuses); - } - - @Override - public List getRolesFromCache(Collection ids) { - if (CollectionUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - return roleCache.values().stream().filter(roleDO -> ids.contains(roleDO.getId())) - .collect(Collectors.toList()); - } - - @Override - public boolean hasAnyAdmin(Collection roleList) { - if (CollectionUtil.isEmpty(roleList)) { - return false; - } - return roleList.stream().anyMatch(roleDO -> RoleCodeEnum.ADMIN.getKey().equals(roleDO.getCode())); - } - - @Override - public SysRoleDO getRole(Long id) { - return roleMapper.selectById(id); - } - - @Override - public PageResult getRolePage(SysRolePageReqVO reqVO) { - return roleMapper.selectPage(reqVO); - } - - @Override - public List getRoles(SysRoleExportReqVO reqVO) { - return roleMapper.listRoles(reqVO); - } - - /** - * 校验角色的唯一字段是否重复 - * - * 1. 是否存在相同名字的角色 - * 2. 是否存在相同编码的角色 - * - * @param name 角色名字 - * @param code 角色额编码 - * @param id 角色编号 - */ - @VisibleForTesting - public void checkDuplicateRole(String name, String code, Long id) { - // 1. 该 name 名字被其它角色所使用 - SysRoleDO role = roleMapper.selectByName(name); - if (role != null && !role.getId().equals(id)) { - throw ServiceExceptionUtil.exception(ROLE_NAME_DUPLICATE, name); - } - // 2. 是否存在相同编码的角色 - if (!StringUtils.hasText(code)) { - return; - } - // 该 code 编码被其它角色所使用 - role = roleMapper.selectByCode(code); - if (role != null && !role.getId().equals(id)) { - throw ServiceExceptionUtil.exception(ROLE_CODE_DUPLICATE, code); - } - } - - /** - * 校验角色是否可以被更新 - * - * @param id 角色编号 - */ - @VisibleForTesting - public void checkUpdateRole(Long id) { - SysRoleDO roleDO = roleMapper.selectById(id); - if (roleDO == null) { - throw ServiceExceptionUtil.exception(ROLE_NOT_EXISTS); - } - // 内置角色,不允许删除 - if (SysRoleTypeEnum.SYSTEM.getType().equals(roleDO.getType())) { - throw ServiceExceptionUtil.exception(ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE); - } - } - -// @Override -// @DataScope(deptAlias = "d") -// public List selectRoleList(SysRole role) { -// return roleMapper.selectRoleList(role); -// } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java deleted file mode 100644 index 6ad0b7c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 短信渠道Service接口 - * - * @author zzf - * @date 2021/1/25 9:24 - */ -public interface SysSmsChannelService { - - /** - * 初始化短信客户端 - */ - void initSmsClients(); - - /** - * 创建短信渠道 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createSmsChannel(@Valid SysSmsChannelCreateReqVO createReqVO); - - /** - * 更新短信渠道 - * - * @param updateReqVO 更新信息 - */ - void updateSmsChannel(@Valid SysSmsChannelUpdateReqVO updateReqVO); - - /** - * 删除短信渠道 - * - * @param id 编号 - */ - void deleteSmsChannel(Long id); - - /** - * 获得短信渠道 - * - * @param id 编号 - * @return 短信渠道 - */ - SysSmsChannelDO getSmsChannel(Long id); - - /** - * 获得短信渠道列表 - * - * @param ids 编号 - * @return 短信渠道列表 - */ - List getSmsChannelList(Collection ids); - - /** - * 获得所有短信渠道列表 - * - * @return 短信渠道列表 - */ - List getSmsChannelList(); - - /** - * 获得短信渠道分页 - * - * @param pageReqVO 分页查询 - * @return 短信渠道分页 - */ - PageResult getSmsChannelPage(SysSmsChannelPageReqVO pageReqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java deleted file mode 100644 index 8676a34..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; - -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 短信日志 Service 实现类 - * - * @author zzf - * @date 13:48 2021/3/2 - */ -public interface SysSmsLogService { - - /** - * 创建短信日志 - * - * @param mobile 手机号 - * @param userId 用户编号 - * @param userType 用户类型 - * @param isSend 是否发送 - * @param template 短信模板 - * @param templateContent 短信内容 - * @param templateParams 短信参数 - * @return 发送日志编号 - */ - Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, - SysSmsTemplateDO template, String templateContent, Map templateParams); - - /** - * 更新日志的发送结果 - * - * @param id 日志编号 - * @param sendCode 发送结果的编码 - * @param sendMsg 发送结果的提示 - * @param apiSendCode 短信 API 发送结果的编码 - * @param apiSendMsg 短信 API 发送失败的提示 - * @param apiRequestId 短信 API 发送返回的唯一请求 ID - * @param apiSerialNo 短信 API 发送返回的序号 - */ - void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, - String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo); - - /** - * 更新日志的接收结果 - * - * @param id 日志编号 - * @param success 是否接收成功 - * @param receiveTime 用户接收时间 - * @param apiReceiveCode API 接收结果的编码 - * @param apiReceiveMsg API 接收结果的说明 - */ - void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg); - - /** - * 获得短信日志分页 - * - * @param pageReqVO 分页查询 - * @return 短信日志分页 - */ - PageResult getSmsLogPage(SysSmsLogPageReqVO pageReqVO); - - /** - * 获得短信日志列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 短信日志列表 - */ - List getSmsLogList(SysSmsLogExportReqVO exportReqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java deleted file mode 100644 index f568b11..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms; - -import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage; - -import java.util.List; -import java.util.Map; - -/** - * 短信Service接口 - * 只支持异步,因此没有返回值 - * - * @author zzf - * @date 2021/1/25 9:24 - */ -public interface SysSmsService { - - /** - * 发送单条短信给用户(管理员) - * - * 在 mobile 为空时,使用 userId 加载对应管理员的手机号 - * - * @param mobile 手机号 - * @param userId 用户编号 - * @param templateCode 短信模板编号 - * @param templateParams 短信模板参数 - * @return 发送日志编号 - */ - Long sendSingleSmsToAdmin(String mobile, Long userId, - String templateCode, Map templateParams); - - /** - * 发送单条短信给用户(会员) - * - * 在 mobile 为空时,使用 userId 加载对应会员的手机号 - * - * @param mobile 手机号 - * @param userId 用户编号 - * @param templateCode 短信模板编号 - * @param templateParams 短信模板参数 - * @return 发送日志编号 - */ - Long sendSingleSmsToMember(String mobile, Long userId, - String templateCode, Map templateParams); - - Long sendSingleSms(String mobile, Long userId, Integer userType, - String templateCode, Map templateParams); - - void sendBatchSms(List mobiles, List userIds, Integer userType, - String templateCode, Map templateParams); - - void doSendSms(SysSmsSendMessage message); - - /** - * 接收短信的接收结果 - * - * @param channelCode 渠道编码 - * @param text 结果内容 - * @throws Throwable 处理失败时,抛出异常 - */ - void receiveSmsStatus(String channelCode, String text) throws Throwable; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateService.java deleted file mode 100644 index 52c8bde..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateService.java +++ /dev/null @@ -1,115 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 短信模板 Service 接口 - * - * @author zzf - * @date 2021/1/25 9:24 - */ -public interface SysSmsTemplateService { - - /** - * 初始化短信模板的本地缓存 - */ - void initLocalCache(); - - /** - * 获得短信模板 - * - * @param code 模板编码 - * @return 短信模板 - */ - SysSmsTemplateDO getSmsTemplateByCode(String code); - - /** - * 获得短信模板,从缓存中 - * - * @param code 模板编码 - * @return 短信模板 - */ - SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code); - - /** - * 格式化短信内容 - * - * @param content 短信模板的内容 - * @param params 内容的参数 - * @return 格式化后的内容 - */ - String formatSmsTemplateContent(String content, Map params); - - /** - * 创建短信模板 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createSmsTemplate(@Valid SysSmsTemplateCreateReqVO createReqVO); - - /** - * 更新短信模板 - * - * @param updateReqVO 更新信息 - */ - void updateSmsTemplate(@Valid SysSmsTemplateUpdateReqVO updateReqVO); - - /** - * 删除短信模板 - * - * @param id 编号 - */ - void deleteSmsTemplate(Long id); - - /** - * 获得短信模板 - * - * @param id 编号 - * @return 短信模板 - */ - SysSmsTemplateDO getSmsTemplate(Long id); - - /** - * 获得短信模板列表 - * - * @param ids 编号 - * @return 短信模板列表 - */ - List getSmsTemplateList(Collection ids); - - /** - * 获得短信模板分页 - * - * @param pageReqVO 分页查询 - * @return 短信模板分页 - */ - PageResult getSmsTemplatePage(SysSmsTemplatePageReqVO pageReqVO); - - /** - * 获得短信模板列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 短信模板分页 - */ - List getSmsTemplateList(SysSmsTemplateExportReqVO exportReqVO); - - /** - * 获得指定短信渠道下的短信模板数量 - * - * @param channelId 短信渠道编号 - * @return 数量 - */ - Integer countByChannelId(Long channelId); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java deleted file mode 100644 index f0fe411..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java +++ /dev/null @@ -1,172 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; -import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; -import cn.iocoder.dashboard.modules.system.convert.sms.SysSmsChannelConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsChannelMapper; -import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.Collection; -import java.util.Comparator; -import java.util.Date; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; - -/** - * 短信渠道Service实现类 - * - * @author zzf - * @date 2021/1/25 9:25 - */ -@Service -@Slf4j -public class SysSmsChannelServiceImpl implements SysSmsChannelService { - - /** - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 - */ - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; - - /** - * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 - */ - private volatile Date maxUpdateTime; - - @Resource - private SmsClientFactory smsClientFactory; - - @Resource - private SysSmsChannelMapper smsChannelMapper; - - @Resource - private SysSmsTemplateService smsTemplateService; - - @Resource - private SysSmsProducer smsProducer; - - @Override - @PostConstruct - public void initSmsClients() { - // 获取短信渠道,如果有更新 - List smsChannels = this.loadSmsChannelIfUpdate(maxUpdateTime); - if (CollUtil.isEmpty(smsChannels)) { - return; - } - - // 创建或更新短信 Client - List propertiesList = SysSmsChannelConvert.INSTANCE.convertList02(smsChannels); - propertiesList.forEach(properties -> smsClientFactory.createOrUpdateSmsClient(properties)); - - // 写入缓存 - assert smsChannels.size() > 0; // 断言,避免告警 - maxUpdateTime = smsChannels.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); - log.info("[initSmsClients][初始化 SmsChannel 数量为 {}]", smsChannels.size()); - } - - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) - public void schedulePeriodicRefresh() { - initSmsClients(); - } - - /** - * 如果短信渠道发生变化,从数据库中获取最新的全量短信渠道。 - * 如果未发生变化,则返回空 - * - * @param maxUpdateTime 当前短信渠道的最大更新时间 - * @return 短信渠道列表 - */ - private List loadSmsChannelIfUpdate(Date maxUpdateTime) { - // 第一步,判断是否要更新。 - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 - log.info("[loadSmsChannelIfUpdate][首次加载全量短信渠道]"); - } else { // 判断数据库中是否有更新的短信渠道 - if (smsChannelMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) { - return null; - } - log.info("[loadSmsChannelIfUpdate][增量加载全量短信渠道]"); - } - // 第二步,如果有更新,则从数据库加载所有短信渠道 - return smsChannelMapper.selectList(); - } - - @Override - public Long createSmsChannel(SysSmsChannelCreateReqVO createReqVO) { - // 插入 - SysSmsChannelDO smsChannel = SysSmsChannelConvert.INSTANCE.convert(createReqVO); - smsChannelMapper.insert(smsChannel); - // 发送刷新消息 - smsProducer.sendSmsChannelRefreshMessage(); - // 返回 - return smsChannel.getId(); - } - - @Override - public void updateSmsChannel(SysSmsChannelUpdateReqVO updateReqVO) { - // 校验存在 - this.validateSmsChannelExists(updateReqVO.getId()); - // 更新 - SysSmsChannelDO updateObj = SysSmsChannelConvert.INSTANCE.convert(updateReqVO); - smsChannelMapper.updateById(updateObj); - // 发送刷新消息 - smsProducer.sendSmsChannelRefreshMessage(); - } - - @Override - public void deleteSmsChannel(Long id) { - // 校验存在 - this.validateSmsChannelExists(id); - // 校验是否有字典数据 - if (smsTemplateService.countByChannelId(id) > 0) { - throw exception(SMS_CHANNEL_HAS_CHILDREN); - } - // 删除 - smsChannelMapper.deleteById(id); - // 发送刷新消息 - smsProducer.sendSmsChannelRefreshMessage(); - } - - private void validateSmsChannelExists(Long id) { - if (smsChannelMapper.selectById(id) == null) { - throw exception(SMS_CHANNEL_NOT_EXISTS); - } - } - - @Override - public SysSmsChannelDO getSmsChannel(Long id) { - return smsChannelMapper.selectById(id); - } - - @Override - public List getSmsChannelList(Collection ids) { - return smsChannelMapper.selectBatchIds(ids); - } - - @Override - public List getSmsChannelList() { - return smsChannelMapper.selectList(); - } - - @Override - public PageResult getSmsChannelPage(SysSmsChannelPageReqVO pageReqVO) { - return smsChannelMapper.selectPage(pageReqVO); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java deleted file mode 100644 index cda9c43..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms.impl; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsLogMapper; -import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsReceiveStatusEnum; -import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - * 短信日志 Service 实现类 - * - * @author zzf - * @date 2021/1/25 9:25 - */ -@Slf4j -@Service -public class SysSmsLogServiceImpl implements SysSmsLogService { - - @Resource - private SysSmsLogMapper smsLogMapper; - - @Override - public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, - SysSmsTemplateDO template, String templateContent, Map templateParams) { - SysSmsLogDO.SysSmsLogDOBuilder logBuilder = SysSmsLogDO.builder(); - // 根据是否要发送,设置状态 - logBuilder.sendStatus(Objects.equals(isSend, true) ? SysSmsSendStatusEnum.INIT.getStatus() - : SysSmsSendStatusEnum.IGNORE.getStatus()); - // 设置手机相关字段 - logBuilder.mobile(mobile).userId(userId).userType(userType); - // 设置模板相关字段 - logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType()); - logBuilder.templateContent(templateContent).templateParams(templateParams).apiTemplateId(template.getApiTemplateId()); - // 设置渠道相关字段 - logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode()); - // 设置接收相关字段 - logBuilder.receiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); - - // 插入数据库 - SysSmsLogDO logDO = logBuilder.build(); - smsLogMapper.insert(logDO); - return logDO.getId(); - } - - @Override - public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, - String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo) { - SysSmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS - : SysSmsSendStatusEnum.FAILURE; - smsLogMapper.updateById(SysSmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()).sendTime(new Date()) - .sendCode(sendCode).sendMsg(sendMsg).apiSendCode(apiSendCode).apiSendMsg(apiSendMsg) - .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build()); - } - - @Override - public void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg) { - SysSmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? SysSmsReceiveStatusEnum.SUCCESS - : SysSmsReceiveStatusEnum.FAILURE; - smsLogMapper.updateById(SysSmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()).receiveTime(receiveTime) - .apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); - } - - @Override - public PageResult getSmsLogPage(SysSmsLogPageReqVO pageReqVO) { - return smsLogMapper.selectPage(pageReqVO); - } - - @Override - public List getSmsLogList(SysSmsLogExportReqVO exportReqVO) { - return smsLogMapper.selectList(exportReqVO); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java deleted file mode 100644 index 7e2f350..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java +++ /dev/null @@ -1,171 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.core.KeyValue; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.sms.core.client.SmsClient; -import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; -import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; -import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO; -import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage; -import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import com.google.common.annotations.VisibleForTesting; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.util.Assert; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; - -/** - * 短信日志Service实现类 - * - * @author zzf - * @date 2021/1/25 9:25 - */ -@Service -@Slf4j -public class SysSmsServiceImpl implements SysSmsService { - - @Resource - private SysSmsTemplateService smsTemplateService; - @Resource - private SysSmsLogService smsLogService; - @Resource - private SysSmsProducer smsProducer; - @Resource - private SmsClientFactory smsClientFactory; - - @Resource - private SysUserService userService; - - @Override - public Long sendSingleSmsToAdmin(String mobile, Long userId, String templateCode, Map templateParams) { - // 如果 mobile 为空,则加载用户编号对应的手机号 - if (StrUtil.isEmpty(mobile)) { - SysUserDO user = userService.getUser(userId); - if (user != null) { - mobile = user.getMobile(); - } - } - // 执行发送 - return this.sendSingleSms(mobile, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams); - } - - @Override - public Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map templateParams) { - throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); - } - - @Override - public Long sendSingleSms(String mobile, Long userId, Integer userType, - String templateCode, Map templateParams) { - // 校验短信模板是否合法 - SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode); - // 校验手机号码是否存在 - mobile = this.checkMobile(mobile); - // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志 - List> newTemplateParams = this.buildTemplateParams(template, templateParams); - - // 创建发送日志 - Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); // 如果模板被禁用,则不发送短信,只记录日志 - String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams); - Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams); - - // 发送 MQ 消息,异步执行发送短信 - if (isSend) { - smsProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(), template.getApiTemplateId(), newTemplateParams); - } - return sendLogId; - } - - @Override - public void sendBatchSms(List mobiles, List userIds, Integer userType, - String templateCode, Map templateParams) { - throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); - } - - @VisibleForTesting - public SysSmsTemplateDO checkSmsTemplateValid(String templateCode) { - // 获得短信模板。考虑到效率,从缓存中获取 - SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode); - // 短信模板不存在 - if (template == null) { - throw exception(SMS_TEMPLATE_NOT_EXISTS); - } - return template; - } - - /** - * 将参数模板,处理成有序的 KeyValue 数组 - * - * 原因是,部分短信平台并不是使用 key 作为参数,而是数组下标,例如说腾讯云 https://cloud.tencent.com/document/product/382/39023 - * - * @param template 短信模板 - * @param templateParams 原始参数 - * @return 处理后的参数 - */ - @VisibleForTesting - public List> buildTemplateParams(SysSmsTemplateDO template, Map templateParams) { - return template.getParams().stream().map(key -> { - Object value = templateParams.get(key); - if (value == null) { - throw exception(SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, key); - } - return new KeyValue<>(key, value); - }).collect(Collectors.toList()); - } - - @VisibleForTesting - public String checkMobile(String mobile) { - if (StrUtil.isEmpty(mobile)) { - throw exception(SMS_SEND_MOBILE_NOT_EXISTS); - } - return mobile; - } - - @Override - public void doSendSms(SysSmsSendMessage message) { - // 获得渠道对应的 SmsClient 客户端 - SmsClient smsClient = smsClientFactory.getSmsClient(message.getChannelId()); - Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", message.getChannelId())); - // 发送短信 - SmsCommonResult sendResult = smsClient.sendSms(message.getLogId(), message.getMobile(), - message.getApiTemplateId(), message.getTemplateParams()); - smsLogService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(), - sendResult.getApiCode(), sendResult.getApiMsg(), sendResult.getApiRequestId(), - sendResult.getData() != null ? sendResult.getData().getSerialNo() : null); - } - - @Override - public void receiveSmsStatus(String channelCode, String text) throws Throwable { - // 获得渠道对应的 SmsClient 客户端 - SmsClient smsClient = smsClientFactory.getSmsClient(channelCode); - Assert.notNull(smsClient, String.format("短信客户端(%s) 不存在", channelCode)); - // 解析内容 - List receiveResults = smsClient.parseSmsReceiveStatus(text); - if (CollUtil.isEmpty(receiveResults)) { - return; - } - // 更新短信日志的接收结果. 因为量一般不打,所以先使用 for 循环更新 - receiveResults.forEach(result -> { - smsLogService.updateSmsReceiveResult(result.getLogId(), result.getSuccess(), result.getReceiveTime(), - result.getErrorCode(), result.getErrorCode()); - }); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java deleted file mode 100644 index 2e04693..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java +++ /dev/null @@ -1,275 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ReUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.sms.core.client.SmsClient; -import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; -import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; -import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; -import cn.iocoder.dashboard.modules.system.convert.sms.SysSmsTemplateConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper; -import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableMap; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; -import org.springframework.util.Assert; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.*; -import java.util.regex.Pattern; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; - -/** - * 短信模板Service实现类 - * - * @author zzf - * @date 2021/1/25 9:25 - */ -@Service -@Slf4j -public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { - - /** - * 正则表达式,匹配 {} 中的变量 - */ - private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}"); - - /** - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 - */ - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; - - /** - * 短信模板缓存 - * key:短信模板编码 {@link SysSmsTemplateDO#getCode()} - * - * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 - */ - private volatile Map smsTemplateCache; - /** - * 缓存短信模板的最大更新时间,用于后续的增量轮询,判断是否有更新 - */ - private volatile Date maxUpdateTime; - - @Resource - private SysSmsTemplateMapper smsTemplateMapper; - - @Resource - private SysSmsChannelService smsChannelService; - - @Resource - private SmsClientFactory smsClientFactory; - - @Resource - private SysSmsProducer smsProducer; - - /** - * 初始化 {@link #smsTemplateCache} 缓存 - */ - @Override - @PostConstruct - public void initLocalCache() { - // 获取短信模板列表,如果有更新 - List smsTemplateList = this.loadSmsTemplateIfUpdate(maxUpdateTime); - if (CollUtil.isEmpty(smsTemplateList)) { - return; - } - - // 写入缓存 - ImmutableMap.Builder builder = ImmutableMap.builder(); - smsTemplateList.forEach(sysSmsTemplateDO -> builder.put(sysSmsTemplateDO.getCode(), sysSmsTemplateDO)); - smsTemplateCache = builder.build(); - assert smsTemplateList.size() > 0; // 断言,避免告警 - maxUpdateTime = smsTemplateList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); - log.info("[initLocalCache][初始化 SmsTemplate 数量为 {}]", smsTemplateList.size()); - } - - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) - public void schedulePeriodicRefresh() { - initLocalCache(); - } - - /** - * 如果短信模板发生变化,从数据库中获取最新的全量短信模板。 - * 如果未发生变化,则返回空 - * - * @param maxUpdateTime 当前短信模板的最大更新时间 - * @return 短信模板列表 - */ - private List loadSmsTemplateIfUpdate(Date maxUpdateTime) { - // 第一步,判断是否要更新。 - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 - log.info("[loadSmsTemplateIfUpdate][首次加载全量短信模板]"); - } else { // 判断数据库中是否有更新的短信模板 - if (smsTemplateMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) { - return null; - } - log.info("[loadSmsTemplateIfUpdate][增量加载全量短信模板]"); - } - // 第二步,如果有更新,则从数据库加载所有短信模板 - return smsTemplateMapper.selectList(); - } - - @Override - public SysSmsTemplateDO getSmsTemplateByCode(String code) { - return smsTemplateMapper.selectByCode(code); - } - - @Override - public SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code) { - return smsTemplateCache.get(code); - } - - @Override - public String formatSmsTemplateContent(String content, Map params) { - return StrUtil.format(content, params); - } - - @VisibleForTesting - public List parseTemplateContentParams(String content) { - return ReUtil.findAllGroup1(PATTERN_PARAMS, content); - } - - @Override - public Long createSmsTemplate(SysSmsTemplateCreateReqVO createReqVO) { - // 校验短信渠道 - SysSmsChannelDO channelDO = checkSmsChannel(createReqVO.getChannelId()); - // 校验短信编码是否重复 - checkSmsTemplateCodeDuplicate(null, createReqVO.getCode()); - // 校验短信模板 - checkApiTemplate(createReqVO.getChannelId(), createReqVO.getApiTemplateId()); - - // 插入 - SysSmsTemplateDO template = SysSmsTemplateConvert.INSTANCE.convert(createReqVO); - template.setParams(parseTemplateContentParams(template.getContent())); - template.setChannelCode(channelDO.getCode()); - smsTemplateMapper.insert(template); - // 发送刷新消息 - smsProducer.sendSmsTemplateRefreshMessage(); - // 返回 - return template.getId(); - } - - @Override - public void updateSmsTemplate(SysSmsTemplateUpdateReqVO updateReqVO) { - // 校验存在 - this.validateSmsTemplateExists(updateReqVO.getId()); - // 校验短信渠道 - SysSmsChannelDO channelDO = checkSmsChannel(updateReqVO.getChannelId()); - // 校验短信编码是否重复 - checkSmsTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode()); - // 校验短信模板 - checkApiTemplate(updateReqVO.getChannelId(), updateReqVO.getApiTemplateId()); - - // 更新 - SysSmsTemplateDO updateObj = SysSmsTemplateConvert.INSTANCE.convert(updateReqVO); - updateObj.setParams(parseTemplateContentParams(updateObj.getContent())); - updateObj.setChannelCode(channelDO.getCode()); - smsTemplateMapper.updateById(updateObj); - // 发送刷新消息 - smsProducer.sendSmsTemplateRefreshMessage(); - } - - @Override - public void deleteSmsTemplate(Long id) { - // 校验存在 - this.validateSmsTemplateExists(id); - // 更新 - smsTemplateMapper.deleteById(id); - // 发送刷新消息 - smsProducer.sendSmsTemplateRefreshMessage(); - } - - private void validateSmsTemplateExists(Long id) { - if (smsTemplateMapper.selectById(id) == null) { - throw exception(SMS_TEMPLATE_NOT_EXISTS); - } - } - - @Override - public SysSmsTemplateDO getSmsTemplate(Long id) { - return smsTemplateMapper.selectById(id); - } - - @Override - public List getSmsTemplateList(Collection ids) { - return smsTemplateMapper.selectBatchIds(ids); - } - - @Override - public PageResult getSmsTemplatePage(SysSmsTemplatePageReqVO pageReqVO) { - return smsTemplateMapper.selectPage(pageReqVO); - } - - @Override - public List getSmsTemplateList(SysSmsTemplateExportReqVO exportReqVO) { - return smsTemplateMapper.selectList(exportReqVO); - } - - @Override - public Integer countByChannelId(Long channelId) { - return smsTemplateMapper.selectCountByChannelId(channelId); - } - - @VisibleForTesting - public SysSmsChannelDO checkSmsChannel(Long channelId) { - SysSmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); - if (channelDO == null) { - throw exception(SMS_CHANNEL_NOT_EXISTS); - } - if (!Objects.equals(channelDO.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { - throw exception(SMS_CHANNEL_DISABLE); - } - return channelDO; - } - - @VisibleForTesting - public void checkSmsTemplateCodeDuplicate(Long id, String code) { - SysSmsTemplateDO template = smsTemplateMapper.selectByCode(code); - if (template == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 - if (id == null) { - throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code); - } - if (!template.getId().equals(id)) { - throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code); - } - } - - /** - * 校验 API 短信平台的模板是否有效 - * - * @param channelId 渠道编号 - * @param apiTemplateId API 模板编号 - */ - @VisibleForTesting - public void checkApiTemplate(Long channelId, String apiTemplateId) { - // 获得短信模板 - SmsClient smsClient = smsClientFactory.getSmsClient(channelId); - Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", channelId)); - SmsCommonResult templateResult = smsClient.getSmsTemplate(apiTemplateId); - // 校验短信模板是否正确 - templateResult.checkError(); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java deleted file mode 100644 index 74690a2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java +++ /dev/null @@ -1,169 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.user; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; - -import java.io.InputStream; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 用户 Service 接口 - * - * @author 芋道源码 - */ -public interface SysUserService { - - /** - * 创建用户 - * - * @param reqVO 用户信息 - * @return 用户编号 - */ - Long createUser(SysUserCreateReqVO reqVO); - - /** - * 修改用户 - * - * @param reqVO 用户信息 - */ - void updateUser(SysUserUpdateReqVO reqVO); - - /** - * 修改用户个人信息 - * - * @param id 用户编号 - * @param reqVO 用户个人信息 - */ - void updateUserProfile(Long id, SysUserProfileUpdateReqVO reqVO); - - /** - * 修改用户个人密码 - * - * @param id 用户编号 - * @param reqVO 更新用户个人密码 - */ - void updateUserPassword(Long id, SysUserProfileUpdatePasswordReqVO reqVO); - - /** - * 更新用户头像 - * - * @param id 用户 id - * @param avatarFile 头像文件 - */ - void updateUserAvatar(Long id, InputStream avatarFile); - - /** - * 修改密码 - * - * @param id 用户编号 - * @param password 密码 - */ - void updateUserPassword(Long id, String password); - - /** - * 修改密码 - * - * @param id 用户编号 - * @param status 状态 - */ - void updateUserStatus(Long id, Integer status); - - /** - * 删除用户 - * - * @param id 用户编号 - */ - void deleteUser(Long id); - - /** - * 通过用户名查询用户 - * - * @param username 用户名 - * @return 用户对象信息 - */ - SysUserDO getUserByUsername(String username); - - /** - * 通过用户 ID 查询用户 - * - * @param id 用户ID - * @return 用户对象信息 - */ - SysUserDO getUser(Long id); - - /** - * 获得用户分页列表 - * - * @param reqVO 分页条件 - * @return 分页列表 - */ - PageResult getUserPage(SysUserPageReqVO reqVO); - - /** - * 获得用户列表 - * - * @param reqVO 列表请求 - * @return 用户列表 - */ - List getUsers(SysUserExportReqVO reqVO); - - /** - * 获得用户列表 - * - * @param ids 用户编号数组 - * @return 用户列表 - */ - List getUsers(Collection ids); - - /** - * 获得用户 Map - * - * @param ids 用户编号数组 - * @return 用户 Map - */ - default Map getUserMap(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return new HashMap<>(); - } - return CollectionUtils.convertMap(getUsers(ids), SysUserDO::getId); - } - - /** - * 获得用户列表,基于昵称模糊匹配 - * - * @param nickname 昵称 - * @return 用户列表 - */ - List getUsersByNickname(String nickname); - - /** - * 获得用户列表,基于用户账号模糊匹配 - * - * @param username 用户账号 - * @return 用户列表 - */ - List getUsersByUsername(String username); - - /** - * 批量导入用户 - * - * @param importUsers 导入用户列表 - * @param isUpdateSupport 是否支持更新 - * @return 导入结果 - */ - SysUserImportRespVO importUsers(List importUsers, boolean isUpdateSupport); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java deleted file mode 100644 index a36b513..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java +++ /dev/null @@ -1,373 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.user; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.exception.ServiceException; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.service.file.InfFileService; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; -import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper; -import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; -import cn.iocoder.dashboard.modules.system.service.dept.SysPostService; -import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import com.google.common.annotations.VisibleForTesting; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.io.InputStream; -import java.util.*; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; - - -/** - * 用户 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Slf4j -public class SysUserServiceImpl implements SysUserService { - - @Value("${sys.user.init-password:yudaoyuanma}") - private String userInitPassword; - - @Resource - private SysUserMapper userMapper; - - @Resource - private SysDeptService deptService; - @Resource - private SysPostService postService; - @Resource - private SysPermissionService permissionService; - @Resource - private PasswordEncoder passwordEncoder; - @Resource - private InfFileService fileService; - - @Override - public Long createUser(SysUserCreateReqVO reqVO) { - // 校验正确性 - this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), - reqVO.getDeptId(), reqVO.getPostIds()); - // 插入用户 - SysUserDO user = SysUserConvert.INSTANCE.convert(reqVO); - user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 - user.setPassword(passwordEncoder.encode(reqVO.getPassword())); // 加密密码 - userMapper.insert(user); - return user.getId(); - } - - @Override - public void updateUser(SysUserUpdateReqVO reqVO) { - // 校验正确性 - this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), - reqVO.getDeptId(), reqVO.getPostIds()); - // 更新用户 - SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO); - userMapper.updateById(updateObj); - } - - @Override - public void updateUserProfile(Long id, SysUserProfileUpdateReqVO reqVO) { - // 校验正确性 - this.checkUserExists(id); - this.checkEmailUnique(id, reqVO.getEmail()); - this.checkMobileUnique(id, reqVO.getMobile()); - // 执行更新 - userMapper.updateById(SysUserConvert.INSTANCE.convert(reqVO).setId(id)); - } - - @Override - public void updateUserPassword(Long id, SysUserProfileUpdatePasswordReqVO reqVO) { - // 校验旧密码密码 - this.checkOldPassword(id, reqVO.getOldPassword()); - // 执行更新 - SysUserDO updateObj = new SysUserDO().setId(id); - updateObj.setPassword(passwordEncoder.encode(reqVO.getNewPassword())); // 加密密码 - userMapper.updateById(updateObj); - } - - @Override - public void updateUserAvatar(Long id, InputStream avatarFile) { - this.checkUserExists(id); - // 存储文件 - String avatar = fileService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile)); - // 更新路径 - SysUserDO sysUserDO = new SysUserDO(); - sysUserDO.setId(id); - sysUserDO.setAvatar(avatar); - userMapper.updateById(sysUserDO); - } - - @Override - public void updateUserPassword(Long id, String password) { - // 校验用户存在 - this.checkUserExists(id); - // 更新密码 - SysUserDO updateObj = new SysUserDO(); - updateObj.setId(id); - updateObj.setPassword(passwordEncoder.encode(password)); // 加密密码 - userMapper.updateById(updateObj); - } - - @Override - public void updateUserStatus(Long id, Integer status) { - // 校验用户存在 - this.checkUserExists(id); - // 更新状态 - SysUserDO updateObj = new SysUserDO(); - updateObj.setId(id); - updateObj.setStatus(status); - userMapper.updateById(updateObj); - } - - @Override - public void deleteUser(Long id) { - // 校验用户存在 - this.checkUserExists(id); - // 删除用户 - userMapper.deleteById(id); - // 删除用户关联数据 - permissionService.processUserDeleted(id); - } - - @Override - public SysUserDO getUserByUsername(String username) { - return userMapper.selectByUsername(username); - } - - @Override - public SysUserDO getUser(Long id) { - return userMapper.selectById(id); - } - - @Override - public PageResult getUserPage(SysUserPageReqVO reqVO) { - return userMapper.selectPage(reqVO, this.getDeptCondition(reqVO.getDeptId())); - } - - @Override - public List getUsers(SysUserExportReqVO reqVO) { - return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId())); - } - - @Override - public List getUsers(Collection ids) { - return userMapper.selectBatchIds(ids); - } - - @Override - public List getUsersByNickname(String nickname) { - return userMapper.selectListByNickname(nickname); - } - - @Override - public List getUsersByUsername(String username) { - return userMapper.selectListByUsername(username); - } - - /** - * 获得部门条件:查询指定部门的子部门编号们,包括自身 - * - * @param deptId 部门编号 - * @return 部门编号集合 - */ - private Set getDeptCondition(Long deptId) { - if (deptId == null) { - return Collections.emptySet(); - } - Set deptIds = CollectionUtils.convertSet(deptService.getDeptsByParentIdFromCache( - deptId, true), SysDeptDO::getId); - deptIds.add(deptId); // 包括自身 - return deptIds; - } - - private void checkCreateOrUpdate(Long id, String username, String mobile, String email, - Long deptId, Set postIds) { - // 校验用户存在 - this.checkUserExists(id); - // 校验用户名唯一 - this.checkUsernameUnique(id, username); - // 校验手机号唯一 - this.checkMobileUnique(id, mobile); - // 校验邮箱唯一 - this.checkEmailUnique(id, email); - // 校验部门处于开启状态 - this.checkDeptEnable(deptId); - // 校验岗位处于开启状态 - this.checkPostEnable(postIds); - } - - @VisibleForTesting - void checkUserExists(Long id) { - if (id == null) { - return; - } - SysUserDO user = userMapper.selectById(id); - if (user == null) { - throw exception(USER_NOT_EXISTS); - } - } - - @VisibleForTesting - void checkUsernameUnique(Long id, String username) { - if (StrUtil.isBlank(username)) { - return; - } - SysUserDO user = userMapper.selectByUsername(username); - if (user == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的用户 - if (id == null) { - throw exception(USER_USERNAME_EXISTS); - } - if (!user.getId().equals(id)) { - throw exception(USER_USERNAME_EXISTS); - } - } - - @VisibleForTesting - void checkEmailUnique(Long id, String email) { - if (StrUtil.isBlank(email)) { - return; - } - SysUserDO user = userMapper.selectByEmail(email); - if (user == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的用户 - if (id == null) { - throw exception(USER_EMAIL_EXISTS); - } - if (!user.getId().equals(id)) { - throw exception(USER_EMAIL_EXISTS); - } - } - - @VisibleForTesting - void checkMobileUnique(Long id, String mobile) { - if (StrUtil.isBlank(mobile)) { - return; - } - SysUserDO user = userMapper.selectByMobile(mobile); - if (user == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的用户 - if (id == null) { - throw exception(USER_MOBILE_EXISTS); - } - if (!user.getId().equals(id)) { - throw exception(USER_MOBILE_EXISTS); - } - } - - @VisibleForTesting - void checkDeptEnable(Long deptId) { - if (deptId == null) { // 允许不选择 - return; - } - SysDeptDO dept = deptService.getDept(deptId); - if (dept == null) { - throw exception(DEPT_NOT_FOUND); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { - throw exception(DEPT_NOT_ENABLE); - } - } - - @VisibleForTesting - void checkPostEnable(Set postIds) { - if (CollUtil.isEmpty(postIds)) { // 允许不选择 - return; - } - List posts = postService.getPosts(postIds, null); - if (CollUtil.isEmpty(posts)) { - throw exception(POST_NOT_FOUND); - } - Map postMap = CollectionUtils.convertMap(posts, SysPostDO::getId); - postIds.forEach(postId -> { - SysPostDO post = postMap.get(postId); - if (post == null) { - throw exception(POST_NOT_FOUND); - } - if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { - throw exception(POST_NOT_ENABLE, post.getName()); - } - }); - } - - /** - * 校验旧密码 - * - * @param id 用户 id - * @param oldPassword 旧密码 - */ - @VisibleForTesting - void checkOldPassword(Long id, String oldPassword) { - SysUserDO user = userMapper.selectById(id); - if (user == null) { - throw exception(USER_NOT_EXISTS); - } - if (!passwordEncoder.matches(oldPassword, user.getPassword())) { - throw exception(USER_PASSWORD_FAILED); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 - public SysUserImportRespVO importUsers(List importUsers, boolean isUpdateSupport) { - if (CollUtil.isEmpty(importUsers)) { - throw exception(USER_IMPORT_LIST_IS_EMPTY); - } - SysUserImportRespVO respVO = SysUserImportRespVO.builder().createUsernames(new ArrayList<>()) - .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); - importUsers.forEach(importUser -> { - // 校验,判断是否有不符合的原因 - try { - checkCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), - importUser.getDeptId(), null); - } catch (ServiceException ex) { - respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); - return; - } - // 判断如果不存在,在进行插入 - SysUserDO existUser = userMapper.selectByUsername(importUser.getUsername()); - if (existUser == null) { - userMapper.insert(SysUserConvert.INSTANCE.convert(importUser) - .setPassword(passwordEncoder.encode(userInitPassword))); // 设置默认密码 - respVO.getCreateUsernames().add(importUser.getUsername()); - return; - } - // 如果存在,判断是否允许更新 - if (!isUpdateSupport) { - respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg()); - return; - } - SysUserDO updateUser = SysUserConvert.INSTANCE.convert(importUser); - updateUser.setId(existUser.getId()); - userMapper.updateById(updateUser); - respVO.getUpdateUsernames().add(importUser.getUsername()); - }); - return respVO; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodegenController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodegenController.java deleted file mode 100644 index 1bfdb96..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodegenController.java +++ /dev/null @@ -1,167 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.codegen; - -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ZipUtil; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.ToolCodegenDetailRespVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.ToolCodegenPreviewRespVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table.ToolCodegenTableRespVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table.ToolSchemaTableRespVO; -import cn.iocoder.dashboard.modules.tool.convert.codegen.ToolCodegenConvert; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; -import cn.iocoder.dashboard.modules.tool.service.codegen.ToolCodegenService; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Api(tags = "代码生成器") -@RestController -@RequestMapping("/tool/codegen") -@Validated -public class ToolCodegenController { - - @Resource - private ToolCodegenService codegenService; - - @GetMapping("/db/table/list") - @ApiOperation(value = "获得数据库自带的表定义列表", notes = "会过滤掉已经导入 Codegen 的表") - @ApiImplicitParams({ - @ApiImplicitParam(name = "tableName", value = "表名,模糊匹配", required = true, example = "yudao", dataTypeClass = String.class), - @ApiImplicitParam(name = "tableComment", value = "描述,模糊匹配", required = true, example = "芋道", dataTypeClass = String.class) - }) - @PreAuthorize("@ss.hasPermission('tool:codegen:query')") - public CommonResult> getSchemaTableList( - @RequestParam(value = "tableName", required = false) String tableName, - @RequestParam(value = "tableComment", required = false) String tableComment) { - // 获得数据库自带的表定义列表 - List schemaTables = codegenService.getSchemaTableList(tableName, tableComment); - // 移除在 Codegen 中,已经存在的 - Set existsTables = CollectionUtils.convertSet(codegenService.getCodeGenTableList(), ToolCodegenTableDO::getTableName); - schemaTables.removeIf(table -> existsTables.contains(table.getTableName())); - return success(ToolCodegenConvert.INSTANCE.convertList04(schemaTables)); - } - - @GetMapping("/table/page") - @ApiOperation("获得表定义分页") - @PreAuthorize("@ss.hasPermission('tool:codegen:query')") - public CommonResult> getCodeGenTablePage(@Valid ToolCodegenTablePageReqVO pageReqVO) { - PageResult pageResult = codegenService.getCodegenTablePage(pageReqVO); - return success(ToolCodegenConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/detail") - @ApiOperation("获得表和字段的明细") - @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('tool:codegen:query')") - public CommonResult getCodegenDetail(@RequestParam("tableId") Long tableId) { - ToolCodegenTableDO table = codegenService.getCodegenTablePage(tableId); - List columns = codegenService.getCodegenColumnListByTableId(tableId); - // 拼装返回 - return success(ToolCodegenConvert.INSTANCE.convert(table, columns)); - } - - @ApiOperation("基于数据库的表结构,创建代码生成器的表和字段定义") - @ApiImplicitParam(name = "tableNames", value = "表名数组", required = true, example = "sys_user", dataTypeClass = List.class) - @PostMapping("/create-list-from-db") - @PreAuthorize("@ss.hasPermission('tool:codegen:create')") - public CommonResult> createCodegenListFromDB(@RequestParam("tableNames") List tableNames) { - return success(codegenService.createCodegenListFromDB(tableNames)); - } - - @ApiOperation("基于 SQL 建表语句,创建代码生成器的表和字段定义") - @ApiImplicitParam(name = "sql", value = "SQL 建表语句", required = true, example = "sql", dataTypeClass = String.class) - @PostMapping("/create-list-from-sql") - @PreAuthorize("@ss.hasPermission('tool:codegen:create')") - public CommonResult createCodegenListFromSQL(@RequestParam("sql") String sql) { - return success(codegenService.createCodegenListFromSQL(sql)); - } - - @ApiOperation("更新数据库的表和字段定义") - @PutMapping("/update") - @PreAuthorize("@ss.hasPermission('tool:codegen:update')") - public CommonResult updateCodegen(@Valid @RequestBody ToolCodegenUpdateReqVO updateReqVO) { - codegenService.updateCodegen(updateReqVO); - return success(true); - } - - @ApiOperation("基于数据库的表结构,同步数据库的表和字段定义") - @PutMapping("/sync-from-db") - @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('tool:codegen:update')") - public CommonResult syncCodegenFromDB(@RequestParam("tableId") Long tableId) { - codegenService.syncCodegenFromDB(tableId); - return success(true); - } - - @ApiOperation("基于 SQL 建表语句,同步数据库的表和字段定义") - @PutMapping("/sync-from-sql") - @ApiImplicitParams({ - @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class), - @ApiImplicitParam(name = "sql", value = "SQL 建表语句", required = true, example = "sql", dataTypeClass = String.class) - }) - @PreAuthorize("@ss.hasPermission('tool:codegen:update')") - public CommonResult syncCodegenFromSQL(@RequestParam("tableId") Long tableId, - @RequestParam("sql") String sql) { - codegenService.syncCodegenFromSQL(tableId, sql); - return success(true); - } - - @ApiOperation("删除数据库的表和字段定义") - @DeleteMapping("/delete") - @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('tool:codegen:delete')") - public CommonResult deleteCodegen(@RequestParam("tableId") Long tableId) { - codegenService.deleteCodegen(tableId); - return success(true); - } - - @ApiOperation("预览生成代码") - @GetMapping("/preview") - @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('tool:codegen:preview')") - public CommonResult> previewCodegen(@RequestParam("tableId") Long tableId) { - Map codes = codegenService.generationCodes(tableId); - return success(ToolCodegenConvert.INSTANCE.convert(codes)); - } - - @ApiOperation("下载生成代码") - @GetMapping("/download") - @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('tool:codegen:download')") - public void downloadCodegen(@RequestParam("tableId") Long tableId, - HttpServletResponse response) throws IOException { - // 生成代码 - Map codes = codegenService.generationCodes(tableId); - // 构建 zip 包 - String[] paths = codes.keySet().toArray(new String[0]); - ByteArrayInputStream[] ins = codes.values().stream().map(IoUtil::toUtf8Stream).toArray(ByteArrayInputStream[]::new); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ZipUtil.zip(outputStream, paths, ins); - // 输出 - ServletUtils.writeAttachment(response, "codegen.zip", outputStream.toByteArray()); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java deleted file mode 100644 index 503ac8b..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.codegen.vo; - -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.column.ToolCodegenColumnRespVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table.ToolCodegenTableRespVO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@ApiModel("代码生成表和字段的明细 Response VO") -@Data -public class ToolCodegenDetailRespVO { - - @ApiModelProperty("表定义") - private ToolCodegenTableRespVO table; - - @ApiModelProperty("字段定义") - private List columns; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java deleted file mode 100644 index 3f41a7d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.codegen.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@ApiModel(value = "代码生成预览 Response VO", description ="注意,每个文件都是一个该对象") -@Data -public class ToolCodegenPreviewRespVO { - - @ApiModelProperty(value = "文件路径", required = true, example = "java/cn/iocoder/dashboard/modules/system/controller/test/SysTestDemoController.java") - private String filePath; - - @ApiModelProperty(value = "代码", required = true, example = "Hello World") - private String code; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java deleted file mode 100644 index 72d430e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.codegen.vo; - -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.column.ToolCodegenColumnBaseVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table.ToolCodegenTableBaseVO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import java.util.List; - -@ApiModel("代码生成表和字段的修改 Request VO") -@Data -public class ToolCodegenUpdateReqVO { - - @Valid // 校验内嵌的字段 - @NotNull(message = "表定义不能为空") - private Table table; - - @Valid // 校验内嵌的字段 - @NotNull(message = "字段定义不能为空") - private List columns; - - @ApiModel("更新表定义") - @Data - @EqualsAndHashCode(callSuper = true) - @ToString(callSuper = true) - public static class Table extends ToolCodegenTableBaseVO { - - @ApiModelProperty(value = "编号", required = true, example = "1") - private Long id; - - } - - @ApiModel("更新表定义") - @Data - @EqualsAndHashCode(callSuper = true) - @ToString(callSuper = true) - public static class Column extends ToolCodegenColumnBaseVO { - - @ApiModelProperty(value = "编号", required = true, example = "1") - private Long id; - - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java deleted file mode 100644 index 04a828f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.codegen.vo.column; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** -* 代码生成字段定义 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class ToolCodegenColumnBaseVO { - - @ApiModelProperty(value = "表编号", required = true, example = "1") - @NotNull(message = "表编号不能为空") - private Long tableId; - - @ApiModelProperty(value = "字段名", required = true, example = "user_age") - @NotNull(message = "字段名不能为空") - private String columnName; - - @ApiModelProperty(value = "字段类型", required = true, example = "int(11)") - @NotNull(message = "字段类型不能为空") - private String columnType; - - @ApiModelProperty(value = "字段描述", required = true, example = "年龄") - @NotNull(message = "字段描述不能为空") - private String columnComment; - - @ApiModelProperty(value = "是否允许为空", required = true, example = "true") - @NotNull(message = "是否允许为空不能为空") - private Boolean nullable; - - @ApiModelProperty(value = "是否主键", required = true, example = "false") - @NotNull(message = "是否主键不能为空") - private Boolean primaryKey; - - @ApiModelProperty(value = "是否自增", required = true, example = "true") - @NotNull(message = "是否自增不能为空") - private String autoIncrement; - - @ApiModelProperty(value = "排序", required = true, example = "10") - @NotNull(message = "排序不能为空") - private Integer ordinalPosition; - - @ApiModelProperty(value = "Java 属性类型", required = true, example = "userAge") - @NotNull(message = "Java 属性类型不能为空") - private String javaType; - - @ApiModelProperty(value = "Java 属性名", required = true, example = "Integer") - @NotNull(message = "Java 属性名不能为空") - private String javaField; - - @ApiModelProperty(value = "字典类型", example = "sys_gender") - private String dictType; - - @ApiModelProperty(value = "数据示例", example = "1024") - private String example; - - @ApiModelProperty(value = "是否为 Create 创建操作的字段", required = true, example = "true") - @NotNull(message = "是否为 Create 创建操作的字段不能为空") - private Boolean createOperation; - - @ApiModelProperty(value = "是否为 Update 更新操作的字段", required = true, example = "false") - @NotNull(message = "是否为 Update 更新操作的字段不能为空") - private Boolean updateOperation; - - @ApiModelProperty(value = "是否为 List 查询操作的字段", required = true, example = "true") - @NotNull(message = "是否为 List 查询操作的字段不能为空") - private Boolean listOperation; - - @ApiModelProperty(value = "List 查询操作的条件类型", required = true, example = "LIKE", notes = "参见 ToolCodegenColumnListConditionEnum 枚举") - @NotNull(message = "List 查询操作的条件类型不能为空") - private String listOperationCondition; - - @ApiModelProperty(value = "是否为 List 查询操作的返回字段", required = true, example = "true") - @NotNull(message = "是否为 List 查询操作的返回字段不能为空") - private Boolean listOperationResult; - - @ApiModelProperty(value = "显示类型", required = true, example = "input") - @NotNull(message = "显示类型不能为空") - private String htmlType; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java deleted file mode 100644 index 12251e2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.codegen.vo.column; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("代码生成字段定义 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ToolCodegenColumnRespVO extends ToolCodegenColumnBaseVO { - - @ApiModelProperty(value = "编号", required = true, example = "1") - private Long id; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java deleted file mode 100644 index 6d56902..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** -* 代码生成 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class ToolCodegenTableBaseVO { - - @ApiModelProperty(value = "导入类型", required = true, example = "1", notes = "参见 ToolCodegenImportTypeEnum 枚举") - @NotNull(message = "导入类型不能为空") - private Integer importType; - - @ApiModelProperty(value = "表名称", required = true, example = "yudao") - @NotNull(message = "表名称不能为空") - private String tableName; - - @ApiModelProperty(value = "表描述", required = true, example = "芋道") - @NotNull(message = "表描述不能为空") - private String tableComment; - - @ApiModelProperty(value = "备注", example = "我是备注") - private String remark; - - @ApiModelProperty(value = "模块名", required = true, example = "system") - @NotNull(message = "模块名不能为空") - private String moduleName; - - @ApiModelProperty(value = "业务名", required = true, example = "codegen") - @NotNull(message = "业务名不能为空") - private String businessName; - - @ApiModelProperty(value = "类名称", required = true, example = "ToolCodegenTable") - @NotNull(message = "类名称不能为空") - private String className; - - @ApiModelProperty(value = "类描述", required = true, example = "代码生成器的表定义") - @NotNull(message = "类描述不能为空") - private String classComment; - - @ApiModelProperty(value = "作者", required = true, example = "芋道源码") - @NotNull(message = "作者不能为空") - private String author; - - @ApiModelProperty(value = "模板类型", required = true, example = "1", notes = "参见 ToolCodegenTemplateTypeEnum 枚举") - @NotNull(message = "模板类型不能为空") - private Integer templateType; - - @ApiModelProperty(value = "父菜单编号", example = "1024") - private Long parentMenuId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java deleted file mode 100644 index 1b25084..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("表定义分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ToolCodegenTablePageReqVO extends PageParam { - - @ApiModelProperty(value = "表名称", example = "yudao", notes = "模糊匹配") - private String tableName; - - @ApiModelProperty(value = "表描述", example = "芋道", notes = "模糊匹配") - private String tableComment; - - @ApiModelProperty(value = "开始创建时间", example = "2020-10-24 00:00:00") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date beginCreateTime; - - @ApiModelProperty(value = "结束创建时间", example = "2020-10-24 23:59:59") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java deleted file mode 100644 index a214df9..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("代码生成表定义 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ToolCodegenTableRespVO extends ToolCodegenTableBaseVO { - - @ApiModelProperty(value = "编号", required = true, example = "1") - private Long id; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - - @ApiModelProperty(value = "更新时间", required = true) - private Date updateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java deleted file mode 100644 index 4b724a1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -@ApiModel("数据字典的表定义 Response VO") -@Data -public class ToolSchemaTableRespVO { - - @ApiModelProperty(value = "数据库", required = true, example = "yudao") - private String tableSchema; - - @ApiModelProperty(value = "表名称", required = true, example = "yuanma") - private String tableName; - - @ApiModelProperty(value = "表描述", required = true, example = "芋道源码") - private String tableComment; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/ToolTestDemoController.http b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/ToolTestDemoController.http deleted file mode 100644 index b10a3d2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/ToolTestDemoController.http +++ /dev/null @@ -1,7 +0,0 @@ -### 请求 /tool/test-demo/get 接口 => 成功 -GET {{baseUrl}}/tool/test-demo/get?id=1 -Authorization: Bearer {{token}} - -### 请求 /tool/test-demo/list 接口 => 成功 -GET {{baseUrl}}/tool/test-demo/list?ids=1 -Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/ToolTestDemoController.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/ToolTestDemoController.java deleted file mode 100644 index 6322f54..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/ToolTestDemoController.java +++ /dev/null @@ -1,108 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.test; - -import cn.hutool.core.thread.ThreadUtil; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.framework.tracer.core.annotation.BizTrace; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.*; -import cn.iocoder.dashboard.modules.tool.convert.test.ToolTestDemoConvert; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.test.ToolTestDemoDO; -import cn.iocoder.dashboard.modules.tool.service.test.ToolTestDemoService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Api(tags = "测试示例") -@RestController -@RequestMapping("/tool/test-demo") -@Validated -public class ToolTestDemoController { - - @Resource - private ToolTestDemoService testDemoService; - - @PostMapping("/create") - @ApiOperation("创建测试示例") - @PreAuthorize("@ss.hasPermission('tool:test-demo:create')") - public CommonResult createTestDemo(@Valid @RequestBody ToolTestDemoCreateReqVO createReqVO) { - return success(testDemoService.createTestDemo(createReqVO)); - } - - @PutMapping("/update") - @ApiOperation("更新测试示例") - @PreAuthorize("@ss.hasPermission('tool:test-demo:update')") - public CommonResult updateTestDemo(@Valid @RequestBody ToolTestDemoUpdateReqVO updateReqVO) { - testDemoService.updateTestDemo(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @ApiOperation("删除测试示例") - @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('tool:test-demo:delete')") - public CommonResult deleteTestDemo(@RequestParam("id") Long id) { - testDemoService.deleteTestDemo(id); - return success(true); - } - - @GetMapping("/get") - @ApiOperation("获得测试示例") - @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) - @PreAuthorize("@ss.hasPermission('tool:test-demo:query')") -// @Lock4j // 分布式锁 - public CommonResult getTestDemo(@RequestParam("id") Long id) { - if (true) { // 测试分布式锁 - ThreadUtil.sleep(5, TimeUnit.SECONDS); - } - ToolTestDemoDO testDemo = testDemoService.getTestDemo(id); - return success(ToolTestDemoConvert.INSTANCE.convert(testDemo)); - } - - @GetMapping("/list") - @ApiOperation("获得测试示例列表") - @ApiImplicitParam(name = "ids", value = "编号列表", required = true, dataTypeClass = List.class) - @PreAuthorize("@ss.hasPermission('tool:test-demo:query')") -// @RateLimiter(name = "backendA") - @BizTrace(id = "#ids", type = "'user'") - public CommonResult> getTestDemoList(@RequestParam("ids") Collection ids) { - List list = testDemoService.getTestDemoList(ids); - return success(ToolTestDemoConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/page") - @ApiOperation("获得测试示例分页") - @PreAuthorize("@ss.hasPermission('tool:test-demo:query')") - public CommonResult> getTestDemoPage(@Valid ToolTestDemoPageReqVO pageVO) { - PageResult pageResult = testDemoService.getTestDemoPage(pageVO); - return success(ToolTestDemoConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @ApiOperation("导出测试示例 Excel") - @PreAuthorize("@ss.hasPermission('tool:test-demo:export')") - @OperateLog(type = EXPORT) - public void exportTestDemoExcel(@Valid ToolTestDemoExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = testDemoService.getTestDemoList(exportReqVO); - // 导出 Excel - List datas = ToolTestDemoConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "测试示例.xls", "数据", ToolTestDemoExcelVO.class, datas); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java deleted file mode 100644 index f10fdb2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.test.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** -* 字典类型 Base VO,提供给添加、修改、详细的子 VO 使用 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 -*/ -@Data -public class ToolTestDemoBaseVO { - - @ApiModelProperty(value = "名字", required = true, example = "芋道") - @NotNull(message = "名字不能为空") - private String name; - - @ApiModelProperty(value = "状态", required = true, example = "1") - @NotNull(message = "状态不能为空") - private Integer status; - - @ApiModelProperty(value = "类型", required = true, example = "2") - @NotNull(message = "类型不能为空") - private Integer type; - - @ApiModelProperty(value = "分类", required = true, example = "3") - @NotNull(message = "分类不能为空") - private Integer category; - - @ApiModelProperty(value = "备注", example = "我是备注") - private String remark; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java deleted file mode 100644 index 5b267fe..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.test.vo; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel("字典类型创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ToolTestDemoCreateReqVO extends ToolTestDemoBaseVO { - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java deleted file mode 100644 index 25c3649..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.test.vo; - -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.dashboard.modules.infra.enums.InfDictTypeConstants; -import cn.iocoder.dashboard.modules.system.enums.SysDictTypeConstants; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * 测试示例 Excel VO - * - * @author 芋艿 - */ -@Data -public class ToolTestDemoExcelVO { - - @ExcelProperty("编号") - private Long id; - - @ExcelProperty("名字") - private String name; - - @ExcelProperty(value = "状态", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.COMMON_STATUS) - private Integer status; - - @ExcelProperty(value = "类型", converter = DictConvert.class) - @DictFormat(SysDictTypeConstants.OPERATE_TYPE) - private Integer type; - - @ExcelProperty(value = "分类", converter = DictConvert.class) - @DictFormat(InfDictTypeConstants.REDIS_TIMEOUT_TYPE) - private Integer category; - - @ExcelProperty("备注") - private String remark; - - @ExcelProperty("创建时间") - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java deleted file mode 100644 index d655b98..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.test.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel(value = "字典类型 Excel 导出 Request VO", description = "参数和 ToolTestDemoPageReqVO 是一致的") -@Data -public class ToolTestDemoExportReqVO { - - @ApiModelProperty(value = "名字", example = "芋道") - private String name; - - @ApiModelProperty(value = "状态", example = "1") - private Integer status; - - @ApiModelProperty(value = "类型", example = "2") - private Integer type; - - @ApiModelProperty(value = "分类", example = "3") - private Integer category; - - @ApiModelProperty(value = "备注", example = "我是备注") - private String remark; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束创建时间") - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java deleted file mode 100644 index 053a021..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.test.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("字典类型分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ToolTestDemoPageReqVO extends PageParam { - - @ApiModelProperty(value = "名字", example = "芋道") - private String name; - - @ApiModelProperty(value = "状态", example = "1") - private Integer status; - - @ApiModelProperty(value = "类型", example = "2") - private Integer type; - - @ApiModelProperty(value = "分类", example = "3") - private Integer category; - - @ApiModelProperty(value = "备注", example = "我是备注") - private String remark; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束创建时间") - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoRespVO.java deleted file mode 100644 index cc22897..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoRespVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.test.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.Date; - -@ApiModel("字典类型 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ToolTestDemoRespVO extends ToolTestDemoBaseVO { - - @ApiModelProperty(value = "编号", required = true, example = "1") - private Long id; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java deleted file mode 100644 index d4bb383..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.controller.test.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@ApiModel("字典类型更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ToolTestDemoUpdateReqVO extends ToolTestDemoBaseVO { - - @ApiModelProperty(value = "编号", required = true, example = "1") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/convert/codegen/ToolCodegenConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/convert/codegen/ToolCodegenConvert.java deleted file mode 100644 index 68bf402..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/convert/codegen/ToolCodegenConvert.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.convert.codegen; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.ToolCodegenDetailRespVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.ToolCodegenPreviewRespVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.column.ToolCodegenColumnRespVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table.ToolCodegenTableRespVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table.ToolSchemaTableRespVO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Mapper -public interface ToolCodegenConvert { - - ToolCodegenConvert INSTANCE = Mappers.getMapper(ToolCodegenConvert.class); - - // ========== ToolInformationSchemaTableDO 和 ToolInformationSchemaColumnDO 相关 ========== - - ToolCodegenTableDO convert(ToolSchemaTableDO bean); - - List convertList(List list); - - ToolCodegenTableRespVO convert(ToolSchemaColumnDO bean); - - // ========== ToolCodegenTableDO 相关 ========== - -// List convertList02(List list); - - ToolCodegenTableRespVO convert(ToolCodegenTableDO bean); - - PageResult convertPage(PageResult page); - - // ========== ToolCodegenTableDO 相关 ========== - - List convertList02(List list); - - ToolCodegenTableDO convert(ToolCodegenUpdateReqVO.Table bean); - - List convertList03(List columns); - - List convertList04(List list); - - // ========== 其它 ========== - - default ToolCodegenDetailRespVO convert(ToolCodegenTableDO table, List columns) { - ToolCodegenDetailRespVO respVO = new ToolCodegenDetailRespVO(); - respVO.setTable(convert(table)); - respVO.setColumns(convertList02(columns)); - return respVO; - } - - default List convert(Map codes) { - return codes.entrySet().stream().map(entry -> { - ToolCodegenPreviewRespVO respVO = new ToolCodegenPreviewRespVO(); - respVO.setFilePath(entry.getKey()); - respVO.setCode(entry.getValue()); - return respVO; - }).collect(Collectors.toList()); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/convert/test/ToolTestDemoConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/convert/test/ToolTestDemoConvert.java deleted file mode 100644 index 0e89a08..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/convert/test/ToolTestDemoConvert.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.convert.test; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoCreateReqVO; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoExcelVO; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoRespVO; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoUpdateReqVO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.test.ToolTestDemoDO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** -* 字典类型 Convert -* -* @author 芋艿 -*/ -@Mapper -public interface ToolTestDemoConvert { - - ToolTestDemoConvert INSTANCE = Mappers.getMapper(ToolTestDemoConvert.class); - - ToolTestDemoDO convert(ToolTestDemoCreateReqVO bean); - - ToolTestDemoDO convert(ToolTestDemoUpdateReqVO bean); - - ToolTestDemoRespVO convert(ToolTestDemoDO bean); - - List convertList(List list); - - PageResult convertPage(PageResult page); - - List convertList02(List list); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java deleted file mode 100644 index 82aed21..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java +++ /dev/null @@ -1,125 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; -import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 代码生成 column 字段定义 - * - * @author 芋道源码 - */ -@TableName(value = "tool_codegen_column", autoResultMap = true) -@Data -@Accessors(chain = true) -@EqualsAndHashCode(callSuper = true) -public class ToolCodegenColumnDO extends BaseDO { - - /** - * ID 编号 - */ - @TableId - private Long id; - /** - * 表编号 - * - * 关联 {@link ToolCodegenTableDO#getId()} - */ - private Long tableId; - - // ========== 表相关字段 ========== - - /** - * 字段名 - */ - private String columnName; - /** - * 字段类型 - */ - private String columnType; - /** - * 字段描述 - */ - private String columnComment; - /** - * 是否允许为空 - */ - private Boolean nullable; - /** - * 是否主键 - */ - private Boolean primaryKey; - /** - * 是否自增 - */ - private Boolean autoIncrement; - /** - * 排序 - */ - private Integer ordinalPosition; - - // ========== Java 相关字段 ========== - - /** - * Java 属性类型 - * - * 例如说 String、Boolean 等等 - */ - private String javaType; - /** - * Java 属性名 - */ -// @NotBlank(message = "Java属性不能为空") - private String javaField; - /** - * 字典类型 - * - * 关联 {@link SysDictTypeDO#getType()} - */ - private String dictType; - /** - * 数据示例,主要用于生成 Swagger 注解的 example 字段 - */ - private String example; - - // ========== CRUD 相关字段 ========== - - /** - * 是否为 Create 创建操作的字段 - */ - private Boolean createOperation; - /** - * 是否为 Update 更新操作的字段 - */ - private Boolean updateOperation; - /** - * 是否为 List 查询操作的字段 - */ - private Boolean listOperation; - /** - * List 查询操作的条件类型 - * - * 枚举 {@link ToolCodegenColumnListConditionEnum} - */ - private String listOperationCondition; - /** - * 是否为 List 查询操作的返回字段 - */ - private Boolean listOperationResult; - - // ========== UI 相关字段 ========== - - /** - * 显示类型 - * - * 枚举 {@link ToolCodegenColumnHtmlTypeEnum} - */ - private String htmlType; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java deleted file mode 100644 index 8a05f1d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java +++ /dev/null @@ -1,96 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenTemplateTypeEnum; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 代码生成 table 表定义 - * - * @author 芋道源码 - */ -@TableName(value = "tool_codegen_table", autoResultMap = true) -@Data -@Accessors(chain = true) -@EqualsAndHashCode(callSuper = true) -public class ToolCodegenTableDO extends BaseDO { - - /** - * ID 编号 - */ - private Long id; - - /** - * 导入类型 - * - * 枚举 {@link ToolCodegenTemplateTypeEnum} - */ - private Integer importType; - - // ========== 表相关字段 ========== - - /** - * 表名称 - */ - private String tableName; - /** - * 表描述 - */ - private String tableComment; - /** - * 备注 - */ - private String remark; - - // ========== 类相关字段 ========== - - /** - * 模块名,即一级目录 - * - * 例如说,system、infra、tool 等等 - */ - private String moduleName; - /** - * 业务名,即二级目录 - * - * 例如说,user、permission、dict 等等 - */ - private String businessName; - /** - * 类名称(首字母大写) - * - * 例如说,SysUser、SysMenu、SysDictData 等等 - */ - private String className; - /** - * 类描述 - */ - private String classComment; - /** - * 作者 - */ - private String author; - - // ========== 生成相关字段 ========== - - /** - * 模板类型 - * - * 枚举 {@link ToolCodegenTemplateTypeEnum} - */ - private Integer templateType; - - // ========== 菜单相关字段 ========== - - /** - * 父菜单编号 - * - * 关联 {@link SysMenuDO#getId()} - */ - private Long parentMenuId; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java deleted file mode 100644 index d20a9c8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Builder; -import lombok.Data; - -/** - * MySQL 数据库中的 column 字段定义 - * - * @author 芋道源码 - */ -@TableName(value = "information_schema.columns", autoResultMap = true) -@Data -@Builder -public class ToolSchemaColumnDO { - - /** - * 表名称 - */ - private String tableName; - /** - * 字段名 - */ - private String columnName; - /** - * 字段类型 - */ - private String columnType; - /** - * 字段描述 - */ - private String columnComment; - /** - * 是否允许为空 - */ - @TableField("case when is_nullable = 'yes' then '1' else '0' end") - private Boolean nullable; - /** - * 是否主键 - */ - @TableField("case when column_key = 'PRI' then '1' else '0' end") - private Boolean primaryKey; - /** - * 是否自增 - */ - @TableField("case when extra = 'auto_increment' then '1' else '0' end") - private Boolean autoIncrement; - /** - * 排序字段 - */ - private Integer ordinalPosition; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java deleted file mode 100644 index e16d913..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Builder; -import lombok.Data; - -import java.util.Date; - -/** - * MySQL 数据库中的 table 表定义 - * - * @author 芋道源码 - */ -@TableName(value = "information_schema.tables", autoResultMap = true) -@Data -@Builder -public class ToolSchemaTableDO { - - /** - * 数据库 - */ - private String tableSchema; - /** - * 表名称 - */ - private String tableName; - /** - * 表描述 - */ - private String tableComment; - /** - * 创建时间 - */ - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/test/ToolTestDemoDO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/test/ToolTestDemoDO.java deleted file mode 100644 index 848bb85..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/dataobject/test/ToolTestDemoDO.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.dataobject.test; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** -* 字典类型 DO -* -* @author 芋艿 -*/ -@TableName("tool_test_demo") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ToolTestDemoDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 名字 - */ - private String name; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 类型 - * - * 枚举 {@link cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum} - */ - private Integer type; - /** - * 分类 - * - * 枚举 {@link cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.TimeoutTypeEnum} - */ - private Integer category; - /** - * 备注 - */ - private String remark; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java deleted file mode 100644 index 8f066f3..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.mysql.codegen; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface ToolCodegenColumnMapper extends BaseMapperX { - - default List selectListByTableId(Long tableId) { - return selectList(new QueryWrapper().eq("table_id", tableId) - .orderByAsc("ordinal_position")); - } - - default void deleteListByTableId(Long tableId) { - delete(new QueryWrapper().eq("table_id", tableId)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java deleted file mode 100644 index 453733c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.mysql.codegen; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ToolCodegenTableMapper extends BaseMapperX { - - default ToolCodegenTableDO selectByTableName(String tableName) { - return selectOne(new QueryWrapper().eq("table_name", tableName)); - } - - default PageResult selectPage(ToolCodegenTablePageReqVO pageReqVO) { - return selectPage(pageReqVO, new QueryWrapperX() - .likeIfPresent("table_name", pageReqVO.getTableName()) - .likeIfPresent("table_comment", pageReqVO.getTableComment()) - .betweenIfPresent("create_time", pageReqVO.getBeginCreateTime(), pageReqVO.getEndCreateTime())); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java deleted file mode 100644 index 8ba6aa1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.mysql.codegen; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface ToolSchemaColumnMapper extends BaseMapperX { - - default List selectListByTableName(String tableSchema, String tableName) { - return selectList(new QueryWrapper().eq("table_name", tableName) - .eq("table_schema", tableSchema) - .orderByAsc("ordinal_position")); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java deleted file mode 100644 index 2572117..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.mysql.codegen; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface ToolSchemaTableMapper extends BaseMapperX { - - default List selectList(Collection tableSchemas, String tableName, String tableComment) { - return selectList(new QueryWrapperX().in("table_schema", tableSchemas) - .likeIfPresent("table_name", tableName) - .likeIfPresent("table_comment", tableComment)); - } - - default ToolSchemaTableDO selectByTableSchemaAndTableName(String tableSchema, String tableName) { - return selectOne(new QueryWrapper().eq("table_schema",tableSchema) - .eq("table_name", tableName)); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/test/ToolTestDemoMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/test/ToolTestDemoMapper.java deleted file mode 100644 index 1209ac1..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/test/ToolTestDemoMapper.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.mysql.test; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoExportReqVO; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoPageReqVO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.test.ToolTestDemoDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 字典类型 Mapper - * - * @author 芋艿 - */ -@Mapper -public interface ToolTestDemoMapper extends BaseMapperX { - - default PageResult selectPage(ToolTestDemoPageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("name", reqVO.getName()) - .eqIfPresent("status", reqVO.getStatus()) - .eqIfPresent("type", reqVO.getType()) - .eqIfPresent("category", reqVO.getCategory()) - .eqIfPresent("remark", reqVO.getRemark()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - ); - } - - default List selectList(ToolTestDemoExportReqVO reqVO) { - return selectList(new QueryWrapperX() - .likeIfPresent("name", reqVO.getName()) - .eqIfPresent("status", reqVO.getStatus()) - .eqIfPresent("type", reqVO.getType()) - .eqIfPresent("category", reqVO.getCategory()) - .eqIfPresent("remark", reqVO.getRemark()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - ); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/ToolErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/ToolErrorCodeConstants.java deleted file mode 100644 index 0753eb6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/ToolErrorCodeConstants.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.enums; - -import cn.iocoder.yudao.framework.common.exception.ErrorCode; - -/** - * Tool 错误码枚举类 - * - * tool 系统,使用 1-003-000-000 段 - */ -public interface ToolErrorCodeConstants { - - // ========== 字典类型(测试) 1003000000 ========== - ErrorCode TEST_DEMO_NOT_EXISTS = new ErrorCode(1003000000, "测试示例不存在"); - - // ========== 代码生成器 1003001000 ========== - ErrorCode CODEGEN_TABLE_EXISTS = new ErrorCode(1003001000, "表定义已经存在"); - ErrorCode CODEGEN_IMPORT_TABLE_NULL = new ErrorCode(1003001001, "导入的表不存在"); - ErrorCode CODEGEN_IMPORT_COLUMNS_NULL = new ErrorCode(1003001002, "导入的字段不存在"); - ErrorCode CODEGEN_PARSE_SQL_ERROR = new ErrorCode(1003001003, "解析 SQL 失败,请检查"); - ErrorCode CODEGEN_TABLE_NOT_EXISTS = new ErrorCode(1003001004, "表定义不存在"); - ErrorCode CODEGEN_COLUMN_NOT_EXISTS = new ErrorCode(1003001005, "字段义不存在"); - ErrorCode CODEGEN_SYNC_COLUMNS_NULL = new ErrorCode(1003001006, "同步的字段不存在"); - ErrorCode CODEGEN_SYNC_NONE_CHANGE = new ErrorCode(1003001007, "同步失败,不存在改变"); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java deleted file mode 100644 index 8eec060..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成器的字段 HTML 展示枚举 - */ -@AllArgsConstructor -@Getter -public enum ToolCodegenColumnHtmlTypeEnum { - - INPUT("input"), // 文本框 - TEXTAREA("textarea"), // 文本域 - SELECT("select"), // 下拉框 - RADIO("radio"), // 单选框 - CHECKBOX("checkbox"), // 复选框 - DATETIME("datetime"), // 日期控件 - UPLOAD_IMAGE("upload_image"), // 上传图片 - UPLOAD_FILE("upload_file"), // 上传文件 - EDITOR("editor"), // 富文本控件 - ; - - /** - * 条件 - */ - private final String type; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java deleted file mode 100644 index bfa76a8..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成器的字段过滤条件枚举 - */ -@AllArgsConstructor -@Getter -public enum ToolCodegenColumnListConditionEnum { - - EQ("="), - NE("!="), - GT(">"), - GTE(">="), - LT("<"), - LTE("<="), - LIKE("LIKE"), - BETWEEN("BETWEEN"); - - /** - * 条件 - */ - private final String condition; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java deleted file mode 100644 index 0e598c0..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成的导入类型 - * - * @author 芋道源码 - */ -@AllArgsConstructor -@Getter -public enum ToolCodegenImportTypeEnum { - - DB(1), // 从 information_schema 的 table 和 columns 表导入 - SQL(2); // 基于建表 SQL 语句导入 - - /** - * 类型 - */ - private final Integer type; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java deleted file mode 100644 index d24cd2f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成模板类型 - * - * @author 芋道源码 - */ -@AllArgsConstructor -@Getter -public enum ToolCodegenTemplateTypeEnum { - - CRUD(1), // 单表(增删改查) - TREE(2), // 树表(增删改查) - ; - - /** - * 类型 - */ - private final Integer type; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java deleted file mode 100644 index 695f466..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.framework.errorcode.config; - -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.generator.ErrorCodeAutoGenerator; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.loader.ErrorCodeLoader; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.loader.ErrorCodeLoaderImpl; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.generator.ErrorCodeAutoGeneratorImpl; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.EnableScheduling; - -/** - * 错误码配置类 - */ -@Configuration -@EnableConfigurationProperties(ErrorCodeProperties.class) -@EnableScheduling // 开启调度任务的功能,因为 ErrorCodeRemoteLoader 通过定时刷新错误码 -public class ErrorCodeConfiguration { - - @Bean - public ErrorCodeAutoGenerator errorCodeAutoGenerator(@Value("${spring.application.name}") String applicationName, - ErrorCodeProperties errorCodeProperties, - ErrorCodeFrameworkService errorCodeFrameworkService) { - return new ErrorCodeAutoGeneratorImpl(applicationName, errorCodeProperties.getConstantsClassList(), - errorCodeFrameworkService); - } - - @Bean - public ErrorCodeLoader errorCodeLoader(@Value("${spring.application.name}") String applicationName, - ErrorCodeFrameworkService errorCodeFrameworkService) { - return new ErrorCodeLoaderImpl(applicationName, errorCodeFrameworkService); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/config/ErrorCodeProperties.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/config/ErrorCodeProperties.java deleted file mode 100644 index b3bf2cb..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/config/ErrorCodeProperties.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.framework.errorcode.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.validation.annotation.Validated; - -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 错误码的配置属性类 - * - * @author dlyan - */ -@ConfigurationProperties("yudao.error-code") -@Data -@Validated -public class ErrorCodeProperties { - - /** - * 错误码枚举类 - */ - @NotNull(message = "错误码枚举类不能为空") - private List constantsClassList; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java deleted file mode 100644 index 4ec2feb..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.framework.errorcode.core.dto; - -import lombok.Data; -import lombok.experimental.Accessors; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - * 错误码自动生成 DTO - * - * @author dylan - */ -@Data -@Accessors(chain = true) -public class ErrorCodeAutoGenerateReqDTO { - - /** - * 应用名 - */ - @NotNull(message = "应用名不能为空") - private String applicationName; - /** - * 错误码编码 - */ - @NotNull(message = "错误码编码不能为空") - private Integer code; - /** - * 错误码错误提示 - */ - @NotEmpty(message = "错误码错误提示不能为空") - private String message; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java deleted file mode 100644 index 78b0a6c..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.framework.errorcode.core.dto; - -import lombok.Data; - -import java.util.Date; - -/** - * 错误码的 Response DTO - * - * @author 芋道源码 - */ -@Data -public class ErrorCodeRespDTO { - - /** - * 错误码编码 - */ - private Integer code; - /** - * 错误码错误提示 - */ - private String message; - /** - * 更新时间 - */ - private Date updateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java deleted file mode 100644 index a152f1f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.framework.errorcode.core.generator; - -/** - * 错误码的自动生成器 - * - * @author dylan - */ -public interface ErrorCodeAutoGenerator { - - /** - * 将配置类到错误码写入数据库 - */ - void execute(); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java deleted file mode 100644 index 0660de2..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.framework.errorcode.core.generator; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ClassUtil; -import cn.hutool.core.util.ReflectUtil; -import cn.iocoder.yudao.framework.common.exception.ErrorCode; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Async; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * ErrorCodeAutoGenerator 的实现类 - * 目的是,扫描指定的 {@link #constantsClassList} 类,写入到 system 服务中 - * - * @author dylan - */ -@RequiredArgsConstructor -@Slf4j -public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator { - - /** - * 应用分组 - */ - private final String applicationName; - /** - * 错误码枚举类 - */ - private final List constantsClassList; - /** - * 错误码 Service - */ - private final ErrorCodeFrameworkService errorCodeService; - - @Override - @EventListener(ApplicationReadyEvent.class) - @Async // 异步,保证项目的启动过程,毕竟非关键流程 - public void execute() { - // 第一步,解析错误码 - List autoGenerateDTOs = parseErrorCode(); - log.info("[execute][解析到错误码数量为 ({}) 个]", autoGenerateDTOs.size()); - - // 第二步,写入到 system 服务 - errorCodeService.autoGenerateErrorCodes(autoGenerateDTOs); - log.info("[execute][写入到 system 组件完成]"); - } - - /** - * 解析 constantsClassList 变量,转换成错误码数组 - * - * @return 错误码数组 - */ - private List parseErrorCode() { - // 校验 errorCodeConstantsClass 参数 - if (CollUtil.isEmpty(constantsClassList)) { - log.info("[execute][未配置 yudao.error-code.constants-class-list 配置项,不进行自动写入到 system 服务中]"); - return new ArrayList<>(); - } - - // 解析错误码 - List autoGenerateDTOs = new ArrayList<>(); - constantsClassList.forEach(constantsClass -> { - // 解析错误码枚举类 - Class errorCodeConstantsClazz = ClassUtil.loadClass(constantsClass); - // 解析错误码 - autoGenerateDTOs.addAll(parseErrorCode(errorCodeConstantsClazz)); - }); - return autoGenerateDTOs; - } - - /** - * 解析错误码类,获得错误码数组 - * - * @return 错误码数组 - */ - private List parseErrorCode(Class constantsClass) { - List autoGenerateDTOs = new ArrayList<>(); - Arrays.stream(constantsClass.getFields()).forEach(field -> { - if (field.getType() != ErrorCode.class) { - return; - } - // 转换成 ErrorCodeAutoGenerateReqDTO 对象 - ErrorCode errorCode = (ErrorCode) ReflectUtil.getFieldValue(constantsClass, field); - autoGenerateDTOs.add(new ErrorCodeAutoGenerateReqDTO().setApplicationName(applicationName) - .setCode(errorCode.getCode()).setMessage(errorCode.getMsg())); - }); - return autoGenerateDTOs; - } - -} - diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java deleted file mode 100644 index aac3e89..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.framework.errorcode.core.loader; - -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; - -/** - * 错误码加载器 - * - * 注意,错误码最终加载到 {@link ServiceExceptionUtil} 的 MESSAGES 变量中! - * - * @author dlyan - */ -public interface ErrorCodeLoader { - - /** - * 添加错误码 - * - * @param code 错误码的编号 - * @param msg 错误码的提示 - */ - default void putErrorCode(Integer code, String msg) { - ServiceExceptionUtil.put(code, msg); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java deleted file mode 100644 index 2a270d0..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.framework.errorcode.core.loader; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; -import cn.iocoder.yudao.framework.common.util.date.DateUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Scheduled; - -import java.util.Date; -import java.util.List; - -/** - * ErrorCodeLoader 的实现类,从 infra 的数据库中,加载错误码。 - * - * 考虑到错误码会刷新,所以按照 {@link #REFRESH_ERROR_CODE_PERIOD} 频率,增量加载错误码。 - * - * @author dlyan - */ -@RequiredArgsConstructor -@Slf4j -public class ErrorCodeLoaderImpl implements ErrorCodeLoader { - - /** - * 刷新错误码的频率,单位:毫秒 - */ - private static final int REFRESH_ERROR_CODE_PERIOD = 60 * 1000; - - /** - * 应用分组 - */ - private final String applicationName; - /** - * 错误码 Service - */ - private final ErrorCodeFrameworkService errorCodeService; - - /** - * 缓存错误码的最大更新时间,用于后续的增量轮询,判断是否有更新 - */ - private Date maxUpdateTime; - - @EventListener(ApplicationReadyEvent.class) - public void loadErrorCodes() { - this.loadErrorCodes0(); - } - - @Scheduled(fixedDelay = REFRESH_ERROR_CODE_PERIOD, initialDelay = REFRESH_ERROR_CODE_PERIOD) - public void refreshErrorCodes() { - this.loadErrorCodes0(); - } - - private void loadErrorCodes0() { - // 加载错误码 - List errorCodeRespDTOs = errorCodeService.getErrorCodeList(applicationName, maxUpdateTime); - if (CollUtil.isEmpty(errorCodeRespDTOs)) { - return; - } - log.info("[loadErrorCodes0][加载到 ({}) 个错误码]", errorCodeRespDTOs.size()); - - // 刷新错误码的缓存 - errorCodeRespDTOs.forEach(errorCodeRespDTO -> { - // 写入到错误码的缓存 - putErrorCode(errorCodeRespDTO.getCode(), errorCodeRespDTO.getMessage()); - // 记录下更新时间,方便增量更新 - maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeRespDTO.getUpdateTime()); - }); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java deleted file mode 100644 index 30b707a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.framework.errorcode.core.service; - -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; - -import javax.validation.Valid; -import java.util.Date; -import java.util.List; - -/** - * 错误码 Framework Service 接口 - * - * @author 芋道源码 - */ -public interface ErrorCodeFrameworkService { - - /** - * 自动创建错误码 - * - * @param autoGenerateDTOs 错误码信息 - */ - void autoGenerateErrorCodes(@Valid List autoGenerateDTOs); - - /** - * 增量获得错误码数组 - * - * 如果 minUpdateTime 为空时,则获取所有错误码 - * - * @param applicationName 应用名 - * @param minUpdateTime 最小更新时间 - * @return 错误码数组 - */ - List getErrorCodeList(String applicationName, Date minUpdateTime); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/package-info.java deleted file mode 100644 index 7d75bc3..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/errorcode/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 错误码组件 - * - * 将错误码缓存在内存中,同时通过定时器每 n 分钟更新 - */ -package cn.iocoder.dashboard.modules.tool.framework.errorcode; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/package-info.java deleted file mode 100644 index 3c4ce27..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 tool 模块的 framework 封装 - * - * @author 芋道源码 - */ -package cn.iocoder.dashboard.modules.tool.framework; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/package-info.java deleted file mode 100644 index d161f55..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * tool 包下,我们放研发工具,提升研发效率与质量。 - * 例如说:代码生成器、接口文档等等 - * - * 缩写:tool - */ -package cn.iocoder.dashboard.modules.tool; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenService.java deleted file mode 100644 index 4a548f0..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenService.java +++ /dev/null @@ -1,121 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.service.codegen; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; - -import java.util.List; -import java.util.Map; - -/** - * 代码生成 Service 接口 - * - * @author 芋道源码 - */ -public interface ToolCodegenService { - - /** - * 基于 SQL 建表语句,创建代码生成器的表定义 - * - * @param sql SQL 建表语句 - * @return 创建的表定义的编号 - */ - Long createCodegenListFromSQL(String sql); - - /** - * 基于数据库的表结构,创建代码生成器的表定义 - * - * @param tableName 表名称 - * @return 创建的表定义的编号 - */ - Long createCodegen(String tableName); - - /** - * 基于 {@link #createCodegen(String)} 的批量创建 - * - * @param tableNames 表名称数组 - * @return 创建的表定义的编号数组 - */ - List createCodegenListFromDB(List tableNames); - - /** - * 更新数据库的表和字段定义 - * - * @param updateReqVO 更新信息 - */ - void updateCodegen(ToolCodegenUpdateReqVO updateReqVO); - - /** - * 基于数据库的表结构,同步数据库的表和字段定义 - * - * @param tableId 表编号 - */ - void syncCodegenFromDB(Long tableId); - - /** - * 基于 SQL 建表语句,同步数据库的表和字段定义 - * - * @param tableId 表编号 - * @param sql SQL 建表语句 - */ - void syncCodegenFromSQL(Long tableId, String sql); - - /** - * 删除数据库的表和字段定义 - * - * @param tableId 数据编号 - */ - void deleteCodegen(Long tableId); - - /** - * 获得表定义分页 - * - * @param pageReqVO 分页条件 - * @return 表定义分页 - */ - PageResult getCodegenTablePage(ToolCodegenTablePageReqVO pageReqVO); - - /** - * 获得表定义 - * - * @param id 表编号 - * @return 表定义 - */ - ToolCodegenTableDO getCodegenTablePage(Long id); - - /** - * 获得全部表定义 - * - * @return 表定义数组 - */ - List getCodeGenTableList(); - - /** - * 获得指定表的字段定义数组 - * - * @param tableId 表编号 - * @return 字段定义数组 - */ - List getCodegenColumnListByTableId(Long tableId); - - /** - * 执行指定表的代码生成 - * - * @param tableId 表编号 - * @return 生成结果。key 为文件路径,value 为对应的代码内容 - */ - Map generationCodes(Long tableId); - - /** - * 获得数据库自带的表定义列表 - * - * @param tableName 表名称 - * @param tableComment 表描述 - * @return 表定义列表 - */ - List getSchemaTableList(String tableName, String tableComment); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java deleted file mode 100644 index 123b1fd..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java +++ /dev/null @@ -1,234 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.service.codegen.impl; - -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.tool.convert.codegen.ToolCodegenConvert; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; -import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; -import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; -import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenTemplateTypeEnum; -import com.google.common.collect.Sets; -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.*; - -import static cn.hutool.core.text.CharSequenceUtil.*; - -/** - * 代码生成器的 Builder,负责: - * 1. 将数据库的表 {@link ToolSchemaTableDO} 定义,构建成 {@link ToolCodegenTableDO} - * 2. 将数据库的列 {@link ToolSchemaColumnDO} 构定义,建成 {@link ToolCodegenColumnDO} - */ -@Component -public class ToolCodegenBuilder { - - /** - * Module 名字的映射 TODO 后续梳理到配置类 - * - * key:模块的完整名 - * value:模块的缩写名 - */ - private static final Map moduleNames = MapUtil.builder() - .put("system", "sys") - .put("infra", "inf") - .put("tool", "tool") - .build(); - - /** - * 字段名与 {@link ToolCodegenColumnListConditionEnum} 的默认映射 - * 注意,字段的匹配以后缀的方式 - */ - private static final Map columnListOperationConditionMappings = - MapUtil.builder() - .put("name", ToolCodegenColumnListConditionEnum.LIKE) - .put("time", ToolCodegenColumnListConditionEnum.BETWEEN) - .put("date", ToolCodegenColumnListConditionEnum.BETWEEN) - .build(); - - /** - * 字段名与 {@link ToolCodegenColumnHtmlTypeEnum} 的默认映射 - * 注意,字段的匹配以后缀的方式 - */ - private static final Map columnHtmlTypeMappings = - MapUtil.builder() - .put("status", ToolCodegenColumnHtmlTypeEnum.RADIO) - .put("sex", ToolCodegenColumnHtmlTypeEnum.RADIO) - .put("type", ToolCodegenColumnHtmlTypeEnum.SELECT) - .put("image", ToolCodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) - .put("file", ToolCodegenColumnHtmlTypeEnum.UPLOAD_FILE) - .put("content", ToolCodegenColumnHtmlTypeEnum.EDITOR) - .put("time", ToolCodegenColumnHtmlTypeEnum.DATETIME) - .put("date", ToolCodegenColumnHtmlTypeEnum.DATETIME) - .build(); - - /** - * {@link BaseDO} 的字段 - */ - public static final Set BASE_DO_FIELDS = new HashSet<>(); - /** - * 新增操作,不需要传递的字段 - */ - private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); - /** - * 修改操作,不需要传递的字段 - */ - private static final Set UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); - /** - * 列表操作的条件,不需要传递的字段 - */ - private static final Set LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); - /** - * 列表操作的结果,不需要返回的字段 - */ - private static final Set LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); - - /** - * Java 类型与 MySQL 类型的映射关系 - */ - private static final Map> javaTypeMappings = MapUtil.>builder() - .put(Boolean.class.getSimpleName(), Sets.newHashSet("bit")) - .put(Integer.class.getSimpleName(), Sets.newHashSet("tinyint", "smallint", "mediumint", "int")) - .put(Long.class.getSimpleName(), Collections.singleton("bigint")) - .put(Double.class.getSimpleName(), Sets.newHashSet("float", "double")) - .put(BigDecimal.class.getSimpleName(), Sets.newHashSet("decimal", "numeric")) - .put(String.class.getSimpleName(), Sets.newHashSet("tinytext", "text", "mediumtext", "longtext", // 长文本 - "char", "varchar", "nvarchar", "varchar2")) // 短文本 - .put(Date.class.getSimpleName(), Sets.newHashSet("datetime", "time", "date", "timestamp")) - .put("byte[]", Sets.newHashSet("blob")) - .build(); - - static { - Arrays.stream(BaseDO.class.getDeclaredFields()).forEach(field -> BASE_DO_FIELDS.add(field.getName())); - // 处理 OPERATION 相关的字段 - CREATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - UPDATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - LIST_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - LIST_OPERATION_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是可能需要传递的 - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的 - } - - public ToolCodegenTableDO buildTable(ToolSchemaTableDO schemaTable) { - ToolCodegenTableDO table = ToolCodegenConvert.INSTANCE.convert(schemaTable); - initTableDefault(table); - return table; - } - - /** - * 初始化 Table 表的默认字段 - * - * @param table 表定义 - */ - private void initTableDefault(ToolCodegenTableDO table) { - table.setModuleName(getFullModuleName(StrUtil.subBefore(table.getTableName(), - '_', false))); // 第一个 _ 前缀的前面,作为 module 名字 - table.setBusinessName(toCamelCase(subAfter(table.getTableName(), - '_', false))); // 第一步,第一个 _ 前缀的后面,作为 module 名字; 第二步,可能存在多个 _ 的情况,转换成驼峰 - table.setClassName(upperFirst(toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写 - table.setClassComment(subBefore(table.getTableComment(), // 去除结尾的表,作为类描述 - '表', true)); - table.setAuthor("芋艿"); // TODO 稍后改成创建人 - table.setTemplateType(ToolCodegenTemplateTypeEnum.CRUD.getType()); - } - - public List buildColumns(List schemaColumns) { - List columns = ToolCodegenConvert.INSTANCE.convertList(schemaColumns); - columns.forEach(this::initColumnDefault); - return columns; - } - - /** - * 初始化 Column 列的默认字段 - * - * @param column 列定义 - */ - private void initColumnDefault(ToolCodegenColumnDO column) { - // 处理 Java 相关的字段的默认值 - processColumnJava(column); - // 处理 CRUD 相关的字段的默认值 - processColumnOperation(column); - // 处理 UI 相关的字段的默认值 - processColumnUI(column); - } - - private void processColumnJava(ToolCodegenColumnDO column) { - // 处理 javaField 字段 - column.setJavaField(toCamelCase(column.getColumnName())); - // 处理 dictType 字段,暂无 - // 处理 javaType 字段 - String dbType = StrUtil.subBefore(column.getColumnType(), '(', false); - javaTypeMappings.entrySet().stream() - .filter(entry -> entry.getValue().contains(dbType)) - .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey())); - if (column.getJavaType() == null) { - throw new IllegalStateException(String.format("column(%s) 的数据库类型(%s) 找不到匹配的 Java 类型", - column.getColumnName(), column.getColumnType())); - } - } - - private void processColumnOperation(ToolCodegenColumnDO column) { - // 处理 createOperation 字段 - column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - && !column.getPrimaryKey()); // 对于主键,创建时无需传递 - // 处理 updateOperation 字段 - column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - || column.getPrimaryKey()); // 对于主键,更新时需要传递 - // 处理 listOperation 字段 - column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 - // 处理 listOperationCondition 字段 - columnListOperationConditionMappings.entrySet().stream() - .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) - .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); - if (column.getListOperationCondition() == null) { - column.setListOperationCondition(ToolCodegenColumnListConditionEnum.EQ.getCondition()); - } - // 处理 listOperationResult 字段 - column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); - } - - private void processColumnUI(ToolCodegenColumnDO column) { - // 基于后缀进行匹配 - columnHtmlTypeMappings.entrySet().stream() - .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) - .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); - // 如果是 Boolean 类型时,设置为 radio 类型. - // 其它类型,因为字段名可以相对保障,所以不进行处理。例如说 date 对应 datetime 类型. - if (Boolean.class.getSimpleName().equals(column.getJavaType())) { - column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.RADIO.getType()); - } - // 兜底,设置默认为 input 类型 - if (column.getHtmlType() == null) { - column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.INPUT.getType()); - } - } - - /** - * 获得模块的缩略名 - * - * @param fullModuleName 模块的完整名 - * @return 缩略名 - */ - public String getSimpleModuleName(String fullModuleName) { - return moduleNames.getOrDefault(fullModuleName, fullModuleName); - } - - /** - * 获得模块的完整名 - * - * @param shortModuleName 模块的缩略名 - * @return 完整名 - */ - public String getFullModuleName(String shortModuleName) { - return moduleNames.entrySet().stream() - .filter(entry -> entry.getValue().equals(shortModuleName)) // 匹配 - .findFirst().map(Map.Entry::getKey) // 返回 key - .orElse(shortModuleName); // 兜底返回 shortModuleName - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java deleted file mode 100644 index e959c14..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ /dev/null @@ -1,207 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.service.codegen.impl; - -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.template.TemplateConfig; -import cn.hutool.extra.template.TemplateEngine; -import cn.hutool.extra.template.engine.velocity.VelocityEngine; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.framework.codegen.config.CodegenProperties; -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.date.DateUtils; -import com.google.common.collect.Maps; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import static cn.hutool.core.map.MapUtil.getStr; -import static cn.hutool.core.text.CharSequenceUtil.*; - -/** - * 代码生成的引擎,用于具体生成代码 - * 目前基于 {@link org.apache.velocity.app.Velocity} 模板引擎实现 - * - * 考虑到 Java 模板引擎的框架非常多,Freemarker、Velocity、Thymeleaf 等等,所以我们采用 hutool 封装的 {@link cn.hutool.extra.template.Template} 抽象 - * - * @author 芋道源码 - */ -@Component -public class ToolCodegenEngine { - - /** - * 模板配置 - * key:模板在 resources 的地址 - * value:生成的路径 - */ - private static final Map TEMPLATES = MapUtil.builder(new LinkedHashMap<>()) // 有序 - // Java Main - .put(javaTemplatePath("controller/vo/baseVO"), - javaFilePath("controller/${table.businessName}/vo/${table.className}BaseVO")) - .put(javaTemplatePath("controller/vo/createReqVO"), - javaFilePath("controller/${table.businessName}/vo/${table.className}CreateReqVO")) - .put(javaTemplatePath("controller/vo/pageReqVO"), - javaFilePath("controller/${table.businessName}/vo/${table.className}PageReqVO")) - .put(javaTemplatePath("controller/vo/respVO"), - javaFilePath("controller/${table.businessName}/vo/${table.className}RespVO")) - .put(javaTemplatePath("controller/vo/updateReqVO"), - javaFilePath("controller/${table.businessName}/vo/${table.className}UpdateReqVO")) - .put(javaTemplatePath("controller/vo/exportReqVO"), - javaFilePath("controller/${table.businessName}/vo/${table.className}ExportReqVO")) - .put(javaTemplatePath("controller/vo/excelVO"), - javaFilePath("controller/${table.businessName}/vo/${table.className}ExcelVO")) - .put(javaTemplatePath("controller/controller"), - javaFilePath("controller/${table.businessName}/${table.className}Controller")) - .put(javaTemplatePath("convert/convert"), - javaFilePath("convert/${table.businessName}/${table.className}Convert")) - .put(javaTemplatePath("dal/do"), - javaFilePath("dal/dataobject/${table.businessName}/${table.className}DO")) - .put(javaTemplatePath("dal/mapper"), - javaFilePath("dal/mysql/${table.businessName}/${table.className}Mapper")) - .put(javaTemplatePath("enums/errorcode"), - javaFilePath("enums/${simpleModuleName_upperFirst}ErrorCodeConstants")) - .put(javaTemplatePath("service/serviceImpl"), - javaFilePath("service/${table.businessName}/impl/${table.className}ServiceImpl")) - .put(javaTemplatePath("service/service"), - javaFilePath("service/${table.businessName}/${table.className}Service")) - // Java Test - .put(javaTemplatePath("test/serviceTest"), - javaFilePath("service/${table.businessName}/${table.className}ServiceTest")) - // Vue - .put(vueTemplatePath("views/index.vue"), - vueFilePath("views/${table.moduleName}/${classNameVar}/index.vue")) - .put(vueTemplatePath("api/api.js"), - vueFilePath("api/${table.moduleName}/${classNameVar}.js")) - // SQL - .put("codegen/sql/sql.vm", "sql/sql.sql") - .build(); - - @Resource - private ToolCodegenBuilder codegenBuilder; - - @Resource - private CodegenProperties codegenProperties; - - /** - * 模板引擎,由 hutool 实现 - */ - private final TemplateEngine templateEngine; - /** - * 全局通用变量映射 - */ - private final Map globalBindingMap = new HashMap<>(); - - public ToolCodegenEngine() { - // 初始化 TemplateEngine 属性 - TemplateConfig config = new TemplateConfig(); - config.setResourceMode(TemplateConfig.ResourceMode.CLASSPATH); - this.templateEngine = new VelocityEngine(config); - } - - @PostConstruct - private void initGlobalBindingMap() { - // 全局配置 - globalBindingMap.put("basePackage", codegenProperties.getBasePackage()); - // 全局 Java Bean - globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); - globalBindingMap.put("PageResultClassName", PageResult.class.getName()); - // VO 类,独有字段 - globalBindingMap.put("PageParamClassName", PageParam.class.getName()); - globalBindingMap.put("DictFormatClassName", DictFormat.class.getName()); - // TODO 芋艿:代码生成器,解决下枚举类 -// globalBindingMap.put("SysDictTypeEnumClassName", SysDictTypeEnum.class.getName()); - // DO 类,独有字段 - globalBindingMap.put("baseDOFields", ToolCodegenBuilder.BASE_DO_FIELDS); - globalBindingMap.put("BaseDOClassName", BaseDO.class.getName()); - globalBindingMap.put("QueryWrapperClassName", QueryWrapperX.class.getName()); - globalBindingMap.put("BaseMapperClassName", BaseMapperX.class.getName()); - // Util 工具类 - globalBindingMap.put("ServiceExceptionUtilClassName", ServiceExceptionUtil.class.getName()); - globalBindingMap.put("DateUtilsClassName", DateUtils.class.getName()); - globalBindingMap.put("ExcelUtilsClassName", ExcelUtils.class.getName()); - globalBindingMap.put("DictConvertClassName", DictConvert.class.getName()); - globalBindingMap.put("OperateLogClassName", OperateLog.class.getName()); - globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName()); - } - - public Map execute(ToolCodegenTableDO table, List columns) { - // 创建 bindingMap - Map bindingMap = new HashMap<>(globalBindingMap); - bindingMap.put("table", table); - bindingMap.put("columns", columns); - bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, ToolCodegenColumnDO::getPrimaryKey)); // 主键字段 - // moduleName 相关 - String simpleModuleName = codegenBuilder.getSimpleModuleName(table.getModuleName()); - bindingMap.put("simpleModuleName", simpleModuleName); // 将 system 转成 sys - bindingMap.put("simpleModuleName_upperFirst", upperFirst(simpleModuleName)); // 将 sys 转成 Sys - // className 相关 - String simpleClassName = subAfter(table.getClassName(), upperFirst(simpleModuleName) - , false); // 将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 - bindingMap.put("simpleClassName", simpleClassName); - bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type - bindingMap.put("classNameVar", lowerFirst(simpleClassName)); // 将 DictType 转换成 dictType,用于变量 - String simpleClassNameStrikeCase = toSymbolCase(simpleClassName, '-'); // 将 DictType 转换成 dict-type - bindingMap.put("simpleClassName_strikeCase", simpleClassNameStrikeCase); - // permission 前缀 - bindingMap.put("permissionPrefix", table.getModuleName() + ":" + simpleClassNameStrikeCase); - - // 执行生成 - final Map result = Maps.newLinkedHashMapWithExpectedSize(TEMPLATES.size()); // 有序 - TEMPLATES.forEach((vmPath, filePath) -> { - filePath = formatFilePath(filePath, bindingMap); - String content = templateEngine.getTemplate(vmPath).render(bindingMap); - result.put(filePath, content); - }); - return result; - } - - private String formatFilePath(String filePath, Map bindingMap) { - filePath = StrUtil.replace(filePath, "${basePackage}", - getStr(bindingMap, "basePackage").replaceAll("\\.", "/")); - filePath = StrUtil.replace(filePath, "${simpleModuleName_upperFirst}", - getStr(bindingMap, "simpleModuleName_upperFirst")); - filePath = StrUtil.replace(filePath, "${classNameVar}", - getStr(bindingMap, "classNameVar")); - - // table 包含的字段 - ToolCodegenTableDO table = (ToolCodegenTableDO) bindingMap.get("table"); - filePath = StrUtil.replace(filePath, "${table.moduleName}", table.getModuleName()); - filePath = StrUtil.replace(filePath, "${table.businessName}", table.getBusinessName()); - filePath = StrUtil.replace(filePath, "${table.className}", table.getClassName()); - return filePath; - } - - private static String javaTemplatePath(String path) { - return "codegen/java/" + path + ".vm"; - } - - private static String javaFilePath(String path) { - return "java/${basePackage}/${table.moduleName}/" + path + ".java"; - } - - private static String vueTemplatePath(String path) { - return "codegen/vue/" + path + ".vm"; - } - - private static String vueFilePath(String path) { - return "vue/" + path; - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java deleted file mode 100644 index d653ab6..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java +++ /dev/null @@ -1,108 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.service.codegen.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; -import com.alibaba.druid.DbType; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; -import com.alibaba.druid.sql.ast.statement.SQLTableElement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; -import com.alibaba.druid.sql.repository.SchemaRepository; -import org.apache.commons.collections4.KeyValue; -import org.apache.commons.collections4.keyvalue.DefaultKeyValue; - -import java.util.ArrayList; -import java.util.List; - -import static com.alibaba.druid.sql.SQLUtils.normalize; - -/** - * SQL 解析器,将创建表的 SQL,解析成 {@link ToolSchemaTableDO} 和 {@link ToolSchemaColumnDO} 对象, - * 后续可以基于它们,生成代码~ - * - * @author 芋道源码 - */ -public class ToolCodegenSQLParser { - - /** - * 解析建表 SQL 语句,返回 {@link ToolSchemaTableDO} 和 {@link ToolSchemaColumnDO} 对象 - * - * @param sql 建表 SQL 语句 - * @return 解析结果 - */ - public static KeyValue> parse(String sql) { - // 解析 SQL 成 Statement - SQLCreateTableStatement statement = parseCreateSQL(sql); - // 解析 Table 表 - ToolSchemaTableDO table = parseTable(statement); - // 解析 Column 字段 - List columns = parseColumns(statement); - columns.forEach(column -> column.setTableName(table.getTableName())); - // 返回 - return new DefaultKeyValue<>(table, columns); - } - - /** - * 使用 Druid 工具,建表 SQL 语句 - * - * @param sql 建表 SQL 语句 - * @return 创建 Statement - */ - private static SQLCreateTableStatement parseCreateSQL(String sql) { - // 解析 SQL - SchemaRepository repository = new SchemaRepository(DbType.mysql); - repository.console(sql); - // 获得该表对应的 MySqlCreateTableStatement 对象 - String tableName = CollUtil.getFirst(repository.getDefaultSchema().getObjects()).getName(); - return (MySqlCreateTableStatement) repository.findTable(tableName).getStatement(); - } - - private static ToolSchemaTableDO parseTable(SQLCreateTableStatement statement) { - return ToolSchemaTableDO.builder() - .tableName(statement.getTableSource().getTableName(true)) - .tableComment(((SQLCharExpr) statement.getComment()).getText()) - .build(); - } - - private static List parseColumns(SQLCreateTableStatement statement) { - List columns = new ArrayList<>(); - statement.getTableElementList().forEach(element -> parseColumn(columns, element)); - return columns; - } - - private static void parseColumn(List columns, SQLTableElement element) { - // 处理主键 - if (element instanceof SQLPrimaryKey) { - parsePrimaryKey(columns, (SQLPrimaryKey) element); - return; - } - // 处理字段定义 - if (element instanceof SQLColumnDefinition) { - parseColumnDefinition(columns, (SQLColumnDefinition) element); - } - } - - private static void parsePrimaryKey(List columns, SQLPrimaryKey primaryKey) { - String columnName = normalize(primaryKey.getColumns().get(0).toString()); // 暂时不考虑联合主键 - // 匹配 columns 主键字段,设置为 primary - columns.stream().filter(column -> column.getColumnName().equals(columnName)) - .forEach(column -> column.setPrimaryKey(true)); - } - - private static void parseColumnDefinition(List columns, SQLColumnDefinition definition) { - String text = definition.toString().toUpperCase(); - columns.add(ToolSchemaColumnDO.builder() - .columnName(normalize(definition.getColumnName())) - .columnType(definition.getDataType().toString()) - .columnComment(normalize(definition.getComment().toString())) - .nullable(!text.contains(" NOT NULL")) - .primaryKey(false) - .autoIncrement(text.contains("AUTO_INCREMENT")) - .ordinalPosition(columns.size() + 1) - .build()); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java deleted file mode 100644 index 33d6962..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java +++ /dev/null @@ -1,284 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.service.codegen.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.framework.codegen.config.CodegenProperties; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; -import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; -import cn.iocoder.dashboard.modules.tool.convert.codegen.ToolCodegenConvert; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; -import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenColumnMapper; -import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenTableMapper; -import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolSchemaColumnMapper; -import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolSchemaTableMapper; -import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenImportTypeEnum; -import cn.iocoder.dashboard.modules.tool.service.codegen.ToolCodegenService; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import org.apache.commons.collections4.KeyValue; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.dashboard.modules.tool.enums.ToolErrorCodeConstants.*; - -/** - * 代码生成 Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class ToolCodegenServiceImpl implements ToolCodegenService { - - @Resource - private ToolSchemaTableMapper schemaTableMapper; - @Resource - private ToolSchemaColumnMapper schemaColumnMapper; - @Resource - private ToolCodegenTableMapper codegenTableMapper; - @Resource - private ToolCodegenColumnMapper codegenColumnMapper; - - @Resource - private ToolCodegenBuilder codegenBuilder; - @Resource - private ToolCodegenEngine codegenEngine; - - @Resource - private CodegenProperties codegenProperties; - - private Long createCodegen0(ToolCodegenImportTypeEnum importType, - ToolSchemaTableDO schemaTable, List schemaColumns) { - // 校验导入的表和字段非空 - if (schemaTable == null) { - throw exception(CODEGEN_IMPORT_TABLE_NULL); - } - if (CollUtil.isEmpty(schemaColumns)) { - throw exception(CODEGEN_IMPORT_COLUMNS_NULL); - } - // 校验是否已经存在 - if (codegenTableMapper.selectByTableName(schemaTable.getTableName()) != null) { - throw exception(CODEGEN_TABLE_EXISTS); - } - - // 构建 ToolCodegenTableDO 对象,插入到 DB 中 - ToolCodegenTableDO table = codegenBuilder.buildTable(schemaTable); - table.setImportType(importType.getType()); - codegenTableMapper.insert(table); - // 构建 ToolCodegenColumnDO 数组,插入到 DB 中 - List columns = codegenBuilder.buildColumns(schemaColumns); - columns.forEach(column -> { - column.setTableId(table.getId()); - codegenColumnMapper.insert(column); // TODO 批量插入 - }); - return table.getId(); - } - - @Override - public Long createCodegenListFromSQL(String sql) { - // 从 SQL 中,获得数据库表结构 - ToolSchemaTableDO schemaTable; - List schemaColumns; - try { - KeyValue> result = ToolCodegenSQLParser.parse(sql); - schemaTable = result.getKey(); - schemaColumns = result.getValue(); - } catch (Exception ex) { - throw exception(CODEGEN_PARSE_SQL_ERROR); - } - // 导入 - return this.createCodegen0(ToolCodegenImportTypeEnum.SQL, schemaTable, schemaColumns); - } - - @Override - public Long createCodegen(String tableName) { - // 获取当前schema - String tableSchema = codegenProperties.getDbSchemas().iterator().next(); - // 从数据库中,获得数据库表结构 - ToolSchemaTableDO schemaTable = schemaTableMapper.selectByTableSchemaAndTableName(tableSchema, tableName); - List schemaColumns = schemaColumnMapper.selectListByTableName(tableSchema, tableName); - // 导入 - return this.createCodegen0(ToolCodegenImportTypeEnum.DB, schemaTable, schemaColumns); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public List createCodegenListFromDB(List tableNames) { - List ids = new ArrayList<>(tableNames.size()); - // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量 - tableNames.forEach(tableName -> ids.add(createCodegen(tableName))); - return ids; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateCodegen(ToolCodegenUpdateReqVO updateReqVO) { - // 校验是否已经存在 - if (codegenTableMapper.selectById(updateReqVO.getTable().getId()) == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - - // 更新 table 表定义 - ToolCodegenTableDO updateTableObj = ToolCodegenConvert.INSTANCE.convert(updateReqVO.getTable()); - codegenTableMapper.updateById(updateTableObj); - // 更新 column 字段定义 - List updateColumnObjs = ToolCodegenConvert.INSTANCE.convertList03(updateReqVO.getColumns()); - updateColumnObjs.forEach(updateColumnObj -> codegenColumnMapper.updateById(updateColumnObj)); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void syncCodegenFromDB(Long tableId) { - // 校验是否已经存在 - ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); - if (table == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - String tableSchema = codegenProperties.getDbSchemas().iterator().next(); - // 从数据库中,获得数据库表结构 - List schemaColumns = schemaColumnMapper.selectListByTableName(tableSchema, table.getTableName()); - - // 执行同步 - this.syncCodegen0(tableId, schemaColumns); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void syncCodegenFromSQL(Long tableId, String sql) { - // 校验是否已经存在 - ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); - if (table == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - // 从 SQL 中,获得数据库表结构 - List schemaColumns; - try { - KeyValue> result = ToolCodegenSQLParser.parse(sql); - schemaColumns = result.getValue(); - } catch (Exception ex) { - throw exception(CODEGEN_PARSE_SQL_ERROR); - } - - // 执行同步 - this.syncCodegen0(tableId, schemaColumns); - } - - private void syncCodegen0(Long tableId, List schemaColumns) { - // 校验导入的字段不为空 - if (CollUtil.isEmpty(schemaColumns)) { - throw exception(CODEGEN_SYNC_COLUMNS_NULL); - } - Set schemaColumnNames = CollectionUtils.convertSet(schemaColumns, ToolSchemaColumnDO::getColumnName); - - // 构建 ToolCodegenColumnDO 数组,只同步新增的字段 - List codegenColumns = codegenColumnMapper.selectListByTableId(tableId); - Set codegenColumnNames = CollectionUtils.convertSet(codegenColumns, ToolCodegenColumnDO::getColumnName); - // 移除已经存在的字段 - schemaColumns.removeIf(column -> codegenColumnNames.contains(column.getColumnName())); - // 计算需要删除的字段 - Set deleteColumnIds = codegenColumns.stream().filter(column -> !schemaColumnNames.contains(column.getColumnName())) - .map(ToolCodegenColumnDO::getId).collect(Collectors.toSet()); - if (CollUtil.isEmpty(schemaColumns) && CollUtil.isEmpty(deleteColumnIds)) { - throw exception(CODEGEN_SYNC_NONE_CHANGE); - } - - // 插入新增的字段 - List columns = codegenBuilder.buildColumns(schemaColumns); - columns.forEach(column -> { - column.setTableId(tableId); - codegenColumnMapper.insert(column); // TODO 批量插入 - }); - // 删除不存在的字段 - if (CollUtil.isNotEmpty(deleteColumnIds)) { - codegenColumnMapper.deleteBatchIds(deleteColumnIds); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteCodegen(Long tableId) { - // 校验是否已经存在 - if (codegenTableMapper.selectById(tableId) == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - - // 删除 table 表定义 - codegenTableMapper.deleteById(tableId); - // 删除 column 字段定义 - codegenColumnMapper.deleteListByTableId(tableId); - } - - @Override - public PageResult getCodegenTablePage(ToolCodegenTablePageReqVO pageReqVO) { - return codegenTableMapper.selectPage(pageReqVO); - } - - @Override - public ToolCodegenTableDO getCodegenTablePage(Long id) { - return codegenTableMapper.selectById(id); - } - - @Override - public List getCodeGenTableList() { - return codegenTableMapper.selectList(); - } - - @Override - public List getCodegenColumnListByTableId(Long tableId) { - return codegenColumnMapper.selectListByTableId(tableId); - } - - @Override - public Map generationCodes(Long tableId) { - // 校验是否已经存在 - ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); - if (codegenTableMapper.selectById(tableId) == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - List columns = codegenColumnMapper.selectListByTableId(tableId); - if (CollUtil.isEmpty(columns)) { - throw exception(CODEGEN_COLUMN_NOT_EXISTS); - } - - // 执行生成 - return codegenEngine.execute(table, columns); - } - - @Override - public List getSchemaTableList(String tableName, String tableComment) { - List tables = schemaTableMapper.selectList(codegenProperties.getDbSchemas(), tableName, tableComment); - // TODO 强制移除 Quartz 的表,未来做成可配置 - tables.removeIf(table -> table.getTableName().startsWith("QRTZ_")); - return tables; - } - -// /** -// * 修改保存参数校验 -// * -// * @param genTable 业务信息 -// */ -// @Override -// public void validateEdit(GenTable genTable) { -// if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { -// String options = JSON.toJSONString(genTable.getParams()); -// JSONObject paramsObj = JSONObject.parseObject(options); -// if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) { -// throw new CustomException("树编码字段不能为空"); -// } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) { -// throw new CustomException("树父编码字段不能为空"); -// } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) { -// throw new CustomException("树名称字段不能为空"); -// } -// } -// } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/test/ToolTestDemoService.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/test/ToolTestDemoService.java deleted file mode 100644 index b2a9b84..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/test/ToolTestDemoService.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.service.test; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoCreateReqVO; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoExportReqVO; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoPageReqVO; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoUpdateReqVO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.test.ToolTestDemoDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 字典类型 Service 接口 - * - * @author 芋艿 - */ -public interface ToolTestDemoService { - - /** - * 创建字典类型 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createTestDemo(@Valid ToolTestDemoCreateReqVO createReqVO); - - /** - * 更新字典类型 - * - * @param updateReqVO 更新信息 - */ - void updateTestDemo(@Valid ToolTestDemoUpdateReqVO updateReqVO); - - /** - * 删除字典类型 - * - * @param id 编号 - */ - void deleteTestDemo(Long id); - - /** - * 获得字典类型 - * - * @param id 编号 - * @return 字典类型 - */ - ToolTestDemoDO getTestDemo(Long id); - - /** - * 获得字典类型列表 - * - * @param ids 编号 - * @return 字典类型列表 - */ - List getTestDemoList(Collection ids); - - /** - * 获得字典类型分页 - * - * @param pageReqVO 分页查询 - * @return 字典类型分页 - */ - PageResult getTestDemoPage(ToolTestDemoPageReqVO pageReqVO); - - /** - * 获得字典类型列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 字典类型分页 - */ - List getTestDemoList(ToolTestDemoExportReqVO exportReqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java deleted file mode 100644 index 64d3e62..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.service.test.impl; - -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoCreateReqVO; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoExportReqVO; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoPageReqVO; -import cn.iocoder.dashboard.modules.tool.controller.test.vo.ToolTestDemoUpdateReqVO; -import cn.iocoder.dashboard.modules.tool.convert.test.ToolTestDemoConvert; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.test.ToolTestDemoDO; -import cn.iocoder.dashboard.modules.tool.dal.mysql.test.ToolTestDemoMapper; -import cn.iocoder.dashboard.modules.tool.service.test.ToolTestDemoService; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.dashboard.modules.tool.enums.ToolErrorCodeConstants.TEST_DEMO_NOT_EXISTS; - -/** - * 字典类型 Service 实现类 - * - * @author 芋艿 - */ -@Service -@Validated -public class ToolTestDemoServiceImpl implements ToolTestDemoService { - - @Resource - private ToolTestDemoMapper testDemoMapper; - - @Override - public Long createTestDemo(ToolTestDemoCreateReqVO createReqVO) { - // 插入 - ToolTestDemoDO testDemo = ToolTestDemoConvert.INSTANCE.convert(createReqVO); - testDemoMapper.insert(testDemo); - // 返回 - return testDemo.getId(); - } - - @Override - public void updateTestDemo(ToolTestDemoUpdateReqVO updateReqVO) { - // 校验存在 - this.validateTestDemoExists(updateReqVO.getId()); - // 更新 - ToolTestDemoDO updateObj = ToolTestDemoConvert.INSTANCE.convert(updateReqVO); - testDemoMapper.updateById(updateObj); - } - - @Override - public void deleteTestDemo(Long id) { - // 校验存在 - this.validateTestDemoExists(id); - // 更新 - testDemoMapper.deleteById(id); - } - - private void validateTestDemoExists(Long id) { - if (testDemoMapper.selectById(id) == null) { - throw ServiceExceptionUtil.exception(TEST_DEMO_NOT_EXISTS); - } - } - - @Override - public ToolTestDemoDO getTestDemo(Long id) { - return testDemoMapper.selectById(id); - } - - @Override - public List getTestDemoList(Collection ids) { - return testDemoMapper.selectBatchIds(ids); - } - - @Override - public PageResult getTestDemoPage(ToolTestDemoPageReqVO pageReqVO) { - return testDemoMapper.selectPage(pageReqVO); - } - - @Override - public List getTestDemoList(ToolTestDemoExportReqVO exportReqVO) { - return testDemoMapper.selectList(exportReqVO); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java new file mode 100644 index 0000000..ba79187 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.adminserver; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AdminServerApplication { + + public static void main(String[] args) { + SpringApplication.run(AdminServerApplication.class, args); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/config/AsyncConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/config/AsyncConfiguration.java new file mode 100644 index 0000000..720fc5a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/config/AsyncConfiguration.java @@ -0,0 +1,9 @@ +package cn.iocoder.yudao.adminserver.framework.async.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; + +@Configuration +@EnableAsync +public class AsyncConfiguration { +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/package-info.java new file mode 100644 index 0000000..aac87cd --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/package-info.java @@ -0,0 +1,4 @@ +/** + * 异步执行,基于 Spring @Async 实现 + */ +package cn.iocoder.yudao.adminserver.framework.async; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/《芋道 Spring Boot 异步任务入门》.md b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/《芋道 Spring Boot 异步任务入门》.md new file mode 100644 index 0000000..5822b83 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/async/《芋道 Spring Boot 异步任务入门》.md @@ -0,0 +1 @@ + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/config/AdminServerConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/config/AdminServerConfiguration.java new file mode 100644 index 0000000..c961441 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/config/AdminServerConfiguration.java @@ -0,0 +1,9 @@ +package cn.iocoder.yudao.adminserver.framework.monitor.config; + +import de.codecentric.boot.admin.server.config.EnableAdminServer; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableAdminServer +public class AdminServerConfiguration { +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/package-info.java new file mode 100644 index 0000000..0d380cf --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/package-info.java @@ -0,0 +1,4 @@ +/** + * 使用 Spring Boot Admin 实现简单的监控平台 + */ +package cn.iocoder.yudao.adminserver.framework.monitor; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md new file mode 100644 index 0000000..a1e3676 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md @@ -0,0 +1 @@ + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/package-info.java new file mode 100644 index 0000000..fcb2a09 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于整个 yudao-admin-server 的 framework 封装 + * + * @author 芋道源码 + */ +package cn.iocoder.yudao.adminserver.framework; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/InfConfigController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/InfConfigController.java new file mode 100644 index 0000000..b0ff2ca --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/InfConfigController.java @@ -0,0 +1,105 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.config; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.*; +import cn.iocoder.yudao.adminserver.modules.infra.convert.config.InfConfigConvert; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO; +import cn.iocoder.yudao.adminserver.modules.infra.service.config.InfConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_SENSITIVE; + +@Api(tags = "参数配置") +@RestController +@RequestMapping("/infra/config") +@Validated +public class InfConfigController { + + @Resource + private InfConfigService configService; + + @PostMapping("/create") + @ApiOperation("创建参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:create')") + public CommonResult createConfig(@Valid @RequestBody InfConfigCreateReqVO reqVO) { + return success(configService.createConfig(reqVO)); + } + + @PutMapping("/update") + @ApiOperation("修改参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:update')") + public CommonResult updateConfig(@Valid @RequestBody InfConfigUpdateReqVO reqVO) { + configService.updateConfig(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除参数配置") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:config:delete')") + public CommonResult deleteConfig(@RequestParam("id") Long id) { + configService.deleteConfig(id); + return success(true); + } + + @GetMapping(value = "/get") + @ApiOperation("获得参数配置") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:config:query')") + public CommonResult getConfig(@RequestParam("id") Long id) { + return success(InfConfigConvert.INSTANCE.convert(configService.getConfig(id))); + } + + @GetMapping(value = "/get-value-by-key") + @ApiOperation(value = "根据参数键名查询参数值", notes = "敏感配置,不允许返回给前端") + @ApiImplicitParam(name = "key", value = "参数键", required = true, example = "yunai.biz.username", dataTypeClass = String.class) + public CommonResult getConfigKey(@RequestParam("key") String key) { + InfConfigDO config = configService.getConfigByKey(key); + if (config == null) { + return null; + } + if (config.getSensitive()) { + throw exception(CONFIG_GET_VALUE_ERROR_IF_SENSITIVE); + } + return success(config.getValue()); + } + + @GetMapping("/page") + @ApiOperation("获取参数配置分页") + @PreAuthorize("@ss.hasPermission('infra:config:query')") + public CommonResult> getConfigPage(@Valid InfConfigPageReqVO reqVO) { + PageResult page = configService.getConfigPage(reqVO); + return success(InfConfigConvert.INSTANCE.convertPage(page)); + } + + @GetMapping("/export") + @ApiOperation("导出参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:export')") + @OperateLog(type = EXPORT) + public void exportSysConfig(@Valid InfConfigExportReqVO reqVO, + HttpServletResponse response) throws IOException { + List list = configService.getConfigList(reqVO); + // 拼接数据 + List datas = InfConfigConvert.INSTANCE.convertList(list); + // 输出 + ExcelUtils.write(response, "参数配置.xls", "数据", InfConfigExcelVO.class, datas); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigBaseVO.java new file mode 100644 index 0000000..82b0f48 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigBaseVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 参数配置 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class InfConfigBaseVO { + + @ApiModelProperty(value = "参数分组", required = true, example = "biz") + @NotEmpty(message = "参数分组不能为空") + @Size(max = 50, message = "参数名称不能超过50个字符") + private String group; + + @ApiModelProperty(value = "参数名称", required = true, example = "数据库名") + @NotBlank(message = "参数名称不能为空") + @Size(max = 100, message = "参数名称不能超过100个字符") + private String name; + + @ApiModelProperty(value = "参数键值", required = true, example = "1024") + @NotBlank(message = "参数键值不能为空") + @Size(max = 500, message = "参数键值长度不能超过500个字符") + private String value; + + @ApiModelProperty(value = "是否敏感", required = true, example = "true") + @NotNull(message = "是否敏感不能为空") + private Boolean sensitive; + + @ApiModelProperty(value = "备注", example = "备注一下很帅气!") + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigCreateReqVO.java new file mode 100644 index 0000000..ee2b90a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigCreateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +@ApiModel("参数配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class InfConfigCreateReqVO extends InfConfigBaseVO { + + @ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username") + @NotBlank(message = "参数键名长度不能为空") + @Size(max = 100, message = "参数键名长度不能超过100个字符") + private String key; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java new file mode 100644 index 0000000..2a5c044 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExcelVO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 参数配置 Excel 导出响应 VO + */ +@Data +public class InfConfigExcelVO { + + @ExcelProperty("参数配置序号") + private Long id; + + @ExcelProperty("参数键名") + private String key; + + @ExcelProperty("参数分组") + private String group; + + @ExcelProperty("参数名称") + private String name; + + @ExcelProperty("参数键值") + private String value; + + @ExcelProperty(value = "参数类型", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.CONFIG_TYPE) + private Integer type; + + @ExcelProperty(value = "是否敏感", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.BOOLEAN_STRING) + private Boolean sensitive; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExportReqVO.java new file mode 100644 index 0000000..550a5df --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigExportReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("参数配置导出 Request VO") +@Data +public class InfConfigExportReqVO { + + @ApiModelProperty(value = "参数名称", example = "模糊匹配") + private String name; + + @ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配") + private String key; + + @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举") + private Integer type; + + @ApiModelProperty(value = "开始时间", example = "2020-10-24 00:00:00") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束时间", example = "2020-10-24 23:59:59") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigPageReqVO.java new file mode 100644 index 0000000..3f031fa --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigPageReqVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("参数配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfConfigPageReqVO extends PageParam { + + @ApiModelProperty(value = "参数名称", example = "模糊匹配") + private String name; + + @ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配") + private String key; + + @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举") + private Integer type; + + @ApiModelProperty(value = "开始时间", example = "2020-10-24 00:00:00") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束时间", example = "2020-10-24 23:59:59") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigRespVO.java new file mode 100644 index 0000000..84689b7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigRespVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.Date; + +@ApiModel("参数配置信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class InfConfigRespVO extends InfConfigBaseVO { + + @ApiModelProperty(value = "参数配置序号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username") + @NotBlank(message = "参数键名长度不能为空") + @Size(max = 100, message = "参数键名长度不能超过100个字符") + private String key; + + @ApiModelProperty(value = "参数类型", required = true, example = "1", notes = "参见 SysConfigTypeEnum 枚举") + private Integer type; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java new file mode 100644 index 0000000..7e9d49c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/vo/InfConfigUpdateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("参数配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfConfigUpdateReqVO extends InfConfigBaseVO { + + @ApiModelProperty(value = "参数配置序号", required = true, example = "1024") + @NotNull(message = "参数配置编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/doc/InfDbDocController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/doc/InfDbDocController.java new file mode 100644 index 0000000..19f72e1 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/doc/InfDbDocController.java @@ -0,0 +1,150 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.doc; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; +import cn.smallbun.screw.core.Configuration; +import cn.smallbun.screw.core.engine.EngineConfig; +import cn.smallbun.screw.core.engine.EngineFileType; +import cn.smallbun.screw.core.engine.EngineTemplateType; +import cn.smallbun.screw.core.execute.DocumentationExecute; +import cn.smallbun.screw.core.process.ProcessConfig; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.util.Collections; + +@Api(tags = "数据库文档") +@RestController +@RequestMapping("/infra/db-doc") +public class InfDbDocController { + + @Resource + private DataSourceProperties dataSourceProperties; + + private static final String FILE_OUTPUT_DIR = System.getProperty("java.io.tmpdir") + File.separator + + "db-doc"; + private static final String DOC_FILE_NAME = "数据库文档"; + private static final String DOC_VERSION = "1.0.0"; + private static final String DOC_DESCRIPTION = "文档描述"; + + @GetMapping("/export-html") + @ApiOperation("导出 html 格式的数据文档") + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) + public void exportHtml(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.HTML, deleteFile, response); + } + + @GetMapping("/export-word") + @ApiOperation("导出 word 格式的数据文档") + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) + public void exportWord(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.WORD, deleteFile, response); + } + + @GetMapping("/export-markdown") + @ApiOperation("导出 markdown 格式的数据文档") + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) + public void exportMarkdown(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.MD, deleteFile, response); + } + + private void doExportFile(EngineFileType fileOutputType, Boolean deleteFile, + HttpServletResponse response) throws IOException { + String docFileName = DOC_FILE_NAME + "_" + IdUtil.fastSimpleUUID(); + String filePath = doExportFile(fileOutputType, docFileName); + String downloadFileName = DOC_FILE_NAME + fileOutputType.getFileSuffix(); //下载后的文件名 + try { + // 读取,返回 + ServletUtils.writeAttachment(response, downloadFileName, FileUtil.readBytes(filePath)); + } finally { + handleDeleteFile(deleteFile, filePath); + } + } + + /** + * 输出文件,返回文件路径 + * + * @param fileOutputType 文件类型 + * @param fileName 文件名, 无需 ".docx" 等文件后缀 + * @return 生成的文件所在路径 + */ + private String doExportFile(EngineFileType fileOutputType, String fileName) { + try (HikariDataSource dataSource = buildDataSource()) { + // 创建 screw 的配置 + Configuration config = Configuration.builder() + .version(DOC_VERSION) // 版本 + .description(DOC_DESCRIPTION) // 描述 + .dataSource(dataSource) // 数据源 + .engineConfig(buildEngineConfig(fileOutputType, fileName)) // 引擎配置 + .produceConfig(buildProcessConfig()) // 处理配置 + .build(); + + // 执行 screw,生成数据库文档 + new DocumentationExecute(config).execute(); + + return FILE_OUTPUT_DIR + File.separator + fileName + fileOutputType.getFileSuffix(); + } + } + + private void handleDeleteFile(Boolean deleteFile, String filePath) { + if (!deleteFile) { + return; + } + FileUtil.del(filePath); + } + + /** + * 创建数据源 + */ + // TODO 芋艿:screw 暂时不支持 druid,尴尬 + private HikariDataSource buildDataSource() { + // 创建 HikariConfig 配置类 + HikariConfig hikariConfig = new HikariConfig(); + hikariConfig.setJdbcUrl(dataSourceProperties.getUrl()); + hikariConfig.setUsername(dataSourceProperties.getUsername()); + hikariConfig.setPassword(dataSourceProperties.getPassword()); + hikariConfig.addDataSourceProperty("useInformationSchema", "true"); // 设置可以获取 tables remarks 信息 + // 创建数据源 + return new HikariDataSource(hikariConfig); + } + + /** + * 创建 screw 的引擎配置 + */ + private static EngineConfig buildEngineConfig(EngineFileType fileOutputType, String docFileName) { + return EngineConfig.builder() + .fileOutputDir(FILE_OUTPUT_DIR) // 生成文件路径 + .openOutputDir(false) // 打开目录 + .fileType(fileOutputType) // 文件类型 + .produceType(EngineTemplateType.freemarker) // 文件类型 + .fileName(docFileName) // 自定义文件名称 + .build(); + } + + /** + * 创建 screw 的处理配置,一般可忽略 + * 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置 + */ + private static ProcessConfig buildProcessConfig() { + return ProcessConfig.builder() + .ignoreTablePrefix(Collections.singletonList("QRTZ_")) // 忽略表前缀 + .build(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java new file mode 100644 index 0000000..223aa90 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java @@ -0,0 +1,81 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.file; + +import cn.hutool.core.io.IoUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFileRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.convert.file.InfFileConvert; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO; +import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService; +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Api(tags = "文件存储") +@RestController +@RequestMapping("/infra/file") +@Validated +@Slf4j +public class InfFileController { + + @Resource + private InfFileService fileService; + + @PostMapping("/upload") + @ApiOperation("上传文件") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "文件附件", required = true, dataTypeClass = MultipartFile.class), + @ApiImplicitParam(name = "path", value = "文件路径", required = false, example = "yudaoyuanma.png", dataTypeClass = String.class) + }) + public CommonResult uploadFile(@RequestParam("file") MultipartFile file, + @RequestParam("path") String path) throws IOException { + return success(fileService.createFile(path, IoUtil.readBytes(file.getInputStream()))); + } + + @DeleteMapping("/delete") + @ApiOperation("删除文件") + @ApiImplicitParam(name = "id", value = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:file:delete')") + public CommonResult deleteFile(@RequestParam("id") String id) { + fileService.deleteFile(id); + return success(true); + } + + @GetMapping("/get/{path}") + @ApiOperation("下载文件") + @ApiImplicitParam(name = "path", value = "文件附件", required = true, dataTypeClass = MultipartFile.class) + public void getFile(HttpServletResponse response, @PathVariable("path") String path) throws IOException { + InfFileDO file = fileService.getFile(path); + if (file == null) { + log.warn("[getFile][path({}) 文件不存在]", path); + response.setStatus(HttpStatus.NOT_FOUND.value()); + return; + } + ServletUtils.writeAttachment(response, path, file.getContent()); + } + + @GetMapping("/page") + @ApiOperation("获得文件分页") + @PreAuthorize("@ss.hasPermission('infra:file:query')") + public CommonResult> getFilePage(@Valid InfFilePageReqVO pageVO) { + PageResult pageResult = fileService.getFilePage(pageVO); + return success(InfFileConvert.INSTANCE.convertPage(pageResult)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java new file mode 100644 index 0000000..152466a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("文件分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfFilePageReqVO extends PageParam { + + @ApiModelProperty(value = "文件路径", example = "yudao", notes = "模糊匹配") + private String id; + + @ApiModelProperty(value = "文件类型", example = "jpg", notes = "模糊匹配") + private String type; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFileRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFileRespVO.java new file mode 100644 index 0000000..2388d7f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFileRespVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@ApiModel(value = "文件 Response VO", description = "不返回 content 字段,太大") +@Data +public class InfFileRespVO { + + @ApiModelProperty(value = "文件路径", required = true, example = "yudao.jpg") + private String id; + + @ApiModelProperty(value = "文件类型", required = true, example = "jpg") + private String type; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobController.java new file mode 100644 index 0000000..1cd3c8d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobController.java @@ -0,0 +1,145 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.framework.quartz.core.util.CronUtils; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.*; +import cn.iocoder.yudao.adminserver.modules.infra.convert.job.InfJobConvert; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; +import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.quartz.SchedulerException; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "定时任务") +@RestController +@RequestMapping("/infra/job") +@Validated +public class InfJobController { + + @Resource + private InfJobService jobService; + + @PostMapping("/create") + @ApiOperation("创建定时任务") + @PreAuthorize("@ss.hasPermission('infra:job:create')") + public CommonResult createJob(@Valid @RequestBody InfJobCreateReqVO createReqVO) + throws SchedulerException { + return success(jobService.createJob(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新定时任务") + @PreAuthorize("@ss.hasPermission('infra:job:update')") + public CommonResult updateJob(@Valid @RequestBody InfJobUpdateReqVO updateReqVO) + throws SchedulerException { + jobService.updateJob(updateReqVO); + return success(true); + } + + @PutMapping("/update-status") + @ApiOperation("更新定时任务的状态") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class), + @ApiImplicitParam(name = "status", value = "状态", required = true, example = "1", dataTypeClass = Integer.class), + }) + @PreAuthorize("@ss.hasPermission('infra:job:update')") + public CommonResult updateJobStatus(@RequestParam(value = "id") Long id, @RequestParam("status") Integer status) + throws SchedulerException { + jobService.updateJobStatus(id, status); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除定时任务") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:job:delete')") + public CommonResult deleteJob(@RequestParam("id") Long id) + throws SchedulerException { + jobService.deleteJob(id); + return success(true); + } + + @PutMapping("/trigger") + @ApiOperation("触发定时任务") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:job:trigger')") + public CommonResult triggerJob(@RequestParam("id") Long id) throws SchedulerException { + jobService.triggerJob(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得定时任务") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult getJob(@RequestParam("id") Long id) { + InfJobDO job = jobService.getJob(id); + return success(InfJobConvert.INSTANCE.convert(job)); + } + + @GetMapping("/list") + @ApiOperation("获得定时任务列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobList(@RequestParam("ids") Collection ids) { + List list = jobService.getJobList(ids); + return success(InfJobConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得定时任务分页") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobPage(@Valid InfJobPageReqVO pageVO) { + PageResult pageResult = jobService.getJobPage(pageVO); + return success(InfJobConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出定时任务 Excel") + @PreAuthorize("@ss.hasPermission('infra:job:export')") + @OperateLog(type = EXPORT) + public void exportJobExcel(@Valid InfJobExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = jobService.getJobList(exportReqVO); + // 导出 Excel + List datas = InfJobConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "定时任务.xls", "数据", InfJobExcelVO.class, datas); + } + + @GetMapping("/get_next_times") + @ApiOperation("获得定时任务的下 n 次执行时间") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class), + @ApiImplicitParam(name = "count", value = "数量", example = "5", dataTypeClass = Long.class) + }) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobNextTimes(@RequestParam("id") Long id, + @RequestParam(value = "count", required = false, defaultValue = "5") Integer count) { + InfJobDO job = jobService.getJob(id); + if (job == null) { + return success(Collections.emptyList()); + } + return success(CronUtils.getNextTimes(job.getCronExpression(), count)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobLogController.java new file mode 100644 index 0000000..d6e2639 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/InfJobLogController.java @@ -0,0 +1,81 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.convert.job.InfJobLogConvert; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; +import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "定时任务日志") +@RestController +@RequestMapping("/infra/job-log") +@Validated +public class InfJobLogController { + + @Resource + private InfJobLogService jobLogService; + + @GetMapping("/get") + @ApiOperation("获得定时任务日志") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult getJobLog(@RequestParam("id") Long id) { + InfJobLogDO jobLog = jobLogService.getJobLog(id); + return success(InfJobLogConvert.INSTANCE.convert(jobLog)); + } + + @GetMapping("/list") + @ApiOperation("获得定时任务日志列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobLogList(@RequestParam("ids") Collection ids) { + List list = jobLogService.getJobLogList(ids); + return success(InfJobLogConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得定时任务日志分页") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobLogPage(@Valid InfJobLogPageReqVO pageVO) { + PageResult pageResult = jobLogService.getJobLogPage(pageVO); + return success(InfJobLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出定时任务日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:job:export')") + @OperateLog(type = EXPORT) + public void exportJobLogExcel(@Valid InfJobLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = jobLogService.getJobLogList(exportReqVO); + // 导出 Excel + List datas = InfJobLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "任务日志.xls", "数据", InfJobLogExcelVO.class, datas); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobBaseVO.java new file mode 100644 index 0000000..2d7b51f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobBaseVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 定时任务 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class InfJobBaseVO { + + @ApiModelProperty(value = "任务名称", required = true, example = "测试任务") + @NotNull(message = "任务名称不能为空") + private String name; + + @ApiModelProperty(value = "处理器的参数", example = "yudao") + private String handlerParam; + + @ApiModelProperty(value = "CRON 表达式", required = true, example = "0/10 * * * * ? *") + @NotNull(message = "CRON 表达式不能为空") + private String cronExpression; + + @ApiModelProperty(value = "重试次数", required = true, example = "3") + @NotNull(message = "重试次数不能为空") + private Integer retryCount; + + @ApiModelProperty(value = "重试间隔", required = true, example = "1000") + @NotNull(message = "重试间隔不能为空") + private Integer retryInterval; + + @ApiModelProperty(value = "监控超时时间", example = "1000") + private Integer monitorTimeout; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java new file mode 100644 index 0000000..b2325d7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobCreateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("定时任务创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfJobCreateReqVO extends InfJobBaseVO { + + @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob") + @NotNull(message = "处理器的名字不能为空") + private String handlerName; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExcelVO.java new file mode 100644 index 0000000..0d9daf8 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExcelVO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 定时任务 Excel VO + * + * @author 芋道源码 + */ +@Data +public class InfJobExcelVO { + + @ExcelProperty("任务编号") + private Long id; + + @ExcelProperty("任务名称") + private String name; + + @ExcelProperty(value = "任务状态", converter = DictConvert.class) + @DictFormat(InfDictTypeConstants.JOB_STATUS) + private Integer status; + + @ExcelProperty("处理器的名字") + private String handlerName; + + @ExcelProperty("处理器的参数") + private String handlerParam; + + @ExcelProperty("CRON 表达式") + private String cronExpression; + + @ExcelProperty("最后一次执行的开始时间") + private Date executeBeginTime; + + @ExcelProperty("最后一次执行的结束时间") + private Date executeEndTime; + + @ExcelProperty("上一次触发时间") + private Date firePrevTime; + + @ExcelProperty("下一次触发时间") + private Date fireNextTime; + + @ExcelProperty("监控超时时间") + private Integer monitorTimeout; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExportReqVO.java new file mode 100644 index 0000000..9c578e9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobExportReqVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "定时任务 Excel 导出 Request VO", description = "参数和 InfJobPageReqVO 是一致的") +@Data +public class InfJobExportReqVO { + + @ApiModelProperty(value = "任务名称", example = "测试任务", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "任务状态", example = "1", notes = "参见 InfJobStatusEnum 枚举") + private Integer status; + + @ApiModelProperty(value = "处理器的名字", example = "sysUserSessionTimeoutJob", notes = "模糊匹配") + private String handlerName; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobPageReqVO.java new file mode 100644 index 0000000..eec31e9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobPageReqVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("定时任务分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfJobPageReqVO extends PageParam { + + @ApiModelProperty(value = "任务名称", example = "测试任务", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "任务状态", example = "1", notes = "参见 InfJobStatusEnum 枚举") + private Integer status; + + @ApiModelProperty(value = "处理器的名字", example = "sysUserSessionTimeoutJob", notes = "模糊匹配") + private String handlerName; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobRespVO.java new file mode 100644 index 0000000..ffe3a69 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobRespVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +@ApiModel("定时任务 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfJobRespVO extends InfJobBaseVO { + + @ApiModelProperty(value = "任务编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "任务状态", required = true, example = "1") + private Integer status; + + @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob") + @NotNull(message = "处理器的名字不能为空") + private String handlerName; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java new file mode 100644 index 0000000..d741a98 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/job/InfJobUpdateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("定时任务更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfJobUpdateReqVO extends InfJobBaseVO { + + @ApiModelProperty(value = "任务编号", required = true, example = "1024") + @NotNull(message = "任务编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java new file mode 100644 index 0000000..0dbd67e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogBaseVO.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 定时任务日志 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class InfJobLogBaseVO { + + @ApiModelProperty(value = "任务编号", required = true, example = "1024") + @NotNull(message = "任务编号不能为空") + private Long jobId; + + @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob") + @NotNull(message = "处理器的名字不能为空") + private String handlerName; + + @ApiModelProperty(value = "处理器的参数", example = "yudao") + private String handlerParam; + + @ApiModelProperty(value = "第几次执行", required = true, example = "1") + @NotNull(message = "第几次执行不能为空") + private Integer executeIndex; + + @ApiModelProperty(value = "开始执行时间", required = true) + @NotNull(message = "开始执行时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束执行时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + + @ApiModelProperty(value = "执行时长", example = "123") + private Integer duration; + + @ApiModelProperty(value = "任务状态", required = true, example = "1", notes = "参见 InfJobLogStatusEnum 枚举") + @NotNull(message = "任务状态不能为空") + private Integer status; + + @ApiModelProperty(value = "结果数据", example = "执行成功") + private String result; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java new file mode 100644 index 0000000..fd7078b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExcelVO.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 定时任务 Excel VO + * + * @author 芋艿 + */ +@Data +public class InfJobLogExcelVO { + + @ExcelProperty("日志编号") + private Long id; + + @ExcelProperty("任务编号") + private Long jobId; + + @ExcelProperty("处理器的名字") + private String handlerName; + + @ExcelProperty("处理器的参数") + private String handlerParam; + + @ExcelProperty("第几次执行") + private Integer executeIndex; + + @ExcelProperty("开始执行时间") + private Date beginTime; + + @ExcelProperty("结束执行时间") + private Date endTime; + + @ExcelProperty("执行时长") + private Integer duration; + + @ExcelProperty(value = "任务状态", converter = DictConvert.class) + @DictFormat(InfDictTypeConstants.JOB_STATUS) + private Integer status; + + @ExcelProperty("结果数据") + private String result; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java new file mode 100644 index 0000000..3e3e85b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogExportReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "定时任务 Excel 导出 Request VO", description = "参数和 InfJobLogPageReqVO 是一致的") +@Data +public class InfJobLogExportReqVO { + + @ApiModelProperty(value = "任务编号", example = "10") + private Long jobId; + + @ApiModelProperty(value = "处理器的名字", notes = "模糊匹配") + private String handlerName; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始执行时间") + private Date beginTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束执行时间") + private Date endTime; + + @ApiModelProperty(value = "任务状态", notes = "参见 InfJobLogStatusEnum 枚举") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java new file mode 100644 index 0000000..0c5b558 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogPageReqVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("定时任务日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfJobLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "任务编号", example = "10") + private Long jobId; + + @ApiModelProperty(value = "处理器的名字", notes = "模糊匹配") + private String handlerName; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始执行时间") + private Date beginTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束执行时间") + private Date endTime; + + @ApiModelProperty(value = "任务状态", notes = "参见 InfJobLogStatusEnum 枚举") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogRespVO.java new file mode 100644 index 0000000..497e691 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/job/vo/log/InfJobLogRespVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("定时任务日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfJobLogRespVO extends InfJobLogBaseVO { + + @ApiModelProperty(value = "日志编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiAccessLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiAccessLogController.java new file mode 100644 index 0000000..434fb1f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiAccessLogController.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiAccessLogConvert; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; +import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiAccessLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "API 访问日志") +@RestController +@RequestMapping("/infra/api-access-log") +@Validated +public class InfApiAccessLogController { + + @Resource + private InfApiAccessLogService apiAccessLogService; + + @GetMapping("/page") + @ApiOperation("获得API 访问日志分页") + @PreAuthorize("@ss.hasPermission('infra:api-access-log:query')") + public CommonResult> getApiAccessLogPage(@Valid InfApiAccessLogPageReqVO pageVO) { + PageResult pageResult = apiAccessLogService.getApiAccessLogPage(pageVO); + return success(InfApiAccessLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出API 访问日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:api-access-log:export')") + @OperateLog(type = EXPORT) + public void exportApiAccessLogExcel(@Valid InfApiAccessLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = apiAccessLogService.getApiAccessLogList(exportReqVO); + // 导出 Excel + List datas = InfApiAccessLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "API 访问日志.xls", "数据", InfApiAccessLogExcelVO.class, datas); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiErrorLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiErrorLogController.java new file mode 100644 index 0000000..abc227f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiErrorLogController.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiErrorLogConvert; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; +import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiErrorLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Api(tags = "API 错误日志") +@RestController +@RequestMapping("/infra/api-error-log") +@Validated +public class InfApiErrorLogController { + + @Resource + private InfApiErrorLogService apiErrorLogService; + + @PutMapping("/update-status") + @ApiOperation("更新 API 错误日志的状态") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class), + @ApiImplicitParam(name = "processStatus", value = "处理状态", required = true, example = "1", dataTypeClass = Integer.class) + }) + @PreAuthorize("@ss.hasPermission('infra:api-error-log:update-status')") + public CommonResult updateApiErrorLogProcess(@RequestParam("id") Long id, + @RequestParam("processStatus") Integer processStatus) { + apiErrorLogService.updateApiErrorLogProcess(id, processStatus, getLoginUserId()); + return success(true); + } + + @GetMapping("/page") + @ApiOperation("获得 API 错误日志分页") + @PreAuthorize("@ss.hasPermission('infra:api-error-log:query')") + public CommonResult> getApiErrorLogPage(@Valid InfApiErrorLogPageReqVO pageVO) { + PageResult pageResult = apiErrorLogService.getApiErrorLogPage(pageVO); + return success(InfApiErrorLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出 API 错误日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:api-error-log:export')") + @OperateLog(type = EXPORT) + public void exportApiErrorLogExcel(@Valid InfApiErrorLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = apiErrorLogService.getApiErrorLogList(exportReqVO); + // 导出 Excel + List datas = InfApiErrorLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "API 错误日志.xls", "数据", InfApiErrorLogExcelVO.class, datas); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java new file mode 100644 index 0000000..d5e300f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogBaseVO.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* API 访问日志 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class InfApiAccessLogBaseVO { + + @ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002") + @NotNull(message = "链路追踪编号不能为空") + private String traceId; + + @ApiModelProperty(value = "用户编号", required = true, example = "666") + @NotNull(message = "用户编号不能为空") + private Long userId; + + @ApiModelProperty(value = "用户类型", required = true, example = "2", notes = "参见 UserTypeEnum 枚举") + @NotNull(message = "用户类型不能为空") + private Integer userType; + + @ApiModelProperty(value = "应用名", required = true, example = "dashboard") + @NotNull(message = "应用名不能为空") + private String applicationName; + + @ApiModelProperty(value = "请求方法名", required = true, example = "GET") + @NotNull(message = "请求方法名不能为空") + private String requestMethod; + + @ApiModelProperty(value = "请求地址", required = true, example = "/xxx/yyy") + @NotNull(message = "请求地址不能为空") + private String requestUrl; + + @ApiModelProperty(value = "请求参数") + private String requestParams; + + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") + @NotNull(message = "用户 IP不能为空") + private String userIp; + + @ApiModelProperty(value = "浏览器 UA", required = true, example = "Mozilla/5.0") + @NotNull(message = "浏览器 UA不能为空") + private String userAgent; + + @ApiModelProperty(value = "开始请求时间", required = true) + @NotNull(message = "开始请求时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束请求时间", required = true) + @NotNull(message = "结束请求时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + + @ApiModelProperty(value = "执行时长", required = true, example = "100") + @NotNull(message = "执行时长不能为空") + private Integer duration; + + @ApiModelProperty(value = "结果码", required = true, example = "0") + @NotNull(message = "结果码不能为空") + private Integer resultCode; + + @ApiModelProperty(value = "结果提示", example = "芋道源码,牛逼!") + private String resultMsg; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java new file mode 100644 index 0000000..d026535 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExcelVO.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * API 访问日志 Excel VO + * + * @author 芋道源码 + */ +@Data +public class InfApiAccessLogExcelVO { + + @ExcelProperty("日志主键") + private Long id; + + @ExcelProperty("链路追踪编号") + private String traceId; + + @ExcelProperty("用户编号") + private Long userId; + + @ExcelProperty(value = "用户类型", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.USER_TYPE) + private Integer userType; + + @ExcelProperty("应用名") + private String applicationName; + + @ExcelProperty("请求方法名") + private String requestMethod; + + @ExcelProperty("请求地址") + private String requestUrl; + + @ExcelProperty("请求参数") + private String requestParams; + + @ExcelProperty("用户 IP") + private String userIp; + + @ExcelProperty("浏览器 UA") + private String userAgent; + + @ExcelProperty("开始请求时间") + private Date beginTime; + + @ExcelProperty("结束请求时间") + private Date endTime; + + @ExcelProperty("执行时长") + private Integer duration; + + @ExcelProperty("结果码") + private Integer resultCode; + + @ExcelProperty("结果提示") + private String resultMsg; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java new file mode 100644 index 0000000..8e9dc40 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogExportReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "API 访问日志 Excel 导出 Request VO", description = "参数和 InfApiAccessLogPageReqVO 是一致的") +@Data +public class InfApiAccessLogExportReqVO { + + @ApiModelProperty(value = "用户编号", example = "666") + private Long userId; + + @ApiModelProperty(value = "用户类型", example = "2") + private Integer userType; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配") + private String requestUrl; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始开始请求时间") + private Date beginBeginTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束开始请求时间") + private Date endBeginTime; + + @ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒") + private Integer duration; + + @ApiModelProperty(value = "结果码", example = "0") + private Integer resultCode; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java new file mode 100644 index 0000000..c045205 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogPageReqVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("API 访问日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfApiAccessLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户编号", example = "666") + private Long userId; + + @ApiModelProperty(value = "用户类型", example = "2") + private Integer userType; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配") + private String requestUrl; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始开始请求时间") + private Date beginBeginTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束开始请求时间") + private Date endBeginTime; + + @ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒") + private Integer duration; + + @ApiModelProperty(value = "结果码", example = "0") + private Integer resultCode; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java new file mode 100644 index 0000000..15dbed3 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apiaccesslog/InfApiAccessLogRespVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("API 访问日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfApiAccessLogRespVO extends InfApiAccessLogBaseVO { + + @ApiModelProperty(value = "日志主键", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java new file mode 100644 index 0000000..87eb2dd --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogBaseVO.java @@ -0,0 +1,96 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* API 错误日志 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class InfApiErrorLogBaseVO { + + @ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002") + @NotNull(message = "链路追踪编号不能为空") + private String traceId; + + @ApiModelProperty(value = "用户编号", required = true, example = "666") + @NotNull(message = "用户编号不能为空") + private Integer userId; + + @ApiModelProperty(value = "用户类型", required = true, example = "1") + @NotNull(message = "用户类型不能为空") + private Integer userType; + + @ApiModelProperty(value = "应用名", required = true, example = "dashboard") + @NotNull(message = "应用名不能为空") + private String applicationName; + + @ApiModelProperty(value = "请求方法名", required = true, example = "GET") + @NotNull(message = "请求方法名不能为空") + private String requestMethod; + + @ApiModelProperty(value = "请求地址", required = true, example = "/xx/yy") + @NotNull(message = "请求地址不能为空") + private String requestUrl; + + @ApiModelProperty(value = "请求参数", required = true) + @NotNull(message = "请求参数不能为空") + private String requestParams; + + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") + @NotNull(message = "用户 IP不能为空") + private String userIp; + + @ApiModelProperty(value = "浏览器 UA", required = true, example = "Mozilla/5.0") + @NotNull(message = "浏览器 UA不能为空") + private String userAgent; + + @ApiModelProperty(value = "异常发生时间", required = true) + @NotNull(message = "异常发生时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date exceptionTime; + + @ApiModelProperty(value = "异常名", required = true) + @NotNull(message = "异常名不能为空") + private String exceptionName; + + @ApiModelProperty(value = "异常导致的消息", required = true) + @NotNull(message = "异常导致的消息不能为空") + private String exceptionMessage; + + @ApiModelProperty(value = "异常导致的根消息", required = true) + @NotNull(message = "异常导致的根消息不能为空") + private String exceptionRootCauseMessage; + + @ApiModelProperty(value = "异常的栈轨迹", required = true) + @NotNull(message = "异常的栈轨迹不能为空") + private String exceptionStackTrace; + + @ApiModelProperty(value = "异常发生的类全名", required = true) + @NotNull(message = "异常发生的类全名不能为空") + private String exceptionClassName; + + @ApiModelProperty(value = "异常发生的类文件", required = true) + @NotNull(message = "异常发生的类文件不能为空") + private String exceptionFileName; + + @ApiModelProperty(value = "异常发生的方法名", required = true) + @NotNull(message = "异常发生的方法名不能为空") + private String exceptionMethodName; + + @ApiModelProperty(value = "异常发生的方法所在行", required = true) + @NotNull(message = "异常发生的方法所在行不能为空") + private Integer exceptionLineNumber; + + @ApiModelProperty(value = "处理状态", required = true, example = "0") + @NotNull(message = "处理状态不能为空") + private Integer processStatus; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java new file mode 100644 index 0000000..3224a30 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExcelVO.java @@ -0,0 +1,91 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * API 错误日志 Excel VO + * + * @author 芋道源码 + */ +@Data +public class InfApiErrorLogExcelVO { + + @ExcelProperty("编号") + private Integer id; + + @ExcelProperty("链路追踪编号") + private String traceId; + + @ExcelProperty("用户编号") + private Integer userId; + + @ExcelProperty(value = "用户类型", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.USER_TYPE) + private Integer userType; + + @ExcelProperty("应用名") + private String applicationName; + + @ExcelProperty("请求方法名") + private String requestMethod; + + @ExcelProperty("请求地址") + private String requestUrl; + + @ExcelProperty("请求参数") + private String requestParams; + + @ExcelProperty("用户 IP") + private String userIp; + + @ExcelProperty("浏览器 UA") + private String userAgent; + + @ExcelProperty("异常发生时间") + private Date exceptionTime; + + @ExcelProperty("异常名") + private String exceptionName; + + @ExcelProperty("异常导致的消息") + private String exceptionMessage; + + @ExcelProperty("异常导致的根消息") + private String exceptionRootCauseMessage; + + @ExcelProperty("异常的栈轨迹") + private String exceptionStackTrace; + + @ExcelProperty("异常发生的类全名") + private String exceptionClassName; + + @ExcelProperty("异常发生的类文件") + private String exceptionFileName; + + @ExcelProperty("异常发生的方法名") + private String exceptionMethodName; + + @ExcelProperty("异常发生的方法所在行") + private Integer exceptionLineNumber; + + @ExcelProperty("创建时间") + private Date createTime; + + @ExcelProperty(value = "处理状态", converter = DictConvert.class) + @DictFormat(InfDictTypeConstants.API_ERROR_LOG_PROCESS_STATUS) + private Integer processStatus; + + @ExcelProperty("处理时间") + private Date processTime; + + @ExcelProperty("处理用户编号") + private Integer processUserId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java new file mode 100644 index 0000000..a86288e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogExportReqVO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "API 错误日志 Excel 导出 Request VO", description = "参数和 InfApiErrorLogPageReqVO 是一致的") +@Data +public class InfApiErrorLogExportReqVO { + + @ApiModelProperty(value = "用户编号", example = "666") + private Long userId; + + @ApiModelProperty(value = "用户类型", example = "1") + private Integer userType; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "请求地址", example = "/xx/yy") + private String requestUrl; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始异常发生时间") + private Date beginExceptionTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束异常发生时间") + private Date endExceptionTime; + + @ApiModelProperty(value = "处理状态", example = "0") + private Integer processStatus; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java new file mode 100644 index 0000000..cc47dd8 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogPageReqVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("API 错误日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfApiErrorLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户编号", example = "666") + private Long userId; + + @ApiModelProperty(value = "用户类型", example = "1") + private Integer userType; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "请求地址", example = "/xx/yy") + private String requestUrl; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始异常发生时间") + private Date beginExceptionTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束异常发生时间") + private Date endExceptionTime; + + @ApiModelProperty(value = "处理状态", example = "0") + private Integer processStatus; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java new file mode 100644 index 0000000..9e4521c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/vo/apierrorlog/InfApiErrorLogRespVO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("API 错误日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfApiErrorLogRespVO extends InfApiErrorLogBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + + @ApiModelProperty(value = "处理时间", required = true) + private Date processTime; + + @ApiModelProperty(value = "处理用户编号", example = "233") + private Integer processUserId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.http b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.http new file mode 100644 index 0000000..1c474e9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.http @@ -0,0 +1,7 @@ +### 请求 /infra/redis/get-monitor-info 接口 => 成功 +GET {{baseUrl}}/infra/redis/get-monitor-info +Authorization: Bearer {{token}} + +### 请求 /infra/redis/get-key-list 接口 => 成功 +GET {{baseUrl}}/infra/redis/get-key-list +Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.java new file mode 100644 index 0000000..f39a38b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/RedisController.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.redis; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; +import cn.iocoder.yudao.framework.redis.core.RedisKeyRegistry; +import cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo.InfRedisKeyRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo.InfRedisMonitorRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.convert.redis.RedisConvert; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.data.redis.connection.RedisServerCommands; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Properties; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Api(tags = "Redis 监控") +@RestController +@RequestMapping("/infra/redis") +public class RedisController { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @GetMapping("/get-monitor-info") + @ApiOperation("获得 Redis 监控信息") + @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')") + public CommonResult getRedisMonitorInfo() { + // 获得 Redis 统计信息 + Properties info = stringRedisTemplate.execute((RedisCallback) RedisServerCommands::info); + Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize); + Properties commandStats = stringRedisTemplate.execute(( + RedisCallback) connection -> connection.info("commandstats")); + assert commandStats != null; // 断言,避免警告 + // 拼接结果返回 + return success(RedisConvert.INSTANCE.build(info, dbSize, commandStats)); + } + + @GetMapping("/get-key-list") + @ApiOperation("获得 Redis Key 列表") + @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") + public CommonResult> getKeyList() { + List keyDefines = RedisKeyRegistry.list(); + return success(RedisConvert.INSTANCE.convertList(keyDefines)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java new file mode 100644 index 0000000..60a14cf --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo; + +import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.time.Duration; + +@ApiModel("Redis Key 信息 Response VO") +@Data +@Builder +@AllArgsConstructor +public class InfRedisKeyRespVO { + + @ApiModelProperty(value = "login_user:%s", required = true, example = "String") + private String keyTemplate; + + @ApiModelProperty(value = "Key 类型的枚举", required = true, example = "String") + private RedisKeyDefine.KeyTypeEnum keyType; + + @ApiModelProperty(value = "Value 类型", required = true, example = "java.lang.String") + private Class valueType; + + @ApiModelProperty(value = "超时类型", required = true, example = "1") + private RedisKeyDefine.TimeoutTypeEnum timeoutType; + + @ApiModelProperty(value = "过期时间,单位:毫秒", required = true, example = "1024") + private Duration timeout; + + @ApiModelProperty(value = "备注", required = true, example = "啦啦啦啦~") + private String memo; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java new file mode 100644 index 0000000..8481fa9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Properties; + +@ApiModel("Redis 监控信息 Response VO") +@Data +@Builder +@AllArgsConstructor +public class InfRedisMonitorRespVO { + + @ApiModelProperty(value = "Redis info 指令结果", required = true, notes = "具体字段,查看 Redis 文档") + private Properties info; + + @ApiModelProperty(value = "Redis key 数量", required = true, example = "1024") + private Long dbSize; + + @ApiModelProperty(value = "CommandStat 数组", required = true) + private List commandStats; + + @ApiModel("Redis 命令统计结果") + @Data + @Builder + @AllArgsConstructor + public static class CommandStat { + + @ApiModelProperty(value = "Redis 命令", required = true, example = "get") + private String command; + + @ApiModelProperty(value = "调用次数", required = true, example = "1024") + private Integer calls; + + @ApiModelProperty(value = "消耗 CPU 秒数", required = true, example = "666") + private Integer usec; + + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/config/InfConfigConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/config/InfConfigConvert.java new file mode 100644 index 0000000..0b076b6 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/config/InfConfigConvert.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.infra.convert.config; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExcelVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface InfConfigConvert { + + InfConfigConvert INSTANCE = Mappers.getMapper(InfConfigConvert.class); + + PageResult convertPage(PageResult page); + + InfConfigRespVO convert(InfConfigDO bean); + + InfConfigDO convert(InfConfigCreateReqVO bean); + + InfConfigDO convert(InfConfigUpdateReqVO bean); + + List convertList(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java new file mode 100644 index 0000000..9d3e95c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.adminserver.modules.infra.convert.file; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFileRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface InfFileConvert { + + InfFileConvert INSTANCE = Mappers.getMapper(InfFileConvert.class); + + InfFileRespVO convert(InfFileDO bean); + + PageResult convertPage(PageResult page); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobConvert.java new file mode 100644 index 0000000..2b6fbc1 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobConvert.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.adminserver.modules.infra.convert.job; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExcelVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 定时任务 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface InfJobConvert { + + InfJobConvert INSTANCE = Mappers.getMapper(InfJobConvert.class); + + InfJobDO convert(InfJobCreateReqVO bean); + + InfJobDO convert(InfJobUpdateReqVO bean); + + InfJobRespVO convert(InfJobDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobLogConvert.java new file mode 100644 index 0000000..146c7fb --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/job/InfJobLogConvert.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.adminserver.modules.infra.convert.job; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 定时任务日志 Convert + * + * @author 芋艿 + */ +@Mapper +public interface InfJobLogConvert { + + InfJobLogConvert INSTANCE = Mappers.getMapper(InfJobLogConvert.class); + + InfJobLogRespVO convert(InfJobLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiAccessLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiAccessLogConvert.java new file mode 100644 index 0000000..71b319c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiAccessLogConvert.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.adminserver.modules.infra.convert.logger; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * API 访问日志 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface InfApiAccessLogConvert { + + InfApiAccessLogConvert INSTANCE = Mappers.getMapper(InfApiAccessLogConvert.class); + + InfApiAccessLogDO convert(ApiAccessLogCreateDTO bean); + + InfApiAccessLogRespVO convert(InfApiAccessLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiErrorLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiErrorLogConvert.java new file mode 100644 index 0000000..359ffaf --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiErrorLogConvert.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.adminserver.modules.infra.convert.logger; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * API 错误日志 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface InfApiErrorLogConvert { + + InfApiErrorLogConvert INSTANCE = Mappers.getMapper(InfApiErrorLogConvert.class); + + InfApiErrorLogDO convert(ApiErrorLogCreateDTO bean); + + InfApiErrorLogRespVO convert(InfApiErrorLogDO bean); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/package-info.java new file mode 100644 index 0000000..3c74fe7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 POJO 类的实体转换 + * + * 目前使用 MapStruct 框架 + */ +package cn.iocoder.yudao.adminserver.modules.infra.convert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/redis/RedisConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/redis/RedisConvert.java new file mode 100644 index 0000000..3cfa92a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/redis/RedisConvert.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.adminserver.modules.infra.convert.redis; + +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; +import cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo.InfRedisKeyRespVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo.InfRedisMonitorRespVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +@Mapper +public interface RedisConvert { + + RedisConvert INSTANCE = Mappers.getMapper(RedisConvert.class); + + default InfRedisMonitorRespVO build(Properties info, Long dbSize, Properties commandStats) { + InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize) + .commandStats(new ArrayList<>(commandStats.size())).build(); + commandStats.forEach((key, value) -> { + respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder() + .command(StrUtil.subAfter((String) key, "cmdstat_", false)) + .calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ","))) + .usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ","))) + .build()); + }); + return respVO; + } + + List convertList(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md new file mode 100644 index 0000000..8153487 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md @@ -0,0 +1 @@ + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/config/InfConfigDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/config/InfConfigDO.java new file mode 100644 index 0000000..119d069 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/config/InfConfigDO.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.infra.enums.config.InfConfigTypeEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 参数配置表 + * + * @author ruoyi + */ +@TableName("inf_config") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfConfigDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Long id; + /** + * 参数分组 + */ + @TableField("`group`") + private String group; + /** + * 参数名称 + */ + private String name; + /** + * 参数键名 + */ + @TableField("`key`") + private String key; + /** + * 参数键值 + */ + private String value; + /** + * 参数类型 + * + * 枚举 {@link InfConfigTypeEnum} + */ + @TableField("`type`") + private Integer type; + /** + * 是否敏感 + * + * 对于敏感配置,需要管理权限才能查看 + */ + @TableField("`sensitive`") + private Boolean sensitive; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/file/InfFileDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/file/InfFileDO.java new file mode 100644 index 0000000..594ae45 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/file/InfFileDO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.io.InputStream; + +/** + * 文件表 + * + * @author 芋道源码 + */ +@Data +@TableName("inf_file") +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InfFileDO extends BaseDO { + + /** + * 文件路径 + */ + @TableId(type = IdType.INPUT) + private String id; + /** + * 文件类型 + * + * 通过 {@link cn.hutool.core.io.FileTypeUtil#getType(InputStream)} 获取 + */ + @TableField(value = "`type`") + private String type; + /** + * 文件内容 + */ + private byte[] content; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobDO.java new file mode 100644 index 0000000..4eb95ca --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobDO.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobStatusEnum; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 定时任务 DO + * + * @author 芋道源码 + */ +@TableName("inf_job") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InfJobDO extends BaseDO { + + /** + * 任务编号 + */ + @TableId + private Long id; + /** + * 任务名称 + */ + private String name; + /** + * 任务状态 + * + * 枚举 {@link InfJobStatusEnum} + */ + private Integer status; + /** + * 处理器的名字 + */ + private String handlerName; + /** + * 处理器的参数 + */ + private String handlerParam; + /** + * CRON 表达式 + */ + private String cronExpression; + + // ========== 重试相关字段 ========== + /** + * 重试次数 + * 如果不重试,则设置为 0 + */ + private Integer retryCount; + /** + * 重试间隔,单位:毫秒 + * 如果没有间隔,则设置为 0 + */ + private Integer retryInterval; + + // ========== 监控相关字段 ========== + /** + * 监控超时时间,单位:毫秒 + * 为空时,表示不监控 + * + * 注意,这里的超时的目的,不是进行任务的取消,而是告警任务的执行时间过长 + */ + private Integer monitorTimeout; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobLogDO.java new file mode 100644 index 0000000..4991680 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/job/InfJobLogDO.java @@ -0,0 +1,80 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; +import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobLogStatusEnum; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Date; + +/** + * 定时任务的执行日志 + * + * @author 芋道源码 + */ +@TableName("inf_job_log") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InfJobLogDO extends BaseDO { + + /** + * 日志编号 + */ + private Long id; + /** + * 任务编号 + * + * 关联 {@link InfJobDO#getId()} + */ + private Long jobId; + /** + * 处理器的名字 + * + * 冗余字段 {@link InfJobDO#getHandlerName()} + */ + private String handlerName; + /** + * 处理器的参数 + * + * 冗余字段 {@link InfJobDO#getHandlerParam()} + */ + private String handlerParam; + /** + * 第几次执行 + * + * 用于区分是不是重试执行。如果是重试执行,则 index 大于 1 + */ + private Integer executeIndex; + + /** + * 开始执行时间 + */ + private Date beginTime; + /** + * 结束执行时间 + */ + private Date endTime; + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + /** + * 状态 + * + * 枚举 {@link InfJobLogStatusEnum} + */ + private Integer status; + /** + * 结果数据 + * + * 成功时,使用 {@link JobHandler#execute(String)} 的结果 + * 失败时,使用 {@link JobHandler#execute(String)} 的异常堆栈 + */ + private String result; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java new file mode 100644 index 0000000..229219e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java @@ -0,0 +1,107 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger; + +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Date; + +/** + * API 访问日志 + * + * @author 芋道源码 + */ +@TableName("inf_api_access_log") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InfApiAccessLogDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Integer id; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 应用名 + * + * 目前读取 `spring.application.name` 配置项 + */ + private String applicationName; + + // ========== 请求相关字段 ========== + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 访问地址 + */ + private String requestUrl; + /** + * 请求参数 + * + * query: Query String + * body: Quest Body + */ + private String requestParams; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + // ========== 执行相关字段 ========== + + /** + * 开始请求时间 + */ + private Date beginTime; + /** + * 结束请求时间 + */ + private Date endTime; + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + /** + * 结果码 + * + * 目前使用的 {@link CommonResult#getCode()} 属性 + */ + private Integer resultCode; + /** + * 结果提示 + * + * 目前使用的 {@link CommonResult#getMsg()} 属性 + */ + private String resultMsg; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java new file mode 100644 index 0000000..7f19def --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java @@ -0,0 +1,153 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger; + +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Date; + +/** + * API 异常数据 + * + * @author 芋道源码 + */ +@TableName("inf_api_error_log") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InfApiErrorLogDO extends BaseDO { + + /** + * 编号 + */ + private Long id; + /** + * 用户编号 + */ + private Long userId; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 应用名 + * + * 目前读取 spring.application.name + */ + private String applicationName; + + // ========== 请求相关字段 ========== + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 访问地址 + */ + private String requestUrl; + /** + * 请求参数 + * + * query: Query String + * body: Quest Body + */ + private String requestParams; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + // ========== 异常相关字段 ========== + + /** + * 异常发生时间 + */ + private Date exceptionTime; + /** + * 异常名 + * + * {@link Throwable#getClass()} 的类全名 + */ + private String exceptionName; + /** + * 异常导致的消息 + * + * {@link cn.hutool.core.exceptions.ExceptionUtil#getMessage(Throwable)} + */ + private String exceptionMessage; + /** + * 异常导致的根消息 + * + * {@link cn.hutool.core.exceptions.ExceptionUtil#getRootCauseMessage(Throwable)} + */ + private String exceptionRootCauseMessage; + /** + * 异常的栈轨迹 + * + * {@link org.apache.commons.lang3.exception.ExceptionUtils#getStackTrace(Throwable)} + */ + private String exceptionStackTrace; + /** + * 异常发生的类全名 + * + * {@link StackTraceElement#getClassName()} + */ + private String exceptionClassName; + /** + * 异常发生的类文件 + * + * {@link StackTraceElement#getFileName()} + */ + private String exceptionFileName; + /** + * 异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()} + */ + private String exceptionMethodName; + /** + * 异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()} + */ + private Integer exceptionLineNumber; + + // ========== 处理相关字段 ========== + + /** + * 处理状态 + * + * 枚举 {@link InfApiErrorLogProcessStatusEnum} + */ + private Integer processStatus; + /** + * 处理时间 + */ + private Date processTime; + /** + * 处理用户编号 + * + * 关联 {@link SysUserDO#getId()} + */ + private Long processUserId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigDAOImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigDAOImpl.java new file mode 100644 index 0000000..a2e7b6f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigDAOImpl.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config; + +import cn.iocoder.yudao.framework.apollo.internals.ConfigFrameworkDAO; +import cn.iocoder.yudao.framework.apollo.internals.dto.ConfigRespDTO; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +import javax.sql.DataSource; +import java.sql.ResultSet; +import java.util.Date; +import java.util.List; + +/** + * ConfigFrameworkDAO 实现类 + * + * @author 芋道源码 + */ +public class InfConfigDAOImpl implements ConfigFrameworkDAO { + + private final JdbcTemplate jdbcTemplate; + + public InfConfigDAOImpl(String jdbcUrl, String username, String password) { + DataSource dataSource = new DriverManagerDataSource(jdbcUrl, username, password); + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + @Override + public boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { + return jdbcTemplate.query("SELECT id FROM inf_config WHERE update_time > ? LIMIT 1", + ResultSet::next, maxUpdateTime); + } + + @Override + public List selectList() { + return jdbcTemplate.query("SELECT `key`, `value`, update_time, deleted FROM inf_config", new BeanPropertyRowMapper<>(ConfigRespDTO.class)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigMapper.java new file mode 100644 index 0000000..546ef84 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigMapper.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface InfConfigMapper extends BaseMapperX { + + default InfConfigDO selectByKey(String key) { + return selectOne(new QueryWrapper().eq("`key`", key)); + } + + default PageResult selectPage(InfConfigPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .likeIfPresent("`key`", reqVO.getKey()) + .eqIfPresent("`type`", reqVO.getType()) + .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); + } + + default List selectList(InfConfigExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .likeIfPresent("`key`", reqVO.getKey()) + .eqIfPresent("`type`", reqVO.getType()) + .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java new file mode 100644 index 0000000..0a487e0 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface InfFileMapper extends BaseMapperX { + + default Integer selectCountById(String id) { + return selectCount("id", id); + } + + default PageResult selectPage(InfFilePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("id", reqVO.getId()) + .likeIfPresent("type", reqVO.getType()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByDesc("create_time")); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobLogMapper.java new file mode 100644 index 0000000..4b1b920 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobLogMapper.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 任务日志 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface InfJobLogMapper extends BaseMapperX { + + default PageResult selectPage(InfJobLogPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .eqIfPresent("job_id", reqVO.getJobId()) + .likeIfPresent("handler_name", reqVO.getHandlerName()) + .geIfPresent("begin_time", reqVO.getBeginTime()) + .leIfPresent("end_time", reqVO.getEndTime()) + .eqIfPresent("status", reqVO.getStatus()) + .orderByDesc("id") // ID 倒序 + ); + } + + default List selectList(InfJobLogExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .eqIfPresent("job_id", reqVO.getJobId()) + .likeIfPresent("handler_name", reqVO.getHandlerName()) + .geIfPresent("begin_time", reqVO.getBeginTime()) + .leIfPresent("end_time", reqVO.getEndTime()) + .eqIfPresent("status", reqVO.getStatus()) + .orderByDesc("id") // ID 倒序 + ); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobMapper.java new file mode 100644 index 0000000..a57ba0f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/job/InfJobMapper.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 定时任务 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface InfJobMapper extends BaseMapperX { + + default InfJobDO selectByHandlerName(String handlerName) { + return selectOne("handler_name", handlerName); + } + + default PageResult selectPage(InfJobPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus()) + .likeIfPresent("handler_name", reqVO.getHandlerName()) + ); + } + + default List selectList(InfJobExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus()) + .likeIfPresent("handler_name", reqVO.getHandlerName()) + ); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java new file mode 100644 index 0000000..85d04a3 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * API 访问日志 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface InfApiAccessLogMapper extends BaseMapperX { + + default PageResult selectPage(InfApiAccessLogPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .eqIfPresent("user_id", reqVO.getUserId()) + .eqIfPresent("user_type", reqVO.getUserType()) + .eqIfPresent("application_name", reqVO.getApplicationName()) + .likeIfPresent("request_url", reqVO.getRequestUrl()) + .betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime()) + .geIfPresent("duration", reqVO.getDuration()) + .eqIfPresent("result_code", reqVO.getResultCode()) + .orderByDesc("id") + ); + } + + default List selectList(InfApiAccessLogExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .eqIfPresent("user_id", reqVO.getUserId()) + .eqIfPresent("user_type", reqVO.getUserType()) + .eqIfPresent("application_name", reqVO.getApplicationName()) + .likeIfPresent("request_url", reqVO.getRequestUrl()) + .betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime()) + .geIfPresent("duration", reqVO.getDuration()) + .eqIfPresent("result_code", reqVO.getResultCode()) + .orderByDesc("id") + ); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java new file mode 100644 index 0000000..4e7481d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * API 错误日志 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface InfApiErrorLogMapper extends BaseMapperX { + + default PageResult selectPage(InfApiErrorLogPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .eqIfPresent("user_id", reqVO.getUserId()) + .eqIfPresent("user_type", reqVO.getUserType()) + .eqIfPresent("application_name", reqVO.getApplicationName()) + .likeIfPresent("request_url", reqVO.getRequestUrl()) + .betweenIfPresent("exception_time", reqVO.getBeginExceptionTime(), reqVO.getEndExceptionTime()) + .eqIfPresent("process_status", reqVO.getProcessStatus()) + .orderByDesc("id") + ); + } + + default List selectList(InfApiErrorLogExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .eqIfPresent("user_id", reqVO.getUserId()) + .eqIfPresent("user_type", reqVO.getUserType()) + .eqIfPresent("application_name", reqVO.getApplicationName()) + .likeIfPresent("request_url", reqVO.getRequestUrl()) + .betweenIfPresent("exception_time", reqVO.getBeginExceptionTime(), reqVO.getEndExceptionTime()) + .eqIfPresent("process_status", reqVO.getProcessStatus()) + .orderByDesc("id") + ); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfDictTypeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfDictTypeConstants.java new file mode 100644 index 0000000..aabbae4 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfDictTypeConstants.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.infra.enums; + +/** + * Infra 字典类型的枚举类 + * + * @author 芋道源码 + */ +public interface InfDictTypeConstants { + + String REDIS_TIMEOUT_TYPE = "inf_redis_timeout_type"; // Redis 超时类型 + + String JOB_STATUS = "inf_job_status"; // 定时任务状态的枚举 + String JOB_LOG_STATUS = "inf_job_log_status"; // 定时任务日志状态的枚举 + + String API_ERROR_LOG_PROCESS_STATUS = "inf_api_error_log_process_status"; // API 错误日志的处理状态的枚举 + + String ERROR_CODE_TYPE = "inf_error_code_type"; // 错误码的类型枚举 + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java new file mode 100644 index 0000000..b53ff8c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.adminserver.modules.infra.enums; + +import cn.iocoder.yudao.framework.common.exception.ErrorCode; + +/** + * Infra 错误码枚举类 + * + * infra 系统,使用 1-001-000-000 段 + */ +public interface InfErrorCodeConstants { + + // ========== 参数配置 1001000000 ========== + ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1001000001, "参数配置不存在"); + ErrorCode CONFIG_KEY_DUPLICATE = new ErrorCode(1001000002, "参数配置 key 重复"); + ErrorCode CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE = new ErrorCode(1001000003, "不能删除类型为系统内置的参数配置"); + ErrorCode CONFIG_GET_VALUE_ERROR_IF_SENSITIVE = new ErrorCode(1001000004, "不允许获取敏感配置到前端"); + + // ========== 定时任务 1001001000 ========== + ErrorCode JOB_NOT_EXISTS = new ErrorCode(1001001000, "定时任务不存在"); + ErrorCode JOB_HANDLER_EXISTS = new ErrorCode(1001001001, "定时任务的处理器已经存在"); + ErrorCode JOB_CHANGE_STATUS_INVALID = new ErrorCode(1001001002, "只允许修改为开启或者关闭状态"); + ErrorCode JOB_CHANGE_STATUS_EQUALS = new ErrorCode(1001001003, "定时任务已经处于该状态,无需修改"); + ErrorCode JOB_UPDATE_ONLY_NORMAL_STATUS = new ErrorCode(1001001004, "只有开启状态的任务,才可以修改"); + ErrorCode JOB_CRON_EXPRESSION_VALID = new ErrorCode(1001001005, "CRON 表达式不正确"); + + // ========== API 错误日志 1001002000 ========== + ErrorCode API_ERROR_LOG_NOT_FOUND = new ErrorCode(1001002000, "API 错误日志不存在"); + ErrorCode API_ERROR_LOG_PROCESSED = new ErrorCode(1001002001, "API 错误日志已处理"); + + // ========== 文件 1001003000 ========== + ErrorCode FILE_NOT_EXISTS = new ErrorCode(1001003000, "文件不存在"); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/config/InfConfigTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/config/InfConfigTypeEnum.java new file mode 100644 index 0000000..6e9fd4d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/config/InfConfigTypeEnum.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.infra.enums.config; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum InfConfigTypeEnum { + + /** + * 系统配置 + */ + SYSTEM(1), + /** + * 自定义配置 + */ + CUSTOM(2); + + private final Integer type; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobLogStatusEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobLogStatusEnum.java new file mode 100644 index 0000000..e904e67 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobLogStatusEnum.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.infra.enums.job; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 任务日志的状态枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum InfJobLogStatusEnum { + + RUNNING(0), // 运行中 + SUCCESS(1), // 成功 + FAILURE(2); // 失败 + + /** + * 状态 + */ + private final Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobStatusEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobStatusEnum.java new file mode 100644 index 0000000..1a7c984 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/job/InfJobStatusEnum.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.adminserver.modules.infra.enums.job; + +import com.google.common.collect.Sets; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Collections; +import java.util.Set; + +import static org.quartz.impl.jdbcjobstore.Constants.*; + +/** + * 任务状态的枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum InfJobStatusEnum { + + /** + * 初始化中 + */ + INIT(0, Collections.emptySet()), + /** + * 开启 + */ + NORMAL(1, Sets.newHashSet(STATE_WAITING, STATE_ACQUIRED, STATE_BLOCKED)), + /** + * 暂停 + */ + STOP(2, Sets.newHashSet(STATE_PAUSED, STATE_PAUSED_BLOCKED)); + + /** + * 状态 + */ + private final Integer status; + /** + * 对应的 Quartz 触发器的状态集合 + */ + private final Set quartzStates; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java new file mode 100644 index 0000000..106e162 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.adminserver.modules.infra.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * API 异常数据的处理状态 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum InfApiErrorLogProcessStatusEnum { + + INIT(0, "未处理"), + DONE(1, "已处理"), + IGNORE(2, "已忽略"); + + /** + * 状态 + */ + private final Integer status; + /** + * 资源类型名 + */ + private final String name; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileConfiguration.java new file mode 100644 index 0000000..e71377e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileConfiguration.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.adminserver.modules.infra.framework.file.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 文件 配置类 + */ +@Configuration +@EnableConfigurationProperties(FileProperties.class) +public class FileConfiguration { +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileProperties.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileProperties.java new file mode 100644 index 0000000..db1a6b7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileProperties.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.adminserver.modules.infra.framework.file.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; + +@ConfigurationProperties(prefix = "yudao.file") +@Validated +@Data +public class FileProperties { + + /** + * 对应 InfFileController 的 getFile 方法 + */ + @NotNull(message = "基础文件路径不能为空") + private String basePath; + + // TODO 七牛、等等 + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/package-info.java new file mode 100644 index 0000000..a69b53e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/package-info.java @@ -0,0 +1,16 @@ +/** + * 文件的存储,推荐使用七牛、阿里云、华为云、腾讯云等文件服务 + * + * 在不采用云服务的情况下,我们有几种技术选型: + * 方案 1. 使用自建的文件服务,例如说 minIO、FastDFS 等等 + * 方案 2. 使用服务器的文件系统存储 + * 方案 3. 使用数据库进行存储 + * + * 如果考虑额外在搭建服务,推荐方案 1。 + * 对于方案 2 来说,如果要实现文件存储的高可用,需要多台服务器之间做实时同步,可以基于 rsync + inotify 来做 + * 对于方案 3 的话,实现起来最简单,但是数据库本身不适合存储海量的文件 + * + * 综合考虑,暂时使用方案 3 的方式,比较适合这样一个 all in one 的项目。 + * 随着文件的量级大了之后,还是推荐采用云服务。 + */ +package cn.iocoder.yudao.adminserver.modules.infra.framework.file; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/package-info.java new file mode 100644 index 0000000..c04bc96 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 infra 模块的 framework 封装 + * + * @author 芋道源码 + */ +package cn.iocoder.yudao.adminserver.modules.infra.framework; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java new file mode 100644 index 0000000..4ab2ba4 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/config/InfConfigRefreshConsumer.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.infra.mq.consumer.config; + +import cn.iocoder.yudao.framework.apollo.internals.DBConfigRepository; +import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; +import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 针对 {@link InfConfigRefreshMessage} 的消费者 + * + * @author 芋道源码 + */ +@Component +@Slf4j +public class InfConfigRefreshConsumer extends AbstractChannelMessageListener { + + @Override + public void onMessage(InfConfigRefreshMessage message) { + log.info("[onMessage][收到 Config 刷新消息]"); + DBConfigRepository.noticeSync(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/package-info.java new file mode 100644 index 0000000..f73455a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/consumer/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.adminserver.modules.infra.mq.consumer; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/config/InfConfigRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/config/InfConfigRefreshMessage.java new file mode 100644 index 0000000..a4f6e01 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/config/InfConfigRefreshMessage.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.infra.mq.message.config; + +import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; +import lombok.Data; + +/** + * 配置数据刷新 Message + */ +@Data +public class InfConfigRefreshMessage implements ChannelMessage { + + @Override + public String getChannel() { + return "infra.config.refresh"; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/package-info.java new file mode 100644 index 0000000..9db3856 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/message/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.adminserver.modules.infra.mq.message; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/config/InfConfigProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/config/InfConfigProducer.java new file mode 100644 index 0000000..44d52e6 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/config/InfConfigProducer.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config; + +import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; +import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Config 配置相关消息的 Producer + */ +@Component +public class InfConfigProducer { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + /** + * 发送 {@link InfConfigRefreshMessage} 消息 + */ + public void sendConfigRefreshMessage() { + InfConfigRefreshMessage message = new InfConfigRefreshMessage(); + RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/package-info.java new file mode 100644 index 0000000..0112c34 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/mq/producer/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.adminserver.modules.infra.mq.producer; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/package-info.java new file mode 100644 index 0000000..b97607f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/package-info.java @@ -0,0 +1,7 @@ +/** + * infra 包下,我们放基础设施的运维与管理,支撑上层的通用与核心业务。 + * 例如说:定时任务的管理、服务器的信息等等 + * + * 缩写:inf + */ +package cn.iocoder.yudao.adminserver.modules.infra; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigService.java new file mode 100644 index 0000000..2430c32 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigService.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.config; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 参数配置 Service 接口 + * + * @author 芋道源码 + */ +public interface InfConfigService { + + /** + * 创建参数配置 + * + * @param reqVO 创建信息 + * @return 配置编号 + */ + Long createConfig(@Valid InfConfigCreateReqVO reqVO); + + /** + * 更新参数配置 + * + * @param reqVO 更新信息 + */ + void updateConfig(@Valid InfConfigUpdateReqVO reqVO); + + /** + * 删除参数配置 + * + * @param id 配置编号 + */ + void deleteConfig(Long id); + + /** + * 获得参数配置 + * + * @param id 配置编号 + * @return 参数配置 + */ + InfConfigDO getConfig(Long id); + + /** + * 根据参数键,获得参数配置 + * + * @param key 配置键 + * @return 参数配置 + */ + InfConfigDO getConfigByKey(String key); + + /** + * 获得参数配置分页列表 + * + * @param reqVO 分页条件 + * @return 分页列表 + */ + PageResult getConfigPage(@Valid InfConfigPageReqVO reqVO); + + /** + * 获得参数配置列表 + * + * @param reqVO 列表 + * @return 列表 + */ + List getConfigList(@Valid InfConfigExportReqVO reqVO); + + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/impl/InfConfigServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/impl/InfConfigServiceImpl.java new file mode 100644 index 0000000..13bc2aa --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/impl/InfConfigServiceImpl.java @@ -0,0 +1,132 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.config.impl; + +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.convert.config.InfConfigConvert; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config.InfConfigMapper; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO; +import cn.iocoder.yudao.adminserver.modules.infra.enums.config.InfConfigTypeEnum; +import cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config.InfConfigProducer; +import cn.iocoder.yudao.adminserver.modules.infra.service.config.InfConfigService; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +import java.util.List; + +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.*; + +/** + * 参数配置 Service 实现类 + */ +@Service +@Slf4j +@Validated +public class InfConfigServiceImpl implements InfConfigService { + + @Resource + private InfConfigMapper configMapper; + + @Resource + private InfConfigProducer configProducer; + + @Override + public Long createConfig(InfConfigCreateReqVO reqVO) { + // 校验正确性 + checkCreateOrUpdate(null, reqVO.getKey()); + // 插入参数配置 + InfConfigDO config = InfConfigConvert.INSTANCE.convert(reqVO); + config.setType(InfConfigTypeEnum.CUSTOM.getType()); + configMapper.insert(config); + // 发送刷新消息 + configProducer.sendConfigRefreshMessage(); + return config.getId(); + } + + @Override + public void updateConfig(InfConfigUpdateReqVO reqVO) { + // 校验正确性 + checkCreateOrUpdate(reqVO.getId(), null); // 不允许更新 key + // 更新参数配置 + InfConfigDO updateObj = InfConfigConvert.INSTANCE.convert(reqVO); + configMapper.updateById(updateObj); + // 发送刷新消息 + configProducer.sendConfigRefreshMessage(); + } + + @Override + public void deleteConfig(Long id) { + // 校验配置存在 + InfConfigDO config = checkConfigExists(id); + // 内置配置,不允许删除 + if (InfConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { + throw ServiceExceptionUtil.exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); + } + // 删除 + configMapper.deleteById(id); + // 发送刷新消息 + configProducer.sendConfigRefreshMessage(); + } + + @Override + public InfConfigDO getConfig(Long id) { + return configMapper.selectById(id); + } + + @Override + public InfConfigDO getConfigByKey(String key) { + return configMapper.selectByKey(key); + } + + @Override + public PageResult getConfigPage(InfConfigPageReqVO reqVO) { + return configMapper.selectPage(reqVO); + } + + @Override + public List getConfigList(InfConfigExportReqVO reqVO) { + return configMapper.selectList(reqVO); + } + + private void checkCreateOrUpdate(Long id, String key) { + // 校验自己存在 + checkConfigExists(id); + // 校验参数配置 key 的唯一性 + checkConfigKeyUnique(id, key); + } + + @VisibleForTesting + public InfConfigDO checkConfigExists(Long id) { + if (id == null) { + return null; + } + InfConfigDO config = configMapper.selectById(id); + if (config == null) { + throw ServiceExceptionUtil.exception(CONFIG_NOT_EXISTS); + } + return config; + } + + @VisibleForTesting + public void checkConfigKeyUnique(Long id, String key) { + InfConfigDO config = configMapper.selectByKey(key); + if (config == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的参数配置 + if (id == null) { + throw ServiceExceptionUtil.exception(CONFIG_KEY_DUPLICATE); + } + if (!config.getId().equals(id)) { + throw ServiceExceptionUtil.exception(CONFIG_KEY_DUPLICATE); + } + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java new file mode 100644 index 0000000..0a11933 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.file; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO; + +/** + * 文件 Service 接口 + * + * @author 芋道源码 + */ +public interface InfFileService { + + /** + * 保存文件,并返回文件的访问路径 + * + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + String createFile(String path, byte[] content); + + /** + * 删除文件 + * + * @param id 编号 + */ + void deleteFile(String id); + + /** + * 获得文件 + * + * @param path 文件路径 + * @return 文件 + */ + InfFileDO getFile(String path); + + /** + * 获得文件分页 + * + * @param pageReqVO 分页查询 + * @return 文件分页 + */ + PageResult getFilePage(InfFilePageReqVO pageReqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java new file mode 100644 index 0000000..a574147 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.file.impl; + +import cn.hutool.core.io.FileTypeUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.framework.file.config.FileProperties; +import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file.InfFileMapper; +import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.ByteArrayInputStream; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.FILE_NOT_EXISTS; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS; + +/** + * 文件 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class InfFileServiceImpl implements InfFileService { + + @Resource + private InfFileMapper fileMapper; + + @Resource + private FileProperties fileProperties; + + @Override + public String createFile(String path, byte[] content) { + if (fileMapper.selectCountById(path) > 0) { + throw exception(FILE_PATH_EXISTS); + } + // 保存到数据库 + InfFileDO file = new InfFileDO(); + file.setId(path); + file.setType(FileTypeUtil.getType(new ByteArrayInputStream(content))); + file.setContent(content); + fileMapper.insert(file); + // 拼接路径返回 + return fileProperties.getBasePath() + path; + } + + @Override + public void deleteFile(String id) { + // 校验存在 + this.validateFileExists(id); + // 更新 + fileMapper.deleteById(id); + } + + private void validateFileExists(String id) { + if (fileMapper.selectById(id) == null) { + throw exception(FILE_NOT_EXISTS); + } + } + + @Override + public InfFileDO getFile(String path) { + return fileMapper.selectById(path); + } + + @Override + public PageResult getFilePage(InfFilePageReqVO pageReqVO) { + return fileMapper.selectPage(pageReqVO); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogService.java new file mode 100644 index 0000000..e4b93d2 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogService.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.job; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.quartz.core.service.JobLogFrameworkService; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; + +import java.util.Collection; +import java.util.List; + +/** + * Job 日志 Service 接口 + * + * @author 芋道源码 + */ +public interface InfJobLogService extends JobLogFrameworkService { + + /** + * 获得定时任务 + * + * @param id 编号 + * @return 定时任务 + */ + InfJobLogDO getJobLog(Long id); + + /** + * 获得定时任务列表 + * + * @param ids 编号 + * @return 定时任务列表 + */ + List getJobLogList(Collection ids); + + /** + * 获得定时任务分页 + * + * @param pageReqVO 分页查询 + * @return 定时任务分页 + */ + PageResult getJobLogPage(InfJobLogPageReqVO pageReqVO); + + /** + * 获得定时任务列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 定时任务分页 + */ + List getJobLogList(InfJobLogExportReqVO exportReqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobService.java new file mode 100644 index 0000000..ba90a3b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobService.java @@ -0,0 +1,91 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.job; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; +import org.quartz.SchedulerException; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 定时任务 Service 接口 + * + * @author 芋道源码 + */ +public interface InfJobService { + + /** + * 创建定时任务 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createJob(@Valid InfJobCreateReqVO createReqVO) throws SchedulerException; + + /** + * 更新定时任务 + * + * @param updateReqVO 更新信息 + */ + void updateJob(@Valid InfJobUpdateReqVO updateReqVO) throws SchedulerException; + + /** + * 更新定时任务的状态 + * + * @param id 任务编号 + * @param status 状态 + */ + void updateJobStatus(Long id, Integer status) throws SchedulerException; + + /** + * 触发定时任务 + * + * @param id 任务编号 + */ + void triggerJob(Long id) throws SchedulerException; + + /** + * 删除定时任务 + * + * @param id 编号 + */ + void deleteJob(Long id) throws SchedulerException; + + /** + * 获得定时任务 + * + * @param id 编号 + * @return 定时任务 + */ + InfJobDO getJob(Long id); + + /** + * 获得定时任务列表 + * + * @param ids 编号 + * @return 定时任务列表 + */ + List getJobList(Collection ids); + + /** + * 获得定时任务分页 + * + * @param pageReqVO 分页查询 + * @return 定时任务分页 + */ + PageResult getJobPage(InfJobPageReqVO pageReqVO); + + /** + * 获得定时任务列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 定时任务分页 + */ + List getJobList(InfJobExportReqVO exportReqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobLogServiceImpl.java new file mode 100644 index 0000000..e055c61 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobLogServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.job.impl; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job.InfJobLogMapper; +import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobLogStatusEnum; +import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * Job 日志 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class InfJobLogServiceImpl implements InfJobLogService { + + @Resource + private InfJobLogMapper jobLogMapper; + + @Override + public Long createJobLog(Long jobId, Date beginTime, String jobHandlerName, String jobHandlerParam, Integer executeIndex) { + InfJobLogDO log = InfJobLogDO.builder().jobId(jobId).handlerName(jobHandlerName).handlerParam(jobHandlerParam).executeIndex(executeIndex) + .beginTime(beginTime).status(InfJobLogStatusEnum.RUNNING.getStatus()).build(); + jobLogMapper.insert(log); + return log.getId(); + } + + @Override + @Async + public void updateJobLogResultAsync(Long logId, Date endTime, Integer duration, boolean success, String result) { + try { + InfJobLogDO updateObj = InfJobLogDO.builder().id(logId).endTime(endTime).duration(duration) + .status(success ? InfJobLogStatusEnum.SUCCESS.getStatus() : InfJobLogStatusEnum.FAILURE.getStatus()).result(result).build(); + jobLogMapper.updateById(updateObj); + } catch (Exception ex) { + log.error("[updateJobLogResultAsync][logId({}) endTime({}) duration({}) success({}) result({})]", + logId, endTime, duration, success, result); + } + } + + @Override + public InfJobLogDO getJobLog(Long id) { + return jobLogMapper.selectById(id); + } + + @Override + public List getJobLogList(Collection ids) { + return jobLogMapper.selectBatchIds(ids); + } + + @Override + public PageResult getJobLogPage(InfJobLogPageReqVO pageReqVO) { + return jobLogMapper.selectPage(pageReqVO); + } + + @Override + public List getJobLogList(InfJobLogExportReqVO exportReqVO) { + return jobLogMapper.selectList(exportReqVO); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobServiceImpl.java new file mode 100644 index 0000000..3597727 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/impl/InfJobServiceImpl.java @@ -0,0 +1,174 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.job.impl; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; +import cn.iocoder.yudao.framework.quartz.core.util.CronUtils; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.convert.job.InfJobConvert; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job.InfJobMapper; +import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobStatusEnum; +import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobService; +import org.quartz.SchedulerException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.containsAny; + +/** + * 定时任务 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class InfJobServiceImpl implements InfJobService { + + @Resource + private InfJobMapper jobMapper; + + @Resource + private SchedulerManager schedulerManager; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createJob(InfJobCreateReqVO createReqVO) throws SchedulerException { + validateCronExpression(createReqVO.getCronExpression()); + // 校验唯一性 + if (jobMapper.selectByHandlerName(createReqVO.getHandlerName()) != null) { + throw exception(JOB_HANDLER_EXISTS); + } + // 插入 + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); + job.setStatus(InfJobStatusEnum.INIT.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + + // 添加 Job 到 Quartz 中 + schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), + createReqVO.getRetryCount(), createReqVO.getRetryInterval()); + // 更新 + InfJobDO updateObj = InfJobDO.builder().id(job.getId()).status(InfJobStatusEnum.NORMAL.getStatus()).build(); + jobMapper.updateById(updateObj); + + // 返回 + return job.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateJob(InfJobUpdateReqVO updateReqVO) throws SchedulerException { + validateCronExpression(updateReqVO.getCronExpression()); + // 校验存在 + InfJobDO job = this.validateJobExists(updateReqVO.getId()); + // 只有开启状态,才可以修改.原因是,如果出暂停状态,修改 Quartz Job 时,会导致任务又开始执行 + if (!job.getStatus().equals(InfJobStatusEnum.NORMAL.getStatus())) { + throw exception(JOB_UPDATE_ONLY_NORMAL_STATUS); + } + // 更新 + InfJobDO updateObj = InfJobConvert.INSTANCE.convert(updateReqVO); + fillJobMonitorTimeoutEmpty(updateObj); + jobMapper.updateById(updateObj); + + // 更新 Job 到 Quartz 中 + schedulerManager.updateJob(job.getHandlerName(), updateReqVO.getHandlerParam(), updateReqVO.getCronExpression(), + updateReqVO.getRetryCount(), updateReqVO.getRetryInterval()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateJobStatus(Long id, Integer status) throws SchedulerException { + // 校验 status + if (!containsAny(status, InfJobStatusEnum.NORMAL.getStatus(), InfJobStatusEnum.STOP.getStatus())) { + throw exception(JOB_CHANGE_STATUS_INVALID); + } + // 校验存在 + InfJobDO job = this.validateJobExists(id); + // 校验是否已经为当前状态 + if (job.getStatus().equals(status)) { + throw exception(JOB_CHANGE_STATUS_EQUALS); + } + // 更新 Job 状态 + InfJobDO updateObj = InfJobDO.builder().id(id).status(status).build(); + jobMapper.updateById(updateObj); + + // 更新状态 Job 到 Quartz 中 + if (InfJobStatusEnum.NORMAL.getStatus().equals(status)) { // 开启 + schedulerManager.resumeJob(job.getHandlerName()); + } else { // 暂停 + schedulerManager.pauseJob(job.getHandlerName()); + } + } + + @Override + public void triggerJob(Long id) throws SchedulerException { + // 校验存在 + InfJobDO job = this.validateJobExists(id); + + // 触发 Quartz 中的 Job + schedulerManager.triggerJob(job.getId(), job.getHandlerName(), job.getHandlerParam()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJob(Long id) throws SchedulerException { + // 校验存在 + InfJobDO job = this.validateJobExists(id); + // 更新 + jobMapper.deleteById(id); + + // 删除 Job 到 Quartz 中 + schedulerManager.deleteJob(job.getHandlerName()); + } + + private InfJobDO validateJobExists(Long id) { + InfJobDO job = jobMapper.selectById(id); + if (job == null) { + throw exception(JOB_NOT_EXISTS); + } + return job; + } + + private void validateCronExpression(String cronExpression) { + if (!CronUtils.isValid(cronExpression)) { + throw exception(JOB_CRON_EXPRESSION_VALID); + } + } + + @Override + public InfJobDO getJob(Long id) { + return jobMapper.selectById(id); + } + + @Override + public List getJobList(Collection ids) { + return jobMapper.selectBatchIds(ids); + } + + @Override + public PageResult getJobPage(InfJobPageReqVO pageReqVO) { + return jobMapper.selectPage(pageReqVO); + } + + @Override + public List getJobList(InfJobExportReqVO exportReqVO) { + return jobMapper.selectList(exportReqVO); + } + + private static void fillJobMonitorTimeoutEmpty(InfJobDO job) { + if (job.getMonitorTimeout() == null) { + job.setMonitorTimeout(0); + } + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogService.java new file mode 100644 index 0000000..f4eb6bd --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogService.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.logger; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; + +import java.util.List; + +/** + * API 访问日志 Service 接口 + * + * @author 芋道源码 + */ +public interface InfApiAccessLogService extends ApiAccessLogFrameworkService { + + /** + * 获得 API 访问日志分页 + * + * @param pageReqVO 分页查询 + * @return API 访问日志分页 + */ + PageResult getApiAccessLogPage(InfApiAccessLogPageReqVO pageReqVO); + + /** + * 获得 API 访问日志列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return API 访问日志分页 + */ + List getApiAccessLogList(InfApiAccessLogExportReqVO exportReqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogService.java new file mode 100644 index 0000000..f5e41a5 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogService.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.logger; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; + +import java.util.List; + +/** + * API 错误日志 Service 接口 + * + * @author 芋道源码 + */ +public interface InfApiErrorLogService extends ApiErrorLogFrameworkService { + + /** + * 获得 API 错误日志分页 + * + * @param pageReqVO 分页查询 + * @return API 错误日志分页 + */ + PageResult getApiErrorLogPage(InfApiErrorLogPageReqVO pageReqVO); + + /** + * 获得 API 错误日志列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return API 错误日志分页 + */ + List getApiErrorLogList(InfApiErrorLogExportReqVO exportReqVO); + + /** + * 更新 API 错误日志已处理 + * + * @param id API 日志编号 + * @param processStatus 处理结果 + * @param processUserId 处理人 + */ + void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java new file mode 100644 index 0000000..8fae484 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiAccessLogConvert; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiAccessLogMapper; +import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiAccessLogService; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.AsyncResult; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.concurrent.Future; + +/** + * API 访问日志 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class InfApiAccessLogServiceImpl implements InfApiAccessLogService { + + @Resource + private InfApiAccessLogMapper apiAccessLogMapper; + + @Override + @Async + public Future createApiAccessLogAsync(ApiAccessLogCreateDTO createDTO) { + // 插入 + InfApiAccessLogDO apiAccessLog = InfApiAccessLogConvert.INSTANCE.convert(createDTO); + int insert = apiAccessLogMapper.insert(apiAccessLog); + return new AsyncResult<>(insert == 1); + } + + @Override + public PageResult getApiAccessLogPage(InfApiAccessLogPageReqVO pageReqVO) { + return apiAccessLogMapper.selectPage(pageReqVO); + } + + @Override + public List getApiAccessLogList(InfApiAccessLogExportReqVO exportReqVO) { + return apiAccessLogMapper.selectList(exportReqVO); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java new file mode 100644 index 0000000..aa0fe1f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiErrorLogConvert; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiErrorLogMapper; +import cn.iocoder.yudao.adminserver.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; +import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiErrorLogService; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.AsyncResult; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.concurrent.Future; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_PROCESSED; + +/** + * API 错误日志 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class InfApiErrorLogServiceImpl implements InfApiErrorLogService { + + @Resource + private InfApiErrorLogMapper apiErrorLogMapper; + + @Override + @Async + public Future createApiErrorLogAsync(ApiErrorLogCreateDTO createDTO) { + InfApiErrorLogDO apiErrorLog = InfApiErrorLogConvert.INSTANCE.convert(createDTO); + apiErrorLog.setProcessStatus(InfApiErrorLogProcessStatusEnum.INIT.getStatus()); + int insert = apiErrorLogMapper.insert(apiErrorLog); + return new AsyncResult<>(insert == 1); + } + + @Override + public PageResult getApiErrorLogPage(InfApiErrorLogPageReqVO pageReqVO) { + return apiErrorLogMapper.selectPage(pageReqVO); + } + + @Override + public List getApiErrorLogList(InfApiErrorLogExportReqVO exportReqVO) { + return apiErrorLogMapper.selectList(exportReqVO); + } + + @Override + public void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId) { + InfApiErrorLogDO errorLog = apiErrorLogMapper.selectById(id); + if (errorLog == null) { + throw exception(API_ERROR_LOG_NOT_FOUND); + } + if (!InfApiErrorLogProcessStatusEnum.INIT.getStatus().equals(errorLog.getProcessStatus())) { + throw exception(API_ERROR_LOG_PROCESSED); + } + // 标记处理 + apiErrorLogMapper.updateById(InfApiErrorLogDO.builder().id(id).processStatus(processStatus) + .processUserId(processUserId).processTime(new Date()).build()); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.http b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.http new file mode 100644 index 0000000..125a368 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.http @@ -0,0 +1,22 @@ +### 请求 /login 接口 => 成功 +POST {{baseUrl}}/login +Content-Type: application/json + +{ + "username": "admin", + "password": "admin123", + "uuid": "9b2ffbc1-7425-4155-9894-9d5c08541d62", + "code": "1024" +} + +### 请求 /get-permission-info 接口 => 成功 +GET {{baseUrl}}/get-permission-info +Authorization: Bearer {{token}} + +### 请求 /list-menus 接口 => 成功 +GET {{baseUrl}}/list-menus +Authorization: Bearer {{token}} + +### 请求 /druid/xxx 接口 => 失败 TODO 临时测试 +GET http://127.0.0.1:8080/druid/123 +Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java new file mode 100644 index 0000000..059e37c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java @@ -0,0 +1,90 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.auth; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.framework.common.util.collection.SetUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserRoleIds; +import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; +import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUserAgent; + +@Api(tags = "认证") +@RestController +@RequestMapping("/") +@Validated +public class SysAuthController { + + @Resource + private SysAuthService authService; + @Resource + private SysUserService userService; + @Resource + private SysRoleService roleService; + @Resource + private SysPermissionService permissionService; + + @PostMapping("/login") + @ApiOperation("使用账号密码登录") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult login(@RequestBody @Valid SysAuthLoginReqVO reqVO) { + String token = authService.login(reqVO, getClientIP(), getUserAgent()); + // 返回结果 + return success(SysAuthLoginRespVO.builder().token(token).build()); + } + + @GetMapping("/get-permission-info") + @ApiOperation("获取登陆用户的权限信息") + public CommonResult getPermissionInfo() { + // 获得用户信息 + SysUserDO user = userService.getUser(getLoginUserId()); + if (user == null) { + return null; + } + // 获得角色列表 + List roleList = roleService.getRolesFromCache(getLoginUserRoleIds()); + // 获得菜单列表 + List menuList = permissionService.getRoleMenusFromCache( + getLoginUserRoleIds(), // 注意,基于登陆的角色,因为后续的权限判断也是基于它 + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()), + SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); + // 拼接结果返回 + return success(SysAuthConvert.INSTANCE.convert(user, roleList, menuList)); + } + + @GetMapping("list-menus") + @ApiOperation("获得登陆用户的菜单列表") + public CommonResult> getMenus() { + // 获得用户拥有的菜单列表 + List menuList = permissionService.getRoleMenusFromCache( + getLoginUserRoleIds(), // 注意,基于登陆的角色,因为后续的权限判断也是基于它 + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型 + SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的 + // 转换成 Tree 结构返回 + return success(SysAuthConvert.INSTANCE.buildMenuTree(menuList)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java new file mode 100644 index 0000000..253b251 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java @@ -0,0 +1,79 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.auth; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysUserSessionConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; + +@Api(tags = "用户 Session") +@RestController +@RequestMapping("/system/user-session") +public class SysUserSessionController { + + @Resource + private SysUserSessionService userSessionService; + @Resource + private SysUserService userService; + @Resource + private SysDeptService deptService; + + @GetMapping("/page") + @ApiOperation("获得 Session 分页列表") + @PreAuthorize("@ss.hasPermission('system:user-session:page')") + public CommonResult> getUserSessionPage(@Validated SysUserSessionPageReqVO reqVO) { + // 获得 Session 分页 + PageResult pageResult = userSessionService.getUserSessionPage(reqVO); + + // 获得拼接需要的数据 + Map userMap = userService.getUserMap( + convertList(pageResult.getList(), SysUserSessionDO::getUserId)); + Map deptMap = deptService.getDeptMap( + convertList(userMap.values(), SysUserDO::getDeptId)); + // 拼接结果返回 + List sessionList = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(session -> { + SysUserSessionPageItemRespVO respVO = SysUserSessionConvert.INSTANCE.convert(session); + sessionList.add(respVO); + // 设置用户账号 + MapUtils.findAndThen(userMap, session.getUserId(), user -> { + respVO.setUsername(user.getUsername()); + // 设置用户部门 + MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> respVO.setDeptName(dept.getName())); + }); + }); + return success(new PageResult<>(sessionList, pageResult.getTotal())); + } + + @DeleteMapping("/delete") + @ApiOperation("删除 Session") + @ApiImplicitParam(name = "id", value = "Session 编号", required = true, dataTypeClass = String.class, + example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7") + @PreAuthorize("@ss.hasPermission('system:user-session:delete')") + public CommonResult deleteUserSession(@RequestParam("id") String id) { + userSessionService.deleteUserSession(id); + return success(true); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java new file mode 100644 index 0000000..43df52c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; + +@ApiModel("账号密码登陆 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SysAuthLoginReqVO { + + @ApiModelProperty(value = "账号", required = true, example = "yudaoyuanma") + @NotEmpty(message = "登陆账号不能为空") + @Length(min = 4, max = 16, message = "账号长度为 4-16 位") + @Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母") + private String username; + + @ApiModelProperty(value = "密码", required = true, example = "buzhidao") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + + @ApiModelProperty(value = "验证码", required = true, example = "1024") + @NotEmpty(message = "验证码不能为空") + private String code; + + @ApiModelProperty(value = "验证码的唯一标识", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + @NotEmpty(message = "唯一标识不能为空") + private String uuid; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java new file mode 100644 index 0000000..c09bd03 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("账号密码登陆 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SysAuthLoginRespVO { + + @ApiModelProperty(value = "token", required = true, example = "yudaoyuanma") + private String token; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java new file mode 100644 index 0000000..3329c80 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@ApiModel("登陆用户的菜单信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SysAuthMenuRespVO { + + @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") + private Long id; + + @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") + private Long parentId; + + @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") + private String name; + + @ApiModelProperty(value = "路由地址", example = "post", notes = "仅菜单类型为菜单或者目录时,才需要传") + private String path; + + @ApiModelProperty(value = "组件路径", example = "system/post/index", notes = "仅菜单类型为菜单时,才需要传") + private String component; + + @ApiModelProperty(value = "菜单图标", example = "/menu/list", notes = "仅菜单类型为菜单或者目录时,才需要传") + private String icon; + + /** + * 子路由 + */ + private List children; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java new file mode 100644 index 0000000..102c3c9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +@ApiModel(value = "登陆用户的权限信息 Response VO", description = "额外包括用户信息和角色列表") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SysAuthPermissionInfoRespVO { + + @ApiModelProperty(value = "用户信息", required = true) + private UserVO user; + + @ApiModelProperty(value = "角色标识数组", required = true) + private Set roles; + + @ApiModelProperty(value = "操作权限数组", required = true) + private Set permissions; + + @ApiModel("用户信息 VO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class UserVO { + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋道源码") + private String nickname; + + @ApiModelProperty(value = "用户头像", required = true, example = "http://www.iocoder.cn/xx.jpg") + private String avatar; + + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java new file mode 100644 index 0000000..1cb9a5a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@ApiModel(value = "用户在线 Session Response VO", description = "相比用户基本信息来说,会多部门、用户账号等信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserSessionPageItemRespVO extends PageParam { + + @ApiModelProperty(value = "Session 编号", required = true, example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7") + private String id; + + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") + private String userIp; + + @ApiModelProperty(value = "浏览器 UserAgent", required = true, example = "Mozilla/5.0") + private String userAgent; + + @ApiModelProperty(value = "登陆时间", required = true) + private Date createTime; + + @ApiModelProperty(value = "用户账号", required = true, example = "yudao") + private String username; + + @ApiModelProperty(value = "部门名称", example = "研发部") + private String deptName; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java new file mode 100644 index 0000000..fb8f4f2 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("在线用户 Session 分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysUserSessionPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模糊匹配") + private String userIp; + + @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") + private String username; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.http b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.http new file mode 100644 index 0000000..0b1cf85 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.http @@ -0,0 +1,2 @@ +### 请求 /captcha/get-image 接口 => 成功 +GET {{baseUrl}}/system/captcha/get-image diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.java new file mode 100644 index 0000000..94e3c9d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/SysCaptchaController.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.common; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.common.vo.SysCaptchaImageRespVO; +import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Api(tags = "验证码") +@RestController +@RequestMapping("/system/captcha") +public class SysCaptchaController { + + @Resource + private SysCaptchaService captchaService; + + @GetMapping("/get-image") + @ApiOperation("生成图片验证码") + public CommonResult getCaptchaImage() { + return success(captchaService.getCaptchaImage()); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/vo/SysCaptchaImageRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/vo/SysCaptchaImageRespVO.java new file mode 100644 index 0000000..b3e9f2c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/common/vo/SysCaptchaImageRespVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("验证码图片 Response VO") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysCaptchaImageRespVO { + + @ApiModelProperty(value = "uuid", required = true, example = "1b3b7d00-83a8-4638-9e37-d67011855968", notes = "通过该 uuid 作为该验证码的标识") + private String uuid; + + @ApiModelProperty(value = "图片", required = true, notes = "验证码的图片内容,使用 Base64 编码") + private String img; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java new file mode 100644 index 0000000..1bae57f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysDeptController.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.*; +import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysDeptConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Comparator; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Api(tags = "部门") +@RestController +@RequestMapping("/system/dept") +@Validated +public class SysDeptController { + + @Resource + private SysDeptService deptService; + + @PostMapping("create") + @ApiOperation("创建部门") + @PreAuthorize("@ss.hasPermission('system:dept:create')") + public CommonResult createDept(@Valid @RequestBody SysDeptCreateReqVO reqVO) { + Long deptId = deptService.createDept(reqVO); + return success(deptId); + } + + @PutMapping("update") + @ApiOperation("更新部门") + @PreAuthorize("@ss.hasPermission('system:dept:update')") + public CommonResult updateDept(@Valid @RequestBody SysDeptUpdateReqVO reqVO) { + deptService.updateDept(reqVO); + return success(true); + } + + @DeleteMapping("delete") + @ApiOperation("删除部门") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dept:delete')") + public CommonResult deleteDept(@RequestParam("id") Long id) { + deptService.deleteDept(id); + return success(true); + } + + @GetMapping("/list") + @ApiOperation("获取部门列表") + @PreAuthorize("@ss.hasPermission('system:dept:query')") + public CommonResult> listDepts(SysDeptListReqVO reqVO) { + List list = deptService.getSimpleDepts(reqVO); + list.sort(Comparator.comparing(SysDeptDO::getSort)); + return success(SysDeptConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取部门精简信息列表", notes = "只包含被开启的部门,主要用于前端的下拉选项") + public CommonResult> getSimpleDepts() { + // 获得部门列表,只要开启状态的 + SysDeptListReqVO reqVO = new SysDeptListReqVO(); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = deptService.getSimpleDepts(reqVO); + // 排序后,返回给前端 + list.sort(Comparator.comparing(SysDeptDO::getSort)); + return success(SysDeptConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/get") + @ApiOperation("获得部门信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dept:query')") + public CommonResult getDept(@RequestParam("id") Long id) { + return success(SysDeptConvert.INSTANCE.convert(deptService.getDept(id))); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java new file mode 100644 index 0000000..c27dc1c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/SysPostController.java @@ -0,0 +1,99 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.*; +import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysPostConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "岗位") +@RestController +@RequestMapping("/system/post") +@Valid +public class SysPostController { + + @Resource + private SysPostService postService; + + @PostMapping("/create") + @ApiOperation("创建岗位") + @PreAuthorize("@ss.hasPermission('system:post:create')") + public CommonResult createPost(@Valid @RequestBody SysPostCreateReqVO reqVO) { + Long postId = postService.createPost(reqVO); + return success(postId); + } + + @PutMapping("/update") + @ApiOperation("修改岗位") + @PreAuthorize("@ss.hasPermission('system:post:update')") + public CommonResult updatePost(@Valid @RequestBody SysPostUpdateReqVO reqVO) { + postService.updatePost(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除岗位") + @PreAuthorize("@ss.hasPermission('system:post:delete')") + public CommonResult deletePost(@RequestParam("id") Long id) { + postService.deletePost(id); + return success(true); + } + + @GetMapping(value = "/get") + @ApiOperation("获得岗位信息") + @ApiImplicitParam(name = "id", value = "岗位编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:post:query')") + public CommonResult getPost(@RequestParam("id") Long id) { + return success(SysPostConvert.INSTANCE.convert(postService.getPost(id))); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取岗位精简信息列表", notes = "只包含被开启的岗位,主要用于前端的下拉选项") + public CommonResult> getSimplePosts() { + // 获得岗位列表,只要开启状态的 + List list = postService.getPosts(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); + // 排序后,返回给前端 + list.sort(Comparator.comparing(SysPostDO::getSort)); + return success(SysPostConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/page") + @ApiOperation("获得岗位分页列表") + @PreAuthorize("@ss.hasPermission('system:post:query')") + public CommonResult> getPostPage(@Validated SysPostPageReqVO reqVO) { + return success(SysPostConvert.INSTANCE.convertPage(postService.getPostPage(reqVO))); + } + + @GetMapping("/export") + @ApiOperation("岗位管理") + @PreAuthorize("@ss.hasPermission('system:post:export')") + @OperateLog(type = EXPORT) + public void export(HttpServletResponse response, @Validated SysPostExportReqVO reqVO) throws IOException { + List posts = postService.getPosts(reqVO); + List data = SysPostConvert.INSTANCE.convertList03(posts); + // 输出 + ExcelUtils.write(response, "岗位数据.xls", "岗位列表", SysPostExcelVO.class, data); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java new file mode 100644 index 0000000..f3e667a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 部门 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SysDeptBaseVO { + + @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") + @NotBlank(message = "部门名称不能为空") + @Size(max = 30, message = "部门名称长度不能超过30个字符") + private String name; + + @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") + @NotNull(message = "父菜单 ID 不能为空") + private Long parentId; + + @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "负责人", example = "芋道") + private String leader; + + @ApiModelProperty(value = "联系电话", example = "15601691000") + @Size(max = 11, message = "联系电话长度不能超过11个字符") + private String phone; + + @ApiModelProperty(value = "邮箱", example = "yudao@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过50个字符") + private String email; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") +// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java new file mode 100644 index 0000000..c5c5aac --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("部门创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysDeptCreateReqVO extends SysDeptBaseVO { +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java new file mode 100644 index 0000000..b47bc53 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptListReqVO.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("部门列表 Request VO") +@Data +public class SysDeptListReqVO { + + @ApiModelProperty(value = "部门名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptRespVO.java new file mode 100644 index 0000000..325cce6 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@ApiModel("部门信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysDeptRespVO extends SysDeptBaseVO { + + @ApiModelProperty(value = "部门编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java new file mode 100644 index 0000000..bf9c8bd --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptSimpleRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("部门精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysDeptSimpleRespVO { + + @ApiModelProperty(value = "部门编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "部门名称", required = true, example = "芋道") + private String name; + + @ApiModelProperty(value = "父部门 ID", required = true, example = "1024") + private Long parentId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java new file mode 100644 index 0000000..5838d1d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/dept/SysDeptUpdateReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("部门更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysDeptUpdateReqVO extends SysDeptBaseVO { + + @ApiModelProperty(value = "部门编号", required = true, example = "1024") + @NotNull(message = "部门编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostBaseVO.java new file mode 100644 index 0000000..c6ed5c8 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostBaseVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 岗位 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SysPostBaseVO { + + @ApiModelProperty(value = "岗位名称", required = true, example = "小博主") + @NotBlank(message = "岗位名称不能为空") + @Size(max = 50, message = "岗位名称长度不能超过50个字符") + private String name; + + @ApiModelProperty(value = "岗位编码", required = true, example = "yudao") + @NotBlank(message = "岗位编码不能为空") + @Size(max = 64, message = "岗位编码长度不能超过64个字符") + private String code; + + @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "备注", example = "快乐的备注") + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java new file mode 100644 index 0000000..72be88d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostCreateReqVO.java @@ -0,0 +1,11 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("岗位创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysPostCreateReqVO extends SysPostBaseVO { +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java new file mode 100644 index 0000000..acc23c3 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExcelVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 岗位 Excel 导出响应 VO + */ +@Data +public class SysPostExcelVO { + + @ExcelProperty("岗位序号") + private Long id; + + @ExcelProperty("岗位编码") + private String code; + + @ExcelProperty("岗位名称") + private String name; + + @ExcelProperty("岗位排序") + private Integer sort; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.COMMON_STATUS) + private String status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExportReqVO.java new file mode 100644 index 0000000..4656392 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostExportReqVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "岗位导出 Request VO", description = "参数和 SysPostExcelVO 是一致的") +@Data +public class SysPostExportReqVO { + + @ApiModelProperty(value = "岗位编码", example = "yudao", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostListReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostListReqVO.java new file mode 100644 index 0000000..0e700a9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostListReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("岗位列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysPostListReqVO extends SysPostBaseVO { + + @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostPageReqVO.java new file mode 100644 index 0000000..432e160 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostPageReqVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("岗位分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysPostPageReqVO extends PageParam { + + @ApiModelProperty(value = "岗位编码", example = "yudao", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostRespVO.java new file mode 100644 index 0000000..cfd42a2 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostRespVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@ApiModel("岗位信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysPostRespVO extends SysPostBaseVO { + + @ApiModelProperty(value = "岗位序号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java new file mode 100644 index 0000000..244667f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostSimpleRespVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("岗位精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysPostSimpleRespVO { + + @ApiModelProperty(value = "岗位编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "岗位名称", required = true, example = "芋道") + private String name; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java new file mode 100644 index 0000000..cc95c9c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dept/vo/post/SysPostUpdateReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("岗位更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysPostUpdateReqVO extends SysPostBaseVO { + + @ApiModelProperty(value = "岗位编号", required = true, example = "1024") + @NotNull(message = "岗位编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.http b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.http new file mode 100644 index 0000000..f7890dc --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.http @@ -0,0 +1,3 @@ +### 请求 /menu/list 接口 => 成功 +GET {{baseUrl}}/system/dict-data/list-all-simple +Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.java new file mode 100644 index 0000000..6f45fc3 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.*; +import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictDataConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "字典数据") +@RestController +@RequestMapping("/system/dict-data") +@Validated +public class SysDictDataController { + + @Resource + private SysDictDataService dictDataService; + + @PostMapping("/create") + @ApiOperation("新增字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:create')") + public CommonResult createDictData(@Valid @RequestBody SysDictDataCreateReqVO reqVO) { + Long dictDataId = dictDataService.createDictData(reqVO); + return success(dictDataId); + } + + @PutMapping("update") + @ApiOperation("修改字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:update')") + public CommonResult updateDictData(@Valid @RequestBody SysDictDataUpdateReqVO reqVO) { + dictDataService.updateDictData(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除字典数据") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictData(Long id) { + dictDataService.deleteDictData(id); + return success(true); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获得全部字典数据列表", notes = "一般用于管理后台缓存字典数据在本地") + // 无需添加权限认证,因为前端全局都需要 + public CommonResult> getSimpleDictDatas() { + List list = dictDataService.getDictDatas(); + return success(SysDictDataConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("/获得字典类型的分页列表") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult> getDictTypePage(@Valid SysDictDataPageReqVO reqVO) { + return success(SysDictDataConvert.INSTANCE.convertPage(dictDataService.getDictDataPage(reqVO))); + } + + @GetMapping(value = "/get") + @ApiOperation("/查询字典数据详细") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult getDictData(@RequestParam("id") Long id) { + return success(SysDictDataConvert.INSTANCE.convert(dictDataService.getDictData(id))); + } + + @GetMapping("/export") + @ApiOperation("导出字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:export')") + @OperateLog(type = EXPORT) + public void export(HttpServletResponse response, @Valid SysDictDataExportReqVO reqVO) throws IOException { + List list = dictDataService.getDictDatas(reqVO); + List data = SysDictDataConvert.INSTANCE.convertList02(list); + // 输出 + ExcelUtils.write(response, "字典数据.xls", "数据列表", SysDictDataExcelVO.class, data); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictTypeController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictTypeController.java new file mode 100644 index 0000000..9ab3661 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictTypeController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.*; +import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictTypeConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictTypeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "字典类型") +@RestController +@RequestMapping("/system/dict-type") +@Validated +public class SysDictTypeController { + + @Resource + private SysDictTypeService dictTypeService; + + @PostMapping("/create") + @ApiOperation("创建字典类型") + @PreAuthorize("@ss.hasPermission('system:dict:create')") + public CommonResult createDictType(@Valid @RequestBody SysDictTypeCreateReqVO reqVO) { + Long dictTypeId = dictTypeService.createDictType(reqVO); + return success(dictTypeId); + } + + @PutMapping("/update") + @ApiOperation("修改字典类型") + @PreAuthorize("@ss.hasPermission('system:dict:update')") + public CommonResult updateDictType(@Valid @RequestBody SysDictTypeUpdateReqVO reqVO) { + dictTypeService.updateDictType(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除字典类型") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictType(Long id) { + dictTypeService.deleteDictType(id); + return success(true); + } + + @ApiOperation("/获得字典类型的分页列表") + @GetMapping("/page") + @PreAuthorize("@ss.hasPermission('system:dict:quey')") + public CommonResult> pageDictTypes(@Valid SysDictTypePageReqVO reqVO) { + return success(SysDictTypeConvert.INSTANCE.convertPage(dictTypeService.getDictTypePage(reqVO))); + } + + @ApiOperation("/查询字典类型详细") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @GetMapping(value = "/get") + @PreAuthorize("@ss.hasPermission('system:dict:quey')") + public CommonResult getDictType(@RequestParam("id") Long id) { + return success(SysDictTypeConvert.INSTANCE.convert(dictTypeService.getDictType(id))); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获得全部字典类型列表", notes = "包括开启 + 禁用的字典类型,主要用于前端的下拉选项") + // 无需添加权限认证,因为前端全局都需要 + public CommonResult> listSimpleDictTypes() { + List list = dictTypeService.getDictTypeList(); + return success(SysDictTypeConvert.INSTANCE.convertList(list)); + } + + @ApiOperation("导出数据类型") + @GetMapping("/export") + @PreAuthorize("@ss.hasPermission('system:dict:quey')") + @OperateLog(type = EXPORT) + public void export(HttpServletResponse response, @Valid SysDictTypeExportReqVO reqVO) throws IOException { + List list = dictTypeService.getDictTypeList(reqVO); + List data = SysDictTypeConvert.INSTANCE.convertList02(list); + // 输出 + ExcelUtils.write(response, "字典类型.xls", "类型列表", SysDictTypeExcelVO.class, data); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java new file mode 100644 index 0000000..adb4bb2 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 字典数据 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SysDictDataBaseVO { + + @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "字典标签", required = true, example = "芋道") + @NotBlank(message = "字典标签不能为空") + @Size(max = 100, message = "字典标签长度不能超过100个字符") + private String label; + + @ApiModelProperty(value = "字典值", required = true, example = "iocoder") + @NotBlank(message = "字典键值不能为空") + @Size(max = 100, message = "字典键值长度不能超过100个字符") + private String value; + + @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") + @NotBlank(message = "字典类型不能为空") + @Size(max = 100, message = "字典类型长度不能超过100个字符") + private String dictType; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") +// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + + @ApiModelProperty(value = "备注", example = "我是一个角色") + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java new file mode 100644 index 0000000..5c96499 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataCreateReqVO.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("字典数据创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysDictDataCreateReqVO extends SysDictDataBaseVO { + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java new file mode 100644 index 0000000..23174a0 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExcelVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 字典数据 Excel 导出响应 VO + */ +@Data +public class SysDictDataExcelVO { + + @ExcelProperty("字典编码") + private Long id; + + @ExcelProperty("字典排序") + private Integer sort; + + @ExcelProperty("字典标签") + private String label; + + @ExcelProperty("字典键值") + private String value; + + @ExcelProperty("字典类型") + private String dictType; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java new file mode 100644 index 0000000..43e8884 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataExportReqVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Size; + +@ApiModel("字典类型导出 Request VO") +@Data +public class SysDictDataExportReqVO { + + @ApiModelProperty(value = "字典标签", example = "芋道") + @Size(max = 100, message = "字典标签长度不能超过100个字符") + private String label; + + @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String dictType; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java new file mode 100644 index 0000000..0cd2a48 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataPageReqVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.Size; + +@ApiModel("字典类型分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysDictDataPageReqVO extends PageParam { + + @ApiModelProperty(value = "字典标签", example = "芋道") + @Size(max = 100, message = "字典标签长度不能超过100个字符") + private String label; + + @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String dictType; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataRespVO.java new file mode 100644 index 0000000..fa6f77f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataRespVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@ApiModel("字典数据信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysDictDataRespVO extends SysDictDataBaseVO { + + @ApiModelProperty(value = "字典数据编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java new file mode 100644 index 0000000..e4a09e6 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataSimpleRespVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("数据字典精简 Response VO") +@Data +public class SysDictDataSimpleRespVO { + + @ApiModelProperty(value = "字典类型", required = true, example = "gender") + private String dictType; + + @ApiModelProperty(value = "字典键值", required = true, example = "1") + private String value; + + @ApiModelProperty(value = "字典标签", required = true, example = "男") + private String label; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java new file mode 100644 index 0000000..ccbd455 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/data/SysDictDataUpdateReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("字典数据更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysDictDataUpdateReqVO extends SysDictDataBaseVO { + + @ApiModelProperty(value = "字典数据编号", required = true, example = "1024") + @NotNull(message = "字典数据编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java new file mode 100644 index 0000000..c4458cd --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeBaseVO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 字典类型 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SysDictTypeBaseVO { + + @ApiModelProperty(value = "字典名称", required = true, example = "性别") + @NotBlank(message = "字典名称不能为空") + @Size(max = 100, message = "字典类型名称长度不能超过100个字符") + private String name; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + @NotNull(message = "状态不能为空") + private Integer status; + + @ApiModelProperty(value = "备注", example = "快乐的备注") + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java new file mode 100644 index 0000000..6f84ecf --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeCreateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@ApiModel("字典类型创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysDictTypeCreateReqVO extends SysDictTypeBaseVO { + + @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") + @NotNull(message = "字典类型不能为空") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String type; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java new file mode 100644 index 0000000..fbb4da3 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExcelVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 字典类型 Excel 导出响应 VO + */ +@Data +public class SysDictTypeExcelVO { + + @ExcelProperty("字典主键") + private Long id; + + @ExcelProperty("字典名称") + private String name; + + @ExcelProperty("字典类型") + private String type; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java new file mode 100644 index 0000000..cfe54e5 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeExportReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("字典类型分页列表 Request VO") +@Data +public class SysDictTypeExportReqVO { + + @ApiModelProperty(value = "字典类型名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") + private String type; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java new file mode 100644 index 0000000..434ca27 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypePageReqVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.Size; +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("字典类型分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysDictTypePageReqVO extends PageParam { + + @ApiModelProperty(value = "字典类型名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String type; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java new file mode 100644 index 0000000..fd216bc --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeRespVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@ApiModel("字典类型信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysDictTypeRespVO extends SysDictTypeBaseVO { + + @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") + private String type; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java new file mode 100644 index 0000000..7d0ef04 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeSimpleRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("字典类型精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysDictTypeSimpleRespVO { + + @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "字典类型名称", required = true, example = "芋道") + private String name; + + @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") + private String type; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java new file mode 100644 index 0000000..9b887bd --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/vo/type/SysDictTypeUpdateReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("字典类型更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysDictTypeUpdateReqVO extends SysDictTypeBaseVO { + + @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") + @NotNull(message = "字典类型编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.http b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.http new file mode 100644 index 0000000..76226d1 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.http @@ -0,0 +1,12 @@ +### +POST {{baseUrl}}/inra/error-code/create +Authorization: Bearer {{token}} +Content-Type:application/json + +{ + "code": 200, + "message": "成功", + "group": "test", + "type": 1 +} + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.java new file mode 100644 index 0000000..04c88eb --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/SysErrorCodeController.java @@ -0,0 +1,89 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.system.convert.errorcode.SysErrorCodeConvert; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.*; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.adminserver.modules.system.service.errorcode.SysErrorCodeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "错误码") +@RestController +@RequestMapping("/system/error-code") +@Validated +public class SysErrorCodeController { + + @Resource + private SysErrorCodeService errorCodeService; + + @PostMapping("/create") + @ApiOperation("创建错误码") + @PreAuthorize("@ss.hasPermission('system:error-code:create')") + public CommonResult createErrorCode(@Valid @RequestBody SysErrorCodeCreateReqVO createReqVO) { + return success(errorCodeService.createErrorCode(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新错误码") + @PreAuthorize("@ss.hasPermission('system:error-code:update')") + public CommonResult updateErrorCode(@Valid @RequestBody SysErrorCodeUpdateReqVO updateReqVO) { + errorCodeService.updateErrorCode(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除错误码") + @ApiImplicitParam(name = "id", value = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:error-code:delete')") + public CommonResult deleteErrorCode(@RequestParam("id") Long id) { + errorCodeService.deleteErrorCode(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得错误码") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:error-code:query')") + public CommonResult getErrorCode(@RequestParam("id") Long id) { + SysErrorCodeDO errorCode = errorCodeService.getErrorCode(id); + return success(SysErrorCodeConvert.INSTANCE.convert(errorCode)); + } + + @GetMapping("/page") + @ApiOperation("获得错误码分页") + @PreAuthorize("@ss.hasPermission('system:error-code:query')") + public CommonResult> getErrorCodePage(@Valid SysErrorCodePageReqVO pageVO) { + PageResult pageResult = errorCodeService.getErrorCodePage(pageVO); + return success(SysErrorCodeConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出错误码 Excel") + @PreAuthorize("@ss.hasPermission('system:error-code:export')") + @OperateLog(type = EXPORT) + public void exportErrorCodeExcel(@Valid SysErrorCodeExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = errorCodeService.getErrorCodeList(exportReqVO); + // 导出 Excel + List datas = SysErrorCodeConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "错误码.xls", "数据", SysErrorCodeExcelVO.class, datas); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java new file mode 100644 index 0000000..118c38b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 错误码 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SysErrorCodeBaseVO { + + @ApiModelProperty(value = "应用名", required = true, example = "dashboard") + @NotNull(message = "应用名不能为空") + private String applicationName; + + @ApiModelProperty(value = "错误码编码", required = true, example = "1234") + @NotNull(message = "错误码编码不能为空") + private Integer code; + + @ApiModelProperty(value = "错误码错误提示", required = true, example = "帅气") + @NotNull(message = "错误码错误提示不能为空") + private String message; + + @ApiModelProperty(value = "备注", example = "哈哈哈") + private String memo; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java new file mode 100644 index 0000000..15190ab --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("错误码创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysErrorCodeCreateReqVO extends SysErrorCodeBaseVO { + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java new file mode 100644 index 0000000..8e20b6e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 错误码 Excel VO + * + * @author 芋道源码 + */ +@Data +public class SysErrorCodeExcelVO { + + @ExcelProperty("错误码编号") + private Long id; + + @ExcelProperty(value = "错误码类型", converter = DictConvert.class) + @DictFormat(InfDictTypeConstants.ERROR_CODE_TYPE) + private Integer type; + + @ExcelProperty("应用名") + private String applicationName; + + @ExcelProperty("错误码编码") + private Integer code; + + @ExcelProperty("错误码错误提示") + private String message; + + @ExcelProperty("备注") + private String memo; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java new file mode 100644 index 0000000..6047679 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "错误码 Excel 导出 Request VO", description = "参数和 InfErrorCodePageReqVO 是一致的") +@Data +public class SysErrorCodeExportReqVO { + + @ApiModelProperty(value = "错误码类型", example = "1") + private Integer type; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "错误码编码", example = "1234") + private Integer code; + + @ApiModelProperty(value = "错误码错误提示", example = "帅气") + private String message; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java new file mode 100644 index 0000000..baf781a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("错误码分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysErrorCodePageReqVO extends PageParam { + + @ApiModelProperty(value = "错误码类型", example = "1", notes = "参见 SysErrorCodeTypeEnum 枚举类") + private Integer type; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "错误码编码", example = "1234") + private Integer code; + + @ApiModelProperty(value = "错误码错误提示", example = "帅气") + private String message; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java new file mode 100644 index 0000000..69798f3 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("错误码 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysErrorCodeRespVO extends SysErrorCodeBaseVO { + + @ApiModelProperty(value = "错误码编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "错误码类型", required = true, example = "1", notes = "参见 SysErrorCodeTypeEnum 枚举类") + private Integer type; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java new file mode 100644 index 0000000..11f124a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("错误码更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysErrorCodeUpdateReqVO extends SysErrorCodeBaseVO { + + @ApiModelProperty(value = "错误码编号", required = true, example = "1024") + @NotNull(message = "错误码编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysLoginLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysLoginLogController.java new file mode 100644 index 0000000..7af2caf --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysLoginLogController.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogRespVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysLoginLogConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "登陆日志") +@RestController +@RequestMapping("/system/login-log") +@Validated +public class SysLoginLogController { + + @Resource + private SysLoginLogService loginLogService; + + @GetMapping("/page") + @ApiOperation("获得登陆日志分页列表") + @PreAuthorize("@ss.hasPermission('system:login-log:query')") + public CommonResult> getLoginLogPage(@Valid SysLoginLogPageReqVO reqVO) { + PageResult page = loginLogService.getLoginLogPage(reqVO); + return CommonResult.success(SysLoginLogConvert.INSTANCE.convertPage(page)); + } + + @GetMapping("/export") + @ApiOperation("导出登陆日志 Excel") + @PreAuthorize("@ss.hasPermission('system:login-log:export')") + @OperateLog(type = EXPORT) + public void exportLoginLog(HttpServletResponse response, @Valid SysLoginLogExportReqVO reqVO) throws IOException { + List list = loginLogService.getLoginLogList(reqVO); + // 拼接数据 + List data = SysLoginLogConvert.INSTANCE.convertList(list); + // 输出 + ExcelUtils.write(response, "登陆日志.xls", "数据列表", SysLoginLogExcelVO.class, data); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.http b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.http new file mode 100644 index 0000000..3b88719 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.http @@ -0,0 +1,3 @@ +### 请求 /system/operate-log/demo 接口 => 成功 +GET {{baseUrl}}/system/operate-log/demo +Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java new file mode 100644 index 0000000..042bf93 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java @@ -0,0 +1,85 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogRespVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysOperateLogConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysOperateLogService; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "操作日志") +@RestController +@RequestMapping("/system/operate-log") +@Validated +public class SysOperateLogController { + + @Resource + private SysOperateLogService operateLogService; + @Resource + private SysUserService userService; + + @GetMapping("/page") + @ApiOperation("查看操作日志分页列表") + @PreAuthorize("@ss.hasPermission('system:operate-log:query')") + public CommonResult> pageOperateLog(@Valid SysOperateLogPageReqVO reqVO) { + PageResult pageResult = operateLogService.getOperateLogPage(reqVO); + + // 获得拼接需要的数据 + Collection userIds = CollectionUtils.convertList(pageResult.getList(), SysOperateLogDO::getUserId); + Map userMap = userService.getUserMap(userIds); + // 拼接数据 + List list = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(operateLog -> { + SysOperateLogRespVO respVO = SysOperateLogConvert.INSTANCE.convert(operateLog); + list.add(respVO); + // 拼接用户信息 + MapUtils.findAndThen(userMap, operateLog.getUserId(), user -> respVO.setUserNickname(user.getNickname())); + }); + return success(new PageResult<>(list, pageResult.getTotal())); + } + + @ApiOperation("导出操作日志") + @GetMapping("/export") + @PreAuthorize("@ss.hasPermission('system:operate-log:export')") + @OperateLog(type = EXPORT) + public void exportOperateLog(HttpServletResponse response, @Valid SysOperateLogExportReqVO reqVO) throws IOException { + List list = operateLogService.getOperateLogs(reqVO); + + // 获得拼接需要的数据 + Collection userIds = CollectionUtils.convertList(list, SysOperateLogDO::getUserId); + Map userMap = userService.getUserMap(userIds); + // 拼接数据 + List excelDataList = SysOperateLogConvert.INSTANCE.convertList(list, userMap); + // 输出 + ExcelUtils.write(response, "操作日志.xls", "数据列表", SysOperateLogExcelVO.class, excelDataList); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java new file mode 100644 index 0000000..080f8f9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogBaseVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 登陆日志 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SysLoginLogBaseVO { + + @ApiModelProperty(value = "日志类型", required = true, example = "1", notes = "参见 SysLoginLogTypeEnum 枚举类") + @NotNull(message = "日志类型不能为空") + private Integer logType; + + @ApiModelProperty(value = "链路追踪编号", required = true, example = "89aca178-a370-411c-ae02-3f0d672be4ab") + @NotEmpty(message = "链路追踪编号不能为空") + private String traceId; + + @ApiModelProperty(value = "用户账号", required = true, example = "yudao") + @NotBlank(message = "用户账号不能为空") + @Size(max = 30, message = "用户账号长度不能超过30个字符") + private String username; + + @ApiModelProperty(value = "登陆结果", required = true, example = "1", notes = "参见 SysLoginResultEnum 枚举类") + @NotNull(message = "登陆结果不能为空") + private Integer result; + + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + @ApiModelProperty(value = "浏览器 UserAgent", required = true, example = "Mozilla/5.0") + @NotEmpty(message = "浏览器 UserAgent 不能为空") + private String userAgent; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java new file mode 100644 index 0000000..6f91554 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel(value = "登陆日志创建 Request VO", + description = "暂时提供给前端,仅仅后端记录登陆日志时,进行使用") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysLoginLogCreateReqVO extends SysLoginLogBaseVO { +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java new file mode 100644 index 0000000..8857a6b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExcelVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 登陆日志 Excel 导出响应 VO + */ +@Data +public class SysLoginLogExcelVO { + + @ExcelProperty("日志主键") + private Long id; + + @ExcelProperty("用户账号") + private String username; + + @ExcelProperty(value = "登陆结果", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.LOGIN_RESULT) + private Integer result; + + @ExcelProperty("登陆 IP") + private String userIp; + + @ExcelProperty("浏览器 UA") + private String userAgent; + + @ExcelProperty("登陆时间") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java new file mode 100644 index 0000000..1e706dd --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogExportReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("登陆日志分页列表 Request VO") +@Data +public class SysLoginLogExportReqVO { + + @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模拟匹配") + private String userIp; + + @ApiModelProperty(value = "用户账号", example = "芋道", notes = "模拟匹配") + private String username; + + @ApiModelProperty(value = "操作状态", example = "true") + private Boolean status; + + @ApiModelProperty(value = "开始时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java new file mode 100644 index 0000000..5b9389b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogPageReqVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("登陆日志分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysLoginLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模拟匹配") + private String userIp; + + @ApiModelProperty(value = "用户账号", example = "芋道", notes = "模拟匹配") + private String username; + + @ApiModelProperty(value = "操作状态", example = "true") + private Boolean status; + + @ApiModelProperty(value = "开始时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java new file mode 100644 index 0000000..6d46f8c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogRespVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("登陆日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysLoginLogRespVO extends SysLoginLogBaseVO { + + @ApiModelProperty(value = "日志编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "登陆时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java new file mode 100644 index 0000000..d29a96c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogBaseVO.java @@ -0,0 +1,85 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.Map; + +/** + * 操作日志 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SysOperateLogBaseVO { + + @ApiModelProperty(value = "链路追踪编号", required = true, example = "89aca178-a370-411c-ae02-3f0d672be4ab") + @NotEmpty(message = "链路追踪编号不能为空") + private String traceId; + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long userId; + + @ApiModelProperty(value = "操作模块", required = true, example = "订单") + @NotEmpty(message = "操作模块不能为空") + private String module; + + @ApiModelProperty(value = "操作名", required = true, example = "创建订单") + @NotEmpty(message = "操作名") + private String name; + + @ApiModelProperty(value = "操作分类", required = true, example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") + @NotNull(message = "操作分类不能为空") + private Integer type; + + @ApiModelProperty(value = "操作明细", example = "修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。") + private String content; + + @ApiModelProperty(value = "拓展字段", example = "{'orderId': 1}") + private Map exts; + + @ApiModelProperty(value = "请求方法名", required = true, example = "GET") + @NotEmpty(message = "请求方法名不能为空") + private String requestMethod; + + @ApiModelProperty(value = "请求地址", required = true, example = "/xxx/yyy") + @NotEmpty(message = "请求地址不能为空") + private String requestUrl; + + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + @ApiModelProperty(value = "浏览器 UserAgent", required = true, example = "Mozilla/5.0") + @NotEmpty(message = "浏览器 UserAgent 不能为空") + private String userAgent; + + @ApiModelProperty(value = "Java 方法名", required = true, example = "cn.iocoder.yudao.adminserver.UserController.save(...)") + @NotEmpty(message = "Java 方法名不能为空") + private String javaMethod; + + @ApiModelProperty(value = "Java 方法的参数") + private String javaMethodArgs; + + @ApiModelProperty(value = "开始时间", required = true) + @NotNull(message = "开始时间不能为空") + private Date startTime; + + @ApiModelProperty(value = "执行时长,单位:毫秒", required = true) + @NotNull(message = "执行时长不能为空") + private Integer duration; + + @ApiModelProperty(value = "结果码", required = true) + @NotNull(message = "结果码不能为空") + private Integer resultCode; + + @ApiModelProperty(value = "结果提示") + private String resultMsg; + + @ApiModelProperty(value = "结果数据") + private String resultData; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java new file mode 100644 index 0000000..71959d8 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExcelVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 操作日志 Excel 导出响应 VO + */ +@Data +public class SysOperateLogExcelVO { + + @ExcelProperty("日志编号") + private Long id; + + @ExcelProperty("操作模块") + private String module; + + @ExcelProperty("操作名") + private String name; + + @ExcelProperty(value = "操作类型", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.OPERATE_TYPE) + private String type; + + @ExcelProperty("操作人") + private String userNickname; + + @ExcelProperty(value = "操作结果") // 成功 or 失败 + private String successStr; + + @ExcelProperty("操作日志") + private Date startTime; + + @ExcelProperty("执行时长") + private Integer duration; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java new file mode 100644 index 0000000..2c500e1 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogExportReqVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("操作日志分页列表 Request VO") +@Data +public class SysOperateLogExportReqVO { + + @ApiModelProperty(value = "操作模块", example = "订单", notes = "模拟匹配") + private String module; + + @ApiModelProperty(value = "用户昵称", example = "芋道", notes = "模拟匹配") + private String userNickname; + + @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") + private Integer type; + + @ApiModelProperty(value = "操作状态", example = "true") + private Boolean success; + + @ApiModelProperty(value = "开始时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java new file mode 100644 index 0000000..2a0378a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogPageReqVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("操作日志分页列表 Request VO") +@Data +public class SysOperateLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "操作模块", example = "订单", notes = "模拟匹配") + private String module; + + @ApiModelProperty(value = "用户昵称", example = "芋道", notes = "模拟匹配") + private String userNickname; + + @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") + private Integer type; + + @ApiModelProperty(value = "操作状态", example = "true") + private Boolean success; + + @ApiModelProperty(value = "开始时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java new file mode 100644 index 0000000..1ac82a9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/operatelog/SysOperateLogRespVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("操作日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysOperateLogRespVO extends SysOperateLogBaseVO { + + @ApiModelProperty(value = "日志编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") + private String userNickname; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/SysNoticeController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/SysNoticeController.java new file mode 100644 index 0000000..f004c95 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/SysNoticeController.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.notice; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.notice.SysNoticeConvert; +import cn.iocoder.yudao.adminserver.modules.system.service.notice.SysNoticeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Api(tags = "通知公告") +@RestController +@RequestMapping("/system/notice") +@Validated +public class SysNoticeController { + + @Resource + private SysNoticeService noticeService; + + @PostMapping("/create") + @ApiOperation("创建通知公告") + @PreAuthorize("@ss.hasPermission('system:notice:create')") + public CommonResult createNotice(@Valid @RequestBody SysNoticeCreateReqVO reqVO) { + Long noticeId = noticeService.createNotice(reqVO); + return success(noticeId); + } + + @PutMapping("/update") + @ApiOperation("修改通知公告") + @PreAuthorize("@ss.hasPermission('system:notice:update')") + public CommonResult updateNotice(@Valid @RequestBody SysNoticeUpdateReqVO reqVO) { + noticeService.updateNotice(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除通知公告") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:notice:delete')") + public CommonResult deleteNotice(@RequestParam("id") Long id) { + noticeService.deleteNotice(id); + return success(true); + } + + @GetMapping("/page") + @ApiOperation("获取通知公告列表") + @PreAuthorize("@ss.hasPermission('system:notice:quey')") + public CommonResult> pageNotices(@Validated SysNoticePageReqVO reqVO) { + return success(SysNoticeConvert.INSTANCE.convertPage(noticeService.pageNotices(reqVO))); + } + + @GetMapping("/get") + @ApiOperation("获得通知公告") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:notice:quey')") + public CommonResult getNotice(@RequestParam("id") Long id) { + return success(SysNoticeConvert.INSTANCE.convert(noticeService.getNotice(id))); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeBaseVO.java new file mode 100644 index 0000000..9bd228e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeBaseVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 通知公告 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SysNoticeBaseVO { + + @ApiModelProperty(value = "公告标题", required = true, example = "小博主") + @NotBlank(message = "公告标题不能为空") + @Size(max = 50, message = "公告标题不能超过50个字符") + private String title; + + @ApiModelProperty(value = "公告标题", required = true, example = "小博主") + @NotNull(message = "公告类型不能为空") + private Integer type; + + @ApiModelProperty(value = "公告内容", required = true, example = "半生编码") + private String content; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java new file mode 100644 index 0000000..cf86f21 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeCreateReqVO.java @@ -0,0 +1,11 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("通知公告创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysNoticeCreateReqVO extends SysNoticeBaseVO { +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticePageReqVO.java new file mode 100644 index 0000000..b347ab9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticePageReqVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("通知公告分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysNoticePageReqVO extends PageParam { + + @ApiModelProperty(value = "通知公告名称", example = "芋道", notes = "模糊匹配") + private String title; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeRespVO.java new file mode 100644 index 0000000..8145e85 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeRespVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@ApiModel("通知公告信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysNoticeRespVO extends SysNoticeBaseVO { + + @ApiModelProperty(value = "通知公告序号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java new file mode 100644 index 0000000..2c02d5a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/notice/vo/SysNoticeUpdateReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("岗位公告更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysNoticeUpdateReqVO extends SysNoticeBaseVO { + + @ApiModelProperty(value = "岗位公告编号", required = true, example = "1024") + @NotNull(message = "岗位公告编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.http b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.http new file mode 100644 index 0000000..c073f7b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.http @@ -0,0 +1,3 @@ +### 请求 /menu/list 接口 => 成功 +GET {{baseUrl}}/system/menu/list +Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.java new file mode 100644 index 0000000..ddf388d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysMenuController.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.*; +import cn.iocoder.yudao.adminserver.modules.system.convert.permission.SysMenuConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Comparator; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Api(tags = "菜单") +@RestController +@RequestMapping("/system/menu") +@Validated +public class SysMenuController { + + @Resource + private SysMenuService menuService; + + @PostMapping("/create") + @ApiOperation("创建菜单") + @PreAuthorize("@ss.hasPermission('system:menu:create')") + public CommonResult createMenu(@Valid @RequestBody SysMenuCreateReqVO reqVO) { + Long menuId = menuService.createMenu(reqVO); + return success(menuId); + } + + @PutMapping("/update") + @ApiOperation("修改菜单") + @PreAuthorize("@ss.hasPermission('system:menu:update')") + public CommonResult updateMenu(@Valid @RequestBody SysMenuUpdateReqVO reqVO) { + menuService.updateMenu(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除菜单") + @ApiImplicitParam(name = "id", value = "角色编号", required= true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:menu:delete')") + public CommonResult deleteMenu(@RequestParam("id") Long id) { + menuService.deleteMenu(id); + return success(true); + } + + @GetMapping("/list") + @ApiOperation("获取菜单列表") + @PreAuthorize("@ss.hasPermission('system:menu:query')") + public CommonResult> getMenus(SysMenuListReqVO reqVO) { + List list = menuService.getMenus(reqVO); + list.sort(Comparator.comparing(SysMenuDO::getSort)); + return success(SysMenuConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取菜单精简信息列表", notes = "只包含被开启的菜单,主要用于前端的下拉选项") + public CommonResult> getSimpleMenus() { + // 获得菜单列表,只要开启状态的 + SysMenuListReqVO reqVO = new SysMenuListReqVO(); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = menuService.getMenus(reqVO); + // 排序后,返回个诶前端 + list.sort(Comparator.comparing(SysMenuDO::getSort)); + return success(SysMenuConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/get") + @ApiOperation("获取菜单信息") + @PreAuthorize("@ss.hasPermission('system:menu:query')") + public CommonResult getMenu(Long id) { + SysMenuDO menu = menuService.getMenu(id); + return success(SysMenuConvert.INSTANCE.convert(menu)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysPermissionController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysPermissionController.java new file mode 100644 index 0000000..ea04c89 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysPermissionController.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission.SysPermissionAssignRoleDataScopeReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission.SysPermissionAssignRoleMenuReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission.SysPermissionAssignUserRoleReqVO; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Set; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +/** + * 权限 Controller,提供赋予用户、角色的权限的 API 接口 + * + * @author 芋道源码 + */ +@Api(tags = "权限") +@RestController +@RequestMapping("/system/permission") +public class SysPermissionController { + + @Resource + private SysPermissionService permissionService; + + @ApiOperation("获得角色拥有的菜单编号") + @ApiImplicitParam(name = "roleId", value = "角色编号", required = true, dataTypeClass = Long.class) + @GetMapping("/list-role-resources") +// @RequiresPermissions("system:permission:assign-role-menu") + public CommonResult> listRoleMenus(Long roleId) { + return success(permissionService.listRoleMenuIds(roleId)); + } + + @PostMapping("/assign-role-menu") + @ApiOperation("赋予角色菜单") +// @RequiresPermissions("system:permission:assign-role-resource") + public CommonResult assignRoleMenu(@Validated @RequestBody SysPermissionAssignRoleMenuReqVO reqVO) { + permissionService.assignRoleMenu(reqVO.getRoleId(), reqVO.getMenuIds()); + return success(true); + } + + @PostMapping("/assign-role-data-scope") + @ApiOperation("赋予角色数据权限") +// @RequiresPermissions("system:permission:assign-role-data-scope") + public CommonResult assignRoleDataScope( + @Validated @RequestBody SysPermissionAssignRoleDataScopeReqVO reqVO) { + permissionService.assignRoleDataScope(reqVO.getRoleId(), reqVO.getDataScope(), reqVO.getDataScopeDeptIds()); + return success(true); + } + + @ApiOperation("获得管理员拥有的角色编号列表") + @ApiImplicitParam(name = "userId", value = "用户编号", required = true, dataTypeClass = Long.class) + @GetMapping("/list-user-roles") +// @RequiresPermissions("system:permission:assign-user-role") + public CommonResult> listAdminRoles(@RequestParam("userId") Long userId) { + return success(permissionService.listUserRoleIs(userId)); + } + + @ApiOperation("赋予用户角色") + @PostMapping("/assign-user-role") +// @RequiresPermissions("system:permission:assign-user-role") + public CommonResult assignUserRole(@Validated @RequestBody SysPermissionAssignUserRoleReqVO reqVO) { + permissionService.assignUserRole(reqVO.getUserId(), reqVO.getRoleIds()); + return success(true); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.http b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.http new file mode 100644 index 0000000..4e150ac --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.http @@ -0,0 +1,41 @@ +### /role/create 成功 +POST {{baseUrl}}/system/role/create +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "name": "测试角色", + "code": "test", + "sort": 0 +} + +### /role/update 成功 +POST {{baseUrl}}/system/role/update +Authorization: Bearer {{token}} +Content-Type: application/json + + +{ + "id": 100, + "name": "测试角色", + "code": "test", + "sort": 10 +} +### /resource/delete 成功 +POST {{baseUrl}}/system/role/delete +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} + +roleId=14 + +### /role/get 成功 +GET {{baseUrl}}/system/role/get?id=100 +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} + +### /role/page 成功 +GET {{baseUrl}}/system/role/page?pageNo=1&pageSize=10 +Authorization: Bearer {{token}} + +### + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java new file mode 100644 index 0000000..0fb7d45 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/SysRoleController.java @@ -0,0 +1,106 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.*; +import cn.iocoder.yudao.adminserver.modules.system.convert.permission.SysRoleConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "角色") +@RestController +@RequestMapping("/system/role") +@Validated +public class SysRoleController { + + @Resource + private SysRoleService roleService; + + @PostMapping("/create") + @ApiOperation("创建角色") + @PreAuthorize("@ss.hasPermission('system:role:create')") + public CommonResult createRole(@Valid @RequestBody SysRoleCreateReqVO reqVO) { + return success(roleService.createRole(reqVO)); + } + + @PutMapping("/update") + @ApiOperation("修改角色") + @PreAuthorize("@ss.hasPermission('system:role:update')") + public CommonResult updateRole(@Valid @RequestBody SysRoleUpdateReqVO reqVO) { + roleService.updateRole(reqVO); + return success(true); + } + + @PutMapping("/update-status") + @ApiOperation("修改角色状态") + @PreAuthorize("@ss.hasPermission('system:role:update')") + public CommonResult updateRoleStatus(@Valid @RequestBody SysRoleUpdateStatusReqVO reqVO) { + roleService.updateRoleStatus(reqVO.getId(), reqVO.getStatus()); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除角色") + @ApiImplicitParam(name = "id", value = "角色编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:role:delete')") + public CommonResult deleteRole(@RequestParam("id") Long id) { + roleService.deleteRole(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得角色信息") + @PreAuthorize("@ss.hasPermission('system:role:query')") + public CommonResult getRole(@RequestParam("id") Long id) { + SysRoleDO role = roleService.getRole(id); + return success(SysRoleConvert.INSTANCE.convert(role)); + } + + @GetMapping("/page") + @ApiOperation("获得角色分页") + @PreAuthorize("@ss.hasPermission('system:role:query')") + public CommonResult> getRolePage(SysRolePageReqVO reqVO) { + return success(roleService.getRolePage(reqVO)); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取角色精简信息列表", notes = "只包含被开启的角色,主要用于前端的下拉选项") + public CommonResult> getSimpleRoles() { + // 获得角色列表,只要开启状态的 + List list = roleService.getRoles(Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); + // 排序后,返回个诶前端 + list.sort(Comparator.comparing(SysRoleDO::getSort)); + return success(SysRoleConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/export") + @OperateLog(type = EXPORT) + @PreAuthorize("@ss.hasPermission('system:role:export')") + public void export(HttpServletResponse response, @Validated SysRoleExportReqVO reqVO) throws IOException { + List list = roleService.getRoles(reqVO); + List data = SysRoleConvert.INSTANCE.convertList03(list); + // 输出 + ExcelUtils.write(response, "角色数据.xls", "角色列表", SysRoleExcelVO.class, data); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java new file mode 100644 index 0000000..66b62d0 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 菜单 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SysMenuBaseVO { + + @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") + @NotBlank(message = "菜单名称不能为空") + @Size(max = 50, message = "菜单名称长度不能超过50个字符") + private String name; + + @ApiModelProperty(value = "权限标识", example = "sys:menu:add", notes = "仅菜单类型为按钮时,才需要传递") + @Size(max = 100) + private String permission; + + @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 SysMenuTypeEnum 枚举类") + @NotNull(message = "菜单类型不能为空") + private Integer type; + + @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") + @NotNull(message = "父菜单 ID 不能为空") + private Long parentId; + + @ApiModelProperty(value = "路由地址", example = "post", notes = "仅菜单类型为菜单或者目录时,才需要传") + @Size(max = 200, message = "路由地址不能超过200个字符") + private String path; + + @ApiModelProperty(value = "菜单图标", example = "/menu/list", notes = "仅菜单类型为菜单或者目录时,才需要传") + private String icon; + + @ApiModelProperty(value = "组件路径", example = "system/post/index", notes = "仅菜单类型为菜单时,才需要传") + @Size(max = 200, message = "组件路径不能超过255个字符") + private String component; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java new file mode 100644 index 0000000..e50c73f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuCreateReqVO.java @@ -0,0 +1,10 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; + +import io.swagger.annotations.ApiModel; +import lombok.*; + +@ApiModel("菜单创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysMenuCreateReqVO extends SysMenuBaseVO { +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java new file mode 100644 index 0000000..5600a13 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuListReqVO.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("菜单列表 Request VO") +@Data +public class SysMenuListReqVO { + + @ApiModelProperty(value = "菜单名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuRespVO.java new file mode 100644 index 0000000..6175a8c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuRespVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@ApiModel("菜单信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysMenuRespVO extends SysMenuBaseVO { + + @ApiModelProperty(value = "菜单编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java new file mode 100644 index 0000000..689d705 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuSimpleRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("菜单精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysMenuSimpleRespVO { + + @ApiModelProperty(value = "菜单编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") + private String name; + + @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") + private Long parentId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java new file mode 100644 index 0000000..736d580 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/menu/SysMenuUpdateReqVO.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotNull; + +@ApiModel("菜单更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysMenuUpdateReqVO extends SysMenuBaseVO { + + @ApiModelProperty(value = "菜单编号", required = true, example = "1024") + @NotNull(message = "菜单编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java new file mode 100644 index 0000000..8050e81 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleDataScopeReqVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@ApiModel("赋予角色数据权限 Request VO") +@Data +public class SysPermissionAssignRoleDataScopeReqVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1") + @NotNull(message = "角色编号不能为空") + private Long roleId; + + @ApiModelProperty(value = "数据范围", required = true, example = "1", notes = "参见 SysDataScopeEnum 枚举类") + @NotNull(message = "数据范围不能为空") +// TODO 这里要多一个枚举校验 + private Integer dataScope; + + @ApiModelProperty(value = "部门编号列表", example = "1,3,5", notes = "只有范围类型为 DEPT_CUSTOM 时,该字段才需要") + private Set dataScopeDeptIds = Collections.emptySet(); // 兜底 + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java new file mode 100644 index 0000000..47ffae9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignRoleMenuReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@ApiModel("赋予角色菜单 Request VO") +@Data +public class SysPermissionAssignRoleMenuReqVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1") + @NotNull(message = "角色编号不能为空") + private Long roleId; + + @ApiModelProperty(value = "菜单编号列表", example = "1,3,5") + private Set menuIds = Collections.emptySet(); // 兜底 + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java new file mode 100644 index 0000000..1a3e034 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.permission; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@ApiModel("赋予用户角色 Request VO") +@Data +public class SysPermissionAssignUserRoleReqVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1") + @NotNull(message = "角色编号不能为空") + private Long userId; + + @ApiModelProperty(value = "角色编号列表", example = "1,3,5") + private Set roleIds = Collections.emptySet(); // 兜底 + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleBaseVO.java new file mode 100644 index 0000000..a07e20c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleBaseVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 角色 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SysRoleBaseVO { + + @ApiModelProperty(value = "角色名称", required = true, example = "管理员") + @NotBlank(message = "角色名称不能为空") + @Size(max = 30, message = "角色名称长度不能超过30个字符") + private String name; + + @NotBlank(message = "角色标志不能为空") + @Size(max = 100, message = "角色标志长度不能超过100个字符") + @ApiModelProperty(value = "角色编码", required = true, example = "ADMIN") + private String code; + + @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "见 SysRoleTypeEnum 枚举") + private Integer type; + + @ApiModelProperty(value = "备注", example = "我是一个角色") + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java new file mode 100644 index 0000000..f16c3ad --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleCreateReqVO.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("角色创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysRoleCreateReqVO extends SysRoleBaseVO { + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java new file mode 100644 index 0000000..c8c1305 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExcelVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 角色 Excel 导出响应 VO + */ +@Data +public class SysRoleExcelVO { + + @ExcelProperty("角色序号") + private Long id; + + @ExcelProperty("角色名称") + private String name; + + @ExcelProperty("角色标志") + private String code; + + @ExcelProperty("角色排序") + private Integer sort; + + @ExcelProperty("数据范围") + private Integer dataScope; + + @ExcelProperty(value = "角色状态", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.COMMON_STATUS) + private String status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java new file mode 100644 index 0000000..656f136 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleExportReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("角色分页 Request VO") +@Data +public class SysRoleExportReqVO { + + @ApiModelProperty(value = "角色名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "角色标识", example = "yudao", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "开始时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRolePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRolePageReqVO.java new file mode 100644 index 0000000..6983176 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRolePageReqVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("角色分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysRolePageReqVO extends PageParam { + + @ApiModelProperty(value = "角色名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "角色标识", example = "yudao", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "开始时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleRespVO.java new file mode 100644 index 0000000..f3a565d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleRespVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.Set; + +@ApiModel("角色信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysRoleRespVO extends SysRoleBaseVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "数据范围", required = true, example = "1", notes = "参见 DataScopeEnum 枚举类") + private Integer dataScope; + + @ApiModelProperty(value = "数据范围(指定部门数组)", example = "1") + private Set dataScopeDeptIds; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "参见 SysRoleTypeEnum 枚举类") + private Integer type; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java new file mode 100644 index 0000000..c1b973f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("角色精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleSimpleRespVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "角色名称", required = true, example = "芋道") + private String name; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java new file mode 100644 index 0000000..dcf994f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("角色更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysRoleUpdateReqVO extends SysRoleBaseVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1024") + @NotNull(message = "角色编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java new file mode 100644 index 0000000..1741881 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@ApiModel("角色更新状态 Request VO") +@Data +public class SysRoleUpdateStatusReqVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1024") + @NotNull(message = "角色编号不能为空") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") +// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SmsCallbackController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SmsCallbackController.java new file mode 100644 index 0000000..ec3287f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SmsCallbackController.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms; + +import cn.hutool.core.util.URLUtil; +import cn.hutool.extra.servlet.ServletUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.framework.sms.core.enums.SmsChannelEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Api(tags = "短信回调") +@RestController +@RequestMapping("/system/sms/callback") +public class SmsCallbackController { + + @Resource + private SysSmsService smsService; + + @PostMapping("/sms/yunpian") + @ApiOperation(value = "云片短信的回调", notes = "参见 https://www.yunpian.com/official/document/sms/zh_cn/domestic_push_report 文档") + @ApiImplicitParam(name = "sms_status", value = "发送状态", required = true, example = "[{具体内容}]", dataTypeClass = Long.class) + @OperateLog(enable = false) + public String receiveYunpianSmsStatus(@RequestParam("sms_status") String smsStatus) throws Throwable { + String text = URLUtil.decode(smsStatus); // decode 解码参数,因为它被 encode + smsService.receiveSmsStatus(SmsChannelEnum.YUN_PIAN.getCode(), text); + return "SUCCESS"; // 约定返回 SUCCESS 为成功 + } + + @PostMapping("/sms/aliyun") + @ApiOperation(value = "阿里云短信的回调", notes = "参见 https://help.aliyun.com/document_detail/120998.html 文档") + @OperateLog(enable = false) + public CommonResult receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable { + String text = ServletUtil.getBody(request); + smsService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text); + return success(true); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsChannelController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsChannelController.java new file mode 100644 index 0000000..5a05a2e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsChannelController.java @@ -0,0 +1,80 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.*; +import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsChannelConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Comparator; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Api(tags = "短信渠道") +@RestController +@RequestMapping("system/sms-channel") +public class SysSmsChannelController { + + @Resource + private SysSmsChannelService smsChannelService; + + @PostMapping("/create") + @ApiOperation("创建短信渠道") + @PreAuthorize("@ss.hasPermission('system:sms-channel:create')") + public CommonResult createSmsChannel(@Valid @RequestBody SysSmsChannelCreateReqVO createReqVO) { + return success(smsChannelService.createSmsChannel(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新短信渠道") + @PreAuthorize("@ss.hasPermission('system:sms-channel:update')") + public CommonResult updateSmsChannel(@Valid @RequestBody SysSmsChannelUpdateReqVO updateReqVO) { + smsChannelService.updateSmsChannel(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除短信渠道") + @ApiImplicitParam(name = "id", value = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:sms-channel:delete')") + public CommonResult deleteSmsChannel(@RequestParam("id") Long id) { + smsChannelService.deleteSmsChannel(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得短信渠道") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") + public CommonResult getSmsChannel(@RequestParam("id") Long id) { + SysSmsChannelDO smsChannel = smsChannelService.getSmsChannel(id); + return success(SysSmsChannelConvert.INSTANCE.convert(smsChannel)); + } + + @GetMapping("/page") + @ApiOperation("获得短信渠道分页") + @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") + public CommonResult> getSmsChannelPage(@Valid SysSmsChannelPageReqVO pageVO) { + PageResult pageResult = smsChannelService.getSmsChannelPage(pageVO); + return success(SysSmsChannelConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获得短信渠道精简列表", notes = "包含被禁用的短信渠道") + public CommonResult> getSimpleSmsChannels() { + List list = smsChannelService.getSmsChannelList(); + // 排序后,返回给前端 + list.sort(Comparator.comparing(SysSmsChannelDO::getId)); + return success(SysSmsChannelConvert.INSTANCE.convertList03(list)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsLogController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsLogController.java new file mode 100644 index 0000000..a39f0a7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsLogController.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogRespVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsLogConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "短信日志") +@RestController +@RequestMapping("/system/sms-log") +@Validated +public class SysSmsLogController { + + @Resource + private SysSmsLogService smsLogService; + + @GetMapping("/page") + @ApiOperation("获得短信日志分页") + @PreAuthorize("@ss.hasPermission('system:sms-log:query')") + public CommonResult> getSmsLogPage(@Valid SysSmsLogPageReqVO pageVO) { + PageResult pageResult = smsLogService.getSmsLogPage(pageVO); + return success(SysSmsLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出短信日志 Excel") + @PreAuthorize("@ss.hasPermission('system:sms-log:export')") + @OperateLog(type = EXPORT) + public void exportSmsLogExcel(@Valid SysSmsLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = smsLogService.getSmsLogList(exportReqVO); + // 导出 Excel + List datas = SysSmsLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "短信日志.xls", "数据", SysSmsLogExcelVO.class, datas); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.http b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.http new file mode 100644 index 0000000..d5441d0 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.http @@ -0,0 +1,12 @@ +### 请求 /menu/list 接口 => 成功 +POST {{baseUrl}}/system/sms-template/send-sms +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "code": "test_01", + "params": { + "key01": "value01", + "key02": "value02" + } +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.java new file mode 100644 index 0000000..b57beb2 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.java @@ -0,0 +1,98 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.*; +import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsTemplateConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api("短信模板") +@RestController +@RequestMapping("/system/sms-template") +public class SysSmsTemplateController { + + @Resource + private SysSmsTemplateService smsTemplateService; + @Resource + private SysSmsService smsService; + + @PostMapping("/create") + @ApiOperation("创建短信模板") + @PreAuthorize("@ss.hasPermission('system:sms-template:create')") + public CommonResult createSmsTemplate(@Valid @RequestBody SysSmsTemplateCreateReqVO createReqVO) { + return success(smsTemplateService.createSmsTemplate(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新短信模板") + @PreAuthorize("@ss.hasPermission('system:sms-template:update')") + public CommonResult updateSmsTemplate(@Valid @RequestBody SysSmsTemplateUpdateReqVO updateReqVO) { + smsTemplateService.updateSmsTemplate(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除短信模板") + @ApiImplicitParam(name = "id", value = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:sms-template:delete')") + public CommonResult deleteSmsTemplate(@RequestParam("id") Long id) { + smsTemplateService.deleteSmsTemplate(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得短信模板") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:sms-template:query')") + public CommonResult getSmsTemplate(@RequestParam("id") Long id) { + SysSmsTemplateDO smsTemplate = smsTemplateService.getSmsTemplate(id); + return success(SysSmsTemplateConvert.INSTANCE.convert(smsTemplate)); + } + + @GetMapping("/page") + @ApiOperation("获得短信模板分页") + @PreAuthorize("@ss.hasPermission('system:sms-template:query')") + public CommonResult> getSmsTemplatePage(@Valid SysSmsTemplatePageReqVO pageVO) { + PageResult pageResult = smsTemplateService.getSmsTemplatePage(pageVO); + return success(SysSmsTemplateConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出短信模板 Excel") + @PreAuthorize("@ss.hasPermission('system:sms-template:export')") + @OperateLog(type = EXPORT) + public void exportSmsTemplateExcel(@Valid SysSmsTemplateExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = smsTemplateService.getSmsTemplateList(exportReqVO); + // 导出 Excel + List datas = SysSmsTemplateConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "短信模板.xls", "数据", SysSmsTemplateExcelVO.class, datas); + } + + @PostMapping("/send-sms") + @ApiOperation("发送短信") + @PreAuthorize("@ss.hasPermission('system:sms-template:send-sms')") + public CommonResult sendSms(@Valid @RequestBody SysSmsTemplateSendReqVO sendReqVO) { + return success(smsService.sendSingleSms(sendReqVO.getMobile(), null, null, + sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java new file mode 100644 index 0000000..fd475bd --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotNull; + +/** +* 短信渠道 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SysSmsChannelBaseVO { + + @ApiModelProperty(value = "短信签名", required = true, example = "芋道源码") + @NotNull(message = "短信签名不能为空") + private String signature; + + @ApiModelProperty(value = "启用状态", required = true, example = "1") + @NotNull(message = "启用状态不能为空") + private Integer status; + + @ApiModelProperty(value = "备注", example = "好吃!") + private String remark; + + @ApiModelProperty(value = "短信 API 的账号", required = true, example = "yudao") + @NotNull(message = "短信 API 的账号不能为空") + private String apiKey; + + @ApiModelProperty(value = "短信 API 的秘钥", example = "yuanma") + private String apiSecret; + + @ApiModelProperty(value = "短信发送回调 URL", example = "http://www.iocoder.cn") + @URL(message = "回调 URL 格式不正确") + private String callbackUrl; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java new file mode 100644 index 0000000..e9466a7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("短信渠道创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysSmsChannelCreateReqVO extends SysSmsChannelBaseVO { + + @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类") + @NotNull(message = "渠道编码不能为空") + private String code; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java new file mode 100644 index 0000000..e30bc3d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("短信渠道分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysSmsChannelPageReqVO extends PageParam { + + @ApiModelProperty(value = "任务状态", example = "1") + private Integer status; + + @ApiModelProperty(value = "短信签名", example = "芋道源码", notes = "模糊匹配") + private String signature; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java new file mode 100644 index 0000000..8e7d111 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("短信渠道 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysSmsChannelRespVO extends SysSmsChannelBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类") + private String code; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java new file mode 100644 index 0000000..451a943 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelSimpleRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@ApiModel("短信渠道精简 Response VO") +@Data +public class SysSmsChannelSimpleRespVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + + @ApiModelProperty(value = "短信签名", required = true, example = "芋道源码") + @NotNull(message = "短信签名不能为空") + private String signature; + + @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类") + private String code; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java new file mode 100644 index 0000000..816e5c2 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("短信渠道更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysSmsChannelUpdateReqVO extends SysSmsChannelBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java new file mode 100644 index 0000000..8376939 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java @@ -0,0 +1,100 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.framework.excel.core.convert.JsonConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; +import java.util.Map; + +/** + * 短信日志 Excel VO + * + * @author 芋道源码 + */ +@Data +public class SysSmsLogExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("短信渠道编号") + private Long channelId; + + @ExcelProperty("短信渠道编码") + private String channelCode; + + @ExcelProperty("模板编号") + private Long templateId; + + @ExcelProperty("模板编码") + private String templateCode; + + @ExcelProperty(value = "短信类型", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.SMS_TEMPLATE_TYPE) + private Integer templateType; + + @ExcelProperty("短信内容") + private String templateContent; + + @ExcelProperty(value = "短信参数", converter = JsonConvert.class) + private Map templateParams; + + @ExcelProperty("短信 API 的模板编号") + private String apiTemplateId; + + @ExcelProperty("手机号") + private String mobile; + + @ExcelProperty("用户编号") + private Long userId; + + @ExcelProperty(value = "用户类型", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.USER_TYPE) + private Integer userType; + + @ExcelProperty(value = "发送状态", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.SMS_SEND_STATUS) + private Integer sendStatus; + + @ExcelProperty("发送时间") + private Date sendTime; + + @ExcelProperty("发送结果的编码") + private Integer sendCode; + + @ExcelProperty("发送结果的提示") + private String sendMsg; + + @ExcelProperty("短信 API 发送结果的编码") + private String apiSendCode; + + @ExcelProperty("短信 API 发送失败的提示") + private String apiSendMsg; + + @ExcelProperty("短信 API 发送返回的唯一请求 ID") + private String apiRequestId; + + @ExcelProperty("短信 API 发送返回的序号") + private String apiSerialNo; + + @ExcelProperty(value = "接收状态", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.SMS_RECEIVE_STATUS) + private Integer receiveStatus; + + @ExcelProperty("接收时间") + private Date receiveTime; + + @ExcelProperty("API 接收结果的编码") + private String apiReceiveCode; + + @ExcelProperty("API 接收结果的说明") + private String apiReceiveMsg; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java new file mode 100644 index 0000000..94be2d8 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "短信日志 Excel 导出 Request VO", description = "参数和 SysSmsLogPageReqVO 是一致的") +@Data +public class SysSmsLogExportReqVO { + + @ApiModelProperty(value = "短信渠道编号", example = "10") + private Long channelId; + + @ApiModelProperty(value = "模板编号", example = "20") + private Long templateId; + + @ApiModelProperty(value = "手机号", example = "15601691300") + private String mobile; + + @ApiModelProperty(value = "发送状态", example = "1") + private Integer sendStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始发送时间") + private Date beginSendTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束发送时间") + private Date endSendTime; + + @ApiModelProperty(value = "接收状态", example = "0") + private Integer receiveStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始接收时间") + private Date beginReceiveTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束接收时间") + private Date endReceiveTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java new file mode 100644 index 0000000..1ea8a1f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("短信日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysSmsLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "短信渠道编号", example = "10") + private Long channelId; + + @ApiModelProperty(value = "模板编号", example = "20") + private Long templateId; + + @ApiModelProperty(value = "手机号", example = "15601691300") + private String mobile; + + @ApiModelProperty(value = "发送状态", example = "1", notes = "参见 SysSmsSendStatusEnum 枚举类") + private Integer sendStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始发送时间") + private Date beginSendTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束发送时间") + private Date endSendTime; + + @ApiModelProperty(value = "接收状态", example = "0", notes = "参见 SysSmsReceiveStatusEnum 枚举类") + private Integer receiveStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始接收时间") + private Date beginReceiveTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束接收时间") + private Date endReceiveTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java new file mode 100644 index 0000000..10ff01a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java @@ -0,0 +1,89 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; +import java.util.Map; + +@ApiModel("短信日志 Response VO") +@Data +public class SysSmsLogRespVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "短信渠道编号", required = true, example = "10") + private Long channelId; + + @ApiModelProperty(value = "短信渠道编码", required = true, example = "ALIYUN") + private String channelCode; + + @ApiModelProperty(value = "模板编号", required = true, example = "20") + private Long templateId; + + @ApiModelProperty(value = "模板编码", required = true, example = "test-01") + private String templateCode; + + @ApiModelProperty(value = "短信类型", required = true, example = "1") + private Integer templateType; + + @ApiModelProperty(value = "短信内容", required = true, example = "你好,你的验证码是 1024") + private String templateContent; + + @ApiModelProperty(value = "短信参数", required = true, example = "name,code") + private Map templateParams; + + @ApiModelProperty(value = "短信 API 的模板编号", required = true, example = "SMS_207945135") + private String apiTemplateId; + + @ApiModelProperty(value = "手机号", required = true, example = "15601691300") + private String mobile; + + @ApiModelProperty(value = "用户编号", example = "10") + private Long userId; + + @ApiModelProperty(value = "用户类型", example = "1") + private Integer userType; + + @ApiModelProperty(value = "发送状态", required = true, example = "1") + private Integer sendStatus; + + @ApiModelProperty(value = "发送时间") + private Date sendTime; + + @ApiModelProperty(value = "发送结果的编码", example = "0") + private Integer sendCode; + + @ApiModelProperty(value = "发送结果的提示", example = "成功") + private String sendMsg; + + @ApiModelProperty(value = "短信 API 发送结果的编码", example = "SUCCESS") + private String apiSendCode; + + @ApiModelProperty(value = "短信 API 发送失败的提示", example = "成功") + private String apiSendMsg; + + @ApiModelProperty(value = "短信 API 发送返回的唯一请求 ID", example = "3837C6D3-B96F-428C-BBB2-86135D4B5B99") + private String apiRequestId; + + @ApiModelProperty(value = "短信 API 发送返回的序号", example = "62923244790") + private String apiSerialNo; + + @ApiModelProperty(value = "接收状态", required = true, example = "0") + private Integer receiveStatus; + + @ApiModelProperty(value = "接收时间") + private Date receiveTime; + + @ApiModelProperty(value = "API 接收结果的编码", example = "DELIVRD") + private String apiReceiveCode; + + @ApiModelProperty(value = "API 接收结果的说明", example = "用户接收成功") + private String apiReceiveMsg; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java new file mode 100644 index 0000000..cc58787 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 短信模板 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SysSmsTemplateBaseVO { + + @ApiModelProperty(value = "短信类型", required = true, example = "1", notes = "参见 SysSmsTemplateTypeEnum 枚举类") + @NotNull(message = "短信类型不能为空") + private Integer type; + + @ApiModelProperty(value = "开启状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + @NotNull(message = "开启状态不能为空") + private Integer status; + + @ApiModelProperty(value = "模板编码", required = true, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String code; + + @ApiModelProperty(value = "模板名称", required = true, example = "yudao") + @NotNull(message = "模板名称不能为空") + private String name; + + @ApiModelProperty(value = "模板内容", required = true, example = "你好,{name}。你长的太{like}啦!") + @NotNull(message = "模板内容不能为空") + private String content; + + @ApiModelProperty(value = "备注", example = "哈哈哈") + private String remark; + + @ApiModelProperty(value = "短信 API 的模板编号", required = true, example = "4383920") + @NotNull(message = "短信 API 的模板编号不能为空") + private String apiTemplateId; + + @ApiModelProperty(value = "短信渠道编号", required = true, example = "10") + @NotNull(message = "短信渠道编号不能为空") + private Long channelId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java new file mode 100644 index 0000000..6d59315 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("短信模板创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysSmsTemplateCreateReqVO extends SysSmsTemplateBaseVO { + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java new file mode 100644 index 0000000..a321541 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 短信模板 Excel VO + * + * @author 芋道源码 + */ +@Data +public class SysSmsTemplateExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty(value = "短信签名", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.SMS_TEMPLATE_TYPE) + private Integer type; + + @ExcelProperty(value = "开启状态", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty("模板编码") + private String code; + + @ExcelProperty("模板名称") + private String name; + + @ExcelProperty("模板内容") + private String content; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("短信 API 的模板编号") + private String apiTemplateId; + + @ExcelProperty("短信渠道编号") + private Long channelId; + + @ExcelProperty(value = "短信渠道编码", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.SMS_CHANNEL_CODE) + private String channelCode; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java new file mode 100644 index 0000000..66efb4d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "短信模板 Excel 导出 Request VO", description = "参数和 SysSmsTemplatePageReqVO 是一致的") +@Data +public class SysSmsTemplateExportReqVO { + + @ApiModelProperty(value = "短信签名", example = "1") + private Integer type; + + @ApiModelProperty(value = "开启状态", example = "1") + private Integer status; + + @ApiModelProperty(value = "模板编码", example = "test_01", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "模板内容", example = "你好,{name}。你长的太{like}啦!", notes = "模糊匹配") + private String content; + + @ApiModelProperty(value = "短信 API 的模板编号", example = "4383920", notes = "模糊匹配") + private String apiTemplateId; + + @ApiModelProperty(value = "短信渠道编号", example = "10") + private Long channelId; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java new file mode 100644 index 0000000..fc8bd80 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("短信模板分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysSmsTemplatePageReqVO extends PageParam { + + @ApiModelProperty(value = "短信签名", example = "1") + private Integer type; + + @ApiModelProperty(value = "开启状态", example = "1") + private Integer status; + + @ApiModelProperty(value = "模板编码", example = "test_01", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "模板内容", example = "你好,{name}。你长的太{like}啦!", notes = "模糊匹配") + private String content; + + @ApiModelProperty(value = "短信 API 的模板编号", example = "4383920", notes = "模糊匹配") + private String apiTemplateId; + + @ApiModelProperty(value = "短信渠道编号", example = "10") + private Long channelId; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java new file mode 100644 index 0000000..c26d380 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; +import java.util.List; + +@ApiModel("短信模板 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysSmsTemplateRespVO extends SysSmsTemplateBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "短信渠道编码", required = true, example = "ALIYUN") + private String channelCode; + + @ApiModelProperty(value = "参数数组", example = "name,code") + private List params; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java new file mode 100644 index 0000000..34a773e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateSendReqVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +@ApiModel("短信模板的发送 Request VO") +@Data +public class SysSmsTemplateSendReqVO { + + @ApiModelProperty(value = "手机号", required = true, example = "15601691300") + @NotNull(message = "手机号不能为空") + private String mobile; + + @ApiModelProperty(value = "模板编码", required = true, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String templateCode; + + @ApiModelProperty(value = "模板参数") + private Map templateParams; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java new file mode 100644 index 0000000..223aa0c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("短信模板更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysSmsTemplateUpdateReqVO extends SysSmsTemplateBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.http b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.http new file mode 100644 index 0000000..8728375 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.http @@ -0,0 +1,3 @@ +### 请求 /system/user/page 接口 => 没有权限 +GET {{baseUrl}}/system/user/page?pageNo=1&pageSize=10 +Authorization: Bearer test104 # 使用测试账号 diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java new file mode 100644 index 0000000..df54e79 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java @@ -0,0 +1,174 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; +import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.*; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "用户") +@RestController +@RequestMapping("/system/user") +@Validated +public class SysUserController { + + @Resource + private SysUserService userService; + @Resource + private SysDeptService deptService; + + @PostMapping("/create") + @ApiOperation("新增用户") + @PreAuthorize("@ss.hasPermission('system:user:create')") + public CommonResult createUser(@Valid @RequestBody SysUserCreateReqVO reqVO) { + Long id = userService.createUser(reqVO); + return success(id); + } + + @PutMapping("update") + @ApiOperation("修改用户") + @PreAuthorize("@ss.hasPermission('system:user:update')") + public CommonResult updateUser(@Valid @RequestBody SysUserUpdateReqVO reqVO) { + userService.updateUser(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除用户") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:user:delete')") + public CommonResult deleteUser(@RequestParam("id") Long id) { + userService.deleteUser(id); + return success(true); + } + + @PutMapping("/update-password") + @ApiOperation("重置用户密码") + @PreAuthorize("@ss.hasPermission('system:user:update-password')") + public CommonResult updateUserPassword(@Valid @RequestBody SysUserUpdatePasswordReqVO reqVO) { + userService.updateUserPassword(reqVO.getId(), reqVO.getPassword()); + return success(true); + } + + @PutMapping("/update-status") + @ApiOperation("修改用户状态") + @PreAuthorize("@ss.hasPermission('system:user:update')") + public CommonResult updateUserStatus(@Valid @RequestBody SysUserUpdateStatusReqVO reqVO) { + userService.updateUserStatus(reqVO.getId(), reqVO.getStatus()); + return success(true); + } + + @GetMapping("/page") + @ApiOperation("获得用户分页列表") + @PreAuthorize("@ss.hasPermission('system:user:list')") + public CommonResult> getUserPage(@Valid SysUserPageReqVO reqVO) { + // 获得用户分页列表 + PageResult pageResult = userService.getUserPage(reqVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(new PageResult<>(pageResult.getTotal())); // 返回空 + } + + // 获得拼接需要的数据 + Collection deptIds = CollectionUtils.convertList(pageResult.getList(), SysUserDO::getDeptId); + Map deptMap = deptService.getDeptMap(deptIds); + // 拼接结果返回 + List userList = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(user -> { + SysUserPageItemRespVO respVO = SysUserConvert.INSTANCE.convert(user); + respVO.setDept(SysUserConvert.INSTANCE.convert(deptMap.get(user.getDeptId()))); + userList.add(respVO); + }); + return success(new PageResult<>(userList, pageResult.getTotal())); + } + + @GetMapping("/get") + @ApiOperation("获得用户详情") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:user:query')") + public CommonResult getInfo(@RequestParam("id") Long id) { + return success(SysUserConvert.INSTANCE.convert(userService.getUser(id))); + } + + @GetMapping("/export") + @ApiOperation("导出用户") + @PreAuthorize("@ss.hasPermission('system:user:export')") + @OperateLog(type = EXPORT) + public void exportUsers(@Validated SysUserExportReqVO reqVO, + HttpServletResponse response) throws IOException { + // 获得用户列表 + List users = userService.getUsers(reqVO); + + // 获得拼接需要的数据 + Collection deptIds = CollectionUtils.convertList(users, SysUserDO::getDeptId); + Map deptMap = deptService.getDeptMap(deptIds); + // 拼接数据 + List excelUsers = new ArrayList<>(users.size()); + users.forEach(user -> { + SysUserExcelVO excelVO = SysUserConvert.INSTANCE.convert02(user); + MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> { + excelVO.setDeptName(dept.getName()); + excelVO.setDeptLeader(dept.getLeader()); + }); + excelUsers.add(excelVO); + }); + + // 输出 + ExcelUtils.write(response, "用户数据.xls", "用户列表", SysUserExcelVO.class, excelUsers); + } + + @GetMapping("/get-import-template") + @ApiOperation("获得导入用户模板") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = Arrays.asList( + SysUserImportExcelVO.builder().username("yudao").deptId(1L).email("yudao@iocoder.cn").mobile("15601691300") + .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SysSexEnum.MALE.getSex()).build(), + SysUserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") + .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SysSexEnum.FEMALE.getSex()).build() + ); + + // 输出 + ExcelUtils.write(response, "用户导入模板.xls", "用户列表", SysUserImportExcelVO.class, list); + } + + @PostMapping("/import") + @ApiOperation("导入用户") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "Excel 文件", required = true, dataTypeClass = MultipartFile.class), + @ApiImplicitParam(name = "updateSupport", value = "是否支持更新,默认为 false", example = "true", dataTypeClass = Boolean.class) + }) + @PreAuthorize("@ss.hasPermission('system:user:import')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.raed(file, SysUserImportExcelVO.class); + return success(userService.importUsers(list, updateSupport)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java new file mode 100644 index 0000000..8fb29bb --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java @@ -0,0 +1,102 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY; + +/** + * @author niudehua + */ +@Api(tags = "用户个人中心") +@RestController +@RequestMapping("/system/user/profile") +@Validated +@Slf4j +public class SysUserProfileController { + + @Resource + private SysUserService userService; + @Resource + private SysDeptService deptService; + @Resource + private SysPostService postService; + @Resource + private SysPermissionService permissionService; + @Resource + private SysRoleService roleService; + + @GetMapping("/get") + @ApiOperation("获得登录用户信息") + public CommonResult profile() { + // 获得用户基本信息 + SysUserDO user = userService.getUser(getLoginUserId()); + SysUserProfileRespVO resp = SysUserConvert.INSTANCE.convert03(user); + // 获得用户角色 + List userRoles = roleService.getRolesFromCache(permissionService.listUserRoleIs(user.getId())); + resp.setRoles(SysUserConvert.INSTANCE.convertList(userRoles)); + // 获得部门信息 + if (user.getDeptId() != null) { + SysDeptDO dept = deptService.getDept(user.getDeptId()); + resp.setDept(SysUserConvert.INSTANCE.convert02(dept)); + } + // 获得岗位信息 + if (CollUtil.isNotEmpty(user.getPostIds())) { + List posts = postService.getPosts(user.getPostIds()); + resp.setPosts(SysUserConvert.INSTANCE.convertList02(posts)); + } + return success(resp); + } + + @PutMapping("/update") + @ApiOperation("修改用户个人信息") + public CommonResult updateUserProfile(@Valid @RequestBody SysUserProfileUpdateReqVO reqVO) { + userService.updateUserProfile(getLoginUserId(), reqVO); + return success(true); + } + + @PutMapping("/update-password") + @ApiOperation("修改用户个人密码") + public CommonResult updateUserProfilePassword(@Valid @RequestBody SysUserProfileUpdatePasswordReqVO reqVO) { + userService.updateUserPassword(getLoginUserId(), reqVO); + return success(true); + } + + @PutMapping("/upload-avatar") + @ApiOperation("上传用户个人头像") + public CommonResult updateUserAvatar(@RequestParam("avatarFile") MultipartFile file) throws IOException { + if (file.isEmpty()) { + throw ServiceExceptionUtil.exception(FILE_IS_EMPTY); + } + userService.updateUserAvatar(getLoginUserId(), file.getInputStream()); + return success(true); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java new file mode 100644 index 0000000..fddc09b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile; + +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserBaseVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + + +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("用户个人中心信息 Response VO") +public class SysUserProfileRespVO extends SysUserBaseVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "最后登陆 IP", required = true, example = "192.168.1.1") + private String loginIp; + + @ApiModelProperty(value = "最后登录时间", required = true, example = "时间戳格式") + private Date loginDate; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + + /** + * 所属角色 + */ + private List roles; + + /** + * 所在部门 + */ + private Dept dept; + + /** + * 所属岗位数组 + */ + private List posts; + + @ApiModel("角色") + @Data + public static class Role { + + @ApiModelProperty(value = "角色编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "角色名称", required = true, example = "普通角色") + private String name; + + } + + @ApiModel("部门") + @Data + public static class Dept { + + @ApiModelProperty(value = "部门编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "部门名称", required = true, example = "研发部") + private String name; + + } + + @ApiModel("岗位") + @Data + public static class Post { + + @ApiModelProperty(value = "岗位编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "岗位名称", required = true, example = "开发") + private String name; + + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java new file mode 100644 index 0000000..340d2e4 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; + +@ApiModel("用户个人中心更新密码 Request VO") +@Data +public class SysUserProfileUpdatePasswordReqVO { + + @ApiModelProperty(value = "旧密码", required = true, example = "123456") + @NotEmpty(message = "旧密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String oldPassword; + + @ApiModelProperty(value = "新密码", required = true, example = "654321") + @NotEmpty(message = "新密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String newPassword; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java new file mode 100644 index 0000000..e77bcd7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Email; +import javax.validation.constraints.Size; + +@ApiModel("用户个人信息更新 Request VO") +@Data +public class SysUserProfileUpdateReqVO { + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过30个字符") + private String nickname; + + @ApiModelProperty(value = "用户邮箱", example = "yudao@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + private String email; + + @ApiModelProperty(value = "手机号码", example = "15601691300") + @Length(min = 11, max = 11, message = "手机号长度必须 11 位") + private String mobile; + + @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类") + private Integer sex; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserBaseVO.java new file mode 100644 index 0000000..1f41be3 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserBaseVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.Set; + +/** + * 用户 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SysUserBaseVO { + + @ApiModelProperty(value = "用户账号", required = true, example = "yudao") + @NotBlank(message = "用户账号不能为空") + @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") + private String username; + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过30个字符") + private String nickname; + + @ApiModelProperty(value = "备注", example = "我是一个用户") + private String remark; + + @ApiModelProperty(value = "部门ID", example = "我是一个用户") + private Long deptId; + + @ApiModelProperty(value = "岗位编号数组", example = "1") + private Set postIds; + + @ApiModelProperty(value = "用户邮箱", example = "yudao@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + private String email; + + @ApiModelProperty(value = "手机号码", example = "15601691300") + @Length(min = 11, max = 11, message = "手机号长度必须 11 位") + private String mobile; + + @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类") + private Integer sex; + + @ApiModelProperty(value = "用户头像", example = "http://www.iocoder.cn/xxx.png") + private String avatar; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserCreateReqVO.java new file mode 100644 index 0000000..89f2e17 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserCreateReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; + +@ApiModel("用户创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysUserCreateReqVO extends SysUserBaseVO { + + @ApiModelProperty(value = "密码", required = true, example = "123456") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java new file mode 100644 index 0000000..d7013fa --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExcelVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 用户 Excel 导出 VO + */ +@Data +public class SysUserExcelVO { + + @ExcelProperty("用户编号") + private Long id; + + @ExcelProperty("用户名称") + private String username; + + @ExcelProperty("用户昵称") + private String nickname; + + @ExcelProperty("用户邮箱") + private String email; + + @ExcelProperty("手机号码") + private String mobile; + + @ExcelProperty(value = "用户性别", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.USER_SEX) + private Integer sex; + + @ExcelProperty(value = "帐号状态", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty("最后登录IP") + private String loginIp; + + @ExcelProperty("最后登录时间") + private Date loginDate; + + @ExcelProperty("部门名称") + private String deptName; + + @ExcelProperty("部门负责人") + private String deptLeader; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExportReqVO.java new file mode 100644 index 0000000..24d8d00 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserExportReqVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "用户导出 Request VO", description = "参数和 SysUserPageReqVO 是一致的") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysUserExportReqVO { + + @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") + private String username; + + @ApiModelProperty(value = "手机号码", example = "yudao", notes = "模糊匹配") + private String mobile; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "开始时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + + @ApiModelProperty(value = "部门编号", example = "1024", notes = "同时筛选子部门") + private Long deptId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java new file mode 100644 index 0000000..bef5451 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 用户 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SysUserImportExcelVO { + + @ExcelProperty("登录名称") + private String username; + + @ExcelProperty("用户名称") + private String nickname; + + @ExcelProperty("部门编号") + private Long deptId; + + @ExcelProperty("用户邮箱") + private String email; + + @ExcelProperty("手机号码") + private String mobile; + + @ExcelProperty(value = "用户性别", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.USER_SEX) + private Integer sex; + + @ExcelProperty(value = "账号状态", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportRespVO.java new file mode 100644 index 0000000..bb4359e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportRespVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@ApiModel("用户导入 Response VO") +@Data +@Builder +public class SysUserImportRespVO { + + @ApiModelProperty(value = "创建成功的用户名数组", required = true) + private List createUsernames; + + @ApiModelProperty(value = "更新成功的用户名数组", required = true) + private List updateUsernames; + + @ApiModelProperty(value = "导入失败的用户集合", required = true, notes = "key 为用户名,value 为失败原因") + private Map failureUsernames; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java new file mode 100644 index 0000000..58959a5 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@ApiModel(value = "用户分页时的信息 Response VO", description = "相比用户基本信息来说,会多部门信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserPageItemRespVO extends SysUserRespVO { + + /** + * 所在部门 + */ + private Dept dept; + + @ApiModel("部门") + @Data + public static class Dept { + + @ApiModelProperty(value = "部门编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "部门名称", required = true, example = "研发部") + private String name; + + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageReqVO.java new file mode 100644 index 0000000..ca1e597 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserPageReqVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("用户分页 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") + private String username; + + @ApiModelProperty(value = "手机号码", example = "yudao", notes = "模糊匹配") + private String mobile; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "开始时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束时间", example = "2020-10-24") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + + @ApiModelProperty(value = "部门编号", example = "1024", notes = "同时筛选子部门") + private Long deptId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserRespVO.java new file mode 100644 index 0000000..8b68dbc --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserRespVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.util.Date; + +@ApiModel("用户信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserRespVO extends SysUserBaseVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "最后登陆 IP", required = true, example = "192.168.1.1") + private String loginIp; + + @ApiModelProperty(value = "最后登录时间", required = true, example = "时间戳格式") + private Date loginDate; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java new file mode 100644 index 0000000..9364c57 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdatePasswordReqVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@ApiModel("用户更新密码 Request VO") +@Data +public class SysUserUpdatePasswordReqVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long id; + + @ApiModelProperty(value = "密码", required = true, example = "123456") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java new file mode 100644 index 0000000..7fc8ffb --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("用户更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysUserUpdateReqVO extends SysUserBaseVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java new file mode 100644 index 0000000..dd1baa4 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserUpdateStatusReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@ApiModel("用户更新状态 Request VO") +@Data +public class SysUserUpdateStatusReqVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + @NotNull(message = "角色编号不能为空") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") +// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java new file mode 100644 index 0000000..84a56ac --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java @@ -0,0 +1,79 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.auth; + +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuIdEnum; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Mapper +public interface SysAuthConvert { + + SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class); + + @Mapping(source = "updateTime", target = "updateTime", ignore = true) + // 字段相同,但是含义不同,忽略 + LoginUser convert(SysUserDO bean); + + default SysAuthPermissionInfoRespVO convert(SysUserDO user, List roleList, List menuList) { + return SysAuthPermissionInfoRespVO.builder() + .user(SysAuthPermissionInfoRespVO.UserVO.builder().nickname(user.getNickname()).avatar(user.getAvatar()).build()) + .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getCode)) + .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPermission)) + .build(); + } + + SysAuthMenuRespVO convertTreeNode(SysMenuDO menu); + + LoginUser convert(SysUserProfileUpdateReqVO reqVO); + + LoginUser convert(SysUserProfileUpdatePasswordReqVO reqVO); + + /** + * 将菜单列表,构建成菜单树 + * + * @param menuList 菜单列表 + * @return 菜单树 + */ + default List buildMenuTree(List menuList) { + // 排序,保证菜单的有序性 + menuList.sort(Comparator.comparing(SysMenuDO::getSort)); + // 构建菜单树 + // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。 + Map treeNodeMap = new LinkedHashMap<>(); + menuList.forEach(menu -> treeNodeMap.put(menu.getId(), SysAuthConvert.INSTANCE.convertTreeNode(menu))); + // 处理父子关系 + treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(MenuIdEnum.ROOT.getId())).forEach(childNode -> { + // 获得父节点 + SysAuthMenuRespVO parentNode = treeNodeMap.get(childNode.getParentId()); + if (parentNode == null) { + LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]", + childNode.getId(), childNode.getParentId()); + return; + } + // 将自己添加到父节点中 + if (parentNode.getChildren() == null) { + parentNode.setChildren(new ArrayList<>()); + } + parentNode.getChildren().add(childNode); + }); + // 获得到所有的根节点 + return CollectionUtils.filterList(treeNodeMap.values(), node -> MenuIdEnum.ROOT.getId().equals(node.getParentId())); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysUserSessionConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysUserSessionConvert.java new file mode 100644 index 0000000..473fa91 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysUserSessionConvert.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.auth; + +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface SysUserSessionConvert { + + SysUserSessionConvert INSTANCE = Mappers.getMapper(SysUserSessionConvert.class); + + SysUserSessionPageItemRespVO convert(SysUserSessionDO session); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/common/SysCaptchaConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/common/SysCaptchaConvert.java new file mode 100644 index 0000000..0931a54 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/common/SysCaptchaConvert.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.common; + +import cn.hutool.captcha.AbstractCaptcha; +import cn.hutool.captcha.ICaptcha; +import cn.iocoder.yudao.adminserver.modules.system.controller.common.vo.SysCaptchaImageRespVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface SysCaptchaConvert { + + SysCaptchaConvert INSTANCE = Mappers.getMapper(SysCaptchaConvert.class); + + default SysCaptchaImageRespVO convert(String uuid, AbstractCaptcha captcha) { + return SysCaptchaImageRespVO.builder().uuid(uuid).img(captcha.getImageBase64()).build(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java new file mode 100644 index 0000000..364b034 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysDeptConvert.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.dept; + +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptSimpleRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SysDeptConvert { + + SysDeptConvert INSTANCE = Mappers.getMapper(SysDeptConvert.class); + + List convertList(List list); + + List convertList02(List list); + + SysDeptRespVO convert(SysDeptDO bean); + + SysDeptDO convert(SysDeptCreateReqVO bean); + + SysDeptDO convert(SysDeptUpdateReqVO bean); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java new file mode 100644 index 0000000..934a31d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dept/SysPostConvert.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.dept; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.*; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SysPostConvert { + + SysPostConvert INSTANCE = Mappers.getMapper(SysPostConvert.class); + + List convertList02(List list); + + PageResult convertPage(PageResult page); + + SysPostRespVO convert(SysPostDO id); + + SysPostDO convert(SysPostCreateReqVO bean); + + SysPostDO convert(SysPostUpdateReqVO reqVO); + + List convertList03(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictDataConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictDataConvert.java new file mode 100644 index 0000000..d8e54bc --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictDataConvert.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.dict; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.*; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface SysDictDataConvert { + + SysDictDataConvert INSTANCE = Mappers.getMapper(SysDictDataConvert.class); + + List convertList(List list); + + SysDictDataRespVO convert(SysDictDataDO bean); + + PageResult convertPage(PageResult page); + + SysDictDataDO convert(SysDictDataUpdateReqVO bean); + + SysDictDataDO convert(SysDictDataCreateReqVO bean); + + List convertList02(List bean); + + DictDataRespDTO convert02(SysDictDataDO bean); + + List convertList03(Collection list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictTypeConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictTypeConvert.java new file mode 100644 index 0000000..e20451c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictTypeConvert.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.dict; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.*; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SysDictTypeConvert { + + SysDictTypeConvert INSTANCE = Mappers.getMapper(SysDictTypeConvert.class); + + PageResult convertPage(PageResult bean); + + SysDictTypeRespVO convert(SysDictTypeDO bean); + + SysDictTypeDO convert(SysDictTypeCreateReqVO bean); + + SysDictTypeDO convert(SysDictTypeUpdateReqVO bean); + + List convertList(List list); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/errorcode/SysErrorCodeConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/errorcode/SysErrorCodeConvert.java new file mode 100644 index 0000000..a7b8ead --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/errorcode/SysErrorCodeConvert.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.errorcode; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeExcelVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 错误码 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface SysErrorCodeConvert { + + SysErrorCodeConvert INSTANCE = Mappers.getMapper(SysErrorCodeConvert.class); + + SysErrorCodeDO convert(SysErrorCodeCreateReqVO bean); + + SysErrorCodeDO convert(SysErrorCodeUpdateReqVO bean); + + SysErrorCodeRespVO convert(SysErrorCodeDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + SysErrorCodeDO convert(ErrorCodeAutoGenerateReqDTO bean); + + List convertList03(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysLoginLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysLoginLogConvert.java new file mode 100644 index 0000000..7c31fe3 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysLoginLogConvert.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.logger; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogRespVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SysLoginLogConvert { + + SysLoginLogConvert INSTANCE = Mappers.getMapper(SysLoginLogConvert.class); + + SysLoginLogDO convert(SysLoginLogCreateReqVO bean); + + PageResult convertPage(PageResult page); + + List convertList(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysOperateLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysOperateLogConvert.java new file mode 100644 index 0000000..dc31e07 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysOperateLogConvert.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.logger; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogRespVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; + +@Mapper +public interface SysOperateLogConvert { + + SysOperateLogConvert INSTANCE = Mappers.getMapper(SysOperateLogConvert.class); + + SysOperateLogDO convert(OperateLogCreateReqDTO bean); + + PageResult convertPage(PageResult page); + + SysOperateLogRespVO convert(SysOperateLogDO bean); + + default List convertList(List list, Map userMap) { + return list.stream().map(operateLog -> { + SysOperateLogExcelVO excelVO = convert02(operateLog); + MapUtils.findAndThen(userMap, operateLog.getId(), user -> excelVO.setUserNickname(user.getNickname())); + excelVO.setSuccessStr(SUCCESS.getCode().equals(operateLog.getResultCode()) ? "成功" : "失败"); + return excelVO; + }).collect(Collectors.toList()); + } + + SysOperateLogExcelVO convert02(SysOperateLogDO bean); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/notice/SysNoticeConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/notice/SysNoticeConvert.java new file mode 100644 index 0000000..ccba20e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/notice/SysNoticeConvert.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.notice; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice.SysNoticeDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface SysNoticeConvert { + + SysNoticeConvert INSTANCE = Mappers.getMapper(SysNoticeConvert.class); + + PageResult convertPage(PageResult page); + + SysNoticeRespVO convert(SysNoticeDO bean); + + SysNoticeDO convert(SysNoticeUpdateReqVO bean); + + SysNoticeDO convert(SysNoticeCreateReqVO bean); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/package-info.java new file mode 100644 index 0000000..d4052eb --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 POJO 类的实体转换 + * + * 目前使用 MapStruct 框架 + */ +package cn.iocoder.yudao.adminserver.modules.system.convert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysMenuConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysMenuConvert.java new file mode 100644 index 0000000..c8ef149 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysMenuConvert.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.permission; + +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuSimpleRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SysMenuConvert { + + SysMenuConvert INSTANCE = Mappers.getMapper(SysMenuConvert.class); + + List convertList(List list); + + SysMenuDO convert(SysMenuCreateReqVO bean); + + SysMenuDO convert(SysMenuUpdateReqVO bean); + + SysMenuRespVO convert(SysMenuDO bean); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java new file mode 100644 index 0000000..59e4d59 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/permission/SysRoleConvert.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.permission; + +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.*; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SysRoleConvert { + + SysRoleConvert INSTANCE = Mappers.getMapper(SysRoleConvert.class); + + SysRoleDO convert(SysRoleUpdateReqVO bean); + + SysRoleRespVO convert(SysRoleDO bean); + + SysRoleDO convert(SysRoleCreateReqVO bean); + + List convertList02(List list); + + List convertList03(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsChannelConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsChannelConvert.java new file mode 100644 index 0000000..8d8304d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsChannelConvert.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.sms; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelSimpleRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 短信渠道 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface SysSmsChannelConvert { + + SysSmsChannelConvert INSTANCE = Mappers.getMapper(SysSmsChannelConvert.class); + + SysSmsChannelDO convert(SysSmsChannelCreateReqVO bean); + + SysSmsChannelDO convert(SysSmsChannelUpdateReqVO bean); + + SysSmsChannelRespVO convert(SysSmsChannelDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + List convertList03(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsLogConvert.java new file mode 100644 index 0000000..792d329 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsLogConvert.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.sms; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExcelVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogRespVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 短信日志 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface SysSmsLogConvert { + + SysSmsLogConvert INSTANCE = Mappers.getMapper(SysSmsLogConvert.class); + + SysSmsLogRespVO convert(SysSmsLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsTemplateConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsTemplateConvert.java new file mode 100644 index 0000000..f7ffeb6 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsTemplateConvert.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.sms; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExcelVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SysSmsTemplateConvert { + + SysSmsTemplateConvert INSTANCE = Mappers.getMapper(SysSmsTemplateConvert.class); + + SysSmsTemplateDO convert(SysSmsTemplateCreateReqVO bean); + + SysSmsTemplateDO convert(SysSmsTemplateUpdateReqVO bean); + + SysSmsTemplateRespVO convert(SysSmsTemplateDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java new file mode 100644 index 0000000..7fddda8 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.adminserver.modules.system.convert.user; + +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SysUserConvert { + + SysUserConvert INSTANCE = Mappers.getMapper(SysUserConvert.class); + + SysUserPageItemRespVO convert(SysUserDO bean); + + SysUserPageItemRespVO.Dept convert(SysDeptDO bean); + + SysUserDO convert(SysUserCreateReqVO bean); + + SysUserDO convert(SysUserUpdateReqVO bean); + + SysUserExcelVO convert02(SysUserDO bean); + + SysUserDO convert(SysUserImportExcelVO bean); + + SysUserProfileRespVO convert03(SysUserDO bean); + + List convertList(List list); + + SysUserProfileRespVO.Dept convert02(SysDeptDO bean); + + SysUserDO convert(SysUserProfileUpdateReqVO bean); + + SysUserDO convert(SysUserProfileUpdatePasswordReqVO bean); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md new file mode 100644 index 0000000..8153487 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md @@ -0,0 +1 @@ + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/auth/SysUserSessionDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/auth/SysUserSessionDO.java new file mode 100644 index 0000000..8aa25a5 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/auth/SysUserSessionDO.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 在线用户表 + * + * 我们已经将 {@link LoginUser} 缓存在 Redis 当中。 + * 这里额外存储在线用户到 MySQL 中,目的是为了方便管理界面可以灵活查询。 + * 同时,通过定时轮询 SysUserSessionDO 表,可以主动删除 Redis 的缓存,因为 Redis 的过期删除是延迟的。 + * + * @author 芋道源码 + */ +@TableName(value = "sys_user_session", autoResultMap = true) +@Data +@Builder +@EqualsAndHashCode(callSuper = true) +public class SysUserSessionDO extends BaseDO { + + /** + * 会话编号, 即 sessionId + */ + @TableId(type = IdType.INPUT) + private String id; + /** + * 用户编号 + * + * 关联 {@link SysUserDO#getId()} + */ + private Long userId; + + /** + * 用户账号 + * + * 冗余,因为账号可以变更 + */ + private String username; + + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + /** + * 会话超时时间 + */ + private Date sessionTimeout; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysDeptDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysDeptDO.java new file mode 100644 index 0000000..46d7b98 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysDeptDO.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 部门表 + * + * @author ruoyi + */ +@TableName("sys_dept") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysDeptDO extends BaseDO { + + /** + * 部门ID + */ + @TableId + private Long id; + /** + * 部门名称 + */ + private String name; + /** + * 父部门ID + * + * 关联 {@link #id} + */ + private Long parentId; + /** + * 显示顺序 + */ + private Integer sort; + /** + * 负责人 + */ + private String leader; + /** + * 联系电话 + */ + private String phone; + /** + * 邮箱 + */ + private String email; + /** + * 部门状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysPostDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysPostDO.java new file mode 100644 index 0000000..52b19c7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysPostDO.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 岗位表 + * + * @author ruoyi + */ +@TableName("sys_post") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysPostDO extends BaseDO { + + /** + * 岗位序号 + */ + @TableId + private Long id; + + /** + * 岗位名称 + */ + private String name; + /** + * 岗位编码 + */ + private String code; + /** + * 岗位排序 + */ + private Integer sort; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictDataDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictDataDO.java new file mode 100644 index 0000000..22b0722 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictDataDO.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 字典数据表 + * + * @author ruoyi + */ +@TableName("sys_dict_data") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysDictDataDO extends BaseDO { + + /** + * 字典数据编号 + */ + @TableId + private Long id; + /** + * 字典排序 + */ + private Integer sort; + /** + * 字典标签 + */ + private String label; + /** + * 字典值 + */ + private String value; + /** + * 字典类型 + * + * 冗余 {@link SysDictDataDO#getDictType()} + */ + private String dictType; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictTypeDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictTypeDO.java new file mode 100644 index 0000000..548ee6f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictTypeDO.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 字典类型表 + * + * @author ruoyi + */ +@TableName("sys_dict_type") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysDictTypeDO extends BaseDO { + + /** + * 字典主键 + */ + @TableId + private Long id; + /** + * 字典名称 + */ + private String name; + /** + * 字典类型 + */ + @TableField("`type`") + private String type; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java new file mode 100644 index 0000000..d2fdb18 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.errorcode.SysErrorCodeTypeEnum; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 错误码表 + * + * @author 芋道源码 + */ +@TableName(value = "sys_error_code") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysErrorCodeDO extends BaseDO { + + /** + * 错误码编号,自增 + */ + @TableId + private Long id; + /** + * 错误码类型 + * + * 枚举 {@link SysErrorCodeTypeEnum} + */ + private Integer type; + /** + * 应用名 + */ + private String applicationName; + /** + * 错误码编码 + */ + private Integer code; + /** + * 错误码错误提示 + */ + private String message; + /** + * 错误码备注 + */ + private String memo; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysLoginLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysLoginLogDO.java new file mode 100644 index 0000000..c61ee7c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysLoginLogDO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 登陆日志表 + * + * 注意,包括登陆和登出两种行为 + * + * @author ruoyi + */ +@TableName("sys_login_log") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysLoginLogDO extends BaseDO { + + /** + * 日志主键 + */ + private Long id; + /** + * 日志类型 + * + * 枚举 {@link SysLoginLogTypeEnum} + */ + private Integer logType; + /** + * 链路追踪编号 + */ + private String traceId; + /** + * 用户账号 + * + * 冗余,因为账号可以变更 + */ + private String username; + /** + * 登陆结果 + * + * 枚举 {@link SysLoginResultEnum} + */ + private Integer result; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java new file mode 100644 index 0000000..1983518 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java @@ -0,0 +1,137 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.Map; + +/** + * 操作日志表 + * + * @author 芋道源码 + */ +@TableName(value = "sys_operate_log", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +public class SysOperateLogDO extends BaseDO { + + /** + * {@link #javaMethodArgs} 的最大长度 + */ + public static final Integer JAVA_METHOD_ARGS_MAX_LENGTH = 8000; + + /** + * {@link #resultData} 的最大长度 + */ + public static final Integer RESULT_MAX_LENGTH = 4000; + + /** + * 日志主键 + */ + @TableId + private Long id; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户编号 + * + * {@link SysUserDO#getId()} + */ + private Long userId; + /** + * 操作模块 + */ + private String module; + /** + * 操作名 + */ + private String name; + /** + * 操作分类 + * + * 枚举 {@link OperateTypeEnum} + */ + @TableField("operate_type") + private Integer type; + /** + * 操作内容,记录整个操作的明细 + * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。 + */ + private String content; + /** + * 拓展字段,有些复杂的业务,需要记录一些字段 + * 例如说,记录订单编号,则可以添加 key 为 "orderId",value 为订单编号 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map exts; + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 请求地址 + */ + private String requestUrl; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + /** + * Java 方法名 + */ + private String javaMethod; + /** + * Java 方法的参数 + * + * 实际格式为 Map + * 不使用 @TableField(typeHandler = FastjsonTypeHandler.class) 注解的原因是,数据库存储有长度限制,会进行裁剪,会导致 JSON 反序列化失败 + * 其中,key 为参数名,value 为参数值 + */ + private String javaMethodArgs; + /** + * 开始时间 + */ + private Date startTime; + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + /** + * 结果码 + * + * 目前使用的 {@link CommonResult#getCode()} 属性 + */ + private Integer resultCode; + /** + * 结果提示 + * + * 目前使用的 {@link CommonResult#getMsg()} 属性 + */ + private String resultMsg; + /** + * 结果数据 + * + * 如果是对象,则使用 JSON 格式化 + */ + private String resultData; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/notice/SysNoticeDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/notice/SysNoticeDO.java new file mode 100644 index 0000000..1ddff65 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/notice/SysNoticeDO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.notice.SysNoticeTypeEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 通知公告表 + * + * @author ruoyi + */ +@TableName("sys_notice") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysNoticeDO extends BaseDO { + + /** + * 公告ID + */ + private Long id; + /** + * 公告标题 + */ + private String title; + /** + * 公告类型 + * + * 枚举 {@link SysNoticeTypeEnum} + */ + @TableField("notice_type") + private Integer type; + /** + * 公告内容 + */ + private String content; + /** + * 公告状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysMenuDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysMenuDO.java new file mode 100644 index 0000000..043f2e9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysMenuDO.java @@ -0,0 +1,76 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 菜单 DO + * + * @author ruoyi + */ +@TableName("sys_menu") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysMenuDO extends BaseDO { + + /** + * 菜单ID + */ + @TableId + private Long id; + /** + * 菜单名称 + */ + private String name; + /** + * 权限标识 + * + * 一般格式为:${系统}:${模块}:${操作} + * 例如说:system:admin:add,即 system 服务的添加管理员。 + * + * 当我们把该 SysMenuDO 赋予给角色后,意味着该角色有该资源: + * - 对于后端,配合 @PreAuthorize 注解,配置 API 接口需要该权限,从而对 API 接口进行权限控制。 + * - 对于前端,配合前端标签,配置按钮是否展示,避免用户没有该权限时,结果可以看到该操作。 + */ + private String permission; + /** + * 菜单类型 + * + * 枚举 {@link MenuTypeEnum} + */ + @TableField("menu_type") + private Integer type; + /** + * 显示顺序 + */ + private Integer sort; + /** + * 父菜单ID + */ + private Long parentId; + /** + * 路由地址 + */ + private String path; + /** + * 菜单图标 + */ + private String icon; + /** + * 组件路径 + */ + private String component; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleDO.java new file mode 100644 index 0000000..72ebedb --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleDO.java @@ -0,0 +1,77 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; +import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.permission.RoleCodeEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.permission.SysRoleTypeEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Set; + +/** + * 角色 DO + * + * @author ruoyi + */ +@TableName(value = "sys_role", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +public class SysRoleDO extends BaseDO { + + /** + * 角色ID + */ + @TableId + private Long id; + /** + * 角色名称 + */ + private String name; + /** + * 角色标识 + * + * 枚举 {@link RoleCodeEnum} + */ + private String code; + /** + * 角色排序 + */ + private Integer sort; + /** + * 角色状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 角色类型 + * + * 枚举 {@link SysRoleTypeEnum} + */ + private Integer type; + /** + * 备注 + */ + private String remark; + + /** + * 数据范围 + * + * 枚举 {@link DataScopeEnum} + */ + private Integer dataScope; + /** + * 数据范围(指定部门数组) + * + * 适用于 {@link #dataScope} 的值为 {@link DataScopeEnum#DEPT_CUSTOM} 时 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set dataScopeDeptIds; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleMenuDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleMenuDO.java new file mode 100644 index 0000000..5cb6c1a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysRoleMenuDO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 角色和菜单关联 + * + * @author ruoyi + */ +@TableName("sys_role_menu") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysRoleMenuDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 角色ID + */ + private Long roleId; + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysUserRoleDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysUserRoleDO.java new file mode 100644 index 0000000..6792f56 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/permission/SysUserRoleDO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户和角色关联 + * + * @author ruoyi + */ +@TableName("sys_user_role") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysUserRoleDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 用户 ID + */ + private Long userId; + /** + * 角色 ID + */ + private Long roleId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsChannelDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsChannelDO.java new file mode 100644 index 0000000..3a3b879 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsChannelDO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.sms.core.enums.SmsChannelEnum; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 短信渠道 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "sys_sms_channel", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysSmsChannelDO extends BaseDO { + + /** + * 渠道编号 + */ + private Long id; + /** + * 短信签名 + */ + private String signature; + /** + * 渠道编码 + * + * 枚举 {@link SmsChannelEnum} + */ + private String code; + /** + * 启用状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 短信 API 的账号 + */ + private String apiKey; + /** + * 短信 API 的秘钥 + */ + private String apiSecret; + /** + * 短信发送回调 URL + */ + private String callbackUrl; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsLogDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsLogDO.java new file mode 100644 index 0000000..3ac39b0 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsLogDO.java @@ -0,0 +1,173 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms; + +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; +import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsReceiveStatusEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsSendStatusEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.util.Date; +import java.util.Map; + +/** + * 短信日志 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "sys_sms_log", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SysSmsLogDO extends BaseDO { + + /** + * 自增编号 + */ + private Long id; + + // ========= 渠道相关字段 ========= + + /** + * 短信渠道编号 + * + * 关联 {@link SysSmsChannelDO#getId()} + */ + private Long channelId; + /** + * 短信渠道编码 + * + * 冗余 {@link SysSmsChannelDO#getCode()} + */ + private String channelCode; + + // ========= 模板相关字段 ========= + + /** + * 模板编号 + * + * 关联 {@link SysSmsTemplateDO#getId()} + */ + private Long templateId; + /** + * 模板编码 + * + * 冗余 {@link SysSmsTemplateDO#getCode()} + */ + private String templateCode; + /** + * 短信类型 + * + * 冗余 {@link SysSmsTemplateDO#getType()} + */ + private Integer templateType; + /** + * 基于 {@link SysSmsTemplateDO#getContent()} 格式化后的内容 + */ + private String templateContent; + /** + * 基于 {@link SysSmsTemplateDO#getParams()} 输入后的参数 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map templateParams; + /** + * 短信 API 的模板编号 + * + * 冗余 {@link SysSmsTemplateDO#getApiTemplateId()} + */ + private String apiTemplateId; + + // ========= 手机相关字段 ========= + + /** + * 手机号 + */ + private String mobile; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + + // ========= 发送相关字段 ========= + + /** + * 发送状态 + * + * 枚举 {@link SysSmsSendStatusEnum} + */ + private Integer sendStatus; + /** + * 发送时间 + */ + private Date sendTime; + /** + * 发送结果的编码 + * + * 枚举 {@link SmsFrameworkErrorCodeConstants} + */ + private Integer sendCode; + /** + * 发送结果的提示 + * + * 一般情况下,使用 {@link SmsFrameworkErrorCodeConstants} + * 异常情况下,通过格式化 Exception 的提示存储 + */ + private String sendMsg; + /** + * 短信 API 发送结果的编码 + * + * 由于第三方的错误码可能是字符串,所以使用 String 类型 + */ + private String apiSendCode; + /** + * 短信 API 发送失败的提示 + */ + private String apiSendMsg; + /** + * 短信 API 发送返回的唯一请求 ID + * + * 用于和短信 API 进行定位于排错 + */ + private String apiRequestId; + /** + * 短信 API 发送返回的序号 + * + * 用于和短信 API 平台的发送记录关联 + */ + private String apiSerialNo; + + // ========= 接收相关字段 ========= + + /** + * 接收状态 + * + * 枚举 {@link SysSmsReceiveStatusEnum} + */ + private Integer receiveStatus; + /** + * 接收时间 + */ + private Date receiveTime; + /** + * 短信 API 接收结果的编码 + */ + private String apiReceiveCode; + /** + * 短信 API 接收结果的提示 + */ + private String apiReceiveMsg; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java new file mode 100644 index 0000000..e409760 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java @@ -0,0 +1,89 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsTemplateTypeEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +/** + * 短信模板 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "sys_sms_template", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysSmsTemplateDO extends BaseDO { + + /** + * 自增编号 + */ + private Long id; + + // ========= 模板相关字段 ========= + + /** + * 短信类型 + * + * 枚举 {@link SysSmsTemplateTypeEnum} + */ + private Integer type; + /** + * 启用状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 模板编码,保证唯一 + */ + private String code; + /** + * 模板名称 + */ + private String name; + /** + * 模板内容 + * + * 内容的参数,使用 {} 包括,例如说 {name} + */ + private String content; + /** + * 参数数组(自动根据内容生成) + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List params; + /** + * 备注 + */ + private String remark; + /** + * 短信 API 的模板编号 + */ + private String apiTemplateId; + + // ========= 渠道相关字段 ========= + + /** + * 短信渠道编号 + * + * 关联 {@link SysSmsChannelDO#getId()} + */ + private Long channelId; + /** + * 短信渠道编码 + * + * 冗余 {@link SysSmsChannelDO#getCode()} + */ + private String channelCode; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/user/SysUserDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/user/SysUserDO.java new file mode 100644 index 0000000..2346ee9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/user/SysUserDO.java @@ -0,0 +1,94 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; +import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import java.util.Date; +import java.util.Set; + +/** + * 用户 DO + * + * @author ruoyi + */ +@TableName(value = "sys_user", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysUserDO extends BaseDO { + + /** + * 用户ID + */ + @TableId + private Long id; + /** + * 用户账号 + */ + private String username; + /** + * 加密后的密码 + * + * 因为目前使用 {@link BCryptPasswordEncoder} 加密器,所以无需自己处理 salt 盐 + */ + private String password; + /** + * 用户昵称 + */ + private String nickname; + /** + * 备注 + */ + private String remark; + /** + * 部门ID + */ + private Long deptId; + /** + * 岗位编号数组 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set postIds; + /** + * 用户邮箱 + */ + private String email; + /** + * 手机号码 + */ + private String mobile; + /** + * 用户性别 + * + * 枚举类 {@link SysSexEnum} + */ + private Integer sex; + /** + * 用户头像 + */ + private String avatar; + /** + * 帐号状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 最后登录IP + */ + private String loginIp; + /** + * 最后登录时间 + */ + private Date loginDate; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/auth/SysUserSessionMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/auth/SysUserSessionMapper.java new file mode 100644 index 0000000..bc6e31c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/auth/SysUserSessionMapper.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +@Mapper +public interface SysUserSessionMapper extends BaseMapperX { + + default PageResult selectPage(SysUserSessionPageReqVO reqVO, Collection userIds) { + return selectPage(reqVO, new QueryWrapperX() + .inIfPresent("user_id", userIds) + .likeIfPresent("user_ip", reqVO.getUserIp())); + } + + default List selectListBySessionTimoutLt() { + return selectList(new QueryWrapperX().lt("session_timeout",new Date())); + } +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java new file mode 100644 index 0000000..9b3cb17 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysDeptMapper.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface SysDeptMapper extends BaseMapperX { + + default List selectList(SysDeptListReqVO reqVO) { + return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus())); + } + + default SysDeptDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(new QueryWrapper().eq("parent_id", parentId) + .eq("name", name)); + } + + default Integer selectCountByParentId(Long parentId) { + return selectCount(new QueryWrapper().eq("parent_id", parentId)); + } + + default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { + return selectOne(new QueryWrapper().select("id") + .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java new file mode 100644 index 0000000..457b4a9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dept/SysPostMapper.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface SysPostMapper extends BaseMapperX { + + default List selectList(Collection ids, Collection statuses) { + return selectList(new QueryWrapperX().inIfPresent("id", ids) + .inIfPresent("status", statuses)); + } + + default PageResult selectPage(SysPostPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("code", reqVO.getCode()) + .likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus())); + } + + default List selectList(SysPostExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .likeIfPresent("code", reqVO.getCode()) + .likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus())); + } + + default SysPostDO selectByName(String name) { + return selectOne(new QueryWrapper().eq("name", name)); + } + + default SysPostDO selectByCode(String code) { + return selectOne(new QueryWrapper().eq("code", code)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictDataMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictDataMapper.java new file mode 100644 index 0000000..dba4b55 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictDataMapper.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface SysDictDataMapper extends BaseMapperX { + + default SysDictDataDO selectByDictTypeAndValue(String dictType, String value) { + return selectOne(new QueryWrapper().eq("dict_type", dictType) + .eq("value", value)); + } + + default int selectCountByDictType(String dictType) { + return selectCount("dict_type", dictType); + } + + default PageResult selectPage(SysDictDataPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("label", reqVO.getLabel()) + .likeIfPresent("dict_type", reqVO.getDictType()) + .eqIfPresent("status", reqVO.getStatus()) + .orderByAsc("dict_type", "sort")); + } + + default List selectList(SysDictDataExportReqVO reqVO) { + return selectList(new QueryWrapperX().likeIfPresent("label", reqVO.getLabel()) + .likeIfPresent("dict_type", reqVO.getDictType()) + .eqIfPresent("status", reqVO.getStatus())); + } + + default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { + return selectOne(new QueryWrapper().select("id") + .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictTypeMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictTypeMapper.java new file mode 100644 index 0000000..90b1256 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictTypeMapper.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SysDictTypeMapper extends BaseMapperX { + + default PageResult selectPage(SysDictTypePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .likeIfPresent("`type`", reqVO.getType()) + .eqIfPresent("status", reqVO.getStatus()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())); + } + + default List selectList(SysDictTypeExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .likeIfPresent("`type`", reqVO.getType()) + .eqIfPresent("status", reqVO.getStatus()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())); + } + + default SysDictTypeDO selectByType(String type) { + return selectOne(new QueryWrapperX().eq("`type`", type)); + } + + default SysDictTypeDO selectByName(String name) { + return selectOne(new QueryWrapperX().eq("name", name)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java new file mode 100644 index 0000000..7760f80 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.errorcode; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +@Mapper +public interface SysErrorCodeMapper extends BaseMapperX { + + default PageResult selectPage(SysErrorCodePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .eqIfPresent("type", reqVO.getType()) + .likeIfPresent("application_name", reqVO.getApplicationName()) + .eqIfPresent("code", reqVO.getCode()) + .likeIfPresent("message", reqVO.getMessage()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByAsc("application_name", "code")); + } + + default List selectList(SysErrorCodeExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .eqIfPresent("type", reqVO.getType()) + .likeIfPresent("application_name", reqVO.getApplicationName()) + .eqIfPresent("code", reqVO.getCode()) + .likeIfPresent("message", reqVO.getMessage()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByAsc("application_name", "code")); + } + + default List selectListByCodes(Collection codes) { + return selectList(new QueryWrapper().in("code", codes)); + } + + default SysErrorCodeDO selectByCode(Integer code) { + return selectOne(new QueryWrapper().eq("code", code)); + } + + default List selectListByApplicationNameAndUpdateTimeGt(String applicationName, Date minUpdateTime) { + return selectList(new QueryWrapperX().eq("application_name", applicationName) + .gtIfPresent("update_time", minUpdateTime)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysLoginLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysLoginLogMapper.java new file mode 100644 index 0000000..62a70f0 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysLoginLogMapper.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SysLoginLogMapper extends BaseMapperX { + + default PageResult selectPage(SysLoginLogPageReqVO reqVO) { + QueryWrapperX query = new QueryWrapperX() + .likeIfPresent("user_ip", reqVO.getUserIp()) + .likeIfPresent("username", reqVO.getUsername()) + .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()); + if (Boolean.TRUE.equals(reqVO.getStatus())) { + query.eq("result", SysLoginResultEnum.SUCCESS.getResult()); + } else if (Boolean.FALSE.equals(reqVO.getStatus())) { + query.gt("result", SysLoginResultEnum.SUCCESS.getResult()); + } + query.orderByDesc("id"); // 降序 + return selectPage(reqVO, query); + } + + default List selectList(SysLoginLogExportReqVO reqVO) { + QueryWrapperX query = new QueryWrapperX() + .likeIfPresent("user_ip", reqVO.getUserIp()) + .likeIfPresent("username", reqVO.getUsername()) + .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()); + if (Boolean.TRUE.equals(reqVO.getStatus())) { + query.eq("result", SysLoginResultEnum.SUCCESS.getResult()); + } else if (Boolean.FALSE.equals(reqVO.getStatus())) { + query.gt("result", SysLoginResultEnum.SUCCESS.getResult()); + } + query.orderByDesc("id"); // 降序 + return selectList(query); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysOperateLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysOperateLogMapper.java new file mode 100644 index 0000000..c588867 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysOperateLogMapper.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger; + +import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface SysOperateLogMapper extends BaseMapperX { + + default PageResult selectPage(SysOperateLogPageReqVO reqVO, Collection userIds) { + QueryWrapperX query = new QueryWrapperX() + .likeIfPresent("module", reqVO.getModule()) + .inIfPresent("user_id", userIds) + .eqIfPresent("operate_type", reqVO.getType()) + .betweenIfPresent("start_time", reqVO.getBeginTime(), reqVO.getEndTime()); + if (Boolean.TRUE.equals(reqVO.getSuccess())) { + query.eq("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); + } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { + query.gt("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); + } + query.orderByDesc("id"); // 降序 + return selectPage(reqVO, query); + } + + default List selectList(SysOperateLogExportReqVO reqVO, Collection userIds) { + QueryWrapperX query = new QueryWrapperX() + .likeIfPresent("module", reqVO.getModule()) + .inIfPresent("user_id", userIds) + .eqIfPresent("operate_type", reqVO.getType()) + .betweenIfPresent("start_time", reqVO.getBeginTime(), reqVO.getEndTime()); + if (Boolean.TRUE.equals(reqVO.getSuccess())) { + query.eq("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); + } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { + query.gt("result_code", GlobalErrorCodeConstants.SUCCESS.getCode()); + } + query.orderByDesc("id"); // 降序 + return selectList(query); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/notice/SysNoticeMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/notice/SysNoticeMapper.java new file mode 100644 index 0000000..52a484a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/notice/SysNoticeMapper.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.notice; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice.SysNoticeDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SysNoticeMapper extends BaseMapperX { + + default PageResult selectPage(SysNoticePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("title", reqVO.getTitle()) + .eqIfPresent("status", reqVO.getStatus())); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysMenuMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysMenuMapper.java new file mode 100644 index 0000000..58913f4 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysMenuMapper.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuListReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface SysMenuMapper extends BaseMapperX { + + default SysMenuDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(new QueryWrapper().eq("parent_id", parentId) + .eq("name", name)); + } + + default Integer selectCountByParentId(Long parentId) { + return selectCount(new QueryWrapper().eq("parent_id", parentId)); + } + + default List selectList(SysMenuListReqVO reqVO) { + return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus())); + } + + default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { + return selectOne(new QueryWrapper().select("id") + .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java new file mode 100644 index 0000000..7d3ab59 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMapper.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRolePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +@Mapper +public interface SysRoleMapper extends BaseMapperX { + + default PageResult selectPage(SysRolePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX().likeIfPresent("name", reqVO.getName()) + .likeIfPresent("code", reqVO.getCode()) + .eqIfPresent("status", reqVO.getStatus()) + .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); + } + + default List listRoles(SysRoleExportReqVO reqVO) { + return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) + .likeIfPresent("code", reqVO.getCode()) + .eqIfPresent("status", reqVO.getStatus()) + .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime())); + } + + default SysRoleDO selectByName(String name) { + return selectOne(new QueryWrapperX().eq("name", name)); + } + + default SysRoleDO selectByCode(String code) { + return selectOne(new QueryWrapperX().eq("code", code)); + } + + default List selectListByStatus(@Nullable Collection statuses) { + return selectList(new QueryWrapperX().in("status", statuses)); + } + + default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { + return selectOne(new QueryWrapper().select("id") + .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMenuMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMenuMapper.java new file mode 100644 index 0000000..698ca73 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysRoleMenuMapper.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Mapper +public interface SysRoleMenuMapper extends BaseMapperX { + + default List selectListByRoleId(Long roleId) { + return selectList(new QueryWrapper().eq("role_id", roleId)); + } + + default void insertList(Long roleId, Collection menuIds) { + List list = menuIds.stream().map(menuId -> { + SysRoleMenuDO entity = new SysRoleMenuDO(); + entity.setRoleId(roleId); + entity.setMenuId(menuId); + return entity; + }).collect(Collectors.toList()); + // TODO 芋艿,mybatis plus 增加批量插入的功能 + list.forEach(this::insert); + } + + default void deleteListByRoleIdAndMenuIds(Long roleId, Collection menuIds) { + delete(new QueryWrapper().eq("role_id", roleId) + .in("menu_id", menuIds)); + } + + default void deleteListByMenuId(Long menuId) { + delete(new QueryWrapper().eq("menu_id", menuId)); + } + + default void deleteListByRoleId(Long roleId) { + delete(new QueryWrapper().eq("role_id", roleId)); + } + + @Select("SELECT id FROM sys_role_menu WHERE update_time > #{maxUpdateTime} LIMIT 1") + Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java new file mode 100644 index 0000000..f6f5f38 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/permission/SysUserRoleMapper.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +@Mapper +public interface SysUserRoleMapper extends BaseMapperX { + + default List selectListByUserId(Long userId) { + return selectList(new QueryWrapper().eq("user_id", userId)); + } + + default void insertList(Long userId, Collection roleIds) { + List list = roleIds.stream().map(roleId -> { + SysUserRoleDO entity = new SysUserRoleDO(); + entity.setUserId(userId); + entity.setRoleId(roleId); + return entity; + }).collect(Collectors.toList()); + // TODO 芋艿,mybatis plus 增加批量插入的功能 + list.forEach(this::insert); + } + + default void deleteListByUserIdAndRoleIdIds(Long userId, Collection roleIds) { + delete(new QueryWrapper().eq("user_id", userId) + .in("role_id", roleIds)); + } + + default void deleteListByUserId(Long userId) { + delete(new QueryWrapper().eq("user_id", userId)); + } + + default void deleteListByRoleId(Long roleId) { + delete(new QueryWrapper().eq("role_id", roleId)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsChannelMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsChannelMapper.java new file mode 100644 index 0000000..bc48f2b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsChannelMapper.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; + +@Mapper +public interface SysSmsChannelMapper extends BaseMapperX { + + default PageResult selectPage(SysSmsChannelPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("signature", reqVO.getSignature()) + .eqIfPresent("status", reqVO.getStatus()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByDesc("id")); + } + + @Select("SELECT id FROM sys_sms_channel WHERE update_time > #{maxUpdateTime} LIMIT 1") + Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsLogMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsLogMapper.java new file mode 100644 index 0000000..663b00a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsLogMapper.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SysSmsLogMapper extends BaseMapperX { + + default PageResult selectPage(SysSmsLogPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .eqIfPresent("channel_id", reqVO.getChannelId()) + .eqIfPresent("template_id", reqVO.getTemplateId()) + .likeIfPresent("mobile", reqVO.getMobile()) + .eqIfPresent("send_status", reqVO.getSendStatus()) + .betweenIfPresent("send_time", reqVO.getBeginSendTime(), reqVO.getEndSendTime()) + .eqIfPresent("receive_status", reqVO.getReceiveStatus()) + .betweenIfPresent("receive_time", reqVO.getBeginReceiveTime(), reqVO.getEndReceiveTime()) + .orderByDesc("id")); + } + + default List selectList(SysSmsLogExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .eqIfPresent("channel_id", reqVO.getChannelId()) + .eqIfPresent("template_id", reqVO.getTemplateId()) + .likeIfPresent("mobile", reqVO.getMobile()) + .eqIfPresent("send_status", reqVO.getSendStatus()) + .betweenIfPresent("send_time", reqVO.getBeginSendTime(), reqVO.getEndSendTime()) + .eqIfPresent("receive_status", reqVO.getReceiveStatus()) + .betweenIfPresent("receive_time", reqVO.getBeginReceiveTime(), reqVO.getEndReceiveTime()) + .orderByDesc("id")); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java new file mode 100644 index 0000000..04465fe --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface SysSmsTemplateMapper extends BaseMapperX { + + default SysSmsTemplateDO selectByCode(String code) { + return selectOne("code", code); + } + + default PageResult selectPage(SysSmsTemplatePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .eqIfPresent("type", reqVO.getType()) + .eqIfPresent("status", reqVO.getStatus()) + .likeIfPresent("code", reqVO.getCode()) + .likeIfPresent("content", reqVO.getContent()) + .likeIfPresent("api_template_id", reqVO.getApiTemplateId()) + .eqIfPresent("channel_id", reqVO.getChannelId()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByDesc("id")); + } + + default List selectList(SysSmsTemplateExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .eqIfPresent("type", reqVO.getType()) + .eqIfPresent("status", reqVO.getStatus()) + .likeIfPresent("code", reqVO.getCode()) + .likeIfPresent("content", reqVO.getContent()) + .likeIfPresent("api_template_id", reqVO.getApiTemplateId()) + .eqIfPresent("channel_id", reqVO.getChannelId()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByDesc("id")); + } + + default Integer selectCountByChannelId(Long channelId) { + return selectCount("channel_id", channelId); + } + + @Select("SELECT id FROM sys_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1") + Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java new file mode 100644 index 0000000..e36727e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface SysUserMapper extends BaseMapperX { + + default SysUserDO selectByUsername(String username) { + return selectOne(new QueryWrapper().eq("username", username)); + } + + default SysUserDO selectByMobile(String mobile) { + return selectOne(new QueryWrapper().eq("mobile", mobile)); + } + + default SysUserDO selectByEmail(String email) { + return selectOne(new QueryWrapper().eq("email", email)); + } + + default PageResult selectPage(SysUserPageReqVO reqVO, Collection deptIds) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("username", reqVO.getUsername()) + .likeIfPresent("mobile", reqVO.getMobile()) + .eqIfPresent("status", reqVO.getStatus()) + .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()) + .inIfPresent("dept_id", deptIds)); + } + + default List selectList(SysUserExportReqVO reqVO, Collection deptIds) { + return selectList(new QueryWrapperX().likeIfPresent("username", reqVO.getUsername()) + .likeIfPresent("mobile", reqVO.getMobile()) + .eqIfPresent("status", reqVO.getStatus()) + .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()) + .inIfPresent("dept_id", deptIds)); + } + + default List selectListByNickname(String nickname) { + return selectList(new QueryWrapperX().like("nickname", nickname)); + } + + default List selectListByUsername(String username) { + return selectList(new QueryWrapperX().like("username", username)); + } + +} + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/RedisKeyConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/RedisKeyConstants.java new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/RedisKeyConstants.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java new file mode 100644 index 0000000..525b084 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.redis; + +import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; +import cn.iocoder.yudao.framework.security.core.LoginUser; + +import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING; + +/** + * System Redis Key 枚举类 + * + * @author 芋道源码 + */ +public interface SysRedisKeyConstants { + + RedisKeyDefine LOGIN_USER = new RedisKeyDefine("登陆用户的缓存", + "login_user:%s", // 参数为 sessionId + STRING, LoginUser.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + + RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("验证码的缓存", + "captcha_code:%s", // 参数为 uuid + STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/auth/SysLoginUserRedisDAO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/auth/SysLoginUserRedisDAO.java new file mode 100644 index 0000000..d62bbb0 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/auth/SysLoginUserRedisDAO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.redis.auth; + +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.time.Duration; + +import static cn.iocoder.yudao.adminserver.modules.system.dal.redis.SysRedisKeyConstants.LOGIN_USER; + +/** + * {@link LoginUser} 的 RedisDAO + * + * @author 芋道源码 + */ +@Repository +public class SysLoginUserRedisDAO { + + @Resource + private StringRedisTemplate stringRedisTemplate; + @Resource + private SysUserSessionService sysUserSessionService; + + public LoginUser get(String sessionId) { + String redisKey = formatKey(sessionId); + return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(redisKey), LoginUser.class); + } + + public void set(String sessionId, LoginUser loginUser) { + String redisKey = formatKey(sessionId); + stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(loginUser), + Duration.ofMillis(sysUserSessionService.getSessionTimeoutMillis())); + } + + public void delete(String sessionId) { + String redisKey = formatKey(sessionId); + stringRedisTemplate.delete(redisKey); + } + + private static String formatKey(String sessionId) { + return String.format(LOGIN_USER.getKeyTemplate(), sessionId); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/common/SysCaptchaRedisDAO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/common/SysCaptchaRedisDAO.java new file mode 100644 index 0000000..701501c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/common/SysCaptchaRedisDAO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.adminserver.modules.system.dal.redis.common; + +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.time.Duration; + +import static cn.iocoder.yudao.adminserver.modules.system.dal.redis.SysRedisKeyConstants.CAPTCHA_CODE; + +/** + * 验证码的 Redis DAO + * + * @author 芋道源码 + */ +@Repository +public class SysCaptchaRedisDAO { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + public String get(String uuid) { + String redisKey = formatKey(uuid); + return stringRedisTemplate.opsForValue().get(redisKey); + } + + public void set(String uuid, String code, Duration timeout) { + String redisKey = formatKey(uuid); + stringRedisTemplate.opsForValue().set(redisKey, code, timeout); + } + + public void delete(String uuid) { + String redisKey = formatKey(uuid); + stringRedisTemplate.delete(redisKey); + } + + private static String formatKey(String uuid) { + return String.format(CAPTCHA_CODE.getKeyTemplate(), uuid); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysDictTypeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysDictTypeConstants.java new file mode 100644 index 0000000..cd480fc --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysDictTypeConstants.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums; + +/** + * System 字典类型的枚举类 + * + * @author 芋道源码 + */ +public interface SysDictTypeConstants { + + String USER_TYPE = "user_type"; // 用户类型 + String COMMON_STATUS = "sys_common_status"; // 系统状态 + + String USER_SEX = "sys_user_sex"; // 用户性别 + String OPERATE_TYPE = "sys_operate_type"; // 操作类型 + String LOGIN_RESULT = "sys_login_result"; // 登陆结果 + String CONFIG_TYPE = "sys_config_type"; // 参数配置类型 + String BOOLEAN_STRING = "sys_boolean_string"; // Boolean 是否类型 + + String SMS_CHANNEL_CODE = "sys_sms_channel_code"; // 短信渠道编码 + String SMS_TEMPLATE_TYPE = "sys_sms_template_type"; // 短信模板类型 + String SMS_SEND_STATUS = "sys_sms_send_status"; // 短信发送状态 + String SMS_RECEIVE_STATUS = "sys_sms_receive_status"; // 短信接收状态 + + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java new file mode 100644 index 0000000..378cc55 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java @@ -0,0 +1,98 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums; + +import cn.iocoder.yudao.framework.common.exception.ErrorCode; + +/** + * System 错误码枚举类 + * + * system 系统,使用 1-002-000-000 段 + */ +public interface SysErrorCodeConstants { + + // ========== AUTH 模块 1002000000 ========== + ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1002000000, "登录失败,账号密码不正确"); + ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1002000001, "登录失败,账号被禁用"); + ErrorCode AUTH_LOGIN_FAIL_UNKNOWN = new ErrorCode(1002000002, "登录失败"); // 登陆失败的兜底,位置原因 + ErrorCode AUTH_LOGIN_CAPTCHA_NOT_FOUND = new ErrorCode(1002000003, "验证码不存在"); + ErrorCode AUTH_LOGIN_CAPTCHA_CODE_ERROR = new ErrorCode(1002000004, "验证码不正确"); + + // ========== TOKEN 模块 1002001000 ========== + ErrorCode TOKEN_EXPIRED = new ErrorCode(1002001000, "Token 已经过期"); + ErrorCode TOKEN_PARSE_FAIL = new ErrorCode(1002001001, "Token 解析失败"); + + // ========== 菜单模块 1002002000 ========== + ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1002002000, "已经存在该名字的菜单"); + ErrorCode MENU_PARENT_NOT_EXISTS = new ErrorCode(1002002001, "父菜单不存在"); + ErrorCode MENU_PARENT_ERROR = new ErrorCode(1002002002, "不能设置自己为父菜单"); + ErrorCode MENU_NOT_EXISTS = new ErrorCode(1002002003, "菜单不存在"); + ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1002002004, "存在子菜单,无法删除"); + ErrorCode MENU_PARENT_NOT_DIR_OR_MENU = new ErrorCode(1002002005, "父菜单的类型必须是目录或者菜单"); + + // ========== 角色模块 1002003000 ========== + ErrorCode ROLE_NOT_EXISTS = new ErrorCode(1002003000, "角色不存在"); + ErrorCode ROLE_NAME_DUPLICATE = new ErrorCode(1002003001, "已经存在名为【{}】的角色"); + ErrorCode ROLE_CODE_DUPLICATE = new ErrorCode(1002003002, "已经存在编码为【{}】的角色"); + ErrorCode ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE = new ErrorCode(1002003004, "不能操作类型为系统内置的角色"); + + // ========== 用户模块 1002004000 ========== + ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1002004000, "用户账号已经存在"); + ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1002004001, "手机号已经存在"); + ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1002004002, "邮箱已经存在"); + ErrorCode USER_NOT_EXISTS = new ErrorCode(1002004003, "用户不存在"); + ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1002004004, "导入用户数据不能为空!"); + ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1002004005, "用户密码校验失败"); + + // ========== 部门模块 1002005000 ========== + ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1002004001, "已经存在该名字的部门"); + ErrorCode DEPT_PARENT_NOT_EXITS = new ErrorCode(1002004002,"父级部门不存在"); + ErrorCode DEPT_NOT_FOUND = new ErrorCode(1002004003, "当前部门不存在"); + ErrorCode DEPT_EXITS_CHILDREN = new ErrorCode(1002004004, "存在子部门,无法删除"); + ErrorCode DEPT_PARENT_ERROR = new ErrorCode(1002004005, "不能设置自己为父部门"); + ErrorCode DEPT_EXISTS_USER = new ErrorCode(1002004006, "部门中存在员工,无法删除"); + ErrorCode DEPT_NOT_ENABLE = new ErrorCode(1002004007, "部门不处于开启状态,不允许选择"); + ErrorCode DEPT_PARENT_IS_CHILD = new ErrorCode(1002004008, "不能设置自己的子部门为父部门"); + + // ========== 岗位模块 1002005000 ========== + ErrorCode POST_NOT_FOUND = new ErrorCode(1002005001, "当前岗位不存在"); + ErrorCode POST_NOT_ENABLE = new ErrorCode(1002005002, "岗位({}) 不处于开启状态,不允许选择"); + ErrorCode POST_NAME_DUPLICATE = new ErrorCode(1002005001, "已经存在该名字的岗位"); + ErrorCode POST_CODE_DUPLICATE = new ErrorCode(1002005001, "已经存在该标识的岗位"); + + // ========== 字典类型 1002006000 ========== + ErrorCode DICT_TYPE_NOT_EXISTS = new ErrorCode(1002006001, "当前字典类型不存在"); + ErrorCode DICT_TYPE_NOT_ENABLE = new ErrorCode(1002006002, "字典类型不处于开启状态,不允许选择"); + ErrorCode DICT_TYPE_NAME_DUPLICATE = new ErrorCode(1002006003, "已经存在该名字的字典类型"); + ErrorCode DICT_TYPE_TYPE_DUPLICATE = new ErrorCode(1002006004, "已经存在该类型的字典类型"); + ErrorCode DICT_TYPE_HAS_CHILDREN = new ErrorCode(1002006004, "无法删除,该字典类型还有字典数据"); + + // ========== 字典数据 1002007000 ========== + ErrorCode DICT_DATA_NOT_EXISTS = new ErrorCode(1002007001, "当前字典数据不存在"); + ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1002007002, "字典数据不处于开启状态,不允许选择"); + ErrorCode DICT_DATA_VALUE_DUPLICATE = new ErrorCode(1002007003, "已经存在该值的字典数据"); + + // ========== 通知公告 1002008000 ========== + ErrorCode NOTICE_NOT_FOUND = new ErrorCode(1002008001, "当前通知公告不存在"); + + // ========== 文件 1002009000 ========== + ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在"); + ErrorCode FILE_UPLOAD_FAILED = new ErrorCode(1002009002, "文件上传失败"); + ErrorCode FILE_IS_EMPTY= new ErrorCode(1002009003, "文件为空"); + + // ========== 短信渠道 1002011000 ========== + ErrorCode SMS_CHANNEL_NOT_EXISTS = new ErrorCode(1002011000, "短信渠道不存在"); + ErrorCode SMS_CHANNEL_DISABLE = new ErrorCode(1002011001, "短信渠道不处于开启状态,不允许选择"); + ErrorCode SMS_CHANNEL_HAS_CHILDREN = new ErrorCode(1002011002, "无法删除,该短信渠道还有短信模板"); + + // ========== 短信模板 1002011000 ========== + ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(1002011000, "短信模板不存在"); + ErrorCode SMS_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1002011001, "已经存在编码为【{}】的短信模板"); + + // ========== 短信发送 1002012000 ========== + ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002012000, "手机号不存在"); + ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002012001, "模板参数({})缺失"); + + // ========== 错误码模块 1002013000 ========== + ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1002013000, "错误码不存在"); + ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1002013001, "已经存在编码为【{}】的错误码"); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/common/SysSexEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/common/SysSexEnum.java new file mode 100644 index 0000000..c764a0f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/common/SysSexEnum.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.common; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 性别的枚举值 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum SysSexEnum { + + MALE(1), // 男 + FEMALE(2); // 女 + + /** + * 性别 + */ + private final Integer sex; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/dept/DeptIdEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/dept/DeptIdEnum.java new file mode 100644 index 0000000..d228a9b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/dept/DeptIdEnum.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.dept; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 部门编号枚举 + */ +@Getter +@AllArgsConstructor +public enum DeptIdEnum { + + /** + * 根节点 + */ + ROOT(0L); + + private final Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java new file mode 100644 index 0000000..8c0b4c7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.errorcode; + +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 错误码的类型枚举 + * + * @author dylan + */ +@AllArgsConstructor +@Getter +public enum SysErrorCodeTypeEnum implements IntArrayValuable { + + /** + * 自动生成 + */ + AUTO_GENERATION(1), + /** + * 手动编辑 + */ + MANUAL_OPERATION(2); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysErrorCodeTypeEnum::getType).toArray(); + + /** + * 类型 + */ + private final Integer type; + + @Override + public int[] array() { + return ARRAYS; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginLogTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginLogTypeEnum.java new file mode 100644 index 0000000..d9aa2eb --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginLogTypeEnum.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 登陆日志的类型枚举 + */ +@Getter +@AllArgsConstructor +public enum SysLoginLogTypeEnum { + + LOGIN_USERNAME(100), // 使用账号登录 + + LOGOUT_SELF(200), // 自己主动登出 + LOGOUT_TIMEOUT(201), // 超时登出 + LOGOUT_DELETE(202), // 强制退出 + ; + + /** + * 日志类型 + */ + private final Integer type; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginResultEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginResultEnum.java new file mode 100644 index 0000000..b34a9fe --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginResultEnum.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 登陆结果的枚举类 + */ +@Getter +@AllArgsConstructor +public enum SysLoginResultEnum { + + SUCCESS(0), // 成功 + BAD_CREDENTIALS(10), // 账号或密码不正确 + USER_DISABLED(20), // 用户被禁用 + CAPTCHA_NOT_FOUND(30), // 验证码不存在 + CAPTCHA_CODE_ERROR(31), // 验证码不正确 + + UNKNOWN_ERROR(100), // 未知异常 + ; + + /** + * 结果 + */ + private final Integer result; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/notice/SysNoticeTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/notice/SysNoticeTypeEnum.java new file mode 100644 index 0000000..0c8bff3 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/notice/SysNoticeTypeEnum.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.notice; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通知类型 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum SysNoticeTypeEnum { + + NOTICE(1), + ANNOUNCEMENT(2); + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuIdEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuIdEnum.java new file mode 100644 index 0000000..a82ab25 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuIdEnum.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Menu 编号枚举 + */ +@Getter +@AllArgsConstructor +public enum MenuIdEnum { + + /** + * 根节点 + */ + ROOT(0L); + + private final Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuTypeEnum.java new file mode 100644 index 0000000..213f799 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/MenuTypeEnum.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 菜单类型枚举类 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum MenuTypeEnum { + + DIR(1), // 目录 + MENU(2), // 菜单 + BUTTON(3) // 按钮 + ; + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/RoleCodeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/RoleCodeEnum.java new file mode 100644 index 0000000..ddfdd05 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/RoleCodeEnum.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 角色标识枚举 + */ +@Getter +@AllArgsConstructor +public enum RoleCodeEnum { + + ADMIN("admin"), // 超级管理员 + ; + + /** + * 角色编码 + */ + private final String key; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/SysRoleTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/SysRoleTypeEnum.java new file mode 100644 index 0000000..61b15b0 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/permission/SysRoleTypeEnum.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum SysRoleTypeEnum { + + /** + * 内置角色 + */ + SYSTEM(1), + /** + * 自定义角色 + */ + CUSTOM(2); + + private final Integer type; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsReceiveStatusEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsReceiveStatusEnum.java new file mode 100644 index 0000000..54b6d4d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsReceiveStatusEnum.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的接收状态枚举 + * + * @author 芋道源码 + * @date 2021/2/1 13:39 + */ +@Getter +@AllArgsConstructor +public enum SysSmsReceiveStatusEnum { + + INIT(0), // 初始化 + SUCCESS(10), // 接收成功 + FAILURE(20), // 接收失败 + ; + + private final int status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsSendStatusEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsSendStatusEnum.java new file mode 100644 index 0000000..de8ed50 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsSendStatusEnum.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的发送状态枚举 + * + * @author zzf + * @date 2021/2/1 13:39 + */ +@Getter +@AllArgsConstructor +public enum SysSmsSendStatusEnum { + + INIT(0), // 初始化 + SUCCESS(10), // 发送成功 + FAILURE(20), // 发送失败 + IGNORE(30), // 忽略,即不发送 + ; + + private final int status; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsTemplateTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsTemplateTypeEnum.java new file mode 100644 index 0000000..779e799 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsTemplateTypeEnum.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的模板类型枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum SysSmsTemplateTypeEnum { + + VERIFICATION_CODE(1), // 验证码 + NOTICE(2), // 通知 + PROMOTION(3), // 营销 + ; + + /** + * 类型 + */ + private final int type; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaConfig.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaConfig.java new file mode 100644 index 0000000..174efe4 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaConfig.java @@ -0,0 +1,9 @@ +package cn.iocoder.yudao.adminserver.modules.system.framework.captcha.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(CaptchaProperties.class) +public class CaptchaConfig { +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaProperties.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaProperties.java new file mode 100644 index 0000000..6eadd4d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/config/CaptchaProperties.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.adminserver.modules.system.framework.captcha.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; +import java.time.Duration; + +@ConfigurationProperties(prefix = "yudao.captcha") +@Validated +@Data +public class CaptchaProperties { + + /** + * 验证码的过期时间 + */ + @NotNull(message = "验证码的过期时间不为空") + private Duration timeout; + /** + * 验证码的高度 + */ + @NotNull(message = "验证码的高度不能为空") + private Integer height; + /** + * 验证码的宽度 + */ + @NotNull(message = "验证码的宽度不能为空") + private Integer width; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/package-info.java new file mode 100644 index 0000000..039431d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/captcha/package-info.java @@ -0,0 +1,4 @@ +/** + * 基于 Hutool captcha 库,实现验证码功能 + */ +package cn.iocoder.yudao.adminserver.modules.system.framework.captcha; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenConfiguration.java new file mode 100644 index 0000000..9f514ee --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenConfiguration.java @@ -0,0 +1,9 @@ +package cn.iocoder.yudao.adminserver.modules.system.framework.codegen.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(CodegenProperties.class) +public class CodegenConfiguration { +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenProperties.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenProperties.java new file mode 100644 index 0000000..b0f0846 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/config/CodegenProperties.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.adminserver.modules.system.framework.codegen.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Collection; + +@ConfigurationProperties(prefix = "yudao.codegen") +@Validated +@Data +public class CodegenProperties { + + /** + * 生成的 Java 代码的基础包 + */ + @NotNull(message = "Java 代码的基础包不能为空") + private String basePackage; + + /** + * 数据库名数组 + */ + @NotEmpty(message = "数据库不能为空") + private Collection dbSchemas; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/package-info.java new file mode 100644 index 0000000..e700260 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/codegen/package-info.java @@ -0,0 +1,4 @@ +/** + * 代码生成器 + */ +package cn.iocoder.yudao.adminserver.modules.system.framework.codegen; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/package-info.java new file mode 100644 index 0000000..b745ae8 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 system 模块的 framework 封装 + * + * @author 芋道源码 + */ +package cn.iocoder.yudao.adminserver.modules.system.framework; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/auth/SysUserSessionTimeoutJob.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/auth/SysUserSessionTimeoutJob.java new file mode 100644 index 0000000..4614ac6 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/auth/SysUserSessionTimeoutJob.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.adminserver.modules.system.job.auth; + +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; +import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 用户 Session 超时 Job + * + * @author 願 + */ +@Component +@Slf4j +public class SysUserSessionTimeoutJob implements JobHandler { + + @Resource + private SysUserSessionService sysUserSessionService; + + @Override + public String execute(String param) throws Exception { + // 执行过期 + Long timeoutCount = sysUserSessionService.clearSessionTimeout(); + // 返回结果,记录每次的超时数量 + return String.format("移除在线会话数量为 %s 个", timeoutCount); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/package-info.java new file mode 100644 index 0000000..b5c66a5 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/job/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.adminserver.modules.system.job; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java new file mode 100644 index 0000000..6673826 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dept/SysDeptRefreshConsumer.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.dept; + +import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.dept.SysDeptRefreshMessage; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SysDeptRefreshMessage} 的消费者 + * + * @author 芋道源码 + */ +@Component +@Slf4j +public class SysDeptRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private SysDeptService deptService; + + @Override + public void onMessage(SysDeptRefreshMessage message) { + log.info("[onMessage][收到 Dept 刷新消息]"); + deptService.initLocalCache(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java new file mode 100644 index 0000000..d7ff74d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.dict; + +import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage; +import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SysDictDataRefreshMessage} 的消费者 + * + * @author 芋道源码 + */ +@Component +@Slf4j +public class SysDictDataRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private SysDictDataService dictDataService; + + @Override + public void onMessage(SysDictDataRefreshMessage message) { + log.info("[onMessage][收到 DictData 刷新消息]"); + dictDataService.initLocalCache(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/mail/SysMailSendConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/mail/SysMailSendConsumer.java new file mode 100644 index 0000000..3862987 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/mail/SysMailSendConsumer.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.mail; + +import cn.iocoder.yudao.framework.redis.core.stream.AbstractStreamMessageListener; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.mail.SysMailSendMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class SysMailSendConsumer extends AbstractStreamMessageListener { + + @Override + public void onMessage(SysMailSendMessage message) { + log.info("[onMessage][消息内容({})]", message); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java new file mode 100644 index 0000000..3d25416 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysMenuRefreshConsumer.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission; + +import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysMenuRefreshMessage; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SysMenuRefreshMessage} 的消费者 + * + * @author 芋道源码 + */ +@Component +@Slf4j +public class SysMenuRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private SysMenuService menuService; + + @Override + public void onMessage(SysMenuRefreshMessage message) { + log.info("[onMessage][收到 Menu 刷新消息]"); + menuService.initLocalCache(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java new file mode 100644 index 0000000..fc82706 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleMenuRefreshConsumer.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission; + +import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SysRoleMenuRefreshMessage} 的消费者 + * + * @author 芋道源码 + */ +@Component +@Slf4j +public class SysRoleMenuRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private SysPermissionService permissionService; + + @Override + public void onMessage(SysRoleMenuRefreshMessage message) { + log.info("[onMessage][收到 Role 与 Menu 的关联刷新消息]"); + permissionService.initLocalCache(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java new file mode 100644 index 0000000..8bb2dee --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/permission/SysRoleRefreshConsumer.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.permission; + +import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleRefreshMessage; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SysRoleRefreshMessage} 的消费者 + * + * @author 芋道源码 + */ +@Component +@Slf4j +public class SysRoleRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private SysRoleService roleService; + + @Override + public void onMessage(SysRoleRefreshMessage message) { + log.info("[onMessage][收到 Role 刷新消息]"); + roleService.initLocalCache(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java new file mode 100644 index 0000000..21c1874 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsChannelRefreshConsumer.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms; + +import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SysSmsChannelRefreshMessage} 的消费者 + * + * @author 芋道源码 + */ +@Component +@Slf4j +public class SysSmsChannelRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private SysSmsChannelService smsChannelService; + + @Override + public void onMessage(SysSmsChannelRefreshMessage message) { + log.info("[onMessage][收到 SmsChannel 刷新消息]"); + smsChannelService.initSmsClients(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java new file mode 100644 index 0000000..68fa315 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms; + +import cn.iocoder.yudao.framework.redis.core.stream.AbstractStreamMessageListener; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SysSmsSendMessage} 的消费者 + * + * @author zzf + * @date 2021/3/9 16:35 + */ +@Component +@Slf4j +public class SysSmsSendConsumer extends AbstractStreamMessageListener { + + @Resource + private SysSmsService smsService; + + @Override + public void onMessage(SysSmsSendMessage message) { + log.info("[onMessage][消息内容({})]", message); + smsService.doSendSms(message); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java new file mode 100644 index 0000000..b083243 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms; + +import cn.iocoder.yudao.framework.redis.core.pubsub.AbstractChannelMessageListener; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SysSmsTemplateRefreshMessage} 的消费者 + * + * @author 芋道源码 + */ +@Component +@Slf4j +public class SysSmsTemplateRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private SysSmsTemplateService smsTemplateService; + + @Override + public void onMessage(SysSmsTemplateRefreshMessage message) { + log.info("[onMessage][收到 SmsTemplate 刷新消息]"); + smsTemplateService.initLocalCache(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dept/SysDeptRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dept/SysDeptRefreshMessage.java new file mode 100644 index 0000000..2aa5332 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dept/SysDeptRefreshMessage.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.message.dept; + +import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; +import lombok.Data; + +/** + * 部门数据刷新 Message + */ +@Data +public class SysDeptRefreshMessage implements ChannelMessage { + + @Override + public String getChannel() { + return "system.dept.refresh"; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dict/SysDictDataRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dict/SysDictDataRefreshMessage.java new file mode 100644 index 0000000..b4520fb --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/dict/SysDictDataRefreshMessage.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.message.dict; + +import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; +import lombok.Data; + +/** + * 字典数据数据刷新 Message + */ +@Data +public class SysDictDataRefreshMessage implements ChannelMessage { + + @Override + public String getChannel() { + return "system.dict-data.refresh"; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/mail/SysMailSendMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/mail/SysMailSendMessage.java new file mode 100644 index 0000000..cfea76b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/mail/SysMailSendMessage.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.message.mail; + +import cn.iocoder.yudao.framework.redis.core.stream.StreamMessage; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * 邮箱发送消息 + * + * @author 芋道源码 + */ +@Data +public class SysMailSendMessage implements StreamMessage { + + /** + * 邮箱地址 + */ + @NotNull(message = "邮箱地址不能为空") + private String address; + /** + * 短信模板编号 + */ + @NotNull(message = "短信模板编号不能为空") + private String templateCode; + /** + * 短信模板参数 + */ + private Map templateParams; + + /** + * 用户编号,允许空 + */ + private Integer userId; + /** + * 用户类型,允许空 + */ + private Integer userType; + + @Override + public String getStreamKey() { + return "system.mail.send"; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysMenuRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysMenuRefreshMessage.java new file mode 100644 index 0000000..73d611f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysMenuRefreshMessage.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission; + +import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; +import lombok.Data; + +/** + * 菜单数据刷新 Message + */ +@Data +public class SysMenuRefreshMessage implements ChannelMessage { + + @Override + public String getChannel() { + return "system.menu.refresh"; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java new file mode 100644 index 0000000..03e321c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleMenuRefreshMessage.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission; + +import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; +import lombok.Data; + +/** + * 角色与菜单数据刷新 Message + */ +@Data +public class SysRoleMenuRefreshMessage implements ChannelMessage { + + @Override + public String getChannel() { + return "system.role-menu.refresh"; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleRefreshMessage.java new file mode 100644 index 0000000..9ae1d94 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/permission/SysRoleRefreshMessage.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.message.permission; + +import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; +import lombok.Data; + +/** + * 角色数据刷新 Message + */ +@Data +public class SysRoleRefreshMessage implements ChannelMessage { + + @Override + public String getChannel() { + return "system.role.refresh"; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java new file mode 100644 index 0000000..7379188 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsChannelRefreshMessage.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms; + +import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; +import lombok.Data; + +/** + * 短信渠道的数据刷新 Message + */ +@Data +public class SysSmsChannelRefreshMessage implements ChannelMessage { + + @Override + public String getChannel() { + return "system.sms-channel.refresh"; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsSendMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsSendMessage.java new file mode 100644 index 0000000..f073640 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsSendMessage.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms; + +import cn.iocoder.yudao.framework.common.core.KeyValue; +import cn.iocoder.yudao.framework.redis.core.stream.StreamMessage; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 短信发送消息 + * + * @author 芋道源码 + */ +@Data +public class SysSmsSendMessage implements StreamMessage { + + /** + * 短信日志编号 + */ + @NotNull(message = "短信日志编号不能为空") + private Long logId; + /** + * 手机号 + */ + @NotNull(message = "手机号不能为空") + private String mobile; + /** + * 短信渠道编号 + */ + @NotNull(message = "短信渠道编号不能为空") + private Long channelId; + /** + * 短信 API 的模板编号 + */ + @NotNull(message = "短信 API 的模板编号不能为空") + private String apiTemplateId; + /** + * 短信模板参数 + */ + private List> templateParams; + + @Override + public String getStreamKey() { + return "system.sms.send"; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java new file mode 100644 index 0000000..9472f8b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsTemplateRefreshMessage.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms; + +import cn.iocoder.yudao.framework.redis.core.pubsub.ChannelMessage; +import lombok.Data; + +/** + * 短信模板的数据刷新 Message + */ +@Data +public class SysSmsTemplateRefreshMessage implements ChannelMessage { + + @Override + public String getChannel() { + return "system.sms-template.refresh"; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dept/SysDeptProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dept/SysDeptProducer.java new file mode 100644 index 0000000..b4c974a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dept/SysDeptProducer.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.producer.dept; + +import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.dept.SysDeptRefreshMessage; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Dept 部门相关消息的 Producer + */ +@Component +public class SysDeptProducer { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + /** + * 发送 {@link SysDeptRefreshMessage} 消息 + */ + public void sendDeptRefreshMessage() { + SysDeptRefreshMessage message = new SysDeptRefreshMessage(); + RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dict/SysDictDataProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dict/SysDictDataProducer.java new file mode 100644 index 0000000..5eb29eb --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/dict/SysDictDataProducer.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict; + +import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * DictData 字典数据相关消息的 Producer + */ +@Component +public class SysDictDataProducer { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + /** + * 发送 {@link SysDictDataRefreshMessage} 消息 + */ + public void sendDictDataRefreshMessage() { + SysDictDataRefreshMessage message = new SysDictDataRefreshMessage(); + RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysMenuProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysMenuProducer.java new file mode 100644 index 0000000..4e1e6a6 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysMenuProducer.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission; + +import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysMenuRefreshMessage; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Menu 菜单相关消息的 Producer + */ +@Component +public class SysMenuProducer { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + /** + * 发送 {@link SysMenuRefreshMessage} 消息 + */ + public void sendMenuRefreshMessage() { + SysMenuRefreshMessage message = new SysMenuRefreshMessage(); + RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysPermissionProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysPermissionProducer.java new file mode 100644 index 0000000..310fefd --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysPermissionProducer.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission; + +import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleMenuRefreshMessage; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Permission 权限相关消息的 Producer + */ +@Component +public class SysPermissionProducer { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + /** + * 发送 {@link SysRoleMenuRefreshMessage} 消息 + */ + public void sendRoleMenuRefreshMessage() { + SysRoleMenuRefreshMessage message = new SysRoleMenuRefreshMessage(); + RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysRoleProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysRoleProducer.java new file mode 100644 index 0000000..09579e7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/permission/SysRoleProducer.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission; + +import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.permission.SysRoleRefreshMessage; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Role 角色相关消息的 Producer + * + * @author 芋道源码 + */ +@Component +public class SysRoleProducer { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + /** + * 发送 {@link SysRoleRefreshMessage} 消息 + */ + public void sendRoleRefreshMessage() { + SysRoleRefreshMessage message = new SysRoleRefreshMessage(); + RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java new file mode 100644 index 0000000..53aa973 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms; + +import cn.iocoder.yudao.framework.common.core.KeyValue; +import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * Sms 短信相关消息的 Producer + * + * @author zzf + * @date 2021/3/9 16:35 + */ +@Slf4j +@Component +public class SysSmsProducer { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + /** + * 发送 {@link SysSmsSendMessage} 消息 + * + * @param logId 短信日志编号 + * @param mobile 手机号 + * @param channelId 渠道编号 + * @param apiTemplateId 短信模板编号 + * @param templateParams 短信模板参数 + */ + public void sendSmsSendMessage(Long logId, String mobile, + Long channelId, String apiTemplateId, List> templateParams) { + SysSmsSendMessage message = new SysSmsSendMessage().setLogId(logId).setMobile(mobile); + message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams); + RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message); + } + + /** + * 发送 {@link SysSmsChannelRefreshMessage} 消息 + */ + public void sendSmsChannelRefreshMessage() { + SysSmsChannelRefreshMessage message = new SysSmsChannelRefreshMessage(); + RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); + } + + /** + * 发送 {@link SysSmsTemplateRefreshMessage} 消息 + */ + public void sendSmsTemplateRefreshMessage() { + SysSmsTemplateRefreshMessage message = new SysSmsTemplateRefreshMessage(); + RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/package-info.java new file mode 100644 index 0000000..f043c0f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/package-info.java @@ -0,0 +1,7 @@ +/** + * system 包下,我们放通用业务,支撑上层的核心业务。 + * 例如说:用户、部门、权限、数据字典等等 + * + * 缩写:sys + */ +package cn.iocoder.yudao.adminserver.modules.system; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthService.java new file mode 100644 index 0000000..1ef1bdf --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthService.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.auth; + +import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; + +/** + * 认证 Service 接口 + * + * 提供用户的账号密码登陆、token 的校验等认证相关的功能 + * + * @author 芋道源码 + */ +public interface SysAuthService extends SecurityAuthFrameworkService { + + /** + * 登陆用户 + * + * @param reqVO 登陆信息 + * @param userIp 用户 IP + * @param userAgent 用户 UA + * @return 身份令牌,使用 JWT 方式 + */ + String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionService.java new file mode 100644 index 0000000..11558e9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionService.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.auth; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO; + +/** + * 在线用户 Session Service 接口 + * + * @author 芋道源码 + */ +public interface SysUserSessionService { + + /** + * 创建在线用户 Session + * + * @param loginUser 登陆用户 + * @param userIp 用户 IP + * @param userAgent 用户 UA + * @return Session 编号 + */ + String createUserSession(LoginUser loginUser, String userIp, String userAgent); + + /** + * 刷新在线用户 Session 的更新时间 + * + * @param sessionId Session 编号 + * @param loginUser 登陆用户 + */ + void refreshUserSession(String sessionId, LoginUser loginUser); + + /** + * 删除在线用户 Session + * + * @param sessionId Session 编号 + */ + void deleteUserSession(String sessionId); + + /** + * 获得 Session 编号对应的在线用户 + * + * @param sessionId Session 编号 + * @return 在线用户 + */ + LoginUser getLoginUser(String sessionId); + + /** + * 获得 Session 超时时间,单位:毫秒 + * + * @return 超时时间 + */ + Long getSessionTimeoutMillis(); + + /** + * 获得在线用户分页列表 + * + * @param reqVO 分页条件 + * @return 份额与列表 + */ + PageResult getUserSessionPage(SysUserSessionPageReqVO reqVO); + + /** + * 移除超时的在线用户 + * + * @return {@link Long } 移出的超时用户数量 + **/ + long clearSessionTimeout(); +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java new file mode 100644 index 0000000..f69c967 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java @@ -0,0 +1,218 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.auth.impl; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService; +import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; +import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService; +import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.DisabledException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.Set; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static java.util.Collections.singleton; + +/** + * Auth Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Slf4j +public class SysAuthServiceImpl implements SysAuthService { + + @Resource + @Lazy // 延迟加载,因为存在相互依赖的问题 + private AuthenticationManager authenticationManager; + @Resource + private SysUserService userService; + @Resource + private SysPermissionService permissionService; + @Resource + private SysCaptchaService captchaService; + @Resource + private SysLoginLogService loginLogService; + @Resource + private SysUserSessionService userSessionService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // 获取 username 对应的 SysUserDO + SysUserDO user = userService.getUserByUsername(username); + if (user == null) { + throw new UsernameNotFoundException(username); + } + // 创建 LoginUser 对象 + return SysAuthConvert.INSTANCE.convert(user); + } + + @Override + public LoginUser mockLogin(Long userId) { + // 获取用户编号对应的 SysUserDO + SysUserDO user = userService.getUser(userId); + if (user == null) { + throw new UsernameNotFoundException(String.valueOf(userId)); + } + // 创建 LoginUser 对象 + LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user); + loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表 + return loginUser; + } + + @Override + public String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent) { + // 判断验证码是否正确 + this.verifyCaptcha(reqVO.getUsername(), reqVO.getUuid(), reqVO.getCode()); + + // 使用账号密码,进行登陆。 + LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword()); + loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表 + + // 缓存登陆用户到 Redis 中,返回 sessionId 编号 + return userSessionService.createUserSession(loginUser, userIp, userAgent); + } + + private void verifyCaptcha(String username, String captchaUUID, String captchaCode) { + String code = captchaService.getCaptchaCode(captchaUUID); + // 验证码不存在 + if (code == null) { + // 创建登陆失败日志(验证码不存在) + this.createLoginLog(username, SysLoginResultEnum.CAPTCHA_NOT_FOUND); + throw ServiceExceptionUtil.exception(AUTH_LOGIN_CAPTCHA_NOT_FOUND); + } + // 验证码不正确 + if (!code.equals(captchaCode)) { + // 创建登陆失败日志(验证码不正确) + this.createLoginLog(username, SysLoginResultEnum.CAPTCHA_CODE_ERROR); + throw ServiceExceptionUtil.exception(AUTH_LOGIN_CAPTCHA_CODE_ERROR); + } + // 正确,所以要删除下验证码 + captchaService.deleteCaptchaCode(captchaUUID); + } + + private LoginUser login0(String username, String password) { + // 用户验证 + Authentication authentication; + try { + // 调用 Spring Security 的 AuthenticationManager#authenticate(...) 方法,使用账号密码进行认证 + // 在其内部,会调用到 loadUserByUsername 方法,获取 User 信息 + authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); + } catch (BadCredentialsException badCredentialsException) { + this.createLoginLog(username, SysLoginResultEnum.BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } catch (DisabledException disabledException) { + this.createLoginLog(username, SysLoginResultEnum.USER_DISABLED); + throw exception(AUTH_LOGIN_USER_DISABLED); + } catch (AuthenticationException authenticationException) { + log.error("[login0][username({}) 发生未知异常]", username, authenticationException); + this.createLoginLog(username, SysLoginResultEnum.UNKNOWN_ERROR); + throw exception(AUTH_LOGIN_FAIL_UNKNOWN); + } + // 登陆成功 + Assert.notNull(authentication.getPrincipal(), "Principal 不会为空"); + this.createLoginLog(username, SysLoginResultEnum.SUCCESS); + return (LoginUser) authentication.getPrincipal(); + } + + private void createLoginLog(String username, SysLoginResultEnum loginResult) { + SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO(); + reqVO.setLogType(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()); + reqVO.setTraceId(TracerUtils.getTraceId()); + reqVO.setUsername(username); + reqVO.setUserAgent(ServletUtils.getUserAgent()); + reqVO.setUserIp(ServletUtils.getClientIP()); + reqVO.setResult(loginResult.getResult()); + loginLogService.createLoginLog(reqVO); + } + + /** + * 获得 User 拥有的角色编号数组 + * + * @param userId 用户编号 + * @return 角色编号数组 + */ + private Set getUserRoleIds(Long userId) { + return permissionService.getUserRoleIds(userId, singleton(CommonStatusEnum.ENABLE.getStatus())); + } + + @Override + public void logout(String token) { + // 查询用户信息 + LoginUser loginUser = userSessionService.getLoginUser(token); + if (loginUser == null) { + return; + } + // 删除 session + userSessionService.deleteUserSession(token); + // 记录登出日子和 + this.createLogoutLog(loginUser.getUsername()); + } + + private void createLogoutLog(String username) { + SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO(); + reqVO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType()); + reqVO.setTraceId(TracerUtils.getTraceId()); + reqVO.setUsername(username); + reqVO.setUserAgent(ServletUtils.getUserAgent()); + reqVO.setUserIp(ServletUtils.getClientIP()); + reqVO.setResult(SysLoginResultEnum.SUCCESS.getResult()); + loginLogService.createLoginLog(reqVO); + } + + @Override + public LoginUser verifyTokenAndRefresh(String token) { + // 获得 LoginUser + LoginUser loginUser = userSessionService.getLoginUser(token); + if (loginUser == null) { + return null; + } + // 刷新 LoginUser 缓存 + this.refreshLoginUserCache(token, loginUser); + return loginUser; + } + + private void refreshLoginUserCache(String token, LoginUser loginUser) { + // 每 1/3 的 Session 超时时间,刷新 LoginUser 缓存 + if (System.currentTimeMillis() - loginUser.getUpdateTime().getTime() < + userSessionService.getSessionTimeoutMillis() / 3) { + return; + } + + // 重新加载 SysUserDO 信息 + SysUserDO user = userService.getUser(loginUser.getId()); + if (user == null || CommonStatusEnum.DISABLE.getStatus().equals(user.getStatus())) { + throw exception(TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登陆界面 + } + + // 刷新 LoginUser 缓存 + loginUser.setDeptId(user.getDeptId()); + loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); + userSessionService.refreshUserSession(token, loginUser); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java new file mode 100644 index 0000000..ca95fe0 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java @@ -0,0 +1,151 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.auth.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.security.config.SecurityProperties; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth.SysUserSessionMapper; +import cn.iocoder.yudao.adminserver.modules.system.dal.redis.auth.SysLoginUserRedisDAO; +import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; +import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import com.google.common.collect.Lists; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.Duration; +import java.util.*; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; + +/** + * 在线用户 Session Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class SysUserSessionServiceImpl implements SysUserSessionService { + + @Resource + private SecurityProperties securityProperties; + @Resource + private SysLoginUserRedisDAO loginUserRedisDAO; + @Resource + private SysUserSessionMapper userSessionMapper; + @Resource + private SysUserService userService; + @Resource + private SysLoginLogService loginLogService; + + @Override + public String createUserSession(LoginUser loginUser, String userIp, String userAgent) { + // 生成 Session 编号 + String sessionId = generateSessionId(); + // 写入 Redis 缓存 + loginUser.setUpdateTime(new Date()); + loginUserRedisDAO.set(sessionId, loginUser); + // 写入 DB 中 + SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) + .userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).username(loginUser.getUsername()) + .sessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))) + .build(); + userSessionMapper.insert(userSession); + // 返回 Session 编号 + return sessionId; + } + + @Override + public void refreshUserSession(String sessionId, LoginUser loginUser) { + // 写入 Redis 缓存 + loginUser.setUpdateTime(new Date()); + loginUserRedisDAO.set(sessionId, loginUser); + // 更新 DB 中 + SysUserSessionDO updateObj = SysUserSessionDO.builder().id(sessionId).build(); + updateObj.setUsername(loginUser.getUsername()); + updateObj.setUpdateTime(new Date()); + updateObj.setSessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))); + userSessionMapper.updateById(updateObj); + } + + @Override + public void deleteUserSession(String sessionId) { + // 删除 Redis 缓存 + loginUserRedisDAO.delete(sessionId); + // 删除 DB 记录 + userSessionMapper.deleteById(sessionId); + } + + @Override + public LoginUser getLoginUser(String sessionId) { + return loginUserRedisDAO.get(sessionId); + } + + @Override + public Long getSessionTimeoutMillis() { + return securityProperties.getSessionTimeout().toMillis(); + } + + @Override + public PageResult getUserSessionPage(SysUserSessionPageReqVO reqVO) { + // 处理基于用户昵称的查询 + Collection userIds = null; + if (StrUtil.isNotEmpty(reqVO.getUsername())) { + userIds = convertSet(userService.getUsersByUsername(reqVO.getUsername()), SysUserDO::getId); + if (CollUtil.isEmpty(userIds)) { + return PageResult.empty(); + } + } + return userSessionMapper.selectPage(reqVO, userIds); + } + + @Override + public long clearSessionTimeout() { + // 获取db里已经超时的用户列表 + List sessionTimeoutDOS = userSessionMapper.selectListBySessionTimoutLt(); + Map timeoutSessionDOMap = sessionTimeoutDOS + .stream() + .filter(sessionDO -> loginUserRedisDAO.get(sessionDO.getId()) == null) + .collect(Collectors.toMap(SysUserSessionDO::getId, o -> o)); + // 确认已经超时,按批次移出在线用户列表 + if (CollUtil.isNotEmpty(timeoutSessionDOMap)) { + Lists.partition(new ArrayList<>(timeoutSessionDOMap.keySet()), 100).forEach(userSessionMapper::deleteBatchIds); + //记录用户超时退出日志 + createTimeoutLogoutLog(timeoutSessionDOMap.values()); + } + return timeoutSessionDOMap.size(); + } + + private void createTimeoutLogoutLog(Collection timeoutSessionDOS) { + for (SysUserSessionDO timeoutSessionDO : timeoutSessionDOS) { + SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO(); + reqVO.setLogType(SysLoginLogTypeEnum.LOGOUT_TIMEOUT.getType()); + reqVO.setTraceId(TracerUtils.getTraceId()); + reqVO.setUsername(timeoutSessionDO.getUsername()); + reqVO.setUserAgent(timeoutSessionDO.getUserAgent()); + reqVO.setUserIp(timeoutSessionDO.getUserIp()); + reqVO.setResult(SysLoginResultEnum.SUCCESS.getResult()); + loginLogService.createLoginLog(reqVO); + } + } + + /** + * 生成 Session 编号,目前采用 UUID 算法 + * + * @return Session 编号 + */ + private static String generateSessionId() { + return IdUtil.fastSimpleUUID(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaService.java new file mode 100644 index 0000000..286a5ef --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaService.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.common; + +import cn.iocoder.yudao.adminserver.modules.system.controller.common.vo.SysCaptchaImageRespVO; + +/** + * 验证码 Service 接口 + */ +public interface SysCaptchaService { + + /** + * 获得验证码图片 + * + * @return 验证码图片 + */ + SysCaptchaImageRespVO getCaptchaImage(); + + /** + * 获得 uuid 对应的验证码 + * + * @param uuid 验证码编号 + * @return 验证码 + */ + String getCaptchaCode(String uuid); + + /** + * 删除 uuid 对应的验证码 + * + * @param uuid 验证码编号 + */ + void deleteCaptchaCode(String uuid); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/impl/SysCaptchaServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/impl/SysCaptchaServiceImpl.java new file mode 100644 index 0000000..44d291f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/common/impl/SysCaptchaServiceImpl.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.common.impl; + +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.CircleCaptcha; +import cn.hutool.core.util.IdUtil; +import cn.iocoder.yudao.adminserver.modules.system.framework.captcha.config.CaptchaProperties; +import cn.iocoder.yudao.adminserver.modules.system.controller.common.vo.SysCaptchaImageRespVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.common.SysCaptchaConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.redis.common.SysCaptchaRedisDAO; +import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 验证码 Service 实现类 + */ +@Service +public class SysCaptchaServiceImpl implements SysCaptchaService { + + @Resource + private CaptchaProperties captchaProperties; + + @Resource + private SysCaptchaRedisDAO captchaRedisDAO; + + @Override + public SysCaptchaImageRespVO getCaptchaImage() { + // 生成验证码 + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight()); + // 缓存到 Redis 中 + String uuid = IdUtil.fastSimpleUUID(); + captchaRedisDAO.set(uuid, captcha.getCode(), captchaProperties.getTimeout()); + // 返回 + return SysCaptchaConvert.INSTANCE.convert(uuid, captcha); + } + + @Override + public String getCaptchaCode(String uuid) { + return captchaRedisDAO.get(uuid); + } + + @Override + public void deleteCaptchaCode(String uuid) { + captchaRedisDAO.delete(uuid); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java new file mode 100644 index 0000000..ad57b73 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptService.java @@ -0,0 +1,96 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * 部门 Service 接口 + * + * @author 芋道源码 + */ +public interface SysDeptService { + + /** + * 初始化部门的本地缓存 + */ + void initLocalCache(); + + /** + * 创建部门 + * + * @param reqVO 部门信息 + * @return 部门编号 + */ + Long createDept(SysDeptCreateReqVO reqVO); + + /** + * 更新部门 + * + * @param reqVO 部门信息 + */ + void updateDept(SysDeptUpdateReqVO reqVO); + + /** + * 删除部门 + * + * @param id 部门编号 + */ + void deleteDept(Long id); + + /** + * 获得指定编号的部门列表 + * + * @param ids 部门编号数组 + * @return 部门列表 + */ + List getSimpleDepts(Collection ids); + + /** + * 获得指定编号的部门 Map + * + * @param ids 部门编号数组 + * @return 部门 Map + */ + default Map getDeptMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyMap(); + } + List list = getSimpleDepts(ids); + return CollectionUtils.convertMap(list, SysDeptDO::getId); + } + + /** + * 筛选部门列表 + * + * @param reqVO 筛选条件请求 VO + * @return 部门列表 + */ + List getSimpleDepts(SysDeptListReqVO reqVO); + + /** + * 获得部门信息 + * + * @param id 部门编号 + * @return 部门信息 + */ + SysDeptDO getDept(Long id); + + /** + * 获得所有子部门,从缓存中 + * + * @param parentId 部门编号 + * @param recursive 是否递归获取所有 + * @return 子部门列表 + */ + List getDeptsByParentIdFromCache(Long parentId, boolean recursive); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java new file mode 100644 index 0000000..d9a0db7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostService.java @@ -0,0 +1,89 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dept; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; + +/** + * 岗位 Service 接口 + * + * @author 芋道源码 + */ +public interface SysPostService { + + /** + * 创建岗位 + * + * @param reqVO 岗位信息 + * @return 岗位编号 + */ + Long createPost(SysPostCreateReqVO reqVO); + + /** + * 更新岗位 + * + * @param reqVO 岗位信息 + */ + void updatePost(SysPostUpdateReqVO reqVO); + + /** + * 删除岗位信息 + * + * @param id 岗位编号 + */ + void deletePost(Long id); + + /** + * 获得岗位列表 + * + * @param ids 岗位编号数组。如果为空,不进行筛选 + * @return 部门列表 + */ + default List getPosts(@Nullable Collection ids) { + return getPosts(ids, asSet(CommonStatusEnum.ENABLE.getStatus(), CommonStatusEnum.DISABLE.getStatus())); + } + + /** + * 获得符合条件的岗位列表 + * + * @param ids 岗位编号数组。如果为空,不进行筛选 + * @param statuses 状态数组。如果为空,不进行筛选 + * @return 部门列表 + */ + List getPosts(@Nullable Collection ids, @Nullable Collection statuses); + + /** + * 获得岗位分页列表 + * + * @param reqVO 分页条件 + * @return 部门分页列表 + */ + PageResult getPostPage(SysPostPageReqVO reqVO); + + /** + * 获得岗位列表 + * + * @param reqVO 查询条件 + * @return 部门列表 + */ + List getPosts(SysPostExportReqVO reqVO); + + /** + * 获得岗位信息 + * + * @param id 岗位编号 + * @return 岗位信息 + */ + SysPostDO getPost(Long id); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..cac9bf5 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysDeptServiceImpl.java @@ -0,0 +1,274 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dept.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysDeptConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysDeptMapper; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.dept.DeptIdEnum; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dept.SysDeptProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; + +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; + +/** + * 部门 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class SysDeptServiceImpl implements SysDeptService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 部门缓存 + * key:部门编号 {@link SysDeptDO#getId()} + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + @SuppressWarnings("FieldCanBeLocal") + private volatile Map deptCache; + /** + * 父部门缓存 + * key:部门编号 {@link SysDeptDO#getParentId()} + * value: 直接子部门列表 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Multimap parentDeptCache; + /** + * 缓存部门的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private SysDeptMapper deptMapper; + + @Resource + private SysDeptProducer deptProducer; + + @Override + @PostConstruct + public synchronized void initLocalCache() { + // 获取部门列表,如果有更新 + List deptList = this.loadDeptIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(deptList)) { + return; + } + + // 构建缓存 + ImmutableMap.Builder builder = ImmutableMap.builder(); + ImmutableMultimap.Builder parentBuilder = ImmutableMultimap.builder(); + deptList.forEach(sysRoleDO -> { + builder.put(sysRoleDO.getId(), sysRoleDO); + parentBuilder.put(sysRoleDO.getParentId(), sysRoleDO); + }); + // 设置缓存 + deptCache = builder.build(); + parentDeptCache = parentBuilder.build(); + assert deptList.size() > 0; // 断言,避免告警 + maxUpdateTime = deptList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); + log.info("[initLocalCache][初始化 Dept 数量为 {}]", deptList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + + /** + * 如果部门发生变化,从数据库中获取最新的全量部门。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前部门的最大更新时间 + * @return 部门列表 + */ + private List loadDeptIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadMenuIfUpdate][首次加载全量部门]"); + } else { // 判断数据库中是否有更新的部门 + if (!deptMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { + return null; + } + log.info("[loadMenuIfUpdate][增量加载全量部门]"); + } + // 第二步,如果有更新,则从数据库加载所有部门 + return deptMapper.selectList(); + } + + @Override + public Long createDept(SysDeptCreateReqVO reqVO) { + // 校验正确性 + checkCreateOrUpdate(null, reqVO.getParentId(), reqVO.getName()); + // 插入部门 + SysDeptDO dept = SysDeptConvert.INSTANCE.convert(reqVO); + deptMapper.insert(dept); + // 发送刷新消息 + deptProducer.sendDeptRefreshMessage(); + return dept.getId(); + } + + @Override + public void updateDept(SysDeptUpdateReqVO reqVO) { + // 校验正确性 + checkCreateOrUpdate(reqVO.getId(), reqVO.getParentId(), reqVO.getName()); + // 更新部门 + SysDeptDO updateObj = SysDeptConvert.INSTANCE.convert(reqVO); + deptMapper.updateById(updateObj); + // 发送刷新消息 + deptProducer.sendDeptRefreshMessage(); + } + + @Override + public void deleteDept(Long id) { + // 校验是否存在 + checkDeptExists(id); + // 校验是否有子部门 + if (deptMapper.selectCountByParentId(id) > 0) { + throw ServiceExceptionUtil.exception(DEPT_EXITS_CHILDREN); + } + // 删除部门 + deptMapper.deleteById(id); + // 发送刷新消息 + deptProducer.sendDeptRefreshMessage(); + } + + @Override + public List getSimpleDepts(Collection ids) { + return deptMapper.selectBatchIds(ids); + } + + @Override + public List getSimpleDepts(SysDeptListReqVO reqVO) { + return deptMapper.selectList(reqVO); + } + + @Override + public List getDeptsByParentIdFromCache(Long parentId, boolean recursive) { + List result = new ArrayList<>(); + // 递归,简单粗暴 + this.listDeptsByParentIdFromCache(result, parentId, + recursive ? Integer.MAX_VALUE : 1, // 如果递归获取,则无限;否则,只递归 1 次 + parentDeptCache); + return result; + } + + /** + * 递归获取所有的子部门,添加到 result 结果 + * + * @param result 结果 + * @param parentId 父编号 + * @param recursiveCount 递归次数 + * @param parentDeptMap 父部门 Map,使用缓存,避免变化 + */ + private void listDeptsByParentIdFromCache(List result, Long parentId, int recursiveCount, + Multimap parentDeptMap) { + // 递归次数为 0,结束! + if (recursiveCount == 0) { + return; + } + // 获得子部门 + Collection depts = parentDeptMap.get(parentId); + if (CollUtil.isEmpty(depts)) { + return; + } + result.addAll(depts); + // 继续递归 + depts.forEach(dept -> listDeptsByParentIdFromCache(result, dept.getId(), + recursiveCount - 1, parentDeptMap)); + } + + @Override + public SysDeptDO getDept(Long id) { + return deptMapper.selectById(id); + } + + private void checkCreateOrUpdate(Long id, Long parentId, String name) { + // 校验自己存在 + checkDeptExists(id); + // 校验父部门的有效性 + checkParentDeptEnable(id, parentId); + // 校验部门名的唯一性 + checkDeptNameUnique(id, parentId, name); + } + + private void checkParentDeptEnable(Long id, Long parentId) { + if (parentId == null || DeptIdEnum.ROOT.getId().equals(parentId)) { + return; + } + // 不能设置自己为父部门 + if (parentId.equals(id)) { + throw ServiceExceptionUtil.exception(DEPT_PARENT_ERROR); + } + // 父岗位不存在 + SysDeptDO dept = deptMapper.selectById(parentId); + if (dept == null) { + throw ServiceExceptionUtil.exception(DEPT_PARENT_NOT_EXITS); + } + // 父部门被禁用 + if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { + throw ServiceExceptionUtil.exception(DEPT_NOT_ENABLE); + } + // 父部门不能是原来的子部门 + List children = this.getDeptsByParentIdFromCache(id, true); + if (children.stream().anyMatch(dept1 -> dept1.getId().equals(parentId))) { + throw ServiceExceptionUtil.exception(DEPT_PARENT_IS_CHILD); + } + } + + private void checkDeptExists(Long id) { + if (id == null) { + return; + } + SysDeptDO dept = deptMapper.selectById(id); + if (dept == null) { + throw ServiceExceptionUtil.exception(DEPT_NOT_FOUND); + } + } + + private void checkDeptNameUnique(Long id, Long parentId, String name) { + SysDeptDO menu = deptMapper.selectByParentIdAndName(parentId, name); + if (menu == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw ServiceExceptionUtil.exception(DEPT_NAME_DUPLICATE); + } + if (!menu.getId().equals(id)) { + throw ServiceExceptionUtil.exception(DEPT_NAME_DUPLICATE); + } + } + +// @Override +// @DataScope(deptAlias = "d") +// public List selectDeptList(SysDept dept) +// { +// return deptMapper.selectDeptList(dept); +// } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..032e59a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/impl/SysPostServiceImpl.java @@ -0,0 +1,128 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dept.impl; + +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.dept.SysPostConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; + +/** + * 岗位 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class SysPostServiceImpl implements SysPostService { + + @Resource + private SysPostMapper postMapper; + + @Override + public Long createPost(SysPostCreateReqVO reqVO) { + // 校验正确性 + this.checkCreateOrUpdate(null, reqVO.getName(), reqVO.getCode()); + // 插入岗位 + SysPostDO post = SysPostConvert.INSTANCE.convert(reqVO); + postMapper.insert(post); + return post.getId(); + } + + @Override + public void updatePost(SysPostUpdateReqVO reqVO) { + // 校验正确性 + this.checkCreateOrUpdate(reqVO.getId(), reqVO.getName(), reqVO.getCode()); + // 更新岗位 + SysPostDO updateObj = SysPostConvert.INSTANCE.convert(reqVO); + postMapper.updateById(updateObj); + } + + @Override + public void deletePost(Long id) { + // 校验是否存在 + this.checkPostExists(id); + // 删除部门 + postMapper.deleteById(id); + } + + @Override + public List getPosts(Collection ids, Collection statuses) { + return postMapper.selectList(ids, statuses); + } + + @Override + public PageResult getPostPage(SysPostPageReqVO reqVO) { + return postMapper.selectPage(reqVO); + } + + @Override + public List getPosts(SysPostExportReqVO reqVO) { + return postMapper.selectList(reqVO); + } + + @Override + public SysPostDO getPost(Long id) { + return postMapper.selectById(id); + } + + private void checkCreateOrUpdate(Long id, String name, String code) { + // 校验自己存在 + checkPostExists(id); + // 校验岗位名的唯一性 + checkPostNameUnique(id, name); + // 校验岗位编码的唯一性 + checkPostCodeUnique(id, code); + } + + private void checkPostNameUnique(Long id, String name) { + SysPostDO post = postMapper.selectByName(name); + if (post == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw ServiceExceptionUtil.exception(POST_NAME_DUPLICATE); + } + if (!post.getId().equals(id)) { + throw ServiceExceptionUtil.exception(POST_NAME_DUPLICATE); + } + } + + private void checkPostCodeUnique(Long id, String code) { + SysPostDO post = postMapper.selectByCode(code); + if (post == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw ServiceExceptionUtil.exception(POST_CODE_DUPLICATE); + } + if (!post.getId().equals(id)) { + throw ServiceExceptionUtil.exception(POST_CODE_DUPLICATE); + } + } + + private void checkPostExists(Long id) { + if (id == null) { + return; + } + SysPostDO post = postMapper.selectById(id); + if (post == null) { + throw ServiceExceptionUtil.exception(POST_NOT_FOUND); + } + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java new file mode 100644 index 0000000..2045720 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dict; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO; + +import java.util.List; + +/** + * 字典数据 Service 接口 + * + * @author ruoyi + */ +public interface SysDictDataService extends DictDataFrameworkService { + + /** + * 初始化字典数据的本地缓存 + */ + void initLocalCache(); + + /** + * 创建字典数据 + * + * @param reqVO 字典数据信息 + * @return 字典数据编号 + */ + Long createDictData(SysDictDataCreateReqVO reqVO); + + /** + * 更新字典数据 + * + * @param reqVO 字典数据信息 + */ + void updateDictData(SysDictDataUpdateReqVO reqVO); + + /** + * 删除字典数据 + * + * @param id 字典数据编号 + */ + void deleteDictData(Long id); + + /** + * 获得字典数据列表 + * + * @return 字典数据全列表 + */ + List getDictDatas(); + + /** + * 获得字典数据分页列表 + * + * @param reqVO 分页请求 + * @return 字典数据分页列表 + */ + PageResult getDictDataPage(SysDictDataPageReqVO reqVO); + + /** + * 获得字典数据列表 + * + * @param reqVO 列表请求 + * @return 字典数据列表 + */ + List getDictDatas(SysDictDataExportReqVO reqVO); + + /** + * 获得字典数据详情 + * + * @param id 字典数据编号 + * @return 字典数据 + */ + SysDictDataDO getDictData(Long id); + + /** + * 获得指定字典类型的数据数量 + * + * @param dictType 字典类型 + * @return 数据数量 + */ + int countByDictType(String dictType); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeService.java new file mode 100644 index 0000000..6c3324f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeService.java @@ -0,0 +1,80 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dict; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; + +import java.util.List; + +/** + * 字典类型 Service 接口 + * + * @author 芋道源码 + */ +public interface SysDictTypeService { + + /** + * 创建字典类型 + * + * @param reqVO 字典类型信息 + * @return 字典类型编号 + */ + Long createDictType(SysDictTypeCreateReqVO reqVO); + + /** + * 更新字典类型 + * + * @param reqVO 字典类型信息 + */ + void updateDictType(SysDictTypeUpdateReqVO reqVO); + + /** + * 删除字典类型 + * + * @param id 字典类型编号 + */ + void deleteDictType(Long id); + + /** + * 获得字典类型分页列表 + * + * @param reqVO 分页请求 + * @return 字典类型分页列表 + */ + PageResult getDictTypePage(SysDictTypePageReqVO reqVO); + + /** + * 获得字典类型列表 + * + * @param reqVO 列表请求 + * @return 字典类型列表 + */ + List getDictTypeList(SysDictTypeExportReqVO reqVO); + + /** + * 获得字典类型详情 + * + * @param id 字典类型编号 + * @return 字典类型 + */ + SysDictTypeDO getDictType(Long id); + + /** + * 获得字典类型详情 + * + * @param type 字典类型 + * @return 字典类型详情 + */ + SysDictTypeDO getDictType(String type); + + /** + * 获得全部字典类型列表 + * + * @return 字典类型列表 + */ + List getDictTypeList(); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..4f23dac --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java @@ -0,0 +1,256 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dict.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictDataConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictDataMapper; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict.SysDictDataProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; +import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictTypeService; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableTable; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; + +/** + * 字典数据 Service 实现类 + * + * @author ruoyi + */ +@Service +@Slf4j +public class SysDictDataServiceImpl implements SysDictDataService { + + /** + * 排序 dictType > sort + */ + private static final Comparator COMPARATOR_TYPE_AND_SORT = Comparator + .comparing(SysDictDataDO::getDictType) + .thenComparingInt(SysDictDataDO::getSort); + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 字典数据缓存,第二个 key 使用 label + * + * key1:字典类型 dictType + * key2:字典标签 label + */ + private ImmutableTable labelDictDataCache; + /** + * 字典数据缓存,第二个 key 使用 value + * + * key1:字典类型 dictType + * key2:字典值 value + */ + private ImmutableTable valueDictDataCache; + /** + * 缓存字典数据的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private SysDictTypeService dictTypeService; + + @Resource + private SysDictDataMapper dictDataMapper; + + @Resource + private SysDictDataProducer dictDataProducer; + + @Override + @PostConstruct + public synchronized void initLocalCache() { + // 获取字典数据列表,如果有更新 + List dataList = this.loadDictDataIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(dataList)) { + return; + } + + // 构建缓存 + ImmutableTable.Builder labelDictDataBuilder = ImmutableTable.builder(); + ImmutableTable.Builder valueDictDataBuilder = ImmutableTable.builder(); + dataList.forEach(dictData -> { + labelDictDataBuilder.put(dictData.getDictType(), dictData.getLabel(), dictData); + valueDictDataBuilder.put(dictData.getDictType(), dictData.getValue(), dictData); + }); + labelDictDataCache = labelDictDataBuilder.build(); + valueDictDataCache = valueDictDataBuilder.build(); + assert dataList.size() > 0; // 断言,避免告警 + maxUpdateTime = dataList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); + log.info("[initLocalCache][缓存字典数据,数量为:{}]", dataList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + + /** + * 如果字典数据发生变化,从数据库中获取最新的全量字典数据。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前字典数据的最大更新时间 + * @return 字典数据列表 + */ + private List loadDictDataIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadDictDataIfUpdate][首次加载全量字典数据]"); + } else { // 判断数据库中是否有更新的字典数据 + if (!dictDataMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { + return null; + } + log.info("[loadDictDataIfUpdate][增量加载全量字典数据]"); + } + // 第二步,如果有更新,则从数据库加载所有字典数据 + return dictDataMapper.selectList(); + } + + @Override + public List getDictDatas() { + List list = dictDataMapper.selectList(); + list.sort(COMPARATOR_TYPE_AND_SORT); + return list; + } + + @Override + public PageResult getDictDataPage(SysDictDataPageReqVO reqVO) { + return dictDataMapper.selectPage(reqVO); + } + + @Override + public List getDictDatas(SysDictDataExportReqVO reqVO) { + List list = dictDataMapper.selectList(reqVO); + list.sort(COMPARATOR_TYPE_AND_SORT); + return list; + } + + @Override + public SysDictDataDO getDictData(Long id) { + return dictDataMapper.selectById(id); + } + + @Override + public Long createDictData(SysDictDataCreateReqVO reqVO) { + // 校验正确性 + this.checkCreateOrUpdate(null, reqVO.getValue(), reqVO.getDictType()); + // 插入字典类型 + SysDictDataDO dictData = SysDictDataConvert.INSTANCE.convert(reqVO); + dictDataMapper.insert(dictData); + // 发送刷新消息 + dictDataProducer.sendDictDataRefreshMessage(); + return dictData.getId(); + } + + @Override + public void updateDictData(SysDictDataUpdateReqVO reqVO) { + // 校验正确性 + this.checkCreateOrUpdate(reqVO.getId(), reqVO.getValue(), reqVO.getDictType()); + // 更新字典类型 + SysDictDataDO updateObj = SysDictDataConvert.INSTANCE.convert(reqVO); + dictDataMapper.updateById(updateObj); + // 发送刷新消息 + dictDataProducer.sendDictDataRefreshMessage(); + } + + @Override + public void deleteDictData(Long id) { + // 校验是否存在 + this.checkDictDataExists(id); + // 删除字典数据 + dictDataMapper.deleteById(id); + // 发送刷新消息 + dictDataProducer.sendDictDataRefreshMessage(); + } + + @Override + public int countByDictType(String dictType) { + return dictDataMapper.selectCountByDictType(dictType); + } + + private void checkCreateOrUpdate(Long id, String value, String dictType) { + // 校验自己存在 + checkDictDataExists(id); + // 校验字典类型有效 + checkDictTypeValid(dictType); + // 校验字典数据的值的唯一性 + checkDictDataValueUnique(id, dictType, value); + } + + @VisibleForTesting + public void checkDictDataValueUnique(Long id, String dictType, String value) { + SysDictDataDO dictData = dictDataMapper.selectByDictTypeAndValue(dictType, value); + if (dictData == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典数据 + if (id == null) { + throw exception(DICT_DATA_VALUE_DUPLICATE); + } + if (!dictData.getId().equals(id)) { + throw exception(DICT_DATA_VALUE_DUPLICATE); + } + } + + @VisibleForTesting + public void checkDictDataExists(Long id) { + if (id == null) { + return; + } + SysDictDataDO dictData = dictDataMapper.selectById(id); + if (dictData == null) { + throw exception(DICT_DATA_NOT_EXISTS); + } + } + + @VisibleForTesting + public void checkDictTypeValid(String type) { + SysDictTypeDO dictType = dictTypeService.getDictType(type); + if (dictType == null) { + throw exception(DICT_TYPE_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dictType.getStatus())) { + throw exception(DICT_TYPE_NOT_ENABLE); + } + } + + @Override + public DictDataRespDTO getDictDataFromCache(String type, String value) { + return SysDictDataConvert.INSTANCE.convert02(valueDictDataCache.get(type, value)); + } + + @Override + public DictDataRespDTO parseDictDataFromCache(String type, String label) { + return SysDictDataConvert.INSTANCE.convert02(labelDictDataCache.get(type, label)); + } + + @Override + public List listDictDatasFromCache(String type) { + return SysDictDataConvert.INSTANCE.convertList03(labelDictDataCache.row(type).values()); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictTypeServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..b054764 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,143 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dict.impl; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictTypeConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictTypeMapper; +import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; +import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictTypeService; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; + +/** + * 字典类型 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class SysDictTypeServiceImpl implements SysDictTypeService { + + @Resource + private SysDictDataService dictDataService; + + @Resource + private SysDictTypeMapper dictTypeMapper; + + @Override + public PageResult getDictTypePage(SysDictTypePageReqVO reqVO) { + return dictTypeMapper.selectPage(reqVO); + } + + @Override + public List getDictTypeList(SysDictTypeExportReqVO reqVO) { + return dictTypeMapper.selectList(reqVO); + } + + @Override + public SysDictTypeDO getDictType(Long id) { + return dictTypeMapper.selectById(id); + } + + @Override + public SysDictTypeDO getDictType(String type) { + return dictTypeMapper.selectByType(type); + } + + @Override + public Long createDictType(SysDictTypeCreateReqVO reqVO) { + // 校验正确性 + this.checkCreateOrUpdate(null, reqVO.getName(), reqVO.getType()); + // 插入字典类型 + SysDictTypeDO dictType = SysDictTypeConvert.INSTANCE.convert(reqVO); + dictTypeMapper.insert(dictType); + return dictType.getId(); + } + + @Override + public void updateDictType(SysDictTypeUpdateReqVO reqVO) { + // 校验正确性 + this.checkCreateOrUpdate(reqVO.getId(), reqVO.getName(), null); + // 更新字典类型 + SysDictTypeDO updateObj = SysDictTypeConvert.INSTANCE.convert(reqVO); + dictTypeMapper.updateById(updateObj); + } + + @Override + public void deleteDictType(Long id) { + // 校验是否存在 + SysDictTypeDO dictType = this.checkDictTypeExists(id); + // 校验是否有字典数据 + if (dictDataService.countByDictType(dictType.getType()) > 0) { + throw exception(DICT_TYPE_HAS_CHILDREN); + } + // 删除字典类型 + dictTypeMapper.deleteById(id); + } + + @Override + public List getDictTypeList() { + return dictTypeMapper.selectList(); + } + + private void checkCreateOrUpdate(Long id, String name, String type) { + // 校验自己存在 + checkDictTypeExists(id); + // 校验字典类型的名字的唯一性 + checkDictTypeNameUnique(id, name); + // 校验字典类型的类型的唯一性 + checkDictTypeUnique(id, type); + } + + @VisibleForTesting + public void checkDictTypeNameUnique(Long id, String name) { + SysDictTypeDO dictType = dictTypeMapper.selectByName(name); + if (dictType == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(DICT_TYPE_NAME_DUPLICATE); + } + if (!dictType.getId().equals(id)) { + throw exception(DICT_TYPE_NAME_DUPLICATE); + } + } + + @VisibleForTesting + public void checkDictTypeUnique(Long id, String type) { + SysDictTypeDO dictType = dictTypeMapper.selectByType(type); + if (dictType == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(DICT_TYPE_TYPE_DUPLICATE); + } + if (!dictType.getId().equals(id)) { + throw exception(DICT_TYPE_TYPE_DUPLICATE); + } + } + + @VisibleForTesting + public SysDictTypeDO checkDictTypeExists(Long id) { + if (id == null) { + return null; + } + SysDictTypeDO dictType = dictTypeMapper.selectById(id); + if (dictType == null) { + throw exception(DICT_TYPE_NOT_EXISTS); + } + return dictType; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeService.java new file mode 100644 index 0000000..4bcfb97 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeService.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.errorcode; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 错误码 Service 接口 + * + * @author 芋道源码 + */ +public interface SysErrorCodeService extends ErrorCodeFrameworkService { + + /** + * 创建错误码 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createErrorCode(@Valid SysErrorCodeCreateReqVO createReqVO); + + /** + * 更新错误码 + * + * @param updateReqVO 更新信息 + */ + void updateErrorCode(@Valid SysErrorCodeUpdateReqVO updateReqVO); + + /** + * 删除错误码 + * + * @param id 编号 + */ + void deleteErrorCode(Long id); + + /** + * 获得错误码 + * + * @param id 编号 + * @return 错误码 + */ + SysErrorCodeDO getErrorCode(Long id); + + /** + * 获得错误码分页 + * + * @param pageReqVO 分页查询 + * @return 错误码分页 + */ + PageResult getErrorCodePage(SysErrorCodePageReqVO pageReqVO); + + /** + * 获得错误码列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 错误码列表 + */ + List getErrorCodeList(SysErrorCodeExportReqVO exportReqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java new file mode 100644 index 0000000..178e071 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java @@ -0,0 +1,174 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.errorcode.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; +import cn.iocoder.yudao.adminserver.modules.system.convert.errorcode.SysErrorCodeConvert; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.errorcode.SysErrorCodeMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.errorcode.SysErrorCodeTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.errorcode.SysErrorCodeService; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +/** + * 错误码 Service 实现类 + * + * @author dlyan + */ +@Service +@Validated +@Slf4j +public class SysErrorCodeServiceImpl implements SysErrorCodeService { + + @Resource + private SysErrorCodeMapper errorCodeMapper; + + @Override + public Long createErrorCode(SysErrorCodeCreateReqVO createReqVO) { + // 校验 code 重复 + validateCodeDuplicate(createReqVO.getCode(), null); + + // 插入 + SysErrorCodeDO errorCode = SysErrorCodeConvert.INSTANCE.convert(createReqVO) + .setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType()); + errorCodeMapper.insert(errorCode); + // 返回 + return errorCode.getId(); + } + + @Override + public void updateErrorCode(SysErrorCodeUpdateReqVO updateReqVO) { + // 校验存在 + this.validateErrorCodeExists(updateReqVO.getId()); + // 校验 code 重复 + validateCodeDuplicate(updateReqVO.getCode(), updateReqVO.getId()); + + // 更新 + SysErrorCodeDO updateObj = SysErrorCodeConvert.INSTANCE.convert(updateReqVO) + .setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType()); + errorCodeMapper.updateById(updateObj); + } + + @Override + public void deleteErrorCode(Long id) { + // 校验存在 + this.validateErrorCodeExists(id); + // 删除 + errorCodeMapper.deleteById(id); + } + + /** + * 校验错误码的唯一字段是否重复 + * + * 是否存在相同编码的错误码 + * + * @param code 错误码编码 + * @param id 错误码编号 + */ + @VisibleForTesting + public void validateCodeDuplicate(Integer code, Long id) { + SysErrorCodeDO errorCodeDO = errorCodeMapper.selectByCode(code); + if (errorCodeDO == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的错误码 + if (id == null) { + throw exception(ERROR_CODE_DUPLICATE); + } + if (!errorCodeDO.getId().equals(id)) { + throw exception(ERROR_CODE_DUPLICATE); + } + } + + @VisibleForTesting + public void validateErrorCodeExists(Long id) { + if (errorCodeMapper.selectById(id) == null) { + throw exception(ERROR_CODE_NOT_EXISTS); + } + } + + @Override + public SysErrorCodeDO getErrorCode(Long id) { + return errorCodeMapper.selectById(id); + } + + @Override + public PageResult getErrorCodePage(SysErrorCodePageReqVO pageReqVO) { + return errorCodeMapper.selectPage(pageReqVO); + } + + @Override + public List getErrorCodeList(SysErrorCodeExportReqVO exportReqVO) { + return errorCodeMapper.selectList(exportReqVO); + } + + @Override + @Transactional + public void autoGenerateErrorCodes(List autoGenerateDTOs) { + if (CollUtil.isEmpty(autoGenerateDTOs)) { + return; + } + // 获得错误码 + List errorCodeDOs = errorCodeMapper.selectListByCodes( + convertSet(autoGenerateDTOs, ErrorCodeAutoGenerateReqDTO::getCode)); + Map errorCodeDOMap = convertMap(errorCodeDOs, SysErrorCodeDO::getCode); + + // 遍历 autoGenerateBOs 数组,逐个插入或更新。考虑到每次量级不大,就不走批量了 + autoGenerateDTOs.forEach(autoGenerateDTO -> { + SysErrorCodeDO errorCodeDO = errorCodeDOMap.get(autoGenerateDTO.getCode()); + // 不存在,则进行新增 + if (errorCodeDO == null) { + errorCodeDO = SysErrorCodeConvert.INSTANCE.convert(autoGenerateDTO) + .setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); + errorCodeMapper.insert(errorCodeDO); + return; + } + // 存在,则进行更新。更新有三个前置条件: + // 条件 1. 只更新自动生成的错误码,即 Type 为 ErrorCodeTypeEnum.AUTO_GENERATION + if (!SysErrorCodeTypeEnum.AUTO_GENERATION.getType().equals(errorCodeDO.getType())) { + return; + } + // 条件 2. 分组 applicationName 必须匹配,避免存在错误码冲突的情况 + if (!autoGenerateDTO.getApplicationName().equals(errorCodeDO.getApplicationName())) { + log.error("[autoGenerateErrorCodes][自动创建({}/{}) 错误码失败,数据库中已经存在({}/{})]", + autoGenerateDTO.getCode(), autoGenerateDTO.getApplicationName(), + errorCodeDO.getCode(), errorCodeDO.getApplicationName()); + return; + } + // 条件 3. 错误提示语存在差异 + if (autoGenerateDTO.getMessage().equals(errorCodeDO.getMessage())) { + return; + } + // 最终匹配,进行更新 + errorCodeMapper.updateById(new SysErrorCodeDO().setId(errorCodeDO.getId()).setMessage(autoGenerateDTO.getMessage())); + }); + } + + @Override + public List getErrorCodeList(String applicationName, Date minUpdateTime) { + List errorCodeDOs = errorCodeMapper.selectListByApplicationNameAndUpdateTimeGt( + applicationName, minUpdateTime); + return SysErrorCodeConvert.INSTANCE.convertList03(errorCodeDOs); + } + +} + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogService.java new file mode 100644 index 0000000..9da2570 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogService.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.logger; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO; + +import java.util.List; + +/** + * 登陆日志 Service 接口 + */ +public interface SysLoginLogService { + + /** + * 创建登陆日志 + * + * @param reqVO 日志信息 + */ + void createLoginLog(SysLoginLogCreateReqVO reqVO); + + /** + * 获得登陆日志分页 + * + * @param reqVO 分页条件 + * @return 登陆日志分页 + */ + PageResult getLoginLogPage(SysLoginLogPageReqVO reqVO); + + /** + * 获得登陆日志列表 + * + * @param reqVO 列表条件 + * @return 登陆日志列表 + */ + List getLoginLogList(SysLoginLogExportReqVO reqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogService.java new file mode 100644 index 0000000..cf3379b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogService.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.logger; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.operatelog.core.service.OperateLogFrameworkService; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; + +import java.util.List; + +/** + * 操作日志 Service 接口 + */ +public interface SysOperateLogService extends OperateLogFrameworkService { + + /** + * 获得操作日志分页列表 + * + * @param reqVO 分页条件 + * @return 操作日志分页列表 + */ + PageResult getOperateLogPage(SysOperateLogPageReqVO reqVO); + + /** + * 获得操作日志列表 + * + * @param reqVO 列表条件 + * @return 日志列表 + */ + List getOperateLogs(SysOperateLogExportReqVO reqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java new file mode 100644 index 0000000..8b28249 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.logger.impl; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysLoginLogConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysLoginLogMapper; +import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 登陆日志 Service 实现 + */ +@Service +public class SysLoginLogServiceImpl implements SysLoginLogService { + + @Resource + private SysLoginLogMapper loginLogMapper; + + @Override + public void createLoginLog(SysLoginLogCreateReqVO reqVO) { + SysLoginLogDO loginLog = SysLoginLogConvert.INSTANCE.convert(reqVO); + loginLogMapper.insert(loginLog); + } + + @Override + public PageResult getLoginLogPage(SysLoginLogPageReqVO reqVO) { + return loginLogMapper.selectPage(reqVO); + } + + @Override + public List getLoginLogList(SysLoginLogExportReqVO reqVO) { + return loginLogMapper.selectList(reqVO); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysOperateLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysOperateLogServiceImpl.java new file mode 100644 index 0000000..69c684e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysOperateLogServiceImpl.java @@ -0,0 +1,85 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.logger.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysOperateLogConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysOperateLogMapper; +import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysOperateLogService; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.framework.common.util.string.StrUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.AsyncResult; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.Future; + +import static cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; +import static cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO.RESULT_MAX_LENGTH; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Service +@Slf4j +public class SysOperateLogServiceImpl implements SysOperateLogService { + + @Resource + private SysOperateLogMapper operateLogMapper; + + @Resource + private SysUserService userService; + + @Override + @Async + public Future createOperateLogAsync(OperateLogCreateReqDTO reqVO) { + boolean success = false; + try { + SysOperateLogDO logDO = SysOperateLogConvert.INSTANCE.convert(reqVO); + logDO.setJavaMethodArgs(StrUtils.maxLength(logDO.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH)); + logDO.setResultData(StrUtils.maxLength(logDO.getResultData(), RESULT_MAX_LENGTH)); + success = operateLogMapper.insert(logDO) == 1; + } catch (Throwable throwable) { + // 仅仅打印日志,不对外抛出。原因是,还是要保留现场数据。 + log.error("[createOperateLogAsync][记录操作日志异常,日志为 ({})]", reqVO, throwable); + } + return new AsyncResult<>(success); + } + + @Override + public PageResult getOperateLogPage(SysOperateLogPageReqVO reqVO) { + // 处理基于用户昵称的查询 + Collection userIds = null; + if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { + userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId); + if (CollUtil.isEmpty(userIds)) { + return PageResult.empty(); + } + } + // 查询分页 + return operateLogMapper.selectPage(reqVO, userIds); + } + + @Override + public List getOperateLogs(SysOperateLogExportReqVO reqVO) { + // 处理基于用户昵称的查询 + Collection userIds = null; + if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { + userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId); + if (CollUtil.isEmpty(userIds)) { + return Collections.emptyList(); + } + } + // 查询列表 + return operateLogMapper.selectList(reqVO, userIds); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeService.java new file mode 100644 index 0000000..ee4ecdd --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeService.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.notice; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice.SysNoticeDO; + +/** + * 通知公告 Service 接口 + */ +public interface SysNoticeService { + + /** + * 创建岗位公告公告 + * + * @param reqVO 岗位公告公告信息 + * @return 岗位公告公告编号 + */ + Long createNotice(SysNoticeCreateReqVO reqVO); + + /** + * 更新岗位公告公告 + * + * @param reqVO 岗位公告公告信息 + */ + void updateNotice(SysNoticeUpdateReqVO reqVO); + + /** + * 删除岗位公告公告信息 + * + * @param id 岗位公告公告编号 + */ + void deleteNotice(Long id); + + /** + * 获得岗位公告公告分页列表 + * + * @param reqVO 分页条件 + * @return 部门分页列表 + */ + PageResult pageNotices(SysNoticePageReqVO reqVO); + + /** + * 获得岗位公告公告信息 + * + * @param id 岗位公告公告编号 + * @return 岗位公告公告信息 + */ + SysNoticeDO getNotice(Long id); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/impl/SysNoticeServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/impl/SysNoticeServiceImpl.java new file mode 100644 index 0000000..2cb770b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/impl/SysNoticeServiceImpl.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.notice.impl; + +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.notice.SysNoticeConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.notice.SysNoticeMapper; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice.SysNoticeDO; +import cn.iocoder.yudao.adminserver.modules.system.service.notice.SysNoticeService; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.NOTICE_NOT_FOUND; + +/** + * 通知公告 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class SysNoticeServiceImpl implements SysNoticeService { + + @Resource + private SysNoticeMapper noticeMapper; + + @Override + public Long createNotice(SysNoticeCreateReqVO reqVO) { + SysNoticeDO notice = SysNoticeConvert.INSTANCE.convert(reqVO); + noticeMapper.insert(notice); + return notice.getId(); + } + + @Override + public void updateNotice(SysNoticeUpdateReqVO reqVO) { + // 校验是否存在 + this.checkNoticeExists(reqVO.getId()); + // 更新通知公告 + SysNoticeDO updateObj = SysNoticeConvert.INSTANCE.convert(reqVO); + noticeMapper.updateById(updateObj); + } + + @Override + public void deleteNotice(Long id) { + // 校验是否存在 + this.checkNoticeExists(id); + // 删除通知公告 + noticeMapper.deleteById(id); + } + + @Override + public PageResult pageNotices(SysNoticePageReqVO reqVO) { + return noticeMapper.selectPage(reqVO); + } + + @Override + public SysNoticeDO getNotice(Long id) { + return noticeMapper.selectById(id); + } + + @VisibleForTesting + public void checkNoticeExists(Long id) { + if (id == null) { + return; + } + SysNoticeDO notice = noticeMapper.selectById(id); + if (notice == null) { + throw ServiceExceptionUtil.exception(NOTICE_NOT_FOUND); + } + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuService.java new file mode 100644 index 0000000..5979f16 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuService.java @@ -0,0 +1,100 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.permission; + +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuListReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; + +import java.util.Collection; +import java.util.List; + +/** + * 菜单 Service 接口 + * + * @author 芋道源码 + */ +public interface SysMenuService { + + /** + * 初始化菜单的本地缓存 + */ + void initLocalCache(); + + /** + * 创建菜单 + * + * @param reqVO 菜单信息 + * @return 创建出来的菜单编号 + */ + Long createMenu(SysMenuCreateReqVO reqVO); + + /** + * 更新菜单 + * + * @param reqVO 菜单信息 + */ + void updateMenu(SysMenuUpdateReqVO reqVO); + + /** + * 删除菜单 + * + * @param id 菜单编号 + */ + void deleteMenu(Long id); + + /** + * 获得所有菜单列表 + * + * @return 菜单列表 + */ + List getMenus(); + + /** + * 筛选菜单列表 + * + * @param reqVO 筛选条件请求 VO + * @return 菜单列表 + */ + List getMenus(SysMenuListReqVO reqVO); + + /** + * 获得所有菜单,从缓存中 + * + * 任一参数为空时,则返回为空 + * + * @param menuTypes 菜单类型数组 + * @param menusStatuses 菜单状态数组 + * @return 菜单列表 + */ + List listMenusFromCache(Collection menuTypes, Collection menusStatuses); + + /** + * 获得指定编号的菜单数组,从缓存中 + * + * 任一参数为空时,则返回为空 + * + * @param menuIds 菜单编号数组 + * @param menuTypes 菜单类型数组 + * @param menusStatuses 菜单状态数组 + * @return 菜单数组 + */ + List listMenusFromCache(Collection menuIds, Collection menuTypes, + Collection menusStatuses); + + /** + * 获得权限对应的菜单数组 + * + * @param permission 权限标识 + * @return 数组 + */ + List getMenuListByPermissionFromCache(String permission); + + /** + * 获得菜单 + * + * @param id 菜单编号 + * @return 菜单 + */ + SysMenuDO getMenu(Long id); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java new file mode 100644 index 0000000..e159f95 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java @@ -0,0 +1,109 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.permission; + +import cn.iocoder.yudao.framework.security.core.service.SecurityPermissionFrameworkService; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * 权限 Service 接口 + * + * 提供用户-角色、角色-菜单、角色-部门的关联权限处理 + * + * @author 芋道源码 + */ +public interface SysPermissionService extends SecurityPermissionFrameworkService { + + /** + * 初始化权限的本地缓存 + */ + void initLocalCache(); + + /** + * 获得角色们拥有的菜单列表,从缓存中获取 + * + * 任一参数为空时,则返回为空 + * + * @param roleIds 角色编号数组 + * @param menuTypes 菜单类型数组 + * @param menusStatuses 菜单状态数组 + * @return 菜单列表 + */ + List getRoleMenusFromCache(Collection roleIds, Collection menuTypes, + Collection menusStatuses); + + /** + * 获得用户拥有的角色编号集合 + * + * @param userId 用户编号 + * @param roleStatuses 角色状态集合. 允许为空,为空时不过滤 + * @return 角色编号集合 + */ + Set getUserRoleIds(Long userId, @Nullable Collection roleStatuses); + + /** + * 获得角色拥有的菜单编号集合 + * + * @param roleId 角色编号 + * @return 菜单编号集合 + */ + Set listRoleMenuIds(Long roleId); + + /** + * 设置角色菜单 + * + * @param roleId 角色编号 + * @param menuIds 菜单编号集合 + */ + void assignRoleMenu(Long roleId, Set menuIds); + + /** + * 获得用户拥有的角色编号集合 + * + * @param userId 用户编号 + * @return 角色编号集合 + */ + Set listUserRoleIs(Long userId); + + /** + * 设置用户角色 + * + * @param userId 角色编号 + * @param roleIds 角色编号集合 + */ + void assignUserRole(Long userId, Set roleIds); + + /** + * 设置角色的数据权限 + * + * @param roleId 角色编号 + * @param dataScope 数据范围 + * @param dataScopeDeptIds 部门编号数组 + */ + void assignRoleDataScope(Long roleId, Integer dataScope, Set dataScopeDeptIds); + + /** + * 处理角色删除时,删除关联授权数据 + * + * @param roleId 角色编号 + */ + void processRoleDeleted(Long roleId); + + /** + * 处理菜单删除时,删除关联授权数据 + * + * @param menuId 菜单编号 + */ + void processMenuDeleted(Long menuId); + + /** + * 处理用户删除是,删除关联授权数据 + * + * @param userId 用户编号 + */ + void processUserDeleted(Long userId); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java new file mode 100644 index 0000000..4f26721 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleService.java @@ -0,0 +1,132 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.permission; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRolePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * 角色 Service 接口 + * + * @author 芋道源码 + */ +public interface SysRoleService { + + /** + * 初始化角色的本地缓存 + */ + void initLocalCache(); + + /** + * 创建角色 + * + * @param reqVO 创建角色信息 + * @return 角色编号 + */ + Long createRole(SysRoleCreateReqVO reqVO); + + /** + * 更新角色 + * + * @param reqVO 更新角色信息 + */ + void updateRole(SysRoleUpdateReqVO reqVO); + + /** + * 删除角色 + * + * @param id 角色编号 + */ + void deleteRole(Long id); + + /** + * 更新角色状态 + * + * @param id 角色编号 + * @param status 状态 + */ + void updateRoleStatus(Long id, Integer status); + + /** + * 设置角色的数据权限 + * + * @param id 角色编号 + * @param dataScope 数据范围 + * @param dataScopeDeptIds 部门编号数组 + */ + void updateRoleDataScope(Long id, Integer dataScope, Set dataScopeDeptIds); + + /** + * 获得角色,从缓存中 + * + * @param id 角色编号 + * @return 角色 + */ + SysRoleDO getRoleFromCache(Long id); + + /** + * 获得角色列表 + * + * @param statuses 筛选的状态。允许空,空时不筛选 + * @return 角色列表 + */ + List getRoles(@Nullable Collection statuses); + + /** + * 获得角色数组,从缓存中 + * + * @param ids 角色编号数组 + * @return 角色数组 + */ + List getRolesFromCache(Collection ids); + + /** + * 判断角色数组中,是否有管理员 + * + * @param roleList 角色数组 + * @return 是否有管理员 + */ + boolean hasAnyAdmin(Collection roleList); + + /** + * 判断角色编号数组中,是否有管理员 + * + * @param ids 角色编号数组 + * @return 是否有管理员 + */ + default boolean hasAnyAdmin(Set ids) { + return hasAnyAdmin(getRolesFromCache(ids)); + } + + /** + * 获得角色 + * + * @param id 角色编号 + * @return 角色 + */ + SysRoleDO getRole(Long id); + + /** + * 获得角色分页 + * + * @param reqVO 角色分页查询 + * @return 角色分页结果 + */ + PageResult getRolePage(SysRolePageReqVO reqVO); + + /** + * 获得角色列表 + * + * @param reqVO 列表查询 + * @return 角色列表 + */ + List getRoles(SysRoleExportReqVO reqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysMenuServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..3920022 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysMenuServiceImpl.java @@ -0,0 +1,311 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.permission.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuListReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.permission.SysMenuConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysMenuMapper; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuIdEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysMenuProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; + +/** + * 菜单 Service 实现 + * + * @author 芋道源码 + */ +@Service +@Slf4j +public class SysMenuServiceImpl implements SysMenuService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 菜单缓存 + * key:菜单编号 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Map menuCache; + /** + * 权限与菜单缓存 + * key:权限 {@link SysMenuDO#getPermission()} + * value:SysMenuDO 数组,因为一个权限可能对应多个 SysMenuDO 对象 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Multimap permissionMenuCache; + /** + * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private SysMenuMapper menuMapper; + @Resource + private SysPermissionService permissionService; + + @Resource + private SysMenuProducer menuProducer; + + /** + * 初始化 {@link #menuCache} 和 {@link #permissionMenuCache} 缓存 + */ + @Override + @PostConstruct + public synchronized void initLocalCache() { + // 获取菜单列表,如果有更新 + List menuList = this.loadMenuIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(menuList)) { + return; + } + + // 构建缓存 + ImmutableMap.Builder menuCacheBuilder = ImmutableMap.builder(); + ImmutableMultimap.Builder permMenuCacheBuilder = ImmutableMultimap.builder(); + menuList.forEach(menuDO -> { + menuCacheBuilder.put(menuDO.getId(), menuDO); + permMenuCacheBuilder.put(menuDO.getPermission(), menuDO); + }); + menuCache = menuCacheBuilder.build(); + permissionMenuCache = permMenuCacheBuilder.build(); + assert menuList.size() > 0; // 断言,避免告警 + maxUpdateTime = menuList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); + log.info("[initLocalCache][缓存菜单,数量为:{}]", menuList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + + /** + * 如果菜单发生变化,从数据库中获取最新的全量菜单。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前菜单的最大更新时间 + * @return 菜单列表 + */ + private List loadMenuIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadMenuIfUpdate][首次加载全量菜单]"); + } else { // 判断数据库中是否有更新的菜单 + if (!menuMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { + return null; + } + log.info("[loadMenuIfUpdate][增量加载全量菜单]"); + } + // 第二步,如果有更新,则从数据库加载所有菜单 + return menuMapper.selectList(); + } + + @Override + public Long createMenu(SysMenuCreateReqVO reqVO) { + // 校验父菜单存在 + checkParentResource(reqVO.getParentId(), null); + // 校验菜单(自己) + checkResource(reqVO.getParentId(), reqVO.getName(), null); + // 插入数据库 + SysMenuDO menu = SysMenuConvert.INSTANCE.convert(reqVO); + initMenuProperty(menu); + menuMapper.insert(menu); + // 发送刷新消息 + menuProducer.sendMenuRefreshMessage(); + // 返回 + return menu.getId(); + } + + @Override + public void updateMenu(SysMenuUpdateReqVO reqVO) { + // 校验更新的菜单是否存在 + if (menuMapper.selectById(reqVO.getId()) == null) { + throw ServiceExceptionUtil.exception(MENU_NOT_EXISTS); + } + // 校验父菜单存在 + checkParentResource(reqVO.getParentId(), reqVO.getId()); + // 校验菜单(自己) + checkResource(reqVO.getParentId(), reqVO.getName(), reqVO.getId()); + // 更新到数据库 + SysMenuDO updateObject = SysMenuConvert.INSTANCE.convert(reqVO); + initMenuProperty(updateObject); + menuMapper.updateById(updateObject); + // 发送刷新消息 + menuProducer.sendMenuRefreshMessage(); + } + + /** + * 删除菜单 + * + * @param menuId 菜单编号 + */ + @Transactional(rollbackFor = Exception.class) + public void deleteMenu(Long menuId) { + // 校验是否还有子菜单 + if (menuMapper.selectCountByParentId(menuId) > 0) { + throw ServiceExceptionUtil.exception(MENU_EXISTS_CHILDREN); + } + // 校验删除的菜单是否存在 + if (menuMapper.selectById(menuId) == null) { + throw ServiceExceptionUtil.exception(MENU_NOT_EXISTS); + } + // 标记删除 + menuMapper.deleteById(menuId); + // 删除授予给角色的权限 + permissionService.processMenuDeleted(menuId); + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + menuProducer.sendMenuRefreshMessage(); + } + + }); + } + + @Override + public List getMenus() { + return menuMapper.selectList(); + } + + @Override + public List getMenus(SysMenuListReqVO reqVO) { + return menuMapper.selectList(reqVO); + } + + @Override + public List listMenusFromCache(Collection menuTypes, Collection menusStatuses) { + // 任一一个参数为空,则返回空 + if (CollectionUtils.isAnyEmpty(menuTypes, menusStatuses)) { + return Collections.emptyList(); + } + // 创建新数组,避免缓存被修改 + return menuCache.values().stream().filter(menu -> menuTypes.contains(menu.getType()) + && menusStatuses.contains(menu.getStatus())) + .collect(Collectors.toList()); + } + + @Override + public List listMenusFromCache(Collection menuIds, Collection menuTypes, + Collection menusStatuses) { + // 任一一个参数为空,则返回空 + if (CollectionUtils.isAnyEmpty(menuIds, menuTypes, menusStatuses)) { + return Collections.emptyList(); + } + return menuCache.values().stream().filter(menu -> menuIds.contains(menu.getId()) + && menuTypes.contains(menu.getType()) + && menusStatuses.contains(menu.getStatus())) + .collect(Collectors.toList()); + } + + @Override + public List getMenuListByPermissionFromCache(String permission) { + return new ArrayList<>(permissionMenuCache.get(permission)); + } + + @Override + public SysMenuDO getMenu(Long id) { + return menuMapper.selectById(id); + } + + /** + * 校验父菜单是否合法 + * + * 1. 不能设置自己为父菜单 + * 2. 父菜单不存在 + * 3. 父菜单必须是 {@link MenuTypeEnum#MENU} 菜单类型 + * + * @param parentId 父菜单编号 + * @param childId 当前菜单编号 + */ + @VisibleForTesting + public void checkParentResource(Long parentId, Long childId) { + if (parentId == null || MenuIdEnum.ROOT.getId().equals(parentId)) { + return; + } + // 不能设置自己为父菜单 + if (parentId.equals(childId)) { + throw ServiceExceptionUtil.exception(MENU_PARENT_ERROR); + } + SysMenuDO menu = menuMapper.selectById(parentId); + // 父菜单不存在 + if (menu == null) { + throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_EXISTS); + } + // 父菜单必须是目录或者菜单类型 + if (!MenuTypeEnum.DIR.getType().equals(menu.getType()) + && !MenuTypeEnum.MENU.getType().equals(menu.getType())) { + throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_DIR_OR_MENU); + } + } + + /** + * 校验菜单是否合法 + * + * 1. 校验相同父菜单编号下,是否存在相同的菜单名 + * + * @param name 菜单名字 + * @param parentId 父菜单编号 + * @param id 菜单编号 + */ + @VisibleForTesting + public void checkResource(Long parentId, String name, Long id) { + SysMenuDO menu = menuMapper.selectByParentIdAndName(parentId, name); + if (menu == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的菜单 + if (id == null) { + throw ServiceExceptionUtil.exception(MENU_NAME_DUPLICATE); + } + if (!menu.getId().equals(id)) { + throw ServiceExceptionUtil.exception(MENU_NAME_DUPLICATE); + } + } + + /** + * 初始化菜单的通用属性。 + * + * 例如说,只有目录或者菜单类型的菜单,才设置 icon + * + * @param menu 菜单 + */ + private void initMenuProperty(SysMenuDO menu) { + // 菜单为按钮类型时,无需 component、icon、path 属性,进行置空 + if (MenuTypeEnum.BUTTON.getType().equals(menu.getType())) { + menu.setComponent(""); + menu.setIcon(""); + menu.setPath(""); + } + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java new file mode 100644 index 0000000..64bf04f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java @@ -0,0 +1,332 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.permission.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; + +/** + * 权限 Service 实现类 + * + * @author 芋道源码 + */ +@Service("ss") // 使用 Spring Security 的缩写,方便食用 +@Slf4j +public class SysPermissionServiceImpl implements SysPermissionService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 角色编号与菜单编号的缓存映射 + * key:角色编号 + * value:菜单编号的数组 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Multimap roleMenuCache; + /** + * 菜单编号与角色编号的缓存映射 + * key:菜单编号 + * value:角色编号的数组 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Multimap menuRoleCache; + /** + * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private SysRoleMenuMapper roleMenuMapper; + @Resource + private SysUserRoleMapper userRoleMapper; + + @Resource + private SysRoleService roleService; + @Resource + private SysMenuService menuService; + + @Resource + private SysPermissionProducer permissionProducer; + + /** + * 初始化 {@link #roleMenuCache} 和 {@link #menuRoleCache} 缓存 + */ + @Override + @PostConstruct + public void initLocalCache() { + Date now = new Date(); + // 获取角色与菜单的关联列表,如果有更新 + List roleMenuList = this.loadRoleMenuIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(roleMenuList)) { + return; + } + + // 初始化 roleMenuCache 和 menuRoleCache 缓存 + ImmutableMultimap.Builder roleMenuCacheBuilder = ImmutableMultimap.builder(); + ImmutableMultimap.Builder menuRoleCacheBuilder = ImmutableMultimap.builder(); + roleMenuList.forEach(roleMenuDO -> { + roleMenuCacheBuilder.put(roleMenuDO.getRoleId(), roleMenuDO.getMenuId()); + menuRoleCacheBuilder.put(roleMenuDO.getMenuId(), roleMenuDO.getRoleId()); + }); + roleMenuCache = roleMenuCacheBuilder.build(); + menuRoleCache = menuRoleCacheBuilder.build(); + assert roleMenuList.size() > 0; // 断言,避免告警 + maxUpdateTime = now; + log.info("[initLocalCache][初始化角色与菜单的关联数量为 {}]", roleMenuList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + + /** + * 如果角色与菜单的关联发生变化,从数据库中获取最新的全量角色与菜单的关联。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前角色与菜单的关联的最大更新时间 + * @return 角色与菜单的关联列表 + */ + private List loadRoleMenuIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadRoleMenuIfUpdate][首次加载全量角色与菜单的关联]"); + } else { // 判断数据库中是否有更新的角色与菜单的关联 + if (Objects.isNull(roleMenuMapper.selectExistsByUpdateTimeAfter(maxUpdateTime))) { + return null; + } + log.info("[loadRoleMenuIfUpdate][增量加载全量角色与菜单的关联]"); + } + // 第二步,如果有更新,则从数据库加载所有角色与菜单的关联 + return roleMenuMapper.selectList(); + } + + @Override + public List getRoleMenusFromCache(Collection roleIds, Collection menuTypes, + Collection menusStatuses) { + // 任一一个参数为空时,不返回任何菜单 + if (CollectionUtils.isAnyEmpty(roleIds, menusStatuses, menusStatuses)) { + return Collections.emptyList(); + } + // 判断角色是否包含管理员 + List roleList = roleService.getRolesFromCache(roleIds); + boolean hasAdmin = roleService.hasAnyAdmin(roleList); + // 获得角色拥有的菜单关联 + if (hasAdmin) { // 管理员,获取到全部 + return menuService.listMenusFromCache(menuTypes, menusStatuses); + } + List menuIds = MapUtils.getList(roleMenuCache, roleIds); + return menuService.listMenusFromCache(menuIds, menuTypes, menusStatuses); + } + + @Override + public Set getUserRoleIds(Long userId, Collection roleStatuses) { + List userRoleList = userRoleMapper.selectListByUserId(userId); + // 过滤角色状态 + if (CollectionUtil.isNotEmpty(roleStatuses)) { + userRoleList.removeIf(userRoleDO -> { + SysRoleDO role = roleService.getRoleFromCache(userRoleDO.getRoleId()); + return role == null || !roleStatuses.contains(role.getStatus()); + }); + } + return CollectionUtils.convertSet(userRoleList, SysUserRoleDO::getRoleId); + } + + @Override + public Set listRoleMenuIds(Long roleId) { + // 如果是管理员的情况下,获取全部菜单编号 + SysRoleDO role = roleService.getRole(roleId); + if (roleService.hasAnyAdmin(Collections.singletonList(role))) { + return CollectionUtils.convertSet(menuService.getMenus(), SysMenuDO::getId); + } + // 如果是非管理员的情况下,获得拥有的菜单编号 + return CollectionUtils.convertSet(roleMenuMapper.selectListByRoleId(roleId), + SysRoleMenuDO::getMenuId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void assignRoleMenu(Long roleId, Set menuIds) { + // 获得角色拥有菜单编号 + Set dbMenuIds = CollectionUtils.convertSet(roleMenuMapper.selectListByRoleId(roleId), + SysRoleMenuDO::getMenuId); + // 计算新增和删除的菜单编号 + Collection createMenuIds = CollUtil.subtract(menuIds, dbMenuIds); + Collection deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIds); + // 执行新增和删除。对于已经授权的菜单,不用做任何处理 + if (!CollectionUtil.isEmpty(createMenuIds)) { + roleMenuMapper.insertList(roleId, createMenuIds); + } + if (!CollectionUtil.isEmpty(deleteMenuIds)) { + roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds); + } + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + permissionProducer.sendRoleMenuRefreshMessage(); + } + + }); + } + + @Override + public Set listUserRoleIs(Long userId) { + return CollectionUtils.convertSet(userRoleMapper.selectListByUserId(userId), + SysUserRoleDO::getRoleId); + } + + @Override + public void assignUserRole(Long userId, Set roleIds) { + // 获得角色拥有角色编号 + Set dbRoleIds = CollectionUtils.convertSet(userRoleMapper.selectListByUserId(userId), + SysUserRoleDO::getRoleId); + // 计算新增和删除的角色编号 + Collection createRoleIds = CollUtil.subtract(roleIds, dbRoleIds); + Collection deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIds); + // 执行新增和删除。对于已经授权的角色,不用做任何处理 + if (!CollectionUtil.isEmpty(createRoleIds)) { + userRoleMapper.insertList(userId, createRoleIds); + } + if (!CollectionUtil.isEmpty(deleteMenuIds)) { + userRoleMapper.deleteListByUserIdAndRoleIdIds(userId, deleteMenuIds); + } + } + + @Override + public void assignRoleDataScope(Long roleId, Integer dataScope, Set dataScopeDeptIds) { + roleService.updateRoleDataScope(roleId, dataScope, dataScopeDeptIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void processRoleDeleted(Long roleId) { + // 标记删除 UserRole + userRoleMapper.deleteListByRoleId(roleId); + // 标记删除 RoleMenu + roleMenuMapper.deleteListByRoleId(roleId); + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + permissionProducer.sendRoleMenuRefreshMessage(); + } + + }); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void processMenuDeleted(Long menuId) { + roleMenuMapper.deleteListByMenuId(menuId); + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + permissionProducer.sendRoleMenuRefreshMessage(); + } + + }); + } + + @Override + public void processUserDeleted(Long userId) { + userRoleMapper.deleteListByUserId(userId); + } + + @Override + public boolean hasPermission(String permission) { + return hasAnyPermissions(permission); + } + + @Override + public boolean hasAnyPermissions(String... permissions) { + // 如果为空,说明已经有权限 + if (ArrayUtil.isEmpty(permissions)) { + return true; + } + + // 获得当前登陆的角色。如果为空,说明没有权限 + Set roleIds = SecurityFrameworkUtils.getLoginUserRoleIds(); + if (CollUtil.isEmpty(roleIds)) { + return false; + } + // 判断是否是超管。如果是,当然符合条件 + if (roleService.hasAnyAdmin(roleIds)) { + return true; + } + + // 遍历权限,判断是否有一个满足 + return Arrays.stream(permissions).anyMatch(permission -> { + List menuList = menuService.getMenuListByPermissionFromCache(permission); + // 采用严格模式,如果权限找不到对应的 Menu 的话,认为 + if (CollUtil.isEmpty(menuList)) { + return false; + } + // 获得是否拥有该权限,任一一个 + return menuList.stream().anyMatch(menu -> CollUtil.containsAny(roleIds, + menuRoleCache.get(menu.getId()))); + }); + } + + @Override + public boolean hasRole(String role) { + return hasAnyRoles(role); + } + + @Override + public boolean hasAnyRoles(String... roles) { + // 如果为空,说明已经有权限 + if (ArrayUtil.isEmpty(roles)) { + return true; + } + + // 获得当前登陆的角色。如果为空,说明没有权限 + Set roleIds = SecurityFrameworkUtils.getLoginUserRoleIds(); + if (CollUtil.isEmpty(roleIds)) { + return false; + } + // 判断是否是超管。如果是,当然符合条件 + if (roleService.hasAnyAdmin(roleIds)) { + return true; + } + Set userRoles = CollectionUtils.convertSet(roleService.getRolesFromCache(roleIds), + SysRoleDO::getCode); + return CollUtil.containsAny(userRoles, Sets.newHashSet(roles)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..c233f4f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysRoleServiceImpl.java @@ -0,0 +1,290 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.permission.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRolePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.permission.SysRoleConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMapper; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.permission.RoleCodeEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.permission.SysRoleTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysRoleProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableMap; +import lombok.extern.slf4j.Slf4j; +import org.springframework.lang.Nullable; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; +import org.springframework.util.StringUtils; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; + +/** + * 角色 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Slf4j +public class SysRoleServiceImpl implements SysRoleService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 角色缓存 + * key:角色编号 {@link SysRoleDO#getId()} + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Map roleCache; + /** + * 缓存角色的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private SysPermissionService permissionService; + + @Resource + private SysRoleMapper roleMapper; + + @Resource + private SysRoleProducer roleProducer; + + /** + * 初始化 {@link #roleCache} 缓存 + */ + @Override + @PostConstruct + public void initLocalCache() { + // 获取角色列表,如果有更新 + List roleList = this.loadRoleIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(roleList)) { + return; + } + + // 写入缓存 + ImmutableMap.Builder builder = ImmutableMap.builder(); + roleList.forEach(sysRoleDO -> builder.put(sysRoleDO.getId(), sysRoleDO)); + roleCache = builder.build(); + assert roleList.size() > 0; // 断言,避免告警 + maxUpdateTime = roleList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); + log.info("[initLocalCache][初始化 Role 数量为 {}]", roleList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + + /** + * 如果角色发生变化,从数据库中获取最新的全量角色。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前角色的最大更新时间 + * @return 角色列表 + */ + private List loadRoleIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadRoleIfUpdate][首次加载全量角色]"); + } else { // 判断数据库中是否有更新的角色 + if (!roleMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { + return null; + } + log.info("[loadRoleIfUpdate][增量加载全量角色]"); + } + // 第二步,如果有更新,则从数据库加载所有角色 + return roleMapper.selectList(); + } + + @Override + public Long createRole(SysRoleCreateReqVO reqVO) { + // 校验角色 + checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null); + // 插入到数据库 + SysRoleDO role = SysRoleConvert.INSTANCE.convert(reqVO); + role.setType(SysRoleTypeEnum.CUSTOM.getType()); + role.setStatus(CommonStatusEnum.ENABLE.getStatus()); + roleMapper.insert(role); + // 发送刷新消息 + roleProducer.sendRoleRefreshMessage(); + // 返回 + return role.getId(); + } + + @Override + public void updateRole(SysRoleUpdateReqVO reqVO) { + // 校验是否可以更新 + this.checkUpdateRole(reqVO.getId()); + // 校验角色的唯一字段是否重复 + checkDuplicateRole(reqVO.getName(), reqVO.getCode(), reqVO.getId()); + // 更新到数据库 + SysRoleDO updateObject = SysRoleConvert.INSTANCE.convert(reqVO); + roleMapper.updateById(updateObject); + // 发送刷新消息 + roleProducer.sendRoleRefreshMessage(); + } + + @Override + public void updateRoleStatus(Long id, Integer status) { + // 校验是否可以更新 + this.checkUpdateRole(id); + // 更新状态 + SysRoleDO updateObject = new SysRoleDO(); + updateObject.setId(id); + updateObject.setStatus(status); + roleMapper.updateById(updateObject); + // 发送刷新消息 + roleProducer.sendRoleRefreshMessage(); + } + + @Override + public void updateRoleDataScope(Long id, Integer dataScope, Set dataScopeDeptIds) { + // 校验是否可以更新 + checkUpdateRole(id); + // 更新数据范围 + SysRoleDO updateObject = new SysRoleDO(); + updateObject.setId(id); + updateObject.setDataScope(dataScope); + updateObject.setDataScopeDeptIds(dataScopeDeptIds); + roleMapper.updateById(updateObject); + // 发送刷新消息 + roleProducer.sendRoleRefreshMessage(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteRole(Long id) { + // 校验是否可以更新 + this.checkUpdateRole(id); + // 标记删除 + roleMapper.deleteById(id); + // 删除相关数据 + permissionService.processRoleDeleted(id); + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + roleProducer.sendRoleRefreshMessage(); + } + + }); + } + + @Override + public SysRoleDO getRoleFromCache(Long id) { + return roleCache.get(id); + } + + @Override + public List getRoles(@Nullable Collection statuses) { + return roleMapper.selectListByStatus(statuses); + } + + @Override + public List getRolesFromCache(Collection ids) { + if (CollectionUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return roleCache.values().stream().filter(roleDO -> ids.contains(roleDO.getId())) + .collect(Collectors.toList()); + } + + @Override + public boolean hasAnyAdmin(Collection roleList) { + if (CollectionUtil.isEmpty(roleList)) { + return false; + } + return roleList.stream().anyMatch(roleDO -> RoleCodeEnum.ADMIN.getKey().equals(roleDO.getCode())); + } + + @Override + public SysRoleDO getRole(Long id) { + return roleMapper.selectById(id); + } + + @Override + public PageResult getRolePage(SysRolePageReqVO reqVO) { + return roleMapper.selectPage(reqVO); + } + + @Override + public List getRoles(SysRoleExportReqVO reqVO) { + return roleMapper.listRoles(reqVO); + } + + /** + * 校验角色的唯一字段是否重复 + * + * 1. 是否存在相同名字的角色 + * 2. 是否存在相同编码的角色 + * + * @param name 角色名字 + * @param code 角色额编码 + * @param id 角色编号 + */ + @VisibleForTesting + public void checkDuplicateRole(String name, String code, Long id) { + // 1. 该 name 名字被其它角色所使用 + SysRoleDO role = roleMapper.selectByName(name); + if (role != null && !role.getId().equals(id)) { + throw ServiceExceptionUtil.exception(ROLE_NAME_DUPLICATE, name); + } + // 2. 是否存在相同编码的角色 + if (!StringUtils.hasText(code)) { + return; + } + // 该 code 编码被其它角色所使用 + role = roleMapper.selectByCode(code); + if (role != null && !role.getId().equals(id)) { + throw ServiceExceptionUtil.exception(ROLE_CODE_DUPLICATE, code); + } + } + + /** + * 校验角色是否可以被更新 + * + * @param id 角色编号 + */ + @VisibleForTesting + public void checkUpdateRole(Long id) { + SysRoleDO roleDO = roleMapper.selectById(id); + if (roleDO == null) { + throw ServiceExceptionUtil.exception(ROLE_NOT_EXISTS); + } + // 内置角色,不允许删除 + if (SysRoleTypeEnum.SYSTEM.getType().equals(roleDO.getType())) { + throw ServiceExceptionUtil.exception(ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE); + } + } + +// @Override +// @DataScope(deptAlias = "d") +// public List selectRoleList(SysRole role) { +// return roleMapper.selectRoleList(role); +// } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelService.java new file mode 100644 index 0000000..cd64514 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelService.java @@ -0,0 +1,79 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 短信渠道Service接口 + * + * @author zzf + * @date 2021/1/25 9:24 + */ +public interface SysSmsChannelService { + + /** + * 初始化短信客户端 + */ + void initSmsClients(); + + /** + * 创建短信渠道 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSmsChannel(@Valid SysSmsChannelCreateReqVO createReqVO); + + /** + * 更新短信渠道 + * + * @param updateReqVO 更新信息 + */ + void updateSmsChannel(@Valid SysSmsChannelUpdateReqVO updateReqVO); + + /** + * 删除短信渠道 + * + * @param id 编号 + */ + void deleteSmsChannel(Long id); + + /** + * 获得短信渠道 + * + * @param id 编号 + * @return 短信渠道 + */ + SysSmsChannelDO getSmsChannel(Long id); + + /** + * 获得短信渠道列表 + * + * @param ids 编号 + * @return 短信渠道列表 + */ + List getSmsChannelList(Collection ids); + + /** + * 获得所有短信渠道列表 + * + * @return 短信渠道列表 + */ + List getSmsChannelList(); + + /** + * 获得短信渠道分页 + * + * @param pageReqVO 分页查询 + * @return 短信渠道分页 + */ + PageResult getSmsChannelPage(SysSmsChannelPageReqVO pageReqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogService.java new file mode 100644 index 0000000..980cf28 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogService.java @@ -0,0 +1,77 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 短信日志 Service 实现类 + * + * @author zzf + * @date 13:48 2021/3/2 + */ +public interface SysSmsLogService { + + /** + * 创建短信日志 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param isSend 是否发送 + * @param template 短信模板 + * @param templateContent 短信内容 + * @param templateParams 短信参数 + * @return 发送日志编号 + */ + Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, + SysSmsTemplateDO template, String templateContent, Map templateParams); + + /** + * 更新日志的发送结果 + * + * @param id 日志编号 + * @param sendCode 发送结果的编码 + * @param sendMsg 发送结果的提示 + * @param apiSendCode 短信 API 发送结果的编码 + * @param apiSendMsg 短信 API 发送失败的提示 + * @param apiRequestId 短信 API 发送返回的唯一请求 ID + * @param apiSerialNo 短信 API 发送返回的序号 + */ + void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, + String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo); + + /** + * 更新日志的接收结果 + * + * @param id 日志编号 + * @param success 是否接收成功 + * @param receiveTime 用户接收时间 + * @param apiReceiveCode API 接收结果的编码 + * @param apiReceiveMsg API 接收结果的说明 + */ + void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg); + + /** + * 获得短信日志分页 + * + * @param pageReqVO 分页查询 + * @return 短信日志分页 + */ + PageResult getSmsLogPage(SysSmsLogPageReqVO pageReqVO); + + /** + * 获得短信日志列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 短信日志列表 + */ + List getSmsLogList(SysSmsLogExportReqVO exportReqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsService.java new file mode 100644 index 0000000..70d32c1 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsService.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms; + +import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage; + +import java.util.List; +import java.util.Map; + +/** + * 短信Service接口 + * 只支持异步,因此没有返回值 + * + * @author zzf + * @date 2021/1/25 9:24 + */ +public interface SysSmsService { + + /** + * 发送单条短信给用户(管理员) + * + * 在 mobile 为空时,使用 userId 加载对应管理员的手机号 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleSmsToAdmin(String mobile, Long userId, + String templateCode, Map templateParams); + + /** + * 发送单条短信给用户(会员) + * + * 在 mobile 为空时,使用 userId 加载对应会员的手机号 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleSmsToMember(String mobile, Long userId, + String templateCode, Map templateParams); + + Long sendSingleSms(String mobile, Long userId, Integer userType, + String templateCode, Map templateParams); + + void sendBatchSms(List mobiles, List userIds, Integer userType, + String templateCode, Map templateParams); + + void doSendSms(SysSmsSendMessage message); + + /** + * 接收短信的接收结果 + * + * @param channelCode 渠道编码 + * @param text 结果内容 + * @throws Throwable 处理失败时,抛出异常 + */ + void receiveSmsStatus(String channelCode, String text) throws Throwable; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateService.java new file mode 100644 index 0000000..40207cf --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateService.java @@ -0,0 +1,115 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 短信模板 Service 接口 + * + * @author zzf + * @date 2021/1/25 9:24 + */ +public interface SysSmsTemplateService { + + /** + * 初始化短信模板的本地缓存 + */ + void initLocalCache(); + + /** + * 获得短信模板 + * + * @param code 模板编码 + * @return 短信模板 + */ + SysSmsTemplateDO getSmsTemplateByCode(String code); + + /** + * 获得短信模板,从缓存中 + * + * @param code 模板编码 + * @return 短信模板 + */ + SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code); + + /** + * 格式化短信内容 + * + * @param content 短信模板的内容 + * @param params 内容的参数 + * @return 格式化后的内容 + */ + String formatSmsTemplateContent(String content, Map params); + + /** + * 创建短信模板 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSmsTemplate(@Valid SysSmsTemplateCreateReqVO createReqVO); + + /** + * 更新短信模板 + * + * @param updateReqVO 更新信息 + */ + void updateSmsTemplate(@Valid SysSmsTemplateUpdateReqVO updateReqVO); + + /** + * 删除短信模板 + * + * @param id 编号 + */ + void deleteSmsTemplate(Long id); + + /** + * 获得短信模板 + * + * @param id 编号 + * @return 短信模板 + */ + SysSmsTemplateDO getSmsTemplate(Long id); + + /** + * 获得短信模板列表 + * + * @param ids 编号 + * @return 短信模板列表 + */ + List getSmsTemplateList(Collection ids); + + /** + * 获得短信模板分页 + * + * @param pageReqVO 分页查询 + * @return 短信模板分页 + */ + PageResult getSmsTemplatePage(SysSmsTemplatePageReqVO pageReqVO); + + /** + * 获得短信模板列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 短信模板分页 + */ + List getSmsTemplateList(SysSmsTemplateExportReqVO exportReqVO); + + /** + * 获得指定短信渠道下的短信模板数量 + * + * @param channelId 短信渠道编号 + * @return 数量 + */ + Integer countByChannelId(Long channelId); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java new file mode 100644 index 0000000..444cae6 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java @@ -0,0 +1,172 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; +import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsChannelConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsChannelMapper; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; + +/** + * 短信渠道Service实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Service +@Slf4j +public class SysSmsChannelServiceImpl implements SysSmsChannelService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private SmsClientFactory smsClientFactory; + + @Resource + private SysSmsChannelMapper smsChannelMapper; + + @Resource + private SysSmsTemplateService smsTemplateService; + + @Resource + private SysSmsProducer smsProducer; + + @Override + @PostConstruct + public void initSmsClients() { + // 获取短信渠道,如果有更新 + List smsChannels = this.loadSmsChannelIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(smsChannels)) { + return; + } + + // 创建或更新短信 Client + List propertiesList = SysSmsChannelConvert.INSTANCE.convertList02(smsChannels); + propertiesList.forEach(properties -> smsClientFactory.createOrUpdateSmsClient(properties)); + + // 写入缓存 + assert smsChannels.size() > 0; // 断言,避免告警 + maxUpdateTime = smsChannels.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); + log.info("[initSmsClients][初始化 SmsChannel 数量为 {}]", smsChannels.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initSmsClients(); + } + + /** + * 如果短信渠道发生变化,从数据库中获取最新的全量短信渠道。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前短信渠道的最大更新时间 + * @return 短信渠道列表 + */ + private List loadSmsChannelIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadSmsChannelIfUpdate][首次加载全量短信渠道]"); + } else { // 判断数据库中是否有更新的短信渠道 + if (smsChannelMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) { + return null; + } + log.info("[loadSmsChannelIfUpdate][增量加载全量短信渠道]"); + } + // 第二步,如果有更新,则从数据库加载所有短信渠道 + return smsChannelMapper.selectList(); + } + + @Override + public Long createSmsChannel(SysSmsChannelCreateReqVO createReqVO) { + // 插入 + SysSmsChannelDO smsChannel = SysSmsChannelConvert.INSTANCE.convert(createReqVO); + smsChannelMapper.insert(smsChannel); + // 发送刷新消息 + smsProducer.sendSmsChannelRefreshMessage(); + // 返回 + return smsChannel.getId(); + } + + @Override + public void updateSmsChannel(SysSmsChannelUpdateReqVO updateReqVO) { + // 校验存在 + this.validateSmsChannelExists(updateReqVO.getId()); + // 更新 + SysSmsChannelDO updateObj = SysSmsChannelConvert.INSTANCE.convert(updateReqVO); + smsChannelMapper.updateById(updateObj); + // 发送刷新消息 + smsProducer.sendSmsChannelRefreshMessage(); + } + + @Override + public void deleteSmsChannel(Long id) { + // 校验存在 + this.validateSmsChannelExists(id); + // 校验是否有字典数据 + if (smsTemplateService.countByChannelId(id) > 0) { + throw exception(SMS_CHANNEL_HAS_CHILDREN); + } + // 删除 + smsChannelMapper.deleteById(id); + // 发送刷新消息 + smsProducer.sendSmsChannelRefreshMessage(); + } + + private void validateSmsChannelExists(Long id) { + if (smsChannelMapper.selectById(id) == null) { + throw exception(SMS_CHANNEL_NOT_EXISTS); + } + } + + @Override + public SysSmsChannelDO getSmsChannel(Long id) { + return smsChannelMapper.selectById(id); + } + + @Override + public List getSmsChannelList(Collection ids) { + return smsChannelMapper.selectBatchIds(ids); + } + + @Override + public List getSmsChannelList() { + return smsChannelMapper.selectList(); + } + + @Override + public PageResult getSmsChannelPage(SysSmsChannelPageReqVO pageReqVO) { + return smsChannelMapper.selectPage(pageReqVO); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsLogServiceImpl.java new file mode 100644 index 0000000..4b291d9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsLogServiceImpl.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsLogMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsReceiveStatusEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsSendStatusEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 短信日志 Service 实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Slf4j +@Service +public class SysSmsLogServiceImpl implements SysSmsLogService { + + @Resource + private SysSmsLogMapper smsLogMapper; + + @Override + public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, + SysSmsTemplateDO template, String templateContent, Map templateParams) { + SysSmsLogDO.SysSmsLogDOBuilder logBuilder = SysSmsLogDO.builder(); + // 根据是否要发送,设置状态 + logBuilder.sendStatus(Objects.equals(isSend, true) ? SysSmsSendStatusEnum.INIT.getStatus() + : SysSmsSendStatusEnum.IGNORE.getStatus()); + // 设置手机相关字段 + logBuilder.mobile(mobile).userId(userId).userType(userType); + // 设置模板相关字段 + logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType()); + logBuilder.templateContent(templateContent).templateParams(templateParams).apiTemplateId(template.getApiTemplateId()); + // 设置渠道相关字段 + logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode()); + // 设置接收相关字段 + logBuilder.receiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); + + // 插入数据库 + SysSmsLogDO logDO = logBuilder.build(); + smsLogMapper.insert(logDO); + return logDO.getId(); + } + + @Override + public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, + String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo) { + SysSmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS + : SysSmsSendStatusEnum.FAILURE; + smsLogMapper.updateById(SysSmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()).sendTime(new Date()) + .sendCode(sendCode).sendMsg(sendMsg).apiSendCode(apiSendCode).apiSendMsg(apiSendMsg) + .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build()); + } + + @Override + public void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg) { + SysSmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? SysSmsReceiveStatusEnum.SUCCESS + : SysSmsReceiveStatusEnum.FAILURE; + smsLogMapper.updateById(SysSmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()).receiveTime(receiveTime) + .apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); + } + + @Override + public PageResult getSmsLogPage(SysSmsLogPageReqVO pageReqVO) { + return smsLogMapper.selectPage(pageReqVO); + } + + @Override + public List getSmsLogList(SysSmsLogExportReqVO exportReqVO) { + return smsLogMapper.selectList(exportReqVO); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsServiceImpl.java new file mode 100644 index 0000000..9fced9b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsServiceImpl.java @@ -0,0 +1,171 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.core.KeyValue; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.sms.core.client.SmsClient; +import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; +import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO; +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsLogService; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; + +/** + * 短信日志Service实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Service +@Slf4j +public class SysSmsServiceImpl implements SysSmsService { + + @Resource + private SysSmsTemplateService smsTemplateService; + @Resource + private SysSmsLogService smsLogService; + @Resource + private SysSmsProducer smsProducer; + @Resource + private SmsClientFactory smsClientFactory; + + @Resource + private SysUserService userService; + + @Override + public Long sendSingleSmsToAdmin(String mobile, Long userId, String templateCode, Map templateParams) { + // 如果 mobile 为空,则加载用户编号对应的手机号 + if (StrUtil.isEmpty(mobile)) { + SysUserDO user = userService.getUser(userId); + if (user != null) { + mobile = user.getMobile(); + } + } + // 执行发送 + return this.sendSingleSms(mobile, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams); + } + + @Override + public Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map templateParams) { + throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); + } + + @Override + public Long sendSingleSms(String mobile, Long userId, Integer userType, + String templateCode, Map templateParams) { + // 校验短信模板是否合法 + SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode); + // 校验手机号码是否存在 + mobile = this.checkMobile(mobile); + // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志 + List> newTemplateParams = this.buildTemplateParams(template, templateParams); + + // 创建发送日志 + Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); // 如果模板被禁用,则不发送短信,只记录日志 + String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams); + Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams); + + // 发送 MQ 消息,异步执行发送短信 + if (isSend) { + smsProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(), template.getApiTemplateId(), newTemplateParams); + } + return sendLogId; + } + + @Override + public void sendBatchSms(List mobiles, List userIds, Integer userType, + String templateCode, Map templateParams) { + throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); + } + + @VisibleForTesting + public SysSmsTemplateDO checkSmsTemplateValid(String templateCode) { + // 获得短信模板。考虑到效率,从缓存中获取 + SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode); + // 短信模板不存在 + if (template == null) { + throw exception(SMS_TEMPLATE_NOT_EXISTS); + } + return template; + } + + /** + * 将参数模板,处理成有序的 KeyValue 数组 + * + * 原因是,部分短信平台并不是使用 key 作为参数,而是数组下标,例如说腾讯云 https://cloud.tencent.com/document/product/382/39023 + * + * @param template 短信模板 + * @param templateParams 原始参数 + * @return 处理后的参数 + */ + @VisibleForTesting + public List> buildTemplateParams(SysSmsTemplateDO template, Map templateParams) { + return template.getParams().stream().map(key -> { + Object value = templateParams.get(key); + if (value == null) { + throw exception(SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, key); + } + return new KeyValue<>(key, value); + }).collect(Collectors.toList()); + } + + @VisibleForTesting + public String checkMobile(String mobile) { + if (StrUtil.isEmpty(mobile)) { + throw exception(SMS_SEND_MOBILE_NOT_EXISTS); + } + return mobile; + } + + @Override + public void doSendSms(SysSmsSendMessage message) { + // 获得渠道对应的 SmsClient 客户端 + SmsClient smsClient = smsClientFactory.getSmsClient(message.getChannelId()); + Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", message.getChannelId())); + // 发送短信 + SmsCommonResult sendResult = smsClient.sendSms(message.getLogId(), message.getMobile(), + message.getApiTemplateId(), message.getTemplateParams()); + smsLogService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(), + sendResult.getApiCode(), sendResult.getApiMsg(), sendResult.getApiRequestId(), + sendResult.getData() != null ? sendResult.getData().getSerialNo() : null); + } + + @Override + public void receiveSmsStatus(String channelCode, String text) throws Throwable { + // 获得渠道对应的 SmsClient 客户端 + SmsClient smsClient = smsClientFactory.getSmsClient(channelCode); + Assert.notNull(smsClient, String.format("短信客户端(%s) 不存在", channelCode)); + // 解析内容 + List receiveResults = smsClient.parseSmsReceiveStatus(text); + if (CollUtil.isEmpty(receiveResults)) { + return; + } + // 更新短信日志的接收结果. 因为量一般不打,所以先使用 for 循环更新 + receiveResults.forEach(result -> { + smsLogService.updateSmsReceiveResult(result.getLogId(), result.getSuccess(), result.getReceiveTime(), + result.getErrorCode(), result.getErrorCode()); + }); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java new file mode 100644 index 0000000..9df2592 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java @@ -0,0 +1,275 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.sms.core.client.SmsClient; +import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; +import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsTemplateConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsTemplateMapper; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableMap; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; +import java.util.regex.Pattern; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; + +/** + * 短信模板Service实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Service +@Slf4j +public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { + + /** + * 正则表达式,匹配 {} 中的变量 + */ + private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}"); + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 短信模板缓存 + * key:短信模板编码 {@link SysSmsTemplateDO#getCode()} + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Map smsTemplateCache; + /** + * 缓存短信模板的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private SysSmsTemplateMapper smsTemplateMapper; + + @Resource + private SysSmsChannelService smsChannelService; + + @Resource + private SmsClientFactory smsClientFactory; + + @Resource + private SysSmsProducer smsProducer; + + /** + * 初始化 {@link #smsTemplateCache} 缓存 + */ + @Override + @PostConstruct + public void initLocalCache() { + // 获取短信模板列表,如果有更新 + List smsTemplateList = this.loadSmsTemplateIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(smsTemplateList)) { + return; + } + + // 写入缓存 + ImmutableMap.Builder builder = ImmutableMap.builder(); + smsTemplateList.forEach(sysSmsTemplateDO -> builder.put(sysSmsTemplateDO.getCode(), sysSmsTemplateDO)); + smsTemplateCache = builder.build(); + assert smsTemplateList.size() > 0; // 断言,避免告警 + maxUpdateTime = smsTemplateList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); + log.info("[initLocalCache][初始化 SmsTemplate 数量为 {}]", smsTemplateList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + + /** + * 如果短信模板发生变化,从数据库中获取最新的全量短信模板。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前短信模板的最大更新时间 + * @return 短信模板列表 + */ + private List loadSmsTemplateIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadSmsTemplateIfUpdate][首次加载全量短信模板]"); + } else { // 判断数据库中是否有更新的短信模板 + if (smsTemplateMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) { + return null; + } + log.info("[loadSmsTemplateIfUpdate][增量加载全量短信模板]"); + } + // 第二步,如果有更新,则从数据库加载所有短信模板 + return smsTemplateMapper.selectList(); + } + + @Override + public SysSmsTemplateDO getSmsTemplateByCode(String code) { + return smsTemplateMapper.selectByCode(code); + } + + @Override + public SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code) { + return smsTemplateCache.get(code); + } + + @Override + public String formatSmsTemplateContent(String content, Map params) { + return StrUtil.format(content, params); + } + + @VisibleForTesting + public List parseTemplateContentParams(String content) { + return ReUtil.findAllGroup1(PATTERN_PARAMS, content); + } + + @Override + public Long createSmsTemplate(SysSmsTemplateCreateReqVO createReqVO) { + // 校验短信渠道 + SysSmsChannelDO channelDO = checkSmsChannel(createReqVO.getChannelId()); + // 校验短信编码是否重复 + checkSmsTemplateCodeDuplicate(null, createReqVO.getCode()); + // 校验短信模板 + checkApiTemplate(createReqVO.getChannelId(), createReqVO.getApiTemplateId()); + + // 插入 + SysSmsTemplateDO template = SysSmsTemplateConvert.INSTANCE.convert(createReqVO); + template.setParams(parseTemplateContentParams(template.getContent())); + template.setChannelCode(channelDO.getCode()); + smsTemplateMapper.insert(template); + // 发送刷新消息 + smsProducer.sendSmsTemplateRefreshMessage(); + // 返回 + return template.getId(); + } + + @Override + public void updateSmsTemplate(SysSmsTemplateUpdateReqVO updateReqVO) { + // 校验存在 + this.validateSmsTemplateExists(updateReqVO.getId()); + // 校验短信渠道 + SysSmsChannelDO channelDO = checkSmsChannel(updateReqVO.getChannelId()); + // 校验短信编码是否重复 + checkSmsTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode()); + // 校验短信模板 + checkApiTemplate(updateReqVO.getChannelId(), updateReqVO.getApiTemplateId()); + + // 更新 + SysSmsTemplateDO updateObj = SysSmsTemplateConvert.INSTANCE.convert(updateReqVO); + updateObj.setParams(parseTemplateContentParams(updateObj.getContent())); + updateObj.setChannelCode(channelDO.getCode()); + smsTemplateMapper.updateById(updateObj); + // 发送刷新消息 + smsProducer.sendSmsTemplateRefreshMessage(); + } + + @Override + public void deleteSmsTemplate(Long id) { + // 校验存在 + this.validateSmsTemplateExists(id); + // 更新 + smsTemplateMapper.deleteById(id); + // 发送刷新消息 + smsProducer.sendSmsTemplateRefreshMessage(); + } + + private void validateSmsTemplateExists(Long id) { + if (smsTemplateMapper.selectById(id) == null) { + throw exception(SMS_TEMPLATE_NOT_EXISTS); + } + } + + @Override + public SysSmsTemplateDO getSmsTemplate(Long id) { + return smsTemplateMapper.selectById(id); + } + + @Override + public List getSmsTemplateList(Collection ids) { + return smsTemplateMapper.selectBatchIds(ids); + } + + @Override + public PageResult getSmsTemplatePage(SysSmsTemplatePageReqVO pageReqVO) { + return smsTemplateMapper.selectPage(pageReqVO); + } + + @Override + public List getSmsTemplateList(SysSmsTemplateExportReqVO exportReqVO) { + return smsTemplateMapper.selectList(exportReqVO); + } + + @Override + public Integer countByChannelId(Long channelId) { + return smsTemplateMapper.selectCountByChannelId(channelId); + } + + @VisibleForTesting + public SysSmsChannelDO checkSmsChannel(Long channelId) { + SysSmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); + if (channelDO == null) { + throw exception(SMS_CHANNEL_NOT_EXISTS); + } + if (!Objects.equals(channelDO.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { + throw exception(SMS_CHANNEL_DISABLE); + } + return channelDO; + } + + @VisibleForTesting + public void checkSmsTemplateCodeDuplicate(Long id, String code) { + SysSmsTemplateDO template = smsTemplateMapper.selectByCode(code); + if (template == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code); + } + if (!template.getId().equals(id)) { + throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code); + } + } + + /** + * 校验 API 短信平台的模板是否有效 + * + * @param channelId 渠道编号 + * @param apiTemplateId API 模板编号 + */ + @VisibleForTesting + public void checkApiTemplate(Long channelId, String apiTemplateId) { + // 获得短信模板 + SmsClient smsClient = smsClientFactory.getSmsClient(channelId); + Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", channelId)); + SmsCommonResult templateResult = smsClient.getSmsTemplate(apiTemplateId); + // 校验短信模板是否正确 + templateResult.checkError(); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java new file mode 100644 index 0000000..16c815a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java @@ -0,0 +1,169 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.user; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserImportExcelVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserImportRespVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; + +import java.io.InputStream; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 用户 Service 接口 + * + * @author 芋道源码 + */ +public interface SysUserService { + + /** + * 创建用户 + * + * @param reqVO 用户信息 + * @return 用户编号 + */ + Long createUser(SysUserCreateReqVO reqVO); + + /** + * 修改用户 + * + * @param reqVO 用户信息 + */ + void updateUser(SysUserUpdateReqVO reqVO); + + /** + * 修改用户个人信息 + * + * @param id 用户编号 + * @param reqVO 用户个人信息 + */ + void updateUserProfile(Long id, SysUserProfileUpdateReqVO reqVO); + + /** + * 修改用户个人密码 + * + * @param id 用户编号 + * @param reqVO 更新用户个人密码 + */ + void updateUserPassword(Long id, SysUserProfileUpdatePasswordReqVO reqVO); + + /** + * 更新用户头像 + * + * @param id 用户 id + * @param avatarFile 头像文件 + */ + void updateUserAvatar(Long id, InputStream avatarFile); + + /** + * 修改密码 + * + * @param id 用户编号 + * @param password 密码 + */ + void updateUserPassword(Long id, String password); + + /** + * 修改密码 + * + * @param id 用户编号 + * @param status 状态 + */ + void updateUserStatus(Long id, Integer status); + + /** + * 删除用户 + * + * @param id 用户编号 + */ + void deleteUser(Long id); + + /** + * 通过用户名查询用户 + * + * @param username 用户名 + * @return 用户对象信息 + */ + SysUserDO getUserByUsername(String username); + + /** + * 通过用户 ID 查询用户 + * + * @param id 用户ID + * @return 用户对象信息 + */ + SysUserDO getUser(Long id); + + /** + * 获得用户分页列表 + * + * @param reqVO 分页条件 + * @return 分页列表 + */ + PageResult getUserPage(SysUserPageReqVO reqVO); + + /** + * 获得用户列表 + * + * @param reqVO 列表请求 + * @return 用户列表 + */ + List getUsers(SysUserExportReqVO reqVO); + + /** + * 获得用户列表 + * + * @param ids 用户编号数组 + * @return 用户列表 + */ + List getUsers(Collection ids); + + /** + * 获得用户 Map + * + * @param ids 用户编号数组 + * @return 用户 Map + */ + default Map getUserMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return new HashMap<>(); + } + return CollectionUtils.convertMap(getUsers(ids), SysUserDO::getId); + } + + /** + * 获得用户列表,基于昵称模糊匹配 + * + * @param nickname 昵称 + * @return 用户列表 + */ + List getUsersByNickname(String nickname); + + /** + * 获得用户列表,基于用户账号模糊匹配 + * + * @param username 用户账号 + * @return 用户列表 + */ + List getUsersByUsername(String username); + + /** + * 批量导入用户 + * + * @param importUsers 导入用户列表 + * @param isUpdateSupport 是否支持更新 + * @return 导入结果 + */ + SysUserImportRespVO importUsers(List importUsers, boolean isUpdateSupport); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImpl.java new file mode 100644 index 0000000..9c344e9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImpl.java @@ -0,0 +1,373 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.user; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.ServiceException; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; +import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.InputStream; +import java.util.*; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; + + +/** + * 用户 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Slf4j +public class SysUserServiceImpl implements SysUserService { + + @Value("${sys.user.init-password:yudaoyuanma}") + private String userInitPassword; + + @Resource + private SysUserMapper userMapper; + + @Resource + private SysDeptService deptService; + @Resource + private SysPostService postService; + @Resource + private SysPermissionService permissionService; + @Resource + private PasswordEncoder passwordEncoder; + @Resource + private InfFileService fileService; + + @Override + public Long createUser(SysUserCreateReqVO reqVO) { + // 校验正确性 + this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), + reqVO.getDeptId(), reqVO.getPostIds()); + // 插入用户 + SysUserDO user = SysUserConvert.INSTANCE.convert(reqVO); + user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 + user.setPassword(passwordEncoder.encode(reqVO.getPassword())); // 加密密码 + userMapper.insert(user); + return user.getId(); + } + + @Override + public void updateUser(SysUserUpdateReqVO reqVO) { + // 校验正确性 + this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), + reqVO.getDeptId(), reqVO.getPostIds()); + // 更新用户 + SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO); + userMapper.updateById(updateObj); + } + + @Override + public void updateUserProfile(Long id, SysUserProfileUpdateReqVO reqVO) { + // 校验正确性 + this.checkUserExists(id); + this.checkEmailUnique(id, reqVO.getEmail()); + this.checkMobileUnique(id, reqVO.getMobile()); + // 执行更新 + userMapper.updateById(SysUserConvert.INSTANCE.convert(reqVO).setId(id)); + } + + @Override + public void updateUserPassword(Long id, SysUserProfileUpdatePasswordReqVO reqVO) { + // 校验旧密码密码 + this.checkOldPassword(id, reqVO.getOldPassword()); + // 执行更新 + SysUserDO updateObj = new SysUserDO().setId(id); + updateObj.setPassword(passwordEncoder.encode(reqVO.getNewPassword())); // 加密密码 + userMapper.updateById(updateObj); + } + + @Override + public void updateUserAvatar(Long id, InputStream avatarFile) { + this.checkUserExists(id); + // 存储文件 + String avatar = fileService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile)); + // 更新路径 + SysUserDO sysUserDO = new SysUserDO(); + sysUserDO.setId(id); + sysUserDO.setAvatar(avatar); + userMapper.updateById(sysUserDO); + } + + @Override + public void updateUserPassword(Long id, String password) { + // 校验用户存在 + this.checkUserExists(id); + // 更新密码 + SysUserDO updateObj = new SysUserDO(); + updateObj.setId(id); + updateObj.setPassword(passwordEncoder.encode(password)); // 加密密码 + userMapper.updateById(updateObj); + } + + @Override + public void updateUserStatus(Long id, Integer status) { + // 校验用户存在 + this.checkUserExists(id); + // 更新状态 + SysUserDO updateObj = new SysUserDO(); + updateObj.setId(id); + updateObj.setStatus(status); + userMapper.updateById(updateObj); + } + + @Override + public void deleteUser(Long id) { + // 校验用户存在 + this.checkUserExists(id); + // 删除用户 + userMapper.deleteById(id); + // 删除用户关联数据 + permissionService.processUserDeleted(id); + } + + @Override + public SysUserDO getUserByUsername(String username) { + return userMapper.selectByUsername(username); + } + + @Override + public SysUserDO getUser(Long id) { + return userMapper.selectById(id); + } + + @Override + public PageResult getUserPage(SysUserPageReqVO reqVO) { + return userMapper.selectPage(reqVO, this.getDeptCondition(reqVO.getDeptId())); + } + + @Override + public List getUsers(SysUserExportReqVO reqVO) { + return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId())); + } + + @Override + public List getUsers(Collection ids) { + return userMapper.selectBatchIds(ids); + } + + @Override + public List getUsersByNickname(String nickname) { + return userMapper.selectListByNickname(nickname); + } + + @Override + public List getUsersByUsername(String username) { + return userMapper.selectListByUsername(username); + } + + /** + * 获得部门条件:查询指定部门的子部门编号们,包括自身 + * + * @param deptId 部门编号 + * @return 部门编号集合 + */ + private Set getDeptCondition(Long deptId) { + if (deptId == null) { + return Collections.emptySet(); + } + Set deptIds = CollectionUtils.convertSet(deptService.getDeptsByParentIdFromCache( + deptId, true), SysDeptDO::getId); + deptIds.add(deptId); // 包括自身 + return deptIds; + } + + private void checkCreateOrUpdate(Long id, String username, String mobile, String email, + Long deptId, Set postIds) { + // 校验用户存在 + this.checkUserExists(id); + // 校验用户名唯一 + this.checkUsernameUnique(id, username); + // 校验手机号唯一 + this.checkMobileUnique(id, mobile); + // 校验邮箱唯一 + this.checkEmailUnique(id, email); + // 校验部门处于开启状态 + this.checkDeptEnable(deptId); + // 校验岗位处于开启状态 + this.checkPostEnable(postIds); + } + + @VisibleForTesting + void checkUserExists(Long id) { + if (id == null) { + return; + } + SysUserDO user = userMapper.selectById(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + } + + @VisibleForTesting + void checkUsernameUnique(Long id, String username) { + if (StrUtil.isBlank(username)) { + return; + } + SysUserDO user = userMapper.selectByUsername(username); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_USERNAME_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_USERNAME_EXISTS); + } + } + + @VisibleForTesting + void checkEmailUnique(Long id, String email) { + if (StrUtil.isBlank(email)) { + return; + } + SysUserDO user = userMapper.selectByEmail(email); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_EMAIL_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_EMAIL_EXISTS); + } + } + + @VisibleForTesting + void checkMobileUnique(Long id, String mobile) { + if (StrUtil.isBlank(mobile)) { + return; + } + SysUserDO user = userMapper.selectByMobile(mobile); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_MOBILE_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_MOBILE_EXISTS); + } + } + + @VisibleForTesting + void checkDeptEnable(Long deptId) { + if (deptId == null) { // 允许不选择 + return; + } + SysDeptDO dept = deptService.getDept(deptId); + if (dept == null) { + throw exception(DEPT_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { + throw exception(DEPT_NOT_ENABLE); + } + } + + @VisibleForTesting + void checkPostEnable(Set postIds) { + if (CollUtil.isEmpty(postIds)) { // 允许不选择 + return; + } + List posts = postService.getPosts(postIds, null); + if (CollUtil.isEmpty(posts)) { + throw exception(POST_NOT_FOUND); + } + Map postMap = CollectionUtils.convertMap(posts, SysPostDO::getId); + postIds.forEach(postId -> { + SysPostDO post = postMap.get(postId); + if (post == null) { + throw exception(POST_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { + throw exception(POST_NOT_ENABLE, post.getName()); + } + }); + } + + /** + * 校验旧密码 + * + * @param id 用户 id + * @param oldPassword 旧密码 + */ + @VisibleForTesting + void checkOldPassword(Long id, String oldPassword) { + SysUserDO user = userMapper.selectById(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + if (!passwordEncoder.matches(oldPassword, user.getPassword())) { + throw exception(USER_PASSWORD_FAILED); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 + public SysUserImportRespVO importUsers(List importUsers, boolean isUpdateSupport) { + if (CollUtil.isEmpty(importUsers)) { + throw exception(USER_IMPORT_LIST_IS_EMPTY); + } + SysUserImportRespVO respVO = SysUserImportRespVO.builder().createUsernames(new ArrayList<>()) + .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); + importUsers.forEach(importUser -> { + // 校验,判断是否有不符合的原因 + try { + checkCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), + importUser.getDeptId(), null); + } catch (ServiceException ex) { + respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); + return; + } + // 判断如果不存在,在进行插入 + SysUserDO existUser = userMapper.selectByUsername(importUser.getUsername()); + if (existUser == null) { + userMapper.insert(SysUserConvert.INSTANCE.convert(importUser) + .setPassword(passwordEncoder.encode(userInitPassword))); // 设置默认密码 + respVO.getCreateUsernames().add(importUser.getUsername()); + return; + } + // 如果存在,判断是否允许更新 + if (!isUpdateSupport) { + respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg()); + return; + } + SysUserDO updateUser = SysUserConvert.INSTANCE.convert(importUser); + updateUser.setId(existUser.getId()); + userMapper.updateById(updateUser); + respVO.getUpdateUsernames().add(importUser.getUsername()); + }); + return respVO; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/ToolCodegenController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/ToolCodegenController.java new file mode 100644 index 0000000..a6bd6a6 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/ToolCodegenController.java @@ -0,0 +1,167 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ZipUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenDetailRespVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenPreviewRespVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTableRespVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolSchemaTableRespVO; +import cn.iocoder.yudao.adminserver.modules.tool.convert.codegen.ToolCodegenConvert; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; +import cn.iocoder.yudao.adminserver.modules.tool.service.codegen.ToolCodegenService; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Api(tags = "代码生成器") +@RestController +@RequestMapping("/tool/codegen") +@Validated +public class ToolCodegenController { + + @Resource + private ToolCodegenService codegenService; + + @GetMapping("/db/table/list") + @ApiOperation(value = "获得数据库自带的表定义列表", notes = "会过滤掉已经导入 Codegen 的表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "tableName", value = "表名,模糊匹配", required = true, example = "yudao", dataTypeClass = String.class), + @ApiImplicitParam(name = "tableComment", value = "描述,模糊匹配", required = true, example = "芋道", dataTypeClass = String.class) + }) + @PreAuthorize("@ss.hasPermission('tool:codegen:query')") + public CommonResult> getSchemaTableList( + @RequestParam(value = "tableName", required = false) String tableName, + @RequestParam(value = "tableComment", required = false) String tableComment) { + // 获得数据库自带的表定义列表 + List schemaTables = codegenService.getSchemaTableList(tableName, tableComment); + // 移除在 Codegen 中,已经存在的 + Set existsTables = CollectionUtils.convertSet(codegenService.getCodeGenTableList(), ToolCodegenTableDO::getTableName); + schemaTables.removeIf(table -> existsTables.contains(table.getTableName())); + return success(ToolCodegenConvert.INSTANCE.convertList04(schemaTables)); + } + + @GetMapping("/table/page") + @ApiOperation("获得表定义分页") + @PreAuthorize("@ss.hasPermission('tool:codegen:query')") + public CommonResult> getCodeGenTablePage(@Valid ToolCodegenTablePageReqVO pageReqVO) { + PageResult pageResult = codegenService.getCodegenTablePage(pageReqVO); + return success(ToolCodegenConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/detail") + @ApiOperation("获得表和字段的明细") + @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('tool:codegen:query')") + public CommonResult getCodegenDetail(@RequestParam("tableId") Long tableId) { + ToolCodegenTableDO table = codegenService.getCodegenTablePage(tableId); + List columns = codegenService.getCodegenColumnListByTableId(tableId); + // 拼装返回 + return success(ToolCodegenConvert.INSTANCE.convert(table, columns)); + } + + @ApiOperation("基于数据库的表结构,创建代码生成器的表和字段定义") + @ApiImplicitParam(name = "tableNames", value = "表名数组", required = true, example = "sys_user", dataTypeClass = List.class) + @PostMapping("/create-list-from-db") + @PreAuthorize("@ss.hasPermission('tool:codegen:create')") + public CommonResult> createCodegenListFromDB(@RequestParam("tableNames") List tableNames) { + return success(codegenService.createCodegenListFromDB(tableNames)); + } + + @ApiOperation("基于 SQL 建表语句,创建代码生成器的表和字段定义") + @ApiImplicitParam(name = "sql", value = "SQL 建表语句", required = true, example = "sql", dataTypeClass = String.class) + @PostMapping("/create-list-from-sql") + @PreAuthorize("@ss.hasPermission('tool:codegen:create')") + public CommonResult createCodegenListFromSQL(@RequestParam("sql") String sql) { + return success(codegenService.createCodegenListFromSQL(sql)); + } + + @ApiOperation("更新数据库的表和字段定义") + @PutMapping("/update") + @PreAuthorize("@ss.hasPermission('tool:codegen:update')") + public CommonResult updateCodegen(@Valid @RequestBody ToolCodegenUpdateReqVO updateReqVO) { + codegenService.updateCodegen(updateReqVO); + return success(true); + } + + @ApiOperation("基于数据库的表结构,同步数据库的表和字段定义") + @PutMapping("/sync-from-db") + @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('tool:codegen:update')") + public CommonResult syncCodegenFromDB(@RequestParam("tableId") Long tableId) { + codegenService.syncCodegenFromDB(tableId); + return success(true); + } + + @ApiOperation("基于 SQL 建表语句,同步数据库的表和字段定义") + @PutMapping("/sync-from-sql") + @ApiImplicitParams({ + @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class), + @ApiImplicitParam(name = "sql", value = "SQL 建表语句", required = true, example = "sql", dataTypeClass = String.class) + }) + @PreAuthorize("@ss.hasPermission('tool:codegen:update')") + public CommonResult syncCodegenFromSQL(@RequestParam("tableId") Long tableId, + @RequestParam("sql") String sql) { + codegenService.syncCodegenFromSQL(tableId, sql); + return success(true); + } + + @ApiOperation("删除数据库的表和字段定义") + @DeleteMapping("/delete") + @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('tool:codegen:delete')") + public CommonResult deleteCodegen(@RequestParam("tableId") Long tableId) { + codegenService.deleteCodegen(tableId); + return success(true); + } + + @ApiOperation("预览生成代码") + @GetMapping("/preview") + @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('tool:codegen:preview')") + public CommonResult> previewCodegen(@RequestParam("tableId") Long tableId) { + Map codes = codegenService.generationCodes(tableId); + return success(ToolCodegenConvert.INSTANCE.convert(codes)); + } + + @ApiOperation("下载生成代码") + @GetMapping("/download") + @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('tool:codegen:download')") + public void downloadCodegen(@RequestParam("tableId") Long tableId, + HttpServletResponse response) throws IOException { + // 生成代码 + Map codes = codegenService.generationCodes(tableId); + // 构建 zip 包 + String[] paths = codes.keySet().toArray(new String[0]); + ByteArrayInputStream[] ins = codes.values().stream().map(IoUtil::toUtf8Stream).toArray(ByteArrayInputStream[]::new); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipUtil.zip(outputStream, paths, ins); + // 输出 + ServletUtils.writeAttachment(response, "codegen.zip", outputStream.toByteArray()); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java new file mode 100644 index 0000000..4a1b10c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenDetailRespVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo; + +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.column.ToolCodegenColumnRespVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTableRespVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel("代码生成表和字段的明细 Response VO") +@Data +public class ToolCodegenDetailRespVO { + + @ApiModelProperty("表定义") + private ToolCodegenTableRespVO table; + + @ApiModelProperty("字段定义") + private List columns; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java new file mode 100644 index 0000000..3a53270 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenPreviewRespVO.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "代码生成预览 Response VO", description ="注意,每个文件都是一个该对象") +@Data +public class ToolCodegenPreviewRespVO { + + @ApiModelProperty(value = "文件路径", required = true, example = "java/cn/iocoder/yudao/adminserver/modules/system/controller/test/SysTestDemoController.java") + private String filePath; + + @ApiModelProperty(value = "代码", required = true, example = "Hello World") + private String code; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java new file mode 100644 index 0000000..b82064e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/ToolCodegenUpdateReqVO.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo; + +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.column.ToolCodegenColumnBaseVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTableBaseVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.List; + +@ApiModel("代码生成表和字段的修改 Request VO") +@Data +public class ToolCodegenUpdateReqVO { + + @Valid // 校验内嵌的字段 + @NotNull(message = "表定义不能为空") + private Table table; + + @Valid // 校验内嵌的字段 + @NotNull(message = "字段定义不能为空") + private List columns; + + @ApiModel("更新表定义") + @Data + @EqualsAndHashCode(callSuper = true) + @ToString(callSuper = true) + public static class Table extends ToolCodegenTableBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + private Long id; + + } + + @ApiModel("更新表定义") + @Data + @EqualsAndHashCode(callSuper = true) + @ToString(callSuper = true) + public static class Column extends ToolCodegenColumnBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + private Long id; + + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java new file mode 100644 index 0000000..bd89971 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnBaseVO.java @@ -0,0 +1,85 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.column; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 代码生成字段定义 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ToolCodegenColumnBaseVO { + + @ApiModelProperty(value = "表编号", required = true, example = "1") + @NotNull(message = "表编号不能为空") + private Long tableId; + + @ApiModelProperty(value = "字段名", required = true, example = "user_age") + @NotNull(message = "字段名不能为空") + private String columnName; + + @ApiModelProperty(value = "字段类型", required = true, example = "int(11)") + @NotNull(message = "字段类型不能为空") + private String columnType; + + @ApiModelProperty(value = "字段描述", required = true, example = "年龄") + @NotNull(message = "字段描述不能为空") + private String columnComment; + + @ApiModelProperty(value = "是否允许为空", required = true, example = "true") + @NotNull(message = "是否允许为空不能为空") + private Boolean nullable; + + @ApiModelProperty(value = "是否主键", required = true, example = "false") + @NotNull(message = "是否主键不能为空") + private Boolean primaryKey; + + @ApiModelProperty(value = "是否自增", required = true, example = "true") + @NotNull(message = "是否自增不能为空") + private String autoIncrement; + + @ApiModelProperty(value = "排序", required = true, example = "10") + @NotNull(message = "排序不能为空") + private Integer ordinalPosition; + + @ApiModelProperty(value = "Java 属性类型", required = true, example = "userAge") + @NotNull(message = "Java 属性类型不能为空") + private String javaType; + + @ApiModelProperty(value = "Java 属性名", required = true, example = "Integer") + @NotNull(message = "Java 属性名不能为空") + private String javaField; + + @ApiModelProperty(value = "字典类型", example = "sys_gender") + private String dictType; + + @ApiModelProperty(value = "数据示例", example = "1024") + private String example; + + @ApiModelProperty(value = "是否为 Create 创建操作的字段", required = true, example = "true") + @NotNull(message = "是否为 Create 创建操作的字段不能为空") + private Boolean createOperation; + + @ApiModelProperty(value = "是否为 Update 更新操作的字段", required = true, example = "false") + @NotNull(message = "是否为 Update 更新操作的字段不能为空") + private Boolean updateOperation; + + @ApiModelProperty(value = "是否为 List 查询操作的字段", required = true, example = "true") + @NotNull(message = "是否为 List 查询操作的字段不能为空") + private Boolean listOperation; + + @ApiModelProperty(value = "List 查询操作的条件类型", required = true, example = "LIKE", notes = "参见 ToolCodegenColumnListConditionEnum 枚举") + @NotNull(message = "List 查询操作的条件类型不能为空") + private String listOperationCondition; + + @ApiModelProperty(value = "是否为 List 查询操作的返回字段", required = true, example = "true") + @NotNull(message = "是否为 List 查询操作的返回字段不能为空") + private Boolean listOperationResult; + + @ApiModelProperty(value = "显示类型", required = true, example = "input") + @NotNull(message = "显示类型不能为空") + private String htmlType; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java new file mode 100644 index 0000000..c7d5564 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/column/ToolCodegenColumnRespVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.column; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("代码生成字段定义 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ToolCodegenColumnRespVO extends ToolCodegenColumnBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java new file mode 100644 index 0000000..e4fa2ab --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableBaseVO.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 代码生成 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ToolCodegenTableBaseVO { + + @ApiModelProperty(value = "导入类型", required = true, example = "1", notes = "参见 ToolCodegenImportTypeEnum 枚举") + @NotNull(message = "导入类型不能为空") + private Integer importType; + + @ApiModelProperty(value = "表名称", required = true, example = "yudao") + @NotNull(message = "表名称不能为空") + private String tableName; + + @ApiModelProperty(value = "表描述", required = true, example = "芋道") + @NotNull(message = "表描述不能为空") + private String tableComment; + + @ApiModelProperty(value = "备注", example = "我是备注") + private String remark; + + @ApiModelProperty(value = "模块名", required = true, example = "system") + @NotNull(message = "模块名不能为空") + private String moduleName; + + @ApiModelProperty(value = "业务名", required = true, example = "codegen") + @NotNull(message = "业务名不能为空") + private String businessName; + + @ApiModelProperty(value = "类名称", required = true, example = "ToolCodegenTable") + @NotNull(message = "类名称不能为空") + private String className; + + @ApiModelProperty(value = "类描述", required = true, example = "代码生成器的表定义") + @NotNull(message = "类描述不能为空") + private String classComment; + + @ApiModelProperty(value = "作者", required = true, example = "芋道源码") + @NotNull(message = "作者不能为空") + private String author; + + @ApiModelProperty(value = "模板类型", required = true, example = "1", notes = "参见 ToolCodegenTemplateTypeEnum 枚举") + @NotNull(message = "模板类型不能为空") + private Integer templateType; + + @ApiModelProperty(value = "父菜单编号", example = "1024") + private Long parentMenuId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java new file mode 100644 index 0000000..b09238b --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("表定义分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ToolCodegenTablePageReqVO extends PageParam { + + @ApiModelProperty(value = "表名称", example = "yudao", notes = "模糊匹配") + private String tableName; + + @ApiModelProperty(value = "表描述", example = "芋道", notes = "模糊匹配") + private String tableComment; + + @ApiModelProperty(value = "开始创建时间", example = "2020-10-24 00:00:00") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginCreateTime; + + @ApiModelProperty(value = "结束创建时间", example = "2020-10-24 23:59:59") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endCreateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java new file mode 100644 index 0000000..73ec3f8 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolCodegenTableRespVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("代码生成表定义 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ToolCodegenTableRespVO extends ToolCodegenTableBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + + @ApiModelProperty(value = "更新时间", required = true) + private Date updateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java new file mode 100644 index 0000000..284856f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/codegen/vo/table/ToolSchemaTableRespVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@ApiModel("数据字典的表定义 Response VO") +@Data +public class ToolSchemaTableRespVO { + + @ApiModelProperty(value = "数据库", required = true, example = "yudao") + private String tableSchema; + + @ApiModelProperty(value = "表名称", required = true, example = "yuanma") + private String tableName; + + @ApiModelProperty(value = "表描述", required = true, example = "芋道源码") + private String tableComment; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.http b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.http new file mode 100644 index 0000000..b10a3d2 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.http @@ -0,0 +1,7 @@ +### 请求 /tool/test-demo/get 接口 => 成功 +GET {{baseUrl}}/tool/test-demo/get?id=1 +Authorization: Bearer {{token}} + +### 请求 /tool/test-demo/list 接口 => 成功 +GET {{baseUrl}}/tool/test-demo/list?ids=1 +Authorization: Bearer {{token}} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.java new file mode 100644 index 0000000..2249af5 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/ToolTestDemoController.java @@ -0,0 +1,108 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.test; + +import cn.hutool.core.thread.ThreadUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.framework.tracer.core.annotation.BizTrace; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.*; +import cn.iocoder.yudao.adminserver.modules.tool.convert.test.ToolTestDemoConvert; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test.ToolTestDemoDO; +import cn.iocoder.yudao.adminserver.modules.tool.service.test.ToolTestDemoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "测试示例") +@RestController +@RequestMapping("/tool/test-demo") +@Validated +public class ToolTestDemoController { + + @Resource + private ToolTestDemoService testDemoService; + + @PostMapping("/create") + @ApiOperation("创建测试示例") + @PreAuthorize("@ss.hasPermission('tool:test-demo:create')") + public CommonResult createTestDemo(@Valid @RequestBody ToolTestDemoCreateReqVO createReqVO) { + return success(testDemoService.createTestDemo(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新测试示例") + @PreAuthorize("@ss.hasPermission('tool:test-demo:update')") + public CommonResult updateTestDemo(@Valid @RequestBody ToolTestDemoUpdateReqVO updateReqVO) { + testDemoService.updateTestDemo(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除测试示例") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('tool:test-demo:delete')") + public CommonResult deleteTestDemo(@RequestParam("id") Long id) { + testDemoService.deleteTestDemo(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得测试示例") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('tool:test-demo:query')") +// @Lock4j // 分布式锁 + public CommonResult getTestDemo(@RequestParam("id") Long id) { + if (true) { // 测试分布式锁 + ThreadUtil.sleep(5, TimeUnit.SECONDS); + } + ToolTestDemoDO testDemo = testDemoService.getTestDemo(id); + return success(ToolTestDemoConvert.INSTANCE.convert(testDemo)); + } + + @GetMapping("/list") + @ApiOperation("获得测试示例列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('tool:test-demo:query')") +// @RateLimiter(name = "backendA") + @BizTrace(id = "#ids", type = "'user'") + public CommonResult> getTestDemoList(@RequestParam("ids") Collection ids) { + List list = testDemoService.getTestDemoList(ids); + return success(ToolTestDemoConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得测试示例分页") + @PreAuthorize("@ss.hasPermission('tool:test-demo:query')") + public CommonResult> getTestDemoPage(@Valid ToolTestDemoPageReqVO pageVO) { + PageResult pageResult = testDemoService.getTestDemoPage(pageVO); + return success(ToolTestDemoConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出测试示例 Excel") + @PreAuthorize("@ss.hasPermission('tool:test-demo:export')") + @OperateLog(type = EXPORT) + public void exportTestDemoExcel(@Valid ToolTestDemoExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = testDemoService.getTestDemoList(exportReqVO); + // 导出 Excel + List datas = ToolTestDemoConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "测试示例.xls", "数据", ToolTestDemoExcelVO.class, datas); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java new file mode 100644 index 0000000..0e1af3c --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoBaseVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 字典类型 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ToolTestDemoBaseVO { + + @ApiModelProperty(value = "名字", required = true, example = "芋道") + @NotNull(message = "名字不能为空") + private String name; + + @ApiModelProperty(value = "状态", required = true, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @ApiModelProperty(value = "类型", required = true, example = "2") + @NotNull(message = "类型不能为空") + private Integer type; + + @ApiModelProperty(value = "分类", required = true, example = "3") + @NotNull(message = "分类不能为空") + private Integer category; + + @ApiModelProperty(value = "备注", example = "我是备注") + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java new file mode 100644 index 0000000..b1866f7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoCreateReqVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("字典类型创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ToolTestDemoCreateReqVO extends ToolTestDemoBaseVO { + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java new file mode 100644 index 0000000..bfb9170 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExcelVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants; +import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 测试示例 Excel VO + * + * @author 芋艿 + */ +@Data +public class ToolTestDemoExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("名字") + private String name; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty(value = "类型", converter = DictConvert.class) + @DictFormat(SysDictTypeConstants.OPERATE_TYPE) + private Integer type; + + @ExcelProperty(value = "分类", converter = DictConvert.class) + @DictFormat(InfDictTypeConstants.REDIS_TIMEOUT_TYPE) + private Integer category; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java new file mode 100644 index 0000000..84bce9e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "字典类型 Excel 导出 Request VO", description = "参数和 ToolTestDemoPageReqVO 是一致的") +@Data +public class ToolTestDemoExportReqVO { + + @ApiModelProperty(value = "名字", example = "芋道") + private String name; + + @ApiModelProperty(value = "状态", example = "1") + private Integer status; + + @ApiModelProperty(value = "类型", example = "2") + private Integer type; + + @ApiModelProperty(value = "分类", example = "3") + private Integer category; + + @ApiModelProperty(value = "备注", example = "我是备注") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java new file mode 100644 index 0000000..05fa157 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("字典类型分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ToolTestDemoPageReqVO extends PageParam { + + @ApiModelProperty(value = "名字", example = "芋道") + private String name; + + @ApiModelProperty(value = "状态", example = "1") + private Integer status; + + @ApiModelProperty(value = "类型", example = "2") + private Integer type; + + @ApiModelProperty(value = "分类", example = "3") + private Integer category; + + @ApiModelProperty(value = "备注", example = "我是备注") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoRespVO.java new file mode 100644 index 0000000..e679fd4 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoRespVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("字典类型 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ToolTestDemoRespVO extends ToolTestDemoBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java new file mode 100644 index 0000000..ef05d44 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/controller/test/vo/ToolTestDemoUpdateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("字典类型更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ToolTestDemoUpdateReqVO extends ToolTestDemoBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/codegen/ToolCodegenConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/codegen/ToolCodegenConvert.java new file mode 100644 index 0000000..65bf461 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/codegen/ToolCodegenConvert.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.adminserver.modules.tool.convert.codegen; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenDetailRespVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenPreviewRespVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.column.ToolCodegenColumnRespVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTableRespVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolSchemaTableRespVO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Mapper +public interface ToolCodegenConvert { + + ToolCodegenConvert INSTANCE = Mappers.getMapper(ToolCodegenConvert.class); + + // ========== ToolInformationSchemaTableDO 和 ToolInformationSchemaColumnDO 相关 ========== + + ToolCodegenTableDO convert(ToolSchemaTableDO bean); + + List convertList(List list); + + ToolCodegenTableRespVO convert(ToolSchemaColumnDO bean); + + // ========== ToolCodegenTableDO 相关 ========== + +// List convertList02(List list); + + ToolCodegenTableRespVO convert(ToolCodegenTableDO bean); + + PageResult convertPage(PageResult page); + + // ========== ToolCodegenTableDO 相关 ========== + + List convertList02(List list); + + ToolCodegenTableDO convert(ToolCodegenUpdateReqVO.Table bean); + + List convertList03(List columns); + + List convertList04(List list); + + // ========== 其它 ========== + + default ToolCodegenDetailRespVO convert(ToolCodegenTableDO table, List columns) { + ToolCodegenDetailRespVO respVO = new ToolCodegenDetailRespVO(); + respVO.setTable(convert(table)); + respVO.setColumns(convertList02(columns)); + return respVO; + } + + default List convert(Map codes) { + return codes.entrySet().stream().map(entry -> { + ToolCodegenPreviewRespVO respVO = new ToolCodegenPreviewRespVO(); + respVO.setFilePath(entry.getKey()); + respVO.setCode(entry.getValue()); + return respVO; + }).collect(Collectors.toList()); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/test/ToolTestDemoConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/test/ToolTestDemoConvert.java new file mode 100644 index 0000000..25f41fa --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/convert/test/ToolTestDemoConvert.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.adminserver.modules.tool.convert.test; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoExcelVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoRespVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test.ToolTestDemoDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** +* 字典类型 Convert +* +* @author 芋艿 +*/ +@Mapper +public interface ToolTestDemoConvert { + + ToolTestDemoConvert INSTANCE = Mappers.getMapper(ToolTestDemoConvert.class); + + ToolTestDemoDO convert(ToolTestDemoCreateReqVO bean); + + ToolTestDemoDO convert(ToolTestDemoUpdateReqVO bean); + + ToolTestDemoRespVO convert(ToolTestDemoDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java new file mode 100644 index 0000000..7d0d950 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenColumnDO.java @@ -0,0 +1,125 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; +import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 代码生成 column 字段定义 + * + * @author 芋道源码 + */ +@TableName(value = "tool_codegen_column", autoResultMap = true) +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class ToolCodegenColumnDO extends BaseDO { + + /** + * ID 编号 + */ + @TableId + private Long id; + /** + * 表编号 + * + * 关联 {@link ToolCodegenTableDO#getId()} + */ + private Long tableId; + + // ========== 表相关字段 ========== + + /** + * 字段名 + */ + private String columnName; + /** + * 字段类型 + */ + private String columnType; + /** + * 字段描述 + */ + private String columnComment; + /** + * 是否允许为空 + */ + private Boolean nullable; + /** + * 是否主键 + */ + private Boolean primaryKey; + /** + * 是否自增 + */ + private Boolean autoIncrement; + /** + * 排序 + */ + private Integer ordinalPosition; + + // ========== Java 相关字段 ========== + + /** + * Java 属性类型 + * + * 例如说 String、Boolean 等等 + */ + private String javaType; + /** + * Java 属性名 + */ +// @NotBlank(message = "Java属性不能为空") + private String javaField; + /** + * 字典类型 + * + * 关联 {@link SysDictTypeDO#getType()} + */ + private String dictType; + /** + * 数据示例,主要用于生成 Swagger 注解的 example 字段 + */ + private String example; + + // ========== CRUD 相关字段 ========== + + /** + * 是否为 Create 创建操作的字段 + */ + private Boolean createOperation; + /** + * 是否为 Update 更新操作的字段 + */ + private Boolean updateOperation; + /** + * 是否为 List 查询操作的字段 + */ + private Boolean listOperation; + /** + * List 查询操作的条件类型 + * + * 枚举 {@link ToolCodegenColumnListConditionEnum} + */ + private String listOperationCondition; + /** + * 是否为 List 查询操作的返回字段 + */ + private Boolean listOperationResult; + + // ========== UI 相关字段 ========== + + /** + * 显示类型 + * + * 枚举 {@link ToolCodegenColumnHtmlTypeEnum} + */ + private String htmlType; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java new file mode 100644 index 0000000..4ed11b2 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolCodegenTableDO.java @@ -0,0 +1,96 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenTemplateTypeEnum; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 代码生成 table 表定义 + * + * @author 芋道源码 + */ +@TableName(value = "tool_codegen_table", autoResultMap = true) +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class ToolCodegenTableDO extends BaseDO { + + /** + * ID 编号 + */ + private Long id; + + /** + * 导入类型 + * + * 枚举 {@link ToolCodegenTemplateTypeEnum} + */ + private Integer importType; + + // ========== 表相关字段 ========== + + /** + * 表名称 + */ + private String tableName; + /** + * 表描述 + */ + private String tableComment; + /** + * 备注 + */ + private String remark; + + // ========== 类相关字段 ========== + + /** + * 模块名,即一级目录 + * + * 例如说,system、infra、tool 等等 + */ + private String moduleName; + /** + * 业务名,即二级目录 + * + * 例如说,user、permission、dict 等等 + */ + private String businessName; + /** + * 类名称(首字母大写) + * + * 例如说,SysUser、SysMenu、SysDictData 等等 + */ + private String className; + /** + * 类描述 + */ + private String classComment; + /** + * 作者 + */ + private String author; + + // ========== 生成相关字段 ========== + + /** + * 模板类型 + * + * 枚举 {@link ToolCodegenTemplateTypeEnum} + */ + private Integer templateType; + + // ========== 菜单相关字段 ========== + + /** + * 父菜单编号 + * + * 关联 {@link SysMenuDO#getId()} + */ + private Long parentMenuId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java new file mode 100644 index 0000000..e78e16f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaColumnDO.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; + +/** + * MySQL 数据库中的 column 字段定义 + * + * @author 芋道源码 + */ +@TableName(value = "information_schema.columns", autoResultMap = true) +@Data +@Builder +public class ToolSchemaColumnDO { + + /** + * 表名称 + */ + private String tableName; + /** + * 字段名 + */ + private String columnName; + /** + * 字段类型 + */ + private String columnType; + /** + * 字段描述 + */ + private String columnComment; + /** + * 是否允许为空 + */ + @TableField("case when is_nullable = 'yes' then '1' else '0' end") + private Boolean nullable; + /** + * 是否主键 + */ + @TableField("case when column_key = 'PRI' then '1' else '0' end") + private Boolean primaryKey; + /** + * 是否自增 + */ + @TableField("case when extra = 'auto_increment' then '1' else '0' end") + private Boolean autoIncrement; + /** + * 排序字段 + */ + private Integer ordinalPosition; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java new file mode 100644 index 0000000..e3e7035 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/codegen/ToolSchemaTableDO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; + +import java.util.Date; + +/** + * MySQL 数据库中的 table 表定义 + * + * @author 芋道源码 + */ +@TableName(value = "information_schema.tables", autoResultMap = true) +@Data +@Builder +public class ToolSchemaTableDO { + + /** + * 数据库 + */ + private String tableSchema; + /** + * 表名称 + */ + private String tableName; + /** + * 表描述 + */ + private String tableComment; + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/test/ToolTestDemoDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/test/ToolTestDemoDO.java new file mode 100644 index 0000000..d77ec22 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/dataobject/test/ToolTestDemoDO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** +* 字典类型 DO +* +* @author 芋艿 +*/ +@TableName("tool_test_demo") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ToolTestDemoDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 名字 + */ + private String name; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 类型 + * + * 枚举 {@link cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum} + */ + private Integer type; + /** + * 分类 + * + * 枚举 {@link cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.TimeoutTypeEnum} + */ + private Integer category; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java new file mode 100644 index 0000000..2fae426 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenColumnMapper.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ToolCodegenColumnMapper extends BaseMapperX { + + default List selectListByTableId(Long tableId) { + return selectList(new QueryWrapper().eq("table_id", tableId) + .orderByAsc("ordinal_position")); + } + + default void deleteListByTableId(Long tableId) { + delete(new QueryWrapper().eq("table_id", tableId)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java new file mode 100644 index 0000000..31ce16f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolCodegenTableMapper.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ToolCodegenTableMapper extends BaseMapperX { + + default ToolCodegenTableDO selectByTableName(String tableName) { + return selectOne(new QueryWrapper().eq("table_name", tableName)); + } + + default PageResult selectPage(ToolCodegenTablePageReqVO pageReqVO) { + return selectPage(pageReqVO, new QueryWrapperX() + .likeIfPresent("table_name", pageReqVO.getTableName()) + .likeIfPresent("table_comment", pageReqVO.getTableComment()) + .betweenIfPresent("create_time", pageReqVO.getBeginCreateTime(), pageReqVO.getEndCreateTime())); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java new file mode 100644 index 0000000..4778da0 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaColumnMapper.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ToolSchemaColumnMapper extends BaseMapperX { + + default List selectListByTableName(String tableSchema, String tableName) { + return selectList(new QueryWrapper().eq("table_name", tableName) + .eq("table_schema", tableSchema) + .orderByAsc("ordinal_position")); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java new file mode 100644 index 0000000..7430ef6 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolSchemaTableMapper.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface ToolSchemaTableMapper extends BaseMapperX { + + default List selectList(Collection tableSchemas, String tableName, String tableComment) { + return selectList(new QueryWrapperX().in("table_schema", tableSchemas) + .likeIfPresent("table_name", tableName) + .likeIfPresent("table_comment", tableComment)); + } + + default ToolSchemaTableDO selectByTableSchemaAndTableName(String tableSchema, String tableName) { + return selectOne(new QueryWrapper().eq("table_schema",tableSchema) + .eq("table_name", tableName)); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/test/ToolTestDemoMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/test/ToolTestDemoMapper.java new file mode 100644 index 0000000..937ba07 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/test/ToolTestDemoMapper.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.test; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoExportReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoPageReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test.ToolTestDemoDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 字典类型 Mapper + * + * @author 芋艿 + */ +@Mapper +public interface ToolTestDemoMapper extends BaseMapperX { + + default PageResult selectPage(ToolTestDemoPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("type", reqVO.getType()) + .eqIfPresent("category", reqVO.getCategory()) + .eqIfPresent("remark", reqVO.getRemark()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + ); + } + + default List selectList(ToolTestDemoExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("type", reqVO.getType()) + .eqIfPresent("category", reqVO.getCategory()) + .eqIfPresent("remark", reqVO.getRemark()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + ); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolErrorCodeConstants.java new file mode 100644 index 0000000..cdf341d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/ToolErrorCodeConstants.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.adminserver.modules.tool.enums; + +import cn.iocoder.yudao.framework.common.exception.ErrorCode; + +/** + * Tool 错误码枚举类 + * + * tool 系统,使用 1-003-000-000 段 + */ +public interface ToolErrorCodeConstants { + + // ========== 字典类型(测试) 1003000000 ========== + ErrorCode TEST_DEMO_NOT_EXISTS = new ErrorCode(1003000000, "测试示例不存在"); + + // ========== 代码生成器 1003001000 ========== + ErrorCode CODEGEN_TABLE_EXISTS = new ErrorCode(1003001000, "表定义已经存在"); + ErrorCode CODEGEN_IMPORT_TABLE_NULL = new ErrorCode(1003001001, "导入的表不存在"); + ErrorCode CODEGEN_IMPORT_COLUMNS_NULL = new ErrorCode(1003001002, "导入的字段不存在"); + ErrorCode CODEGEN_PARSE_SQL_ERROR = new ErrorCode(1003001003, "解析 SQL 失败,请检查"); + ErrorCode CODEGEN_TABLE_NOT_EXISTS = new ErrorCode(1003001004, "表定义不存在"); + ErrorCode CODEGEN_COLUMN_NOT_EXISTS = new ErrorCode(1003001005, "字段义不存在"); + ErrorCode CODEGEN_SYNC_COLUMNS_NULL = new ErrorCode(1003001006, "同步的字段不存在"); + ErrorCode CODEGEN_SYNC_NONE_CHANGE = new ErrorCode(1003001007, "同步失败,不存在改变"); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java new file mode 100644 index 0000000..22dbdd2 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.tool.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成器的字段 HTML 展示枚举 + */ +@AllArgsConstructor +@Getter +public enum ToolCodegenColumnHtmlTypeEnum { + + INPUT("input"), // 文本框 + TEXTAREA("textarea"), // 文本域 + SELECT("select"), // 下拉框 + RADIO("radio"), // 单选框 + CHECKBOX("checkbox"), // 复选框 + DATETIME("datetime"), // 日期控件 + UPLOAD_IMAGE("upload_image"), // 上传图片 + UPLOAD_FILE("upload_file"), // 上传文件 + EDITOR("editor"), // 富文本控件 + ; + + /** + * 条件 + */ + private final String type; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java new file mode 100644 index 0000000..0783c98 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.adminserver.modules.tool.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成器的字段过滤条件枚举 + */ +@AllArgsConstructor +@Getter +public enum ToolCodegenColumnListConditionEnum { + + EQ("="), + NE("!="), + GT(">"), + GTE(">="), + LT("<"), + LTE("<="), + LIKE("LIKE"), + BETWEEN("BETWEEN"); + + /** + * 条件 + */ + private final String condition; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java new file mode 100644 index 0000000..746cb71 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenImportTypeEnum.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver.modules.tool.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成的导入类型 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum ToolCodegenImportTypeEnum { + + DB(1), // 从 information_schema 的 table 和 columns 表导入 + SQL(2); // 基于建表 SQL 语句导入 + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java new file mode 100644 index 0000000..b192c31 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.tool.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成模板类型 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum ToolCodegenTemplateTypeEnum { + + CRUD(1), // 单表(增删改查) + TREE(2), // 树表(增删改查) + ; + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java new file mode 100644 index 0000000..9a2789e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeConfiguration.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.config; + +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.generator.ErrorCodeAutoGenerator; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.loader.ErrorCodeLoader; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.loader.ErrorCodeLoaderImpl; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.generator.ErrorCodeAutoGeneratorImpl; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * 错误码配置类 + */ +@Configuration +@EnableConfigurationProperties(ErrorCodeProperties.class) +@EnableScheduling // 开启调度任务的功能,因为 ErrorCodeRemoteLoader 通过定时刷新错误码 +public class ErrorCodeConfiguration { + + @Bean + public ErrorCodeAutoGenerator errorCodeAutoGenerator(@Value("${spring.application.name}") String applicationName, + ErrorCodeProperties errorCodeProperties, + ErrorCodeFrameworkService errorCodeFrameworkService) { + return new ErrorCodeAutoGeneratorImpl(applicationName, errorCodeProperties.getConstantsClassList(), + errorCodeFrameworkService); + } + + @Bean + public ErrorCodeLoader errorCodeLoader(@Value("${spring.application.name}") String applicationName, + ErrorCodeFrameworkService errorCodeFrameworkService) { + return new ErrorCodeLoaderImpl(applicationName, errorCodeFrameworkService); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeProperties.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeProperties.java new file mode 100644 index 0000000..f652a6a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/config/ErrorCodeProperties.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 错误码的配置属性类 + * + * @author dlyan + */ +@ConfigurationProperties("yudao.error-code") +@Data +@Validated +public class ErrorCodeProperties { + + /** + * 错误码枚举类 + */ + @NotNull(message = "错误码枚举类不能为空") + private List constantsClassList; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java new file mode 100644 index 0000000..098f043 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 错误码自动生成 DTO + * + * @author dylan + */ +@Data +@Accessors(chain = true) +public class ErrorCodeAutoGenerateReqDTO { + + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + /** + * 错误码编码 + */ + @NotNull(message = "错误码编码不能为空") + private Integer code; + /** + * 错误码错误提示 + */ + @NotEmpty(message = "错误码错误提示不能为空") + private String message; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java new file mode 100644 index 0000000..7e2bb2a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/dto/ErrorCodeRespDTO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto; + +import lombok.Data; + +import java.util.Date; + +/** + * 错误码的 Response DTO + * + * @author 芋道源码 + */ +@Data +public class ErrorCodeRespDTO { + + /** + * 错误码编码 + */ + private Integer code; + /** + * 错误码错误提示 + */ + private String message; + /** + * 更新时间 + */ + private Date updateTime; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java new file mode 100644 index 0000000..60689af --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.generator; + +/** + * 错误码的自动生成器 + * + * @author dylan + */ +public interface ErrorCodeAutoGenerator { + + /** + * 将配置类到错误码写入数据库 + */ + void execute(); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java new file mode 100644 index 0000000..bedbcdc --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java @@ -0,0 +1,98 @@ +package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.generator; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.iocoder.yudao.framework.common.exception.ErrorCode; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ErrorCodeAutoGenerator 的实现类 + * 目的是,扫描指定的 {@link #constantsClassList} 类,写入到 system 服务中 + * + * @author dylan + */ +@RequiredArgsConstructor +@Slf4j +public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator { + + /** + * 应用分组 + */ + private final String applicationName; + /** + * 错误码枚举类 + */ + private final List constantsClassList; + /** + * 错误码 Service + */ + private final ErrorCodeFrameworkService errorCodeService; + + @Override + @EventListener(ApplicationReadyEvent.class) + @Async // 异步,保证项目的启动过程,毕竟非关键流程 + public void execute() { + // 第一步,解析错误码 + List autoGenerateDTOs = parseErrorCode(); + log.info("[execute][解析到错误码数量为 ({}) 个]", autoGenerateDTOs.size()); + + // 第二步,写入到 system 服务 + errorCodeService.autoGenerateErrorCodes(autoGenerateDTOs); + log.info("[execute][写入到 system 组件完成]"); + } + + /** + * 解析 constantsClassList 变量,转换成错误码数组 + * + * @return 错误码数组 + */ + private List parseErrorCode() { + // 校验 errorCodeConstantsClass 参数 + if (CollUtil.isEmpty(constantsClassList)) { + log.info("[execute][未配置 yudao.error-code.constants-class-list 配置项,不进行自动写入到 system 服务中]"); + return new ArrayList<>(); + } + + // 解析错误码 + List autoGenerateDTOs = new ArrayList<>(); + constantsClassList.forEach(constantsClass -> { + // 解析错误码枚举类 + Class errorCodeConstantsClazz = ClassUtil.loadClass(constantsClass); + // 解析错误码 + autoGenerateDTOs.addAll(parseErrorCode(errorCodeConstantsClazz)); + }); + return autoGenerateDTOs; + } + + /** + * 解析错误码类,获得错误码数组 + * + * @return 错误码数组 + */ + private List parseErrorCode(Class constantsClass) { + List autoGenerateDTOs = new ArrayList<>(); + Arrays.stream(constantsClass.getFields()).forEach(field -> { + if (field.getType() != ErrorCode.class) { + return; + } + // 转换成 ErrorCodeAutoGenerateReqDTO 对象 + ErrorCode errorCode = (ErrorCode) ReflectUtil.getFieldValue(constantsClass, field); + autoGenerateDTOs.add(new ErrorCodeAutoGenerateReqDTO().setApplicationName(applicationName) + .setCode(errorCode.getCode()).setMessage(errorCode.getMsg())); + }); + return autoGenerateDTOs; + } + +} + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java new file mode 100644 index 0000000..d35767f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoader.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.loader; + +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; + +/** + * 错误码加载器 + * + * 注意,错误码最终加载到 {@link ServiceExceptionUtil} 的 MESSAGES 变量中! + * + * @author dlyan + */ +public interface ErrorCodeLoader { + + /** + * 添加错误码 + * + * @param code 错误码的编号 + * @param msg 错误码的提示 + */ + default void putErrorCode(Integer code, String msg) { + ServiceExceptionUtil.put(code, msg); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java new file mode 100644 index 0000000..234d30d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.loader; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.service.ErrorCodeFrameworkService; +import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.Date; +import java.util.List; + +/** + * ErrorCodeLoader 的实现类,从 infra 的数据库中,加载错误码。 + * + * 考虑到错误码会刷新,所以按照 {@link #REFRESH_ERROR_CODE_PERIOD} 频率,增量加载错误码。 + * + * @author dlyan + */ +@RequiredArgsConstructor +@Slf4j +public class ErrorCodeLoaderImpl implements ErrorCodeLoader { + + /** + * 刷新错误码的频率,单位:毫秒 + */ + private static final int REFRESH_ERROR_CODE_PERIOD = 60 * 1000; + + /** + * 应用分组 + */ + private final String applicationName; + /** + * 错误码 Service + */ + private final ErrorCodeFrameworkService errorCodeService; + + /** + * 缓存错误码的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private Date maxUpdateTime; + + @EventListener(ApplicationReadyEvent.class) + public void loadErrorCodes() { + this.loadErrorCodes0(); + } + + @Scheduled(fixedDelay = REFRESH_ERROR_CODE_PERIOD, initialDelay = REFRESH_ERROR_CODE_PERIOD) + public void refreshErrorCodes() { + this.loadErrorCodes0(); + } + + private void loadErrorCodes0() { + // 加载错误码 + List errorCodeRespDTOs = errorCodeService.getErrorCodeList(applicationName, maxUpdateTime); + if (CollUtil.isEmpty(errorCodeRespDTOs)) { + return; + } + log.info("[loadErrorCodes0][加载到 ({}) 个错误码]", errorCodeRespDTOs.size()); + + // 刷新错误码的缓存 + errorCodeRespDTOs.forEach(errorCodeRespDTO -> { + // 写入到错误码的缓存 + putErrorCode(errorCodeRespDTO.getCode(), errorCodeRespDTO.getMessage()); + // 记录下更新时间,方便增量更新 + maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeRespDTO.getUpdateTime()); + }); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java new file mode 100644 index 0000000..e3f5e91 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/core/service/ErrorCodeFrameworkService.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.service; + +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeRespDTO; + +import javax.validation.Valid; +import java.util.Date; +import java.util.List; + +/** + * 错误码 Framework Service 接口 + * + * @author 芋道源码 + */ +public interface ErrorCodeFrameworkService { + + /** + * 自动创建错误码 + * + * @param autoGenerateDTOs 错误码信息 + */ + void autoGenerateErrorCodes(@Valid List autoGenerateDTOs); + + /** + * 增量获得错误码数组 + * + * 如果 minUpdateTime 为空时,则获取所有错误码 + * + * @param applicationName 应用名 + * @param minUpdateTime 最小更新时间 + * @return 错误码数组 + */ + List getErrorCodeList(String applicationName, Date minUpdateTime); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/package-info.java new file mode 100644 index 0000000..343ccae --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/errorcode/package-info.java @@ -0,0 +1,6 @@ +/** + * 错误码组件 + * + * 将错误码缓存在内存中,同时通过定时器每 n 分钟更新 + */ +package cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/package-info.java new file mode 100644 index 0000000..f9a66d3 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 tool 模块的 framework 封装 + * + * @author 芋道源码 + */ +package cn.iocoder.yudao.adminserver.modules.tool.framework; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/package-info.java new file mode 100644 index 0000000..f1e361d --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/package-info.java @@ -0,0 +1,7 @@ +/** + * tool 包下,我们放研发工具,提升研发效率与质量。 + * 例如说:代码生成器、接口文档等等 + * + * 缩写:tool + */ +package cn.iocoder.yudao.adminserver.modules.tool; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenService.java new file mode 100644 index 0000000..fbe61c4 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenService.java @@ -0,0 +1,121 @@ +package cn.iocoder.yudao.adminserver.modules.tool.service.codegen; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; + +import java.util.List; +import java.util.Map; + +/** + * 代码生成 Service 接口 + * + * @author 芋道源码 + */ +public interface ToolCodegenService { + + /** + * 基于 SQL 建表语句,创建代码生成器的表定义 + * + * @param sql SQL 建表语句 + * @return 创建的表定义的编号 + */ + Long createCodegenListFromSQL(String sql); + + /** + * 基于数据库的表结构,创建代码生成器的表定义 + * + * @param tableName 表名称 + * @return 创建的表定义的编号 + */ + Long createCodegen(String tableName); + + /** + * 基于 {@link #createCodegen(String)} 的批量创建 + * + * @param tableNames 表名称数组 + * @return 创建的表定义的编号数组 + */ + List createCodegenListFromDB(List tableNames); + + /** + * 更新数据库的表和字段定义 + * + * @param updateReqVO 更新信息 + */ + void updateCodegen(ToolCodegenUpdateReqVO updateReqVO); + + /** + * 基于数据库的表结构,同步数据库的表和字段定义 + * + * @param tableId 表编号 + */ + void syncCodegenFromDB(Long tableId); + + /** + * 基于 SQL 建表语句,同步数据库的表和字段定义 + * + * @param tableId 表编号 + * @param sql SQL 建表语句 + */ + void syncCodegenFromSQL(Long tableId, String sql); + + /** + * 删除数据库的表和字段定义 + * + * @param tableId 数据编号 + */ + void deleteCodegen(Long tableId); + + /** + * 获得表定义分页 + * + * @param pageReqVO 分页条件 + * @return 表定义分页 + */ + PageResult getCodegenTablePage(ToolCodegenTablePageReqVO pageReqVO); + + /** + * 获得表定义 + * + * @param id 表编号 + * @return 表定义 + */ + ToolCodegenTableDO getCodegenTablePage(Long id); + + /** + * 获得全部表定义 + * + * @return 表定义数组 + */ + List getCodeGenTableList(); + + /** + * 获得指定表的字段定义数组 + * + * @param tableId 表编号 + * @return 字段定义数组 + */ + List getCodegenColumnListByTableId(Long tableId); + + /** + * 执行指定表的代码生成 + * + * @param tableId 表编号 + * @return 生成结果。key 为文件路径,value 为对应的代码内容 + */ + Map generationCodes(Long tableId); + + /** + * 获得数据库自带的表定义列表 + * + * @param tableName 表名称 + * @param tableComment 表描述 + * @return 表定义列表 + */ + List getSchemaTableList(String tableName, String tableComment); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenBuilder.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenBuilder.java new file mode 100644 index 0000000..87e6ab6 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenBuilder.java @@ -0,0 +1,234 @@ +package cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.adminserver.modules.tool.convert.codegen.ToolCodegenConvert; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; +import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; +import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; +import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenTemplateTypeEnum; +import com.google.common.collect.Sets; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.*; + +import static cn.hutool.core.text.CharSequenceUtil.*; + +/** + * 代码生成器的 Builder,负责: + * 1. 将数据库的表 {@link ToolSchemaTableDO} 定义,构建成 {@link ToolCodegenTableDO} + * 2. 将数据库的列 {@link ToolSchemaColumnDO} 构定义,建成 {@link ToolCodegenColumnDO} + */ +@Component +public class ToolCodegenBuilder { + + /** + * Module 名字的映射 TODO 后续梳理到配置类 + * + * key:模块的完整名 + * value:模块的缩写名 + */ + private static final Map moduleNames = MapUtil.builder() + .put("system", "sys") + .put("infra", "inf") + .put("tool", "tool") + .build(); + + /** + * 字段名与 {@link ToolCodegenColumnListConditionEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map columnListOperationConditionMappings = + MapUtil.builder() + .put("name", ToolCodegenColumnListConditionEnum.LIKE) + .put("time", ToolCodegenColumnListConditionEnum.BETWEEN) + .put("date", ToolCodegenColumnListConditionEnum.BETWEEN) + .build(); + + /** + * 字段名与 {@link ToolCodegenColumnHtmlTypeEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map columnHtmlTypeMappings = + MapUtil.builder() + .put("status", ToolCodegenColumnHtmlTypeEnum.RADIO) + .put("sex", ToolCodegenColumnHtmlTypeEnum.RADIO) + .put("type", ToolCodegenColumnHtmlTypeEnum.SELECT) + .put("image", ToolCodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) + .put("file", ToolCodegenColumnHtmlTypeEnum.UPLOAD_FILE) + .put("content", ToolCodegenColumnHtmlTypeEnum.EDITOR) + .put("time", ToolCodegenColumnHtmlTypeEnum.DATETIME) + .put("date", ToolCodegenColumnHtmlTypeEnum.DATETIME) + .build(); + + /** + * {@link BaseDO} 的字段 + */ + public static final Set BASE_DO_FIELDS = new HashSet<>(); + /** + * 新增操作,不需要传递的字段 + */ + private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); + /** + * 修改操作,不需要传递的字段 + */ + private static final Set UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); + /** + * 列表操作的条件,不需要传递的字段 + */ + private static final Set LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); + /** + * 列表操作的结果,不需要返回的字段 + */ + private static final Set LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); + + /** + * Java 类型与 MySQL 类型的映射关系 + */ + private static final Map> javaTypeMappings = MapUtil.>builder() + .put(Boolean.class.getSimpleName(), Sets.newHashSet("bit")) + .put(Integer.class.getSimpleName(), Sets.newHashSet("tinyint", "smallint", "mediumint", "int")) + .put(Long.class.getSimpleName(), Collections.singleton("bigint")) + .put(Double.class.getSimpleName(), Sets.newHashSet("float", "double")) + .put(BigDecimal.class.getSimpleName(), Sets.newHashSet("decimal", "numeric")) + .put(String.class.getSimpleName(), Sets.newHashSet("tinytext", "text", "mediumtext", "longtext", // 长文本 + "char", "varchar", "nvarchar", "varchar2")) // 短文本 + .put(Date.class.getSimpleName(), Sets.newHashSet("datetime", "time", "date", "timestamp")) + .put("byte[]", Sets.newHashSet("blob")) + .build(); + + static { + Arrays.stream(BaseDO.class.getDeclaredFields()).forEach(field -> BASE_DO_FIELDS.add(field.getName())); + // 处理 OPERATION 相关的字段 + CREATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + UPDATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是可能需要传递的 + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的 + } + + public ToolCodegenTableDO buildTable(ToolSchemaTableDO schemaTable) { + ToolCodegenTableDO table = ToolCodegenConvert.INSTANCE.convert(schemaTable); + initTableDefault(table); + return table; + } + + /** + * 初始化 Table 表的默认字段 + * + * @param table 表定义 + */ + private void initTableDefault(ToolCodegenTableDO table) { + table.setModuleName(getFullModuleName(StrUtil.subBefore(table.getTableName(), + '_', false))); // 第一个 _ 前缀的前面,作为 module 名字 + table.setBusinessName(toCamelCase(subAfter(table.getTableName(), + '_', false))); // 第一步,第一个 _ 前缀的后面,作为 module 名字; 第二步,可能存在多个 _ 的情况,转换成驼峰 + table.setClassName(upperFirst(toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写 + table.setClassComment(subBefore(table.getTableComment(), // 去除结尾的表,作为类描述 + '表', true)); + table.setAuthor("芋艿"); // TODO 稍后改成创建人 + table.setTemplateType(ToolCodegenTemplateTypeEnum.CRUD.getType()); + } + + public List buildColumns(List schemaColumns) { + List columns = ToolCodegenConvert.INSTANCE.convertList(schemaColumns); + columns.forEach(this::initColumnDefault); + return columns; + } + + /** + * 初始化 Column 列的默认字段 + * + * @param column 列定义 + */ + private void initColumnDefault(ToolCodegenColumnDO column) { + // 处理 Java 相关的字段的默认值 + processColumnJava(column); + // 处理 CRUD 相关的字段的默认值 + processColumnOperation(column); + // 处理 UI 相关的字段的默认值 + processColumnUI(column); + } + + private void processColumnJava(ToolCodegenColumnDO column) { + // 处理 javaField 字段 + column.setJavaField(toCamelCase(column.getColumnName())); + // 处理 dictType 字段,暂无 + // 处理 javaType 字段 + String dbType = StrUtil.subBefore(column.getColumnType(), '(', false); + javaTypeMappings.entrySet().stream() + .filter(entry -> entry.getValue().contains(dbType)) + .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey())); + if (column.getJavaType() == null) { + throw new IllegalStateException(String.format("column(%s) 的数据库类型(%s) 找不到匹配的 Java 类型", + column.getColumnName(), column.getColumnType())); + } + } + + private void processColumnOperation(ToolCodegenColumnDO column) { + // 处理 createOperation 字段 + column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,创建时无需传递 + // 处理 updateOperation 字段 + column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + || column.getPrimaryKey()); // 对于主键,更新时需要传递 + // 处理 listOperation 字段 + column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 + // 处理 listOperationCondition 字段 + columnListOperationConditionMappings.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); + if (column.getListOperationCondition() == null) { + column.setListOperationCondition(ToolCodegenColumnListConditionEnum.EQ.getCondition()); + } + // 处理 listOperationResult 字段 + column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); + } + + private void processColumnUI(ToolCodegenColumnDO column) { + // 基于后缀进行匹配 + columnHtmlTypeMappings.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); + // 如果是 Boolean 类型时,设置为 radio 类型. + // 其它类型,因为字段名可以相对保障,所以不进行处理。例如说 date 对应 datetime 类型. + if (Boolean.class.getSimpleName().equals(column.getJavaType())) { + column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.RADIO.getType()); + } + // 兜底,设置默认为 input 类型 + if (column.getHtmlType() == null) { + column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.INPUT.getType()); + } + } + + /** + * 获得模块的缩略名 + * + * @param fullModuleName 模块的完整名 + * @return 缩略名 + */ + public String getSimpleModuleName(String fullModuleName) { + return moduleNames.getOrDefault(fullModuleName, fullModuleName); + } + + /** + * 获得模块的完整名 + * + * @param shortModuleName 模块的缩略名 + * @return 完整名 + */ + public String getFullModuleName(String shortModuleName) { + return moduleNames.entrySet().stream() + .filter(entry -> entry.getValue().equals(shortModuleName)) // 匹配 + .findFirst().map(Map.Entry::getKey) // 返回 key + .orElse(shortModuleName); // 兜底返回 shortModuleName + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java new file mode 100644 index 0000000..5560c56 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -0,0 +1,207 @@ +package cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.template.TemplateConfig; +import cn.hutool.extra.template.TemplateEngine; +import cn.hutool.extra.template.engine.velocity.VelocityEngine; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.framework.codegen.config.CodegenProperties; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import com.google.common.collect.Maps; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static cn.hutool.core.map.MapUtil.getStr; +import static cn.hutool.core.text.CharSequenceUtil.*; + +/** + * 代码生成的引擎,用于具体生成代码 + * 目前基于 {@link org.apache.velocity.app.Velocity} 模板引擎实现 + * + * 考虑到 Java 模板引擎的框架非常多,Freemarker、Velocity、Thymeleaf 等等,所以我们采用 hutool 封装的 {@link cn.hutool.extra.template.Template} 抽象 + * + * @author 芋道源码 + */ +@Component +public class ToolCodegenEngine { + + /** + * 模板配置 + * key:模板在 resources 的地址 + * value:生成的路径 + */ + private static final Map TEMPLATES = MapUtil.builder(new LinkedHashMap<>()) // 有序 + // Java Main + .put(javaTemplatePath("controller/vo/baseVO"), + javaFilePath("controller/${table.businessName}/vo/${table.className}BaseVO")) + .put(javaTemplatePath("controller/vo/createReqVO"), + javaFilePath("controller/${table.businessName}/vo/${table.className}CreateReqVO")) + .put(javaTemplatePath("controller/vo/pageReqVO"), + javaFilePath("controller/${table.businessName}/vo/${table.className}PageReqVO")) + .put(javaTemplatePath("controller/vo/respVO"), + javaFilePath("controller/${table.businessName}/vo/${table.className}RespVO")) + .put(javaTemplatePath("controller/vo/updateReqVO"), + javaFilePath("controller/${table.businessName}/vo/${table.className}UpdateReqVO")) + .put(javaTemplatePath("controller/vo/exportReqVO"), + javaFilePath("controller/${table.businessName}/vo/${table.className}ExportReqVO")) + .put(javaTemplatePath("controller/vo/excelVO"), + javaFilePath("controller/${table.businessName}/vo/${table.className}ExcelVO")) + .put(javaTemplatePath("controller/controller"), + javaFilePath("controller/${table.businessName}/${table.className}Controller")) + .put(javaTemplatePath("convert/convert"), + javaFilePath("convert/${table.businessName}/${table.className}Convert")) + .put(javaTemplatePath("dal/do"), + javaFilePath("dal/dataobject/${table.businessName}/${table.className}DO")) + .put(javaTemplatePath("dal/mapper"), + javaFilePath("dal/mysql/${table.businessName}/${table.className}Mapper")) + .put(javaTemplatePath("enums/errorcode"), + javaFilePath("enums/${simpleModuleName_upperFirst}ErrorCodeConstants")) + .put(javaTemplatePath("service/serviceImpl"), + javaFilePath("service/${table.businessName}/impl/${table.className}ServiceImpl")) + .put(javaTemplatePath("service/service"), + javaFilePath("service/${table.businessName}/${table.className}Service")) + // Java Test + .put(javaTemplatePath("test/serviceTest"), + javaFilePath("service/${table.businessName}/${table.className}ServiceTest")) + // Vue + .put(vueTemplatePath("views/index.vue"), + vueFilePath("views/${table.moduleName}/${classNameVar}/index.vue")) + .put(vueTemplatePath("api/api.js"), + vueFilePath("api/${table.moduleName}/${classNameVar}.js")) + // SQL + .put("codegen/sql/sql.vm", "sql/sql.sql") + .build(); + + @Resource + private ToolCodegenBuilder codegenBuilder; + + @Resource + private CodegenProperties codegenProperties; + + /** + * 模板引擎,由 hutool 实现 + */ + private final TemplateEngine templateEngine; + /** + * 全局通用变量映射 + */ + private final Map globalBindingMap = new HashMap<>(); + + public ToolCodegenEngine() { + // 初始化 TemplateEngine 属性 + TemplateConfig config = new TemplateConfig(); + config.setResourceMode(TemplateConfig.ResourceMode.CLASSPATH); + this.templateEngine = new VelocityEngine(config); + } + + @PostConstruct + private void initGlobalBindingMap() { + // 全局配置 + globalBindingMap.put("basePackage", codegenProperties.getBasePackage()); + // 全局 Java Bean + globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); + globalBindingMap.put("PageResultClassName", PageResult.class.getName()); + // VO 类,独有字段 + globalBindingMap.put("PageParamClassName", PageParam.class.getName()); + globalBindingMap.put("DictFormatClassName", DictFormat.class.getName()); + // TODO 芋艿:代码生成器,解决下枚举类 +// globalBindingMap.put("SysDictTypeEnumClassName", SysDictTypeEnum.class.getName()); + // DO 类,独有字段 + globalBindingMap.put("baseDOFields", ToolCodegenBuilder.BASE_DO_FIELDS); + globalBindingMap.put("BaseDOClassName", BaseDO.class.getName()); + globalBindingMap.put("QueryWrapperClassName", QueryWrapperX.class.getName()); + globalBindingMap.put("BaseMapperClassName", BaseMapperX.class.getName()); + // Util 工具类 + globalBindingMap.put("ServiceExceptionUtilClassName", ServiceExceptionUtil.class.getName()); + globalBindingMap.put("DateUtilsClassName", DateUtils.class.getName()); + globalBindingMap.put("ExcelUtilsClassName", ExcelUtils.class.getName()); + globalBindingMap.put("DictConvertClassName", DictConvert.class.getName()); + globalBindingMap.put("OperateLogClassName", OperateLog.class.getName()); + globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName()); + } + + public Map execute(ToolCodegenTableDO table, List columns) { + // 创建 bindingMap + Map bindingMap = new HashMap<>(globalBindingMap); + bindingMap.put("table", table); + bindingMap.put("columns", columns); + bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, ToolCodegenColumnDO::getPrimaryKey)); // 主键字段 + // moduleName 相关 + String simpleModuleName = codegenBuilder.getSimpleModuleName(table.getModuleName()); + bindingMap.put("simpleModuleName", simpleModuleName); // 将 system 转成 sys + bindingMap.put("simpleModuleName_upperFirst", upperFirst(simpleModuleName)); // 将 sys 转成 Sys + // className 相关 + String simpleClassName = subAfter(table.getClassName(), upperFirst(simpleModuleName) + , false); // 将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 + bindingMap.put("simpleClassName", simpleClassName); + bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type + bindingMap.put("classNameVar", lowerFirst(simpleClassName)); // 将 DictType 转换成 dictType,用于变量 + String simpleClassNameStrikeCase = toSymbolCase(simpleClassName, '-'); // 将 DictType 转换成 dict-type + bindingMap.put("simpleClassName_strikeCase", simpleClassNameStrikeCase); + // permission 前缀 + bindingMap.put("permissionPrefix", table.getModuleName() + ":" + simpleClassNameStrikeCase); + + // 执行生成 + final Map result = Maps.newLinkedHashMapWithExpectedSize(TEMPLATES.size()); // 有序 + TEMPLATES.forEach((vmPath, filePath) -> { + filePath = formatFilePath(filePath, bindingMap); + String content = templateEngine.getTemplate(vmPath).render(bindingMap); + result.put(filePath, content); + }); + return result; + } + + private String formatFilePath(String filePath, Map bindingMap) { + filePath = StrUtil.replace(filePath, "${basePackage}", + getStr(bindingMap, "basePackage").replaceAll("\\.", "/")); + filePath = StrUtil.replace(filePath, "${simpleModuleName_upperFirst}", + getStr(bindingMap, "simpleModuleName_upperFirst")); + filePath = StrUtil.replace(filePath, "${classNameVar}", + getStr(bindingMap, "classNameVar")); + + // table 包含的字段 + ToolCodegenTableDO table = (ToolCodegenTableDO) bindingMap.get("table"); + filePath = StrUtil.replace(filePath, "${table.moduleName}", table.getModuleName()); + filePath = StrUtil.replace(filePath, "${table.businessName}", table.getBusinessName()); + filePath = StrUtil.replace(filePath, "${table.className}", table.getClassName()); + return filePath; + } + + private static String javaTemplatePath(String path) { + return "codegen/java/" + path + ".vm"; + } + + private static String javaFilePath(String path) { + return "java/${basePackage}/${table.moduleName}/" + path + ".java"; + } + + private static String vueTemplatePath(String path) { + return "codegen/vue/" + path + ".vm"; + } + + private static String vueFilePath(String path) { + return "vue/" + path; + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java new file mode 100644 index 0000000..7a79f05 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenSQLParser.java @@ -0,0 +1,108 @@ +package cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLTableElement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; +import com.alibaba.druid.sql.repository.SchemaRepository; +import org.apache.commons.collections4.KeyValue; +import org.apache.commons.collections4.keyvalue.DefaultKeyValue; + +import java.util.ArrayList; +import java.util.List; + +import static com.alibaba.druid.sql.SQLUtils.normalize; + +/** + * SQL 解析器,将创建表的 SQL,解析成 {@link ToolSchemaTableDO} 和 {@link ToolSchemaColumnDO} 对象, + * 后续可以基于它们,生成代码~ + * + * @author 芋道源码 + */ +public class ToolCodegenSQLParser { + + /** + * 解析建表 SQL 语句,返回 {@link ToolSchemaTableDO} 和 {@link ToolSchemaColumnDO} 对象 + * + * @param sql 建表 SQL 语句 + * @return 解析结果 + */ + public static KeyValue> parse(String sql) { + // 解析 SQL 成 Statement + SQLCreateTableStatement statement = parseCreateSQL(sql); + // 解析 Table 表 + ToolSchemaTableDO table = parseTable(statement); + // 解析 Column 字段 + List columns = parseColumns(statement); + columns.forEach(column -> column.setTableName(table.getTableName())); + // 返回 + return new DefaultKeyValue<>(table, columns); + } + + /** + * 使用 Druid 工具,建表 SQL 语句 + * + * @param sql 建表 SQL 语句 + * @return 创建 Statement + */ + private static SQLCreateTableStatement parseCreateSQL(String sql) { + // 解析 SQL + SchemaRepository repository = new SchemaRepository(DbType.mysql); + repository.console(sql); + // 获得该表对应的 MySqlCreateTableStatement 对象 + String tableName = CollUtil.getFirst(repository.getDefaultSchema().getObjects()).getName(); + return (MySqlCreateTableStatement) repository.findTable(tableName).getStatement(); + } + + private static ToolSchemaTableDO parseTable(SQLCreateTableStatement statement) { + return ToolSchemaTableDO.builder() + .tableName(statement.getTableSource().getTableName(true)) + .tableComment(((SQLCharExpr) statement.getComment()).getText()) + .build(); + } + + private static List parseColumns(SQLCreateTableStatement statement) { + List columns = new ArrayList<>(); + statement.getTableElementList().forEach(element -> parseColumn(columns, element)); + return columns; + } + + private static void parseColumn(List columns, SQLTableElement element) { + // 处理主键 + if (element instanceof SQLPrimaryKey) { + parsePrimaryKey(columns, (SQLPrimaryKey) element); + return; + } + // 处理字段定义 + if (element instanceof SQLColumnDefinition) { + parseColumnDefinition(columns, (SQLColumnDefinition) element); + } + } + + private static void parsePrimaryKey(List columns, SQLPrimaryKey primaryKey) { + String columnName = normalize(primaryKey.getColumns().get(0).toString()); // 暂时不考虑联合主键 + // 匹配 columns 主键字段,设置为 primary + columns.stream().filter(column -> column.getColumnName().equals(columnName)) + .forEach(column -> column.setPrimaryKey(true)); + } + + private static void parseColumnDefinition(List columns, SQLColumnDefinition definition) { + String text = definition.toString().toUpperCase(); + columns.add(ToolSchemaColumnDO.builder() + .columnName(normalize(definition.getColumnName())) + .columnType(definition.getDataType().toString()) + .columnComment(normalize(definition.getComment().toString())) + .nullable(!text.contains(" NOT NULL")) + .primaryKey(false) + .autoIncrement(text.contains("AUTO_INCREMENT")) + .ordinalPosition(columns.size() + 1) + .build()); + } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java new file mode 100644 index 0000000..f897b66 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java @@ -0,0 +1,284 @@ +package cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.framework.codegen.config.CodegenProperties; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.ToolCodegenUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.codegen.vo.table.ToolCodegenTablePageReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.convert.codegen.ToolCodegenConvert; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolCodegenColumnMapper; +import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolCodegenTableMapper; +import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolSchemaColumnMapper; +import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolSchemaTableMapper; +import cn.iocoder.yudao.adminserver.modules.tool.enums.codegen.ToolCodegenImportTypeEnum; +import cn.iocoder.yudao.adminserver.modules.tool.service.codegen.ToolCodegenService; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import org.apache.commons.collections4.KeyValue; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.adminserver.modules.tool.enums.ToolErrorCodeConstants.*; + +/** + * 代码生成 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class ToolCodegenServiceImpl implements ToolCodegenService { + + @Resource + private ToolSchemaTableMapper schemaTableMapper; + @Resource + private ToolSchemaColumnMapper schemaColumnMapper; + @Resource + private ToolCodegenTableMapper codegenTableMapper; + @Resource + private ToolCodegenColumnMapper codegenColumnMapper; + + @Resource + private ToolCodegenBuilder codegenBuilder; + @Resource + private ToolCodegenEngine codegenEngine; + + @Resource + private CodegenProperties codegenProperties; + + private Long createCodegen0(ToolCodegenImportTypeEnum importType, + ToolSchemaTableDO schemaTable, List schemaColumns) { + // 校验导入的表和字段非空 + if (schemaTable == null) { + throw exception(CODEGEN_IMPORT_TABLE_NULL); + } + if (CollUtil.isEmpty(schemaColumns)) { + throw exception(CODEGEN_IMPORT_COLUMNS_NULL); + } + // 校验是否已经存在 + if (codegenTableMapper.selectByTableName(schemaTable.getTableName()) != null) { + throw exception(CODEGEN_TABLE_EXISTS); + } + + // 构建 ToolCodegenTableDO 对象,插入到 DB 中 + ToolCodegenTableDO table = codegenBuilder.buildTable(schemaTable); + table.setImportType(importType.getType()); + codegenTableMapper.insert(table); + // 构建 ToolCodegenColumnDO 数组,插入到 DB 中 + List columns = codegenBuilder.buildColumns(schemaColumns); + columns.forEach(column -> { + column.setTableId(table.getId()); + codegenColumnMapper.insert(column); // TODO 批量插入 + }); + return table.getId(); + } + + @Override + public Long createCodegenListFromSQL(String sql) { + // 从 SQL 中,获得数据库表结构 + ToolSchemaTableDO schemaTable; + List schemaColumns; + try { + KeyValue> result = ToolCodegenSQLParser.parse(sql); + schemaTable = result.getKey(); + schemaColumns = result.getValue(); + } catch (Exception ex) { + throw exception(CODEGEN_PARSE_SQL_ERROR); + } + // 导入 + return this.createCodegen0(ToolCodegenImportTypeEnum.SQL, schemaTable, schemaColumns); + } + + @Override + public Long createCodegen(String tableName) { + // 获取当前schema + String tableSchema = codegenProperties.getDbSchemas().iterator().next(); + // 从数据库中,获得数据库表结构 + ToolSchemaTableDO schemaTable = schemaTableMapper.selectByTableSchemaAndTableName(tableSchema, tableName); + List schemaColumns = schemaColumnMapper.selectListByTableName(tableSchema, tableName); + // 导入 + return this.createCodegen0(ToolCodegenImportTypeEnum.DB, schemaTable, schemaColumns); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public List createCodegenListFromDB(List tableNames) { + List ids = new ArrayList<>(tableNames.size()); + // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量 + tableNames.forEach(tableName -> ids.add(createCodegen(tableName))); + return ids; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCodegen(ToolCodegenUpdateReqVO updateReqVO) { + // 校验是否已经存在 + if (codegenTableMapper.selectById(updateReqVO.getTable().getId()) == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + + // 更新 table 表定义 + ToolCodegenTableDO updateTableObj = ToolCodegenConvert.INSTANCE.convert(updateReqVO.getTable()); + codegenTableMapper.updateById(updateTableObj); + // 更新 column 字段定义 + List updateColumnObjs = ToolCodegenConvert.INSTANCE.convertList03(updateReqVO.getColumns()); + updateColumnObjs.forEach(updateColumnObj -> codegenColumnMapper.updateById(updateColumnObj)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncCodegenFromDB(Long tableId) { + // 校验是否已经存在 + ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); + if (table == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + String tableSchema = codegenProperties.getDbSchemas().iterator().next(); + // 从数据库中,获得数据库表结构 + List schemaColumns = schemaColumnMapper.selectListByTableName(tableSchema, table.getTableName()); + + // 执行同步 + this.syncCodegen0(tableId, schemaColumns); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncCodegenFromSQL(Long tableId, String sql) { + // 校验是否已经存在 + ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); + if (table == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + // 从 SQL 中,获得数据库表结构 + List schemaColumns; + try { + KeyValue> result = ToolCodegenSQLParser.parse(sql); + schemaColumns = result.getValue(); + } catch (Exception ex) { + throw exception(CODEGEN_PARSE_SQL_ERROR); + } + + // 执行同步 + this.syncCodegen0(tableId, schemaColumns); + } + + private void syncCodegen0(Long tableId, List schemaColumns) { + // 校验导入的字段不为空 + if (CollUtil.isEmpty(schemaColumns)) { + throw exception(CODEGEN_SYNC_COLUMNS_NULL); + } + Set schemaColumnNames = CollectionUtils.convertSet(schemaColumns, ToolSchemaColumnDO::getColumnName); + + // 构建 ToolCodegenColumnDO 数组,只同步新增的字段 + List codegenColumns = codegenColumnMapper.selectListByTableId(tableId); + Set codegenColumnNames = CollectionUtils.convertSet(codegenColumns, ToolCodegenColumnDO::getColumnName); + // 移除已经存在的字段 + schemaColumns.removeIf(column -> codegenColumnNames.contains(column.getColumnName())); + // 计算需要删除的字段 + Set deleteColumnIds = codegenColumns.stream().filter(column -> !schemaColumnNames.contains(column.getColumnName())) + .map(ToolCodegenColumnDO::getId).collect(Collectors.toSet()); + if (CollUtil.isEmpty(schemaColumns) && CollUtil.isEmpty(deleteColumnIds)) { + throw exception(CODEGEN_SYNC_NONE_CHANGE); + } + + // 插入新增的字段 + List columns = codegenBuilder.buildColumns(schemaColumns); + columns.forEach(column -> { + column.setTableId(tableId); + codegenColumnMapper.insert(column); // TODO 批量插入 + }); + // 删除不存在的字段 + if (CollUtil.isNotEmpty(deleteColumnIds)) { + codegenColumnMapper.deleteBatchIds(deleteColumnIds); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCodegen(Long tableId) { + // 校验是否已经存在 + if (codegenTableMapper.selectById(tableId) == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + + // 删除 table 表定义 + codegenTableMapper.deleteById(tableId); + // 删除 column 字段定义 + codegenColumnMapper.deleteListByTableId(tableId); + } + + @Override + public PageResult getCodegenTablePage(ToolCodegenTablePageReqVO pageReqVO) { + return codegenTableMapper.selectPage(pageReqVO); + } + + @Override + public ToolCodegenTableDO getCodegenTablePage(Long id) { + return codegenTableMapper.selectById(id); + } + + @Override + public List getCodeGenTableList() { + return codegenTableMapper.selectList(); + } + + @Override + public List getCodegenColumnListByTableId(Long tableId) { + return codegenColumnMapper.selectListByTableId(tableId); + } + + @Override + public Map generationCodes(Long tableId) { + // 校验是否已经存在 + ToolCodegenTableDO table = codegenTableMapper.selectById(tableId); + if (codegenTableMapper.selectById(tableId) == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + List columns = codegenColumnMapper.selectListByTableId(tableId); + if (CollUtil.isEmpty(columns)) { + throw exception(CODEGEN_COLUMN_NOT_EXISTS); + } + + // 执行生成 + return codegenEngine.execute(table, columns); + } + + @Override + public List getSchemaTableList(String tableName, String tableComment) { + List tables = schemaTableMapper.selectList(codegenProperties.getDbSchemas(), tableName, tableComment); + // TODO 强制移除 Quartz 的表,未来做成可配置 + tables.removeIf(table -> table.getTableName().startsWith("QRTZ_")); + return tables; + } + +// /** +// * 修改保存参数校验 +// * +// * @param genTable 业务信息 +// */ +// @Override +// public void validateEdit(GenTable genTable) { +// if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { +// String options = JSON.toJSONString(genTable.getParams()); +// JSONObject paramsObj = JSONObject.parseObject(options); +// if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) { +// throw new CustomException("树编码字段不能为空"); +// } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) { +// throw new CustomException("树父编码字段不能为空"); +// } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) { +// throw new CustomException("树名称字段不能为空"); +// } +// } +// } + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/ToolTestDemoService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/ToolTestDemoService.java new file mode 100644 index 0000000..6ad63b7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/ToolTestDemoService.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.adminserver.modules.tool.service.test; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoExportReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoPageReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test.ToolTestDemoDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 字典类型 Service 接口 + * + * @author 芋艿 + */ +public interface ToolTestDemoService { + + /** + * 创建字典类型 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTestDemo(@Valid ToolTestDemoCreateReqVO createReqVO); + + /** + * 更新字典类型 + * + * @param updateReqVO 更新信息 + */ + void updateTestDemo(@Valid ToolTestDemoUpdateReqVO updateReqVO); + + /** + * 删除字典类型 + * + * @param id 编号 + */ + void deleteTestDemo(Long id); + + /** + * 获得字典类型 + * + * @param id 编号 + * @return 字典类型 + */ + ToolTestDemoDO getTestDemo(Long id); + + /** + * 获得字典类型列表 + * + * @param ids 编号 + * @return 字典类型列表 + */ + List getTestDemoList(Collection ids); + + /** + * 获得字典类型分页 + * + * @param pageReqVO 分页查询 + * @return 字典类型分页 + */ + PageResult getTestDemoPage(ToolTestDemoPageReqVO pageReqVO); + + /** + * 获得字典类型列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 字典类型分页 + */ + List getTestDemoList(ToolTestDemoExportReqVO exportReqVO); + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java new file mode 100644 index 0000000..b894b5f --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/tool/service/test/impl/ToolTestDemoServiceImpl.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.adminserver.modules.tool.service.test.impl; + +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoExportReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoPageReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.controller.test.vo.ToolTestDemoUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.tool.convert.test.ToolTestDemoConvert; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.test.ToolTestDemoDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.test.ToolTestDemoMapper; +import cn.iocoder.yudao.adminserver.modules.tool.service.test.ToolTestDemoService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static cn.iocoder.yudao.adminserver.modules.tool.enums.ToolErrorCodeConstants.TEST_DEMO_NOT_EXISTS; + +/** + * 字典类型 Service 实现类 + * + * @author 芋艿 + */ +@Service +@Validated +public class ToolTestDemoServiceImpl implements ToolTestDemoService { + + @Resource + private ToolTestDemoMapper testDemoMapper; + + @Override + public Long createTestDemo(ToolTestDemoCreateReqVO createReqVO) { + // 插入 + ToolTestDemoDO testDemo = ToolTestDemoConvert.INSTANCE.convert(createReqVO); + testDemoMapper.insert(testDemo); + // 返回 + return testDemo.getId(); + } + + @Override + public void updateTestDemo(ToolTestDemoUpdateReqVO updateReqVO) { + // 校验存在 + this.validateTestDemoExists(updateReqVO.getId()); + // 更新 + ToolTestDemoDO updateObj = ToolTestDemoConvert.INSTANCE.convert(updateReqVO); + testDemoMapper.updateById(updateObj); + } + + @Override + public void deleteTestDemo(Long id) { + // 校验存在 + this.validateTestDemoExists(id); + // 更新 + testDemoMapper.deleteById(id); + } + + private void validateTestDemoExists(Long id) { + if (testDemoMapper.selectById(id) == null) { + throw ServiceExceptionUtil.exception(TEST_DEMO_NOT_EXISTS); + } + } + + @Override + public ToolTestDemoDO getTestDemo(Long id) { + return testDemoMapper.selectById(id); + } + + @Override + public List getTestDemoList(Collection ids) { + return testDemoMapper.selectBatchIds(ids); + } + + @Override + public PageResult getTestDemoPage(ToolTestDemoPageReqVO pageReqVO) { + return testDemoMapper.selectPage(pageReqVO); + } + + @Override + public List getTestDemoList(ToolTestDemoExportReqVO exportReqVO) { + return testDemoMapper.selectList(exportReqVO); + } + +} diff --git a/yudao-admin-server/src/main/resources/application-dev.yaml b/yudao-admin-server/src/main/resources/application-dev.yaml index 9963de7..5e71e23 100644 --- a/yudao-admin-server/src/main/resources/application-dev.yaml +++ b/yudao-admin-server/src/main/resources/application-dev.yaml @@ -99,7 +99,7 @@ apollo: eagerLoad: enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置 jdbc: # 自定义的 JDBC 配置项,用于数据库的地址 - dao: cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigDAOImpl + dao: cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config.InfConfigDAOImpl url: ${spring.datasource.dynamic.datasource.master.url} username: ${spring.datasource.dynamic.datasource.master.username} password: ${spring.datasource.dynamic.datasource.master.password} @@ -152,12 +152,6 @@ logging: # 芋道配置项,设置当前项目所有自定义的配置 yudao: - info: - version: 1.0.0 - base-package: cn.iocoder.dashboard - web: - api-prefix: /api - controller-package: ${yudao.info.base-package} security: token-header: Authorization token-secret: abcdefghijklmnopqrstuvwxyz @@ -165,20 +159,8 @@ yudao: session-timeout: 30m mock-enable: true mock-secret: test - swagger: - title: 管理后台 - description: 提供管理员管理的所有功能 - version: ${yudao.info.version} - base-package: ${yudao.info.base-package}.modules - captcha: - timeout: 5m - width: 160 - height: 60 file: base-path: http://127.0.0.1:${server.port}${yudao.web.api-prefix}/system/file/get/ - codegen: - base-package: ${yudao.info.base-package} - db-schemas: ${spring.datasource.dynamic.datasource.master.name} xss: enable: false exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 diff --git a/yudao-admin-server/src/main/resources/application-local.yaml b/yudao-admin-server/src/main/resources/application-local.yaml index 6e56f50..da750e7 100644 --- a/yudao-admin-server/src/main/resources/application-local.yaml +++ b/yudao-admin-server/src/main/resources/application-local.yaml @@ -99,7 +99,7 @@ apollo: eagerLoad: enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置 jdbc: # 自定义的 JDBC 配置项,用于数据库的地址 - dao: cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigDAOImpl + dao: cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config.InfConfigDAOImpl url: ${spring.datasource.dynamic.datasource.master.url} username: ${spring.datasource.dynamic.datasource.master.username} password: ${spring.datasource.dynamic.datasource.master.password} @@ -152,12 +152,6 @@ logging: # 芋道配置项,设置当前项目所有自定义的配置 yudao: - info: - version: 1.0.0 - base-package: cn.iocoder.dashboard - web: - api-prefix: /api - controller-package: ${yudao.info.base-package} security: token-header: Authorization token-secret: abcdefghijklmnopqrstuvwxyz @@ -165,20 +159,8 @@ yudao: session-timeout: 30m mock-enable: true mock-secret: test - swagger: - title: 管理后台 - description: 提供管理员管理的所有功能 - version: ${yudao.info.version} - base-package: ${yudao.info.base-package}.modules - captcha: - timeout: 5m - width: 160 - height: 60 file: base-path: http://127.0.0.1:${server.port}${yudao.web.api-prefix}/system/file/get/ - codegen: - base-package: ${yudao.info.base-package} - db-schemas: ${spring.datasource.dynamic.datasource.master.name} xss: enable: false exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 diff --git a/yudao-admin-server/src/main/resources/application.yaml b/yudao-admin-server/src/main/resources/application.yaml index ff50a89..21227d5 100644 --- a/yudao-admin-server/src/main/resources/application.yaml +++ b/yudao-admin-server/src/main/resources/application.yaml @@ -1,6 +1,6 @@ spring: application: - name: dashboard + name: yudao-admin-server profiles: active: local @@ -36,6 +36,24 @@ mybatis-plus: --- #################### 芋道相关配置 #################### yudao: + info: + version: 1.0.0 + base-package: cn.iocoder.yudao.adminserver + web: + api-prefix: /api + controller-package: ${yudao.info.base-package} + swagger: + title: 管理后台 + description: 提供管理员管理的所有功能 + version: ${yudao.info.version} + base-package: ${yudao.info.base-package}.modules + captcha: + timeout: 5m + width: 160 + height: 60 + codegen: + base-package: ${yudao.info.base-package} + db-schemas: ${spring.datasource.dynamic.datasource.master.name} error-code: # 错误码相关配置项 constants-class-list: - cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/BaseDbAndRedisIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/BaseDbAndRedisIntegrationTest.java deleted file mode 100644 index 6694db7..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/BaseDbAndRedisIntegrationTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.dashboard; - -import cn.iocoder.yudao.framework.datasource.config.DataSourceConfiguration; -import cn.iocoder.yudao.framework.mybatis.config.MybatisConfiguration; -import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import org.redisson.spring.starter.RedissonAutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisIntegrationTest.Application.class) -@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 -public class BaseDbAndRedisIntegrationTest { - - @Import({ - // DB 配置类 - DynamicDataSourceAutoConfiguration.class, // Dynamic Datasource 配置类 - DataSourceConfiguration.class, // 自己的 DB 配置类 - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 - // MyBatis 配置类 - MybatisConfiguration.class, // 自己的 MyBatis 配置类 - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 - - // Redis 配置类 - RedisAutoConfiguration.class, // Spring Redis 自动配置类 - RedisConfig.class, // 自己的 Redis 配置类 - RedissonAutoConfiguration.class, // Redisson 自动高配置类 - }) - public static class Application { - } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/BaseRedisIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/BaseRedisIntegrationTest.java deleted file mode 100644 index 469efa5..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/BaseRedisIntegrationTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.dashboard; - -import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; -import org.redisson.spring.starter.RedissonAutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisIntegrationTest.Application.class) -@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 -public class BaseRedisIntegrationTest { - - @Import({ - // Redis 配置类 - RedisAutoConfiguration.class, // Spring Redis 自动配置类 - RedisConfig.class, // 自己的 Redis 配置类 - RedissonAutoConfiguration.class, // Redisson 自动高配置类 - }) - public static class Application { - } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/quartz/core/SchedulerManagerTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/quartz/core/SchedulerManagerTest.java deleted file mode 100644 index 296383a..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/quartz/core/SchedulerManagerTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.iocoder.dashboard.framework.quartz.core; - -import cn.hutool.core.util.StrUtil; -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.dashboard.framework.quartz.core.scheduler.SchedulerManager; -import cn.iocoder.dashboard.modules.system.job.auth.SysUserSessionTimeoutJob; -import org.junit.jupiter.api.Test; -import org.quartz.SchedulerException; - -import javax.annotation.Resource; - -class SchedulerManagerTest extends BaseDbUnitTest { - - @Resource - private SchedulerManager schedulerManager; - - @Test - public void testAddJob() throws SchedulerException { - String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); - schedulerManager.addJob(1L, jobHandlerName, "test", "0/10 * * * * ? *", 0, 0); - } - - @Test - public void testUpdateJob() throws SchedulerException { - String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); - schedulerManager.updateJob(jobHandlerName, "hahaha", "0/20 * * * * ? *", 0, 0); - } - - @Test - public void testDeleteJob() throws SchedulerException { - String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); - schedulerManager.deleteJob(jobHandlerName); - } - - @Test - public void testPauseJob() throws SchedulerException { - String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); - schedulerManager.pauseJob(jobHandlerName); - } - - @Test - public void testResumeJob() throws SchedulerException { - String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); - schedulerManager.resumeJob(jobHandlerName); - } - - @Test - public void testTriggerJob() throws SchedulerException { - String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); - schedulerManager.triggerJob(1L, jobHandlerName, "niubi!!!"); - } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/redis/core/stream/RedisStreamTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/redis/core/stream/RedisStreamTest.java deleted file mode 100644 index da82a2c..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/redis/core/stream/RedisStreamTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.iocoder.yudao.framework.redis.core.stream; - -import cn.hutool.core.thread.ThreadUtil; -import cn.iocoder.dashboard.BaseRedisIntegrationTest; -import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; -import cn.iocoder.dashboard.modules.system.mq.consumer.mail.SysMailSendConsumer; -import cn.iocoder.dashboard.modules.system.mq.consumer.sms.SysSmsSendConsumer; -import cn.iocoder.dashboard.modules.system.mq.message.mail.SysMailSendMessage; -import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.StringRedisTemplate; - -import javax.annotation.Resource; -import java.util.concurrent.TimeUnit; - -public class RedisStreamTest { - - @Import({SysSmsSendConsumer.class, SysMailSendConsumer.class}) - @Disabled - public static class ConsumerTest extends BaseRedisIntegrationTest { - - @Test - public void testConsumer() { - ThreadUtil.sleep(1, TimeUnit.DAYS); - } - - } - - @Disabled - public static class ProducerTest extends BaseRedisIntegrationTest { - - @Resource - private StringRedisTemplate stringRedisTemplate; - - @Resource - private RedisTemplate redisTemplate; - - @Test - public void testProducer01() { - for (int i = 0; i < 100; i++) { - // 创建消息 - SysSmsSendMessage message = new SysSmsSendMessage(); - message.setMobile("15601691300").setApiTemplateId("test:" + i); - // 发送消息 - RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message); - } - } - - @Test - public void testProducer02() { - // 创建消息 - SysMailSendMessage message = new SysMailSendMessage(); - message.setAddress("fangfang@mihayou.com").setTemplateCode("test"); - // 发送消息 - RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message); - } - - } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java deleted file mode 100644 index ef38552..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun; - -import cn.iocoder.yudao.common.core.KeyValue; -import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; -import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; -import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO; -import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; -import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link AliyunSmsClient} 的集成测试 - */ -public class AliyunSmsClientIntegrationTest { - - private static AliyunSmsClient smsClient; - - @BeforeAll - public static void before() { - // 创建配置类 - SmsChannelProperties properties = new SmsChannelProperties(); - properties.setId(1L); - properties.setSignature("Ballcat"); - properties.setCode(SmsChannelEnum.ALIYUN.getCode()); - properties.setApiKey(System.getenv("ALIYUN_ACCESS_KEY")); - properties.setApiSecret(System.getenv("ALIYUN_SECRET_KEY")); - // 创建客户端 - smsClient = new AliyunSmsClient(properties); - smsClient.init(); - } - - @Test - public void testSendSms() { - List> templateParams = new ArrayList<>(); - templateParams.add(new KeyValue<>("code", "1024")); -// templateParams.put("operation", "嘿嘿"); -// SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams); - SmsCommonResult result = smsClient.sendSms(1L, "15601691399", - "SMS_207945135", templateParams); - System.out.println(result); - } - - @Test - public void testGetSmsTemplate() { - String apiTemplateId = "SMS_2079451351"; - SmsCommonResult result = smsClient.getSmsTemplate(apiTemplateId); - System.out.println(result); - } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java deleted file mode 100644 index 825eb09..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.iocoder.dashboard.framework.sms.core.client.impl.debug; - -import cn.iocoder.yudao.common.core.KeyValue; -import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; -import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; -import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; -import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link DebugDingTalkSmsClient} 的集成测试 - */ -public class DebugDingTalkSmsClientIntegrationTest { - - private static DebugDingTalkSmsClient smsClient; - - @BeforeAll - public static void init() { - // 创建配置类 - SmsChannelProperties properties = new SmsChannelProperties(); - properties.setId(1L); - properties.setSignature("芋道"); - properties.setCode(SmsChannelEnum.DEBUG_DING_TALK.getCode()); - properties.setApiKey("696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859"); - properties.setApiSecret("SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67"); - // 创建客户端 - smsClient = new DebugDingTalkSmsClient(properties); - smsClient.init(); - } - - @Test - public void testSendSms() { - List> templateParams = new ArrayList<>(); - templateParams.add(new KeyValue<>("code", "1024")); - templateParams.add(new KeyValue<>("operation", "嘿嘿")); -// SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams); - SmsCommonResult result = smsClient.sendSms(1L, "15601691399", "4383920", templateParams); - System.out.println(result); - } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java deleted file mode 100644 index 3099cdf..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian; - -import cn.iocoder.yudao.common.core.KeyValue; -import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; -import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; -import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO; -import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; -import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link YunpianSmsClient} 的集成测试 - */ -public class YunpianSmsClientIntegrationTest { - - private static YunpianSmsClient smsClient; - - @BeforeAll - public static void init() { - // 创建配置类 - SmsChannelProperties properties = new SmsChannelProperties(); - properties.setId(1L); - properties.setSignature("芋道"); - properties.setCode(SmsChannelEnum.YUN_PIAN.getCode()); - properties.setApiKey("1555a14277cb8a608cf45a9e6a80d510"); - // 创建客户端 - smsClient = new YunpianSmsClient(properties); - smsClient.init(); - } - - @Test - public void testSendSms() { - List> templateParams = new ArrayList<>(); - templateParams.add(new KeyValue<>("code", "1024")); - templateParams.add(new KeyValue<>("operation", "嘿嘿")); -// SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams); - SmsCommonResult result = smsClient.sendSms(1L, "15601691399", "4383920", templateParams); - System.out.println(result); - } - - @Test - public void testGetSmsTemplate() { - String apiTemplateId = "4383920"; - SmsCommonResult result = smsClient.getSmsTemplate(apiTemplateId); - System.out.println(result); - } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/package-info.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/package-info.java deleted file mode 100644 index 037ce8c..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.dashboard.framework.sms.core.client; diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/system/service/package-info.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/system/service/package-info.java deleted file mode 100644 index 09c1d9d..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/system/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service; diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsServiceIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsServiceIntegrationTest.java deleted file mode 100644 index 4504863..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsServiceIntegrationTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms; - -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.thread.ThreadUtil; -import cn.iocoder.dashboard.BaseDbAndRedisIntegrationTest; -import cn.iocoder.yudao.common.enums.UserTypeEnum; -import cn.iocoder.dashboard.framework.sms.config.SmsConfiguration; -import cn.iocoder.dashboard.modules.system.mq.consumer.sms.SysSmsSendConsumer; -import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsChannelServiceImpl; -import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsLogServiceImpl; -import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsServiceImpl; -import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsTemplateServiceImpl; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -@Import({SmsConfiguration.class, - SysSmsChannelServiceImpl.class, SysSmsServiceImpl.class, SysSmsTemplateServiceImpl.class, SysSmsLogServiceImpl.class, - SysSmsProducer.class, SysSmsSendConsumer.class}) -public class SysSmsServiceIntegrationTest extends BaseDbAndRedisIntegrationTest { - - @Resource - private SysSmsServiceImpl smsService; - @Resource - private SysSmsChannelServiceImpl smsChannelService; - - @MockBean - private SysUserService userService; - - @Test - public void testSendSingleSms_yunpianSuccess() { - // 参数准备 - String mobile = "15601691399"; - Long userId = 1L; - Integer userType = UserTypeEnum.ADMIN.getValue(); - String templateCode = "test_01"; - Map templateParams = MapUtil.builder() - .put("operation", "登陆").put("code", "1234").build(); - // 调用 - smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); - - // 等待 MQ 消费 - ThreadUtil.sleep(1, TimeUnit.HOURS); - } - - @Test - public void testSendSingleSms_aliyunSuccess() { - // 参数准备 - String mobile = "15601691399"; - Long userId = 1L; - Integer userType = UserTypeEnum.ADMIN.getValue(); - String templateCode = "test_02"; - Map templateParams = MapUtil.builder() - .put("code", "1234").build(); - // 调用 - smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); - - // 等待 MQ 消费 - ThreadUtil.sleep(1, TimeUnit.HOURS); - } - -// @Test -// public void testDoSendSms() { -// // 等待 MQ 消费 -// ThreadUtil.sleep(1, TimeUnit.HOURS); -// } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java deleted file mode 100644 index af2fc68..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.mysql.codegen; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; -import org.junit.jupiter.api.Test; - -import javax.annotation.Resource; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class ToolInformationSchemaColumnMapperTest extends BaseDbUnitTest { - - @Resource - private ToolSchemaColumnMapper toolInformationSchemaColumnMapper; - - @Test - public void testSelectListByTableName() { - List columns = toolInformationSchemaColumnMapper - .selectListByTableName("", "inf_config"); - assertTrue(columns.size() > 0); - } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java deleted file mode 100644 index a0004f3..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.dal.mysql.codegen; - -import cn.iocoder.dashboard.BaseDbUnitTest; - -import javax.annotation.Resource; - -class ToolInformationSchemaTableMapperTest extends BaseDbUnitTest { - - @Resource - private ToolSchemaTableMapper toolInformationSchemaTableMapper; - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenEngineTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenEngineTest.java deleted file mode 100644 index e3cf739..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenEngineTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.service.codegen; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenColumnMapper; -import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenTableMapper; -import cn.iocoder.dashboard.modules.tool.service.codegen.impl.ToolCodegenEngine; -import org.junit.jupiter.api.Test; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Map; - -public class ToolCodegenEngineTest extends BaseDbUnitTest { - - @Resource - private ToolCodegenTableMapper codegenTableMapper; - @Resource - private ToolCodegenColumnMapper codegenColumnMapper; - - @Resource - private ToolCodegenEngine codegenEngine; - - @Test - public void testExecute() { - ToolCodegenTableDO table = codegenTableMapper.selectById(20); - List columns = codegenColumnMapper.selectListByTableId(table.getId()); - Map result = codegenEngine.execute(table, columns); - result.forEach((s, s2) -> System.out.println(s2)); -// System.out.println(result.get("vue/views/system/test/index.vue")); - } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenSQLParserTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenSQLParserTest.java deleted file mode 100644 index 45c4238..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenSQLParserTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.service.codegen; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.dashboard.modules.tool.service.codegen.impl.ToolCodegenSQLParser; -import org.junit.jupiter.api.Test; - -public class ToolCodegenSQLParserTest extends BaseDbUnitTest { - - @Test - public void testParse() { - String sql = "CREATE TABLE `tool_test_demo` (\n" + - " `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',\n" + - " `name` varchar(100) NOT NULL DEFAULT '' COMMENT '名字',\n" + - " `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态',\n" + - " `type` tinyint(4) NOT NULL COMMENT '类型',\n" + - " `category` tinyint(4) NOT NULL COMMENT '分类',\n" + - " `remark` varchar(500) DEFAULT NULL COMMENT '备注',\n" + - " `create_by` varchar(64) DEFAULT '' COMMENT '创建者',\n" + - " `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n" + - " `update_by` varchar(64) DEFAULT '' COMMENT '更新者',\n" + - " `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',\n" + - " `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',\n" + - " PRIMARY KEY (`id`) USING BTREE\n" + - ") ENGINE=InnoDB AUTO_INCREMENT=108 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表';"; - ToolCodegenSQLParser.parse(sql); - // TODO 芋艿:后续完善断言 - } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenServiceImplTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenServiceImplTest.java deleted file mode 100644 index 4bb2cc6..0000000 --- a/yudao-admin-server/src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenServiceImplTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.dashboard.modules.tool.service.codegen; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.dashboard.modules.tool.service.codegen.impl.ToolCodegenServiceImpl; -import org.junit.jupiter.api.Test; - -import javax.annotation.Resource; - -class ToolCodegenServiceImplTest extends BaseDbUnitTest { - - @Resource - private ToolCodegenServiceImpl toolCodegenService; - - @Test - public void tetCreateCodegenTable() { - toolCodegenService.createCodegen("tool_test_demo"); -// toolCodegenService.createCodegenTable("tool_codegen_table"); -// toolCodegenService.createCodegen("tool_codegen_column"); - } - -} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisIntegrationTest.java new file mode 100644 index 0000000..915715c --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisIntegrationTest.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.adminserver; + +import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; +import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisIntegrationTest.Application.class) +@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 +public class BaseDbAndRedisIntegrationTest { + + @Import({ + // DB 配置类 + DynamicDataSourceAutoConfiguration.class, // Dynamic Datasource 配置类 + YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + // MyBatis 配置类 + YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + + // Redis 配置类 + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/BaseRedisIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/BaseRedisIntegrationTest.java new file mode 100644 index 0000000..78857e0 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/BaseRedisIntegrationTest.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.adminserver; + +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisIntegrationTest.Application.class) +@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 +public class BaseRedisIntegrationTest { + + @Import({ + // Redis 配置类 + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/quartz/core/SchedulerManagerTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/quartz/core/SchedulerManagerTest.java new file mode 100644 index 0000000..efa9592 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/quartz/core/SchedulerManagerTest.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.adminserver.framework.quartz.core; + +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.adminserver.modules.system.job.auth.SysUserSessionTimeoutJob; +import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; +import org.junit.jupiter.api.Test; +import org.quartz.SchedulerException; + +import javax.annotation.Resource; + +class SchedulerManagerTest extends BaseDbUnitTest { + + @Resource + private SchedulerManager schedulerManager; + + @Test + public void testAddJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.addJob(1L, jobHandlerName, "test", "0/10 * * * * ? *", 0, 0); + } + + @Test + public void testUpdateJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.updateJob(jobHandlerName, "hahaha", "0/20 * * * * ? *", 0, 0); + } + + @Test + public void testDeleteJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.deleteJob(jobHandlerName); + } + + @Test + public void testPauseJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.pauseJob(jobHandlerName); + } + + @Test + public void testResumeJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.resumeJob(jobHandlerName); + } + + @Test + public void testTriggerJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.triggerJob(1L, jobHandlerName, "niubi!!!"); + } + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java new file mode 100644 index 0000000..eea5c00 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.adminserver.framework.redis.core.stream; + +import cn.hutool.core.thread.ThreadUtil; +import cn.iocoder.yudao.adminserver.BaseRedisIntegrationTest; +import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.mail.SysMailSendConsumer; +import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms.SysSmsSendConsumer; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.mail.SysMailSendMessage; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage; +import cn.iocoder.yudao.framework.redis.core.util.RedisMessageUtils; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; + +import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; + +public class RedisStreamTest { + + @Import({SysSmsSendConsumer.class, SysMailSendConsumer.class}) + @Disabled + public static class ConsumerTest extends BaseRedisIntegrationTest { + + @Test + public void testConsumer() { + ThreadUtil.sleep(1, TimeUnit.DAYS); + } + + } + + @Disabled + public static class ProducerTest extends BaseRedisIntegrationTest { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @Resource + private RedisTemplate redisTemplate; + + @Test + public void testProducer01() { + for (int i = 0; i < 100; i++) { + // 创建消息 + SysSmsSendMessage message = new SysSmsSendMessage(); + message.setMobile("15601691300").setApiTemplateId("test:" + i); + // 发送消息 + RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message); + } + } + + @Test + public void testProducer02() { + // 创建消息 + SysMailSendMessage message = new SysMailSendMessage(); + message.setAddress("fangfang@mihayou.com").setTemplateCode("test"); + // 发送消息 + RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message); + } + + } + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java new file mode 100644 index 0000000..ef1c363 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.adminserver.framework.sms.core.client.impl.aliyun; + +import cn.iocoder.yudao.framework.common.core.KeyValue; +import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO; +import cn.iocoder.yudao.framework.sms.core.client.impl.aliyun.AliyunSmsClient; +import cn.iocoder.yudao.framework.sms.core.enums.SmsChannelEnum; +import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link AliyunSmsClient} 的集成测试 + */ +public class AliyunSmsClientIntegrationTest { + + private static AliyunSmsClient smsClient; + + @BeforeAll + public static void before() { + // 创建配置类 + SmsChannelProperties properties = new SmsChannelProperties(); + properties.setId(1L); + properties.setSignature("Ballcat"); + properties.setCode(SmsChannelEnum.ALIYUN.getCode()); + properties.setApiKey(System.getenv("ALIYUN_ACCESS_KEY")); + properties.setApiSecret(System.getenv("ALIYUN_SECRET_KEY")); + // 创建客户端 + smsClient = new AliyunSmsClient(properties); + smsClient.init(); + } + + @Test + public void testSendSms() { + List> templateParams = new ArrayList<>(); + templateParams.add(new KeyValue<>("code", "1024")); +// templateParams.put("operation", "嘿嘿"); +// SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams); + SmsCommonResult result = smsClient.sendSms(1L, "15601691399", + "SMS_207945135", templateParams); + System.out.println(result); + } + + @Test + public void testGetSmsTemplate() { + String apiTemplateId = "SMS_2079451351"; + SmsCommonResult result = smsClient.getSmsTemplate(apiTemplateId); + System.out.println(result); + } + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java new file mode 100644 index 0000000..52b4d67 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.adminserver.framework.sms.core.client.impl.debug; + +import cn.iocoder.yudao.framework.common.core.KeyValue; +import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; +import cn.iocoder.yudao.framework.sms.core.client.impl.debug.DebugDingTalkSmsClient; +import cn.iocoder.yudao.framework.sms.core.enums.SmsChannelEnum; +import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link DebugDingTalkSmsClient} 的集成测试 + */ +public class DebugDingTalkSmsClientIntegrationTest { + + private static DebugDingTalkSmsClient smsClient; + + @BeforeAll + public static void init() { + // 创建配置类 + SmsChannelProperties properties = new SmsChannelProperties(); + properties.setId(1L); + properties.setSignature("芋道"); + properties.setCode(SmsChannelEnum.DEBUG_DING_TALK.getCode()); + properties.setApiKey("696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859"); + properties.setApiSecret("SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67"); + // 创建客户端 + smsClient = new DebugDingTalkSmsClient(properties); + smsClient.init(); + } + + @Test + public void testSendSms() { + List> templateParams = new ArrayList<>(); + templateParams.add(new KeyValue<>("code", "1024")); + templateParams.add(new KeyValue<>("operation", "嘿嘿")); +// SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams); + SmsCommonResult result = smsClient.sendSms(1L, "15601691399", "4383920", templateParams); + System.out.println(result); + } + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java new file mode 100644 index 0000000..ed73f9e --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.adminserver.framework.sms.core.client.impl.yunpian; + +import cn.iocoder.yudao.framework.common.core.KeyValue; +import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO; +import cn.iocoder.yudao.framework.sms.core.client.impl.yunpian.YunpianSmsClient; +import cn.iocoder.yudao.framework.sms.core.enums.SmsChannelEnum; +import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link YunpianSmsClient} 的集成测试 + */ +public class YunpianSmsClientIntegrationTest { + + private static YunpianSmsClient smsClient; + + @BeforeAll + public static void init() { + // 创建配置类 + SmsChannelProperties properties = new SmsChannelProperties(); + properties.setId(1L); + properties.setSignature("芋道"); + properties.setCode(SmsChannelEnum.YUN_PIAN.getCode()); + properties.setApiKey("1555a14277cb8a608cf45a9e6a80d510"); + // 创建客户端 + smsClient = new YunpianSmsClient(properties); + smsClient.init(); + } + + @Test + public void testSendSms() { + List> templateParams = new ArrayList<>(); + templateParams.add(new KeyValue<>("code", "1024")); + templateParams.add(new KeyValue<>("operation", "嘿嘿")); +// SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams); + SmsCommonResult result = smsClient.sendSms(1L, "15601691399", "4383920", templateParams); + System.out.println(result); + } + + @Test + public void testGetSmsTemplate() { + String apiTemplateId = "4383920"; + SmsCommonResult result = smsClient.getSmsTemplate(apiTemplateId); + System.out.println(result); + } + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/package-info.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/package-info.java new file mode 100644 index 0000000..2fc6be2 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/sms/core/client/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.adminserver.framework.sms.core.client; diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/package-info.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/package-info.java new file mode 100644 index 0000000..b6bd214 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.adminserver.modules.system.service; diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java new file mode 100644 index 0000000..bb43560 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.thread.ThreadUtil; +import cn.iocoder.yudao.adminserver.BaseDbAndRedisIntegrationTest; +import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms.SysSmsSendConsumer; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsChannelServiceImpl; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsLogServiceImpl; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsServiceImpl; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsTemplateServiceImpl; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.sms.config.YudaoSmsAutoConfiguration; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Import({YudaoSmsAutoConfiguration.class, + SysSmsChannelServiceImpl.class, SysSmsServiceImpl.class, SysSmsTemplateServiceImpl.class, SysSmsLogServiceImpl.class, + SysSmsProducer.class, SysSmsSendConsumer.class}) +public class SysSmsServiceIntegrationTest extends BaseDbAndRedisIntegrationTest { + + @Resource + private SysSmsServiceImpl smsService; + @Resource + private SysSmsChannelServiceImpl smsChannelService; + + @MockBean + private SysUserService userService; + + @Test + public void testSendSingleSms_yunpianSuccess() { + // 参数准备 + String mobile = "15601691399"; + Long userId = 1L; + Integer userType = UserTypeEnum.ADMIN.getValue(); + String templateCode = "test_01"; + Map templateParams = MapUtil.builder() + .put("operation", "登陆").put("code", "1234").build(); + // 调用 + smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); + + // 等待 MQ 消费 + ThreadUtil.sleep(1, TimeUnit.HOURS); + } + + @Test + public void testSendSingleSms_aliyunSuccess() { + // 参数准备 + String mobile = "15601691399"; + Long userId = 1L; + Integer userType = UserTypeEnum.ADMIN.getValue(); + String templateCode = "test_02"; + Map templateParams = MapUtil.builder() + .put("code", "1234").build(); + // 调用 + smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); + + // 等待 MQ 消费 + ThreadUtil.sleep(1, TimeUnit.HOURS); + } + +// @Test +// public void testDoSendSms() { +// // 等待 MQ 消费 +// ThreadUtil.sleep(1, TimeUnit.HOURS); +// } + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java new file mode 100644 index 0000000..1e86eb5 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ToolInformationSchemaColumnMapperTest extends BaseDbUnitTest { + + @Resource + private ToolSchemaColumnMapper toolInformationSchemaColumnMapper; + + @Test + public void testSelectListByTableName() { + List columns = toolInformationSchemaColumnMapper + .selectListByTableName("", "inf_config"); + assertTrue(columns.size() > 0); + } + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java new file mode 100644 index 0000000..35d91b8 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; + +import javax.annotation.Resource; + +class ToolInformationSchemaTableMapperTest extends BaseDbUnitTest { + + @Resource + private ToolSchemaTableMapper toolInformationSchemaTableMapper; + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenEngineTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenEngineTest.java new file mode 100644 index 0000000..a8a7857 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenEngineTest.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.adminserver.modules.tool.service.codegen; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolCodegenColumnMapper; +import cn.iocoder.yudao.adminserver.modules.tool.dal.mysql.codegen.ToolCodegenTableMapper; +import cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl.ToolCodegenEngine; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +public class ToolCodegenEngineTest extends BaseDbUnitTest { + + @Resource + private ToolCodegenTableMapper codegenTableMapper; + @Resource + private ToolCodegenColumnMapper codegenColumnMapper; + + @Resource + private ToolCodegenEngine codegenEngine; + + @Test + public void testExecute() { + ToolCodegenTableDO table = codegenTableMapper.selectById(20); + List columns = codegenColumnMapper.selectListByTableId(table.getId()); + Map result = codegenEngine.execute(table, columns); + result.forEach((s, s2) -> System.out.println(s2)); +// System.out.println(result.get("vue/views/system/test/index.vue")); + } + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenSQLParserTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenSQLParserTest.java new file mode 100644 index 0000000..44c9091 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenSQLParserTest.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.adminserver.modules.tool.service.codegen; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl.ToolCodegenSQLParser; +import org.junit.jupiter.api.Test; + +public class ToolCodegenSQLParserTest extends BaseDbUnitTest { + + @Test + public void testParse() { + String sql = "CREATE TABLE `tool_test_demo` (\n" + + " `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',\n" + + " `name` varchar(100) NOT NULL DEFAULT '' COMMENT '名字',\n" + + " `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态',\n" + + " `type` tinyint(4) NOT NULL COMMENT '类型',\n" + + " `category` tinyint(4) NOT NULL COMMENT '分类',\n" + + " `remark` varchar(500) DEFAULT NULL COMMENT '备注',\n" + + " `create_by` varchar(64) DEFAULT '' COMMENT '创建者',\n" + + " `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n" + + " `update_by` varchar(64) DEFAULT '' COMMENT '更新者',\n" + + " `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',\n" + + " `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',\n" + + " PRIMARY KEY (`id`) USING BTREE\n" + + ") ENGINE=InnoDB AUTO_INCREMENT=108 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表';"; + ToolCodegenSQLParser.parse(sql); + // TODO 芋艿:后续完善断言 + } + +} diff --git a/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenServiceImplTest.java b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenServiceImplTest.java new file mode 100644 index 0000000..87661a3 --- /dev/null +++ b/yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/tool/service/codegen/ToolCodegenServiceImplTest.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.adminserver.modules.tool.service.codegen; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.adminserver.modules.tool.service.codegen.impl.ToolCodegenServiceImpl; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; + +class ToolCodegenServiceImplTest extends BaseDbUnitTest { + + @Resource + private ToolCodegenServiceImpl toolCodegenService; + + @Test + public void tetCreateCodegenTable() { + toolCodegenService.createCodegen("tool_test_demo"); +// toolCodegenService.createCodegenTable("tool_codegen_table"); +// toolCodegenService.createCodegen("tool_codegen_column"); + } + +} diff --git a/yudao-admin-server/src/test-integration/resources/application-integration-test.yaml b/yudao-admin-server/src/test-integration/resources/application-integration-test.yaml index a248134..d9612ee 100644 --- a/yudao-admin-server/src/test-integration/resources/application-integration-test.yaml +++ b/yudao-admin-server/src/test-integration/resources/application-integration-test.yaml @@ -90,12 +90,6 @@ resilience4j: # 芋道配置项,设置当前项目所有自定义的配置 yudao: - info: - version: 1.0.0 - base-package: cn.iocoder.dashboard - web: - api-prefix: /api - controller-package: ${yudao.info.base-package} security: token-header: Authorization token-secret: abcdefghijklmnopqrstuvwxyz @@ -105,15 +99,8 @@ yudao: mock-secret: test swagger: enable: false # 单元测试,禁用 Swagger - captcha: - timeout: 5m - width: 160 - height: 60 file: base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ - codegen: - base-package: ${yudao.info.base-package}.modules - db-schemas: ${spring.datasource.dynamic.datasource.master.name} xss: enable: false exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java deleted file mode 100644 index 1a3b854..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.dashboard; - -import cn.iocoder.dashboard.config.RedisTestConfiguration; -import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; -import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; -import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import org.redisson.spring.starter.RedissonAutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.jdbc.Sql; - -/** - * 依赖内存 DB + Redis 的单元测试 - * - * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis - * - * @author 芋道源码 - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class) -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 -@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB -public class BaseDbAndRedisUnitTest { - - @Import({ - // DB 配置类 - YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 - DruidDataSourceAutoConfigure.class, // Druid 自动配置类 - // MyBatis 配置类 - YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 - // Redis 配置类 - RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer - RedisAutoConfiguration.class, // Spring Redis 自动配置类 - YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 - RedissonAutoConfiguration.class, // Redisson 自动高配置类 - }) - public static class Application { - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java deleted file mode 100644 index 00579e3..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.dashboard; - -import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; -import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.jdbc.Sql; - -/** - * 依赖内存 DB 的单元测试 - * - * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 - * - * @author 芋道源码 - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 -@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB -public class BaseDbUnitTest { - - @Import({ - // DB 配置类 - YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 - DruidDataSourceAutoConfigure.class, // Druid 自动配置类 - // MyBatis 配置类 - YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 - }) - public static class Application { - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseMockitoUnitTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseMockitoUnitTest.java deleted file mode 100644 index 4a595b2..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseMockitoUnitTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.iocoder.dashboard; - -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; - -/** - * 纯 Mockito 的单元测试 - * - * @author 芋道源码 - */ -@ExtendWith(MockitoExtension.class) -public class BaseMockitoUnitTest { -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseRedisUnitTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseRedisUnitTest.java deleted file mode 100644 index ce9ac1b..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/BaseRedisUnitTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.dashboard; - -import cn.iocoder.dashboard.config.RedisTestConfiguration; -import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; -import cn.iocoder.yudao.framework.tracer.config.YudaoTracerAutoConfiguration; -import org.redisson.spring.starter.RedissonAutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; - -/** - * 依赖内存 Redis 的单元测试 - * - * 相比 {@link BaseDbUnitTest} 来说,从内存 DB 改成了内存 Redis - * - * @author 芋道源码 - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisUnitTest.Application.class) -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 -public class BaseRedisUnitTest { - - @Import({ - // Redis 配置类 - RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer - RedisAutoConfiguration.class, // Spring Redis 自动配置类 - YudaoTracerAutoConfiguration.class, // 自己的 Redis 配置类 - RedissonAutoConfiguration.class, // Redisson 自动高配置类 - }) - public static class Application { - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/config/QuartzTestConfiguration.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/config/QuartzTestConfiguration.java deleted file mode 100644 index 124aaea..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/config/QuartzTestConfiguration.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.iocoder.dashboard.config; - -import org.mockito.Mockito; -import org.quartz.Scheduler; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class QuartzTestConfiguration { - - @Bean - public Scheduler scheduler() { - return Mockito.mock(Scheduler.class); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/config/RedisTestConfiguration.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/config/RedisTestConfiguration.java deleted file mode 100644 index 299d9f4..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/config/RedisTestConfiguration.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.dashboard.config; - -import com.github.fppt.jedismock.RedisServer; -import org.springframework.boot.autoconfigure.data.redis.RedisProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Lazy; - -import java.io.IOException; - -@Configuration(proxyBeanMethods = false) -@Lazy(false) // 禁止延迟加载 -@EnableConfigurationProperties(RedisProperties.class) -public class RedisTestConfiguration { - - /** - * 创建模拟的 Redis Server 服务器 - */ - @Bean - public RedisServer redisServer(RedisProperties properties) throws IOException { - RedisServer redisServer = new RedisServer(properties.getPort()); - // TODO 芋艿:一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。 - try { - redisServer.start(); - } catch (Exception ignore) {} - return redisServer; - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java deleted file mode 100644 index f6cc3d9..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java +++ /dev/null @@ -1,256 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.config; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigPageReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigMapper; -import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum; -import cn.iocoder.dashboard.modules.infra.mq.producer.config.InfConfigProducer; -import cn.iocoder.dashboard.modules.infra.service.config.impl.InfConfigServiceImpl; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -/** - * {@link InfConfigServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -@Import(InfConfigServiceImpl.class) -public class InfConfigServiceTest extends BaseDbUnitTest { - - @Resource - private InfConfigServiceImpl configService; - - @Resource - private InfConfigMapper configMapper; - @MockBean - private InfConfigProducer configProducer; - - @Test - public void testCreateConfig_success() { - // 准备参数 - InfConfigCreateReqVO reqVO = randomPojo(InfConfigCreateReqVO.class); - - // 调用 - Long configId = configService.createConfig(reqVO); - // 断言 - assertNotNull(configId); - // 校验记录的属性是否正确 - InfConfigDO config = configMapper.selectById(configId); - assertPojoEquals(reqVO, config); - assertEquals(InfConfigTypeEnum.CUSTOM.getType(), config.getType()); - // 校验调用 - verify(configProducer, times(1)).sendConfigRefreshMessage(); - } - - @Test - public void testUpdateConfig_success() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(); - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class, o -> { - o.setId(dbConfig.getId()); // 设置更新的 ID - }); - - // 调用 - configService.updateConfig(reqVO); - // 校验是否更新正确 - InfConfigDO config = configMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, config); - // 校验调用 - verify(configProducer, times(1)).sendConfigRefreshMessage(); - } - - @Test - public void testDeleteConfig_success() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { - o.setType(InfConfigTypeEnum.CUSTOM.getType()); // 只能删除 CUSTOM 类型 - }); - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbConfig.getId(); - - // 调用 - configService.deleteConfig(id); - // 校验数据不存在了 - assertNull(configMapper.selectById(id)); - // 校验调用 - verify(configProducer, times(1)).sendConfigRefreshMessage(); - } - - @Test - public void testDeleteConfig_canNotDeleteSystemType() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { - o.setType(InfConfigTypeEnum.SYSTEM.getType()); // SYSTEM 不允许删除 - }); - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbConfig.getId(); - - // 调用, 并断言异常 - assertServiceException(() -> configService.deleteConfig(id), CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); - } - - @Test - public void testCheckConfigExists_success() { - // mock 数据 - InfConfigDO dbConfigDO = randomInfConfigDO(); - configMapper.insert(dbConfigDO);// @Sql: 先插入出一条存在的数据 - - // 调用成功 - configService.checkConfigExists(dbConfigDO.getId()); - } - - @Test - public void testCheckConfigExist_notExists() { - assertServiceException(() -> configService.checkConfigExists(randomLongId()), CONFIG_NOT_EXISTS); - } - - @Test - public void testCheckConfigKeyUnique_success() { - // 调用,成功 - configService.checkConfigKeyUnique(randomLongId(), randomString()); - } - - @Test - public void testCheckConfigKeyUnique_keyDuplicateForCreate() { - // 准备参数 - String key = randomString(); - // mock 数据 - configMapper.insert(randomInfConfigDO(o -> o.setKey(key))); - - // 调用,校验异常 - assertServiceException(() -> configService.checkConfigKeyUnique(null, key), - CONFIG_KEY_DUPLICATE); - } - - @Test - public void testCheckConfigKeyUnique_keyDuplicateForUpdate() { - // 准备参数 - Long id = randomLongId(); - String key = randomString(); - // mock 数据 - configMapper.insert(randomInfConfigDO(o -> o.setKey(key))); - - // 调用,校验异常 - assertServiceException(() -> configService.checkConfigKeyUnique(id, key), - CONFIG_KEY_DUPLICATE); - } - - @Test - public void testGetConfigPage() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 - o.setName("芋艿"); - o.setKey("yunai"); - o.setType(InfConfigTypeEnum.SYSTEM.getType()); - o.setCreateTime(buildTime(2021, 2, 1)); - }); - configMapper.insert(dbConfig); - // 测试 name 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); - // 测试 key 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); - // 测试 type 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); - // 测试 createTime 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); - // 准备参数 - InfConfigPageReqVO reqVO = new InfConfigPageReqVO(); - reqVO.setName("艿"); - reqVO.setKey("nai"); - reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); - reqVO.setBeginTime(buildTime(2021, 1, 15)); - reqVO.setEndTime(buildTime(2021, 2, 15)); - - // 调用 - PageResult pageResult = configService.getConfigPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbConfig, pageResult.getList().get(0)); - } - - @Test - public void testGetConfigList() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 - o.setName("芋艿"); - o.setKey("yunai"); - o.setType(InfConfigTypeEnum.SYSTEM.getType()); - o.setCreateTime(buildTime(2021, 2, 1)); - }); - configMapper.insert(dbConfig); - // 测试 name 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); - // 测试 key 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); - // 测试 type 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); - // 测试 createTime 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); - // 准备参数 - InfConfigExportReqVO reqVO = new InfConfigExportReqVO(); - reqVO.setName("艿"); - reqVO.setKey("nai"); - reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); - reqVO.setBeginTime(buildTime(2021, 1, 15)); - reqVO.setEndTime(buildTime(2021, 2, 15)); - - // 调用 - List list = configService.getConfigList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbConfig, list.get(0)); - } - - @Test - public void testGetConfigByKey() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(); - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - String key = dbConfig.getKey(); - - // 调用 - InfConfigDO config = configService.getConfigByKey(key); - // 断言 - assertNotNull(config); - assertPojoEquals(dbConfig, config); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static InfConfigDO randomInfConfigDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setType(randomEle(InfConfigTypeEnum.values()).getType()); // 保证 key 的范围 - }; - return randomPojo(InfConfigDO.class, ArrayUtils.append(consumer, consumers)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileServiceTest.java deleted file mode 100644 index 9a1b565..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/file/InfFileServiceTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.file; - -import cn.hutool.core.io.resource.ResourceUtil; -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.framework.file.config.FileProperties; -import cn.iocoder.dashboard.modules.infra.controller.file.vo.InfFilePageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.file.InfFileMapper; -import cn.iocoder.dashboard.modules.infra.service.file.impl.InfFileServiceImpl; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.FILE_NOT_EXISTS; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static org.junit.jupiter.api.Assertions.*; - -@Import({InfFileServiceImpl.class, FileProperties.class}) -public class InfFileServiceTest extends BaseDbUnitTest { - - @Resource - private InfFileServiceImpl fileService; - - @Resource - private FileProperties fileProperties; - @Resource - private InfFileMapper fileMapper; - - @Test - public void testCreateFile_success() { - // 准备参数 - String path = randomString(); - byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); - - // 调用 - String url = fileService.createFile(path, content); - // 断言 - assertEquals(fileProperties.getBasePath() + path, url); - // 校验数据 - InfFileDO file = fileMapper.selectById(path); - assertEquals(path, file.getId()); - assertEquals("jpg", file.getType()); - assertArrayEquals(content, file.getContent()); - } - - @Test - public void testCreateFile_exists() { - // mock 数据 - InfFileDO dbFile = randomPojo(InfFileDO.class); - fileMapper.insert(dbFile); - // 准备参数 - String path = dbFile.getId(); // 模拟已存在 - byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); - - // 调用,并断言异常 - assertServiceException(() -> fileService.createFile(path, content), FILE_PATH_EXISTS); - } - - @Test - public void testDeleteFile_success() { - // mock 数据 - InfFileDO dbFile = randomPojo(InfFileDO.class); - fileMapper.insert(dbFile);// @Sql: 先插入出一条存在的数据 - // 准备参数 - String id = dbFile.getId(); - - // 调用 - fileService.deleteFile(id); - // 校验数据不存在了 - assertNull(fileMapper.selectById(id)); - } - - @Test - public void testDeleteFile_notExists() { - // 准备参数 - String id = randomString(); - - // 调用, 并断言异常 - assertServiceException(() -> fileService.deleteFile(id), FILE_NOT_EXISTS); - } - - @Test - public void testGetFilePage() { - // mock 数据 - InfFileDO dbFile = randomPojo(InfFileDO.class, o -> { // 等会查询到 - o.setId("yudao"); - o.setType("jpg"); - o.setCreateTime(buildTime(2021, 1, 15)); - }); - fileMapper.insert(dbFile); - // 测试 id 不匹配 - fileMapper.insert(ObjectUtils.clone(dbFile, o -> o.setId("tudou"))); - // 测试 type 不匹配 - fileMapper.insert(ObjectUtils.clone(dbFile, o -> { - o.setId("yudao02"); - o.setType("png"); - })); - // 测试 createTime 不匹配 - fileMapper.insert(ObjectUtils.clone(dbFile, o -> { - o.setId("yudao03"); - o.setCreateTime(buildTime(2020, 1, 15)); - })); - // 准备参数 - InfFilePageReqVO reqVO = new InfFilePageReqVO(); - reqVO.setId("yudao"); - reqVO.setType("jp"); - reqVO.setBeginCreateTime(buildTime(2021, 1, 10)); - reqVO.setEndCreateTime(buildTime(2021, 1, 20)); - - // 调用 - PageResult pageResult = fileService.getFilePage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbFile, pageResult.getList().get(0), "content"); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobLogServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobLogServiceTest.java deleted file mode 100644 index f028825..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobLogServiceTest.java +++ /dev/null @@ -1,173 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.job; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Resource; - -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobLogDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobLogMapper; -import cn.iocoder.dashboard.modules.infra.enums.job.InfJobLogStatusEnum; -import cn.iocoder.dashboard.modules.infra.service.job.impl.InfJobLogServiceImpl; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; - -/** - * {@link InfJobLogServiceImpl} 的单元测试 - * - * @author neilz - */ -@Import(InfJobLogServiceImpl.class) -public class InfJobLogServiceTest extends BaseDbUnitTest { - - @Resource - private InfJobLogServiceImpl jobLogService; - @Resource - private InfJobLogMapper jobLogMapper; - - @Test - public void testCreateJobLog_success() { - // 准备参数 - InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> { - o.setExecuteIndex(1); - }); - // 调用 - Long jobLogId = jobLogService.createJobLog(reqVO.getJobId(), reqVO.getBeginTime(), reqVO.getHandlerName(), reqVO.getHandlerParam(), reqVO.getExecuteIndex()); - // 断言 - assertNotNull(jobLogId); - // 校验记录的属性是否正确 - InfJobLogDO job = jobLogMapper.selectById(jobLogId); - assertEquals(InfJobLogStatusEnum.RUNNING.getStatus(), job.getStatus()); - } - - @Test - public void testUpdateJobLogResultAsync_success() { - // 准备参数 - InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> { - o.setExecuteIndex(1); - }); - InfJobLogDO log = InfJobLogDO.builder().jobId(reqVO.getJobId()).handlerName(reqVO.getHandlerName()).handlerParam(reqVO.getHandlerParam()).executeIndex(reqVO.getExecuteIndex()) - .beginTime(reqVO.getBeginTime()).status(InfJobLogStatusEnum.RUNNING.getStatus()).build(); - jobLogMapper.insert(log); - // 调用 - jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), true,reqVO.getResult()); - // 校验记录的属性是否正确 - InfJobLogDO job = jobLogMapper.selectById(log.getId()); - assertEquals(InfJobLogStatusEnum.SUCCESS.getStatus(), job.getStatus()); - - // 调用 - jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), false,reqVO.getResult()); - // 校验记录的属性是否正确 - InfJobLogDO job2 = jobLogMapper.selectById(log.getId()); - assertEquals(InfJobLogStatusEnum.FAILURE.getStatus(), job2.getStatus()); - } - - @Test - public void testGetJobLogListByIds_success() { - // mock 数据 - InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { - o.setExecuteIndex(1); - o.setStatus(randomEle(InfJobLogStatusEnum.values()).getStatus()); // 保证 status 的范围 - }); - InfJobLogDO cloneJobLog = ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString())); - jobLogMapper.insert(dbJobLog); - // 测试 handlerName 不匹配 - jobLogMapper.insert(cloneJobLog); - // 准备参数 - ArrayList ids = new ArrayList<>(); - ids.add(dbJobLog.getId()); - ids.add(cloneJobLog.getId()); - // 调用 - List list = jobLogService.getJobLogList(ids); - // 断言 - assertEquals(2, list.size()); - assertPojoEquals(dbJobLog, list.get(0)); - } - - @Test - public void testGetJobPage_success() { - // mock 数据 - InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { - o.setExecuteIndex(1); - o.setHandlerName("handlerName 单元测试"); - o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); - o.setBeginTime(buildTime(2021, 1, 8)); - o.setEndTime(buildTime(2021, 1, 8)); - }); - jobLogMapper.insert(dbJobLog); - // 测试 jobId 不匹配 - jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setJobId(randomLongId()))); - // 测试 handlerName 不匹配 - jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString()))); - // 测试 beginTime 不匹配 - jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7)))); - // 测试 endTime 不匹配 - jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9)))); - // 测试 status 不匹配 - jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus()))); - // 准备参数 - InfJobLogPageReqVO reqVo = new InfJobLogPageReqVO(); - reqVo.setJobId(dbJobLog.getJobId()); - reqVo.setHandlerName("单元"); - reqVo.setBeginTime(dbJobLog.getBeginTime()); - reqVo.setEndTime(dbJobLog.getEndTime()); - reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); - // 调用 - PageResult pageResult = jobLogService.getJobLogPage(reqVo); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbJobLog, pageResult.getList().get(0)); - } - - @Test - public void testGetJobListForExport_success() { - // mock 数据 - InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { - o.setExecuteIndex(1); - o.setHandlerName("handlerName 单元测试"); - o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); - o.setBeginTime(buildTime(2021, 1, 8)); - o.setEndTime(buildTime(2021, 1, 8)); - }); - jobLogMapper.insert(dbJobLog); - // 测试 jobId 不匹配 - jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setJobId(randomLongId()))); - // 测试 handlerName 不匹配 - jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString()))); - // 测试 beginTime 不匹配 - jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7)))); - // 测试 endTime 不匹配 - jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9)))); - // 测试 status 不匹配 - jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus()))); - // 准备参数 - InfJobLogExportReqVO reqVo = new InfJobLogExportReqVO(); - reqVo.setJobId(dbJobLog.getJobId()); - reqVo.setHandlerName("单元"); - reqVo.setBeginTime(dbJobLog.getBeginTime()); - reqVo.setEndTime(dbJobLog.getEndTime()); - reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); - // 调用 - List list = jobLogService.getJobLogList(reqVo); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbJobLog, list.get(0)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobServiceTest.java deleted file mode 100644 index dde3600..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobServiceTest.java +++ /dev/null @@ -1,309 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.job; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_EQUALS; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_INVALID; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CRON_EXPRESSION_VALID; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_HANDLER_EXISTS; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_NOT_EXISTS; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_UPDATE_ONLY_NORMAL_STATUS; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Resource; - -import org.junit.jupiter.api.Test; -import org.quartz.SchedulerException; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobCreateReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobPageReqVO; -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; -import cn.iocoder.dashboard.modules.infra.convert.job.InfJobConvert; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobMapper; -import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum; -import cn.iocoder.dashboard.modules.infra.service.job.impl.InfJobServiceImpl; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; - -/** - * {@link InfJobServiceImpl} 的单元测试 - * - * @author neilz - */ -@Import(InfJobServiceImpl.class) -public class InfJobServiceTest extends BaseDbUnitTest { - - @Resource - private InfJobServiceImpl jobService; - @Resource - private InfJobMapper jobMapper; - @MockBean - private SchedulerManager schedulerManager; - - @Test - public void testCreateJob_cronExpressionValid() { - // 准备参数。Cron 表达式为 String 类型,默认随机字符串。 - InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class); - // 调用,并断言异常 - assertServiceException(() -> jobService.createJob(reqVO), JOB_CRON_EXPRESSION_VALID); - } - - @Test - public void testCreateJob_jobHandlerExists() throws SchedulerException { - // 准备参数 指定 Cron 表达式 - InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - // 调用 - jobService.createJob(reqVO); - // 调用,并断言异常 - assertServiceException(() -> jobService.createJob(reqVO), JOB_HANDLER_EXISTS); - } - - @Test - public void testCreateJob_success() throws SchedulerException { - // 准备参数 指定 Cron 表达式 - InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - // 调用 - Long jobId = jobService.createJob(reqVO); - // 断言 - assertNotNull(jobId); - // 校验记录的属性是否正确 - InfJobDO job = jobMapper.selectById(jobId); - assertPojoEquals(reqVO, job); - assertEquals(InfJobStatusEnum.NORMAL.getStatus(), job.getStatus()); - // 校验调用 - verify(schedulerManager, times(1)).addJob(eq(job.getId()), eq(job.getHandlerName()), eq(job.getHandlerParam()), eq(job.getCronExpression()), - eq(reqVO.getRetryCount()), eq(reqVO.getRetryInterval())); - } - - @Test - public void testUpdateJob_jobNotExists(){ - // 准备参数 - InfJobUpdateReqVO reqVO = randomPojo(InfJobUpdateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - // 调用,并断言异常 - assertServiceException(() -> jobService.updateJob(reqVO), JOB_NOT_EXISTS); - } - - @Test - public void testUpdateJob_onlyNormalStatus(){ - // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.INIT.getStatus()); - fillJobMonitorTimeoutEmpty(job); - jobMapper.insert(job); - // 准备参数 - InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> { - o.setId(job.getId()); - o.setName(createReqVO.getName()); - o.setCronExpression(createReqVO.getCronExpression()); - }); - // 调用,并断言异常 - assertServiceException(() -> jobService.updateJob(updateReqVO), JOB_UPDATE_ONLY_NORMAL_STATUS); - } - - @Test - public void testUpdateJob_success() throws SchedulerException { - // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); - fillJobMonitorTimeoutEmpty(job); - jobMapper.insert(job); - // 准备参数 - InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> { - o.setId(job.getId()); - o.setName(createReqVO.getName()); - o.setCronExpression(createReqVO.getCronExpression()); - }); - // 调用 - jobService.updateJob(updateReqVO); - // 校验记录的属性是否正确 - InfJobDO updateJob = jobMapper.selectById(updateReqVO.getId()); - assertPojoEquals(updateReqVO, updateJob); - // 校验调用 - verify(schedulerManager, times(1)).updateJob(eq(job.getHandlerName()), eq(updateReqVO.getHandlerParam()), eq(updateReqVO.getCronExpression()), - eq(updateReqVO.getRetryCount()), eq(updateReqVO.getRetryInterval())); - } - - @Test - public void testUpdateJobStatus_changeStatusInvalid() { - // 调用,并断言异常 - assertServiceException(() -> jobService.updateJobStatus(1l, InfJobStatusEnum.INIT.getStatus()), JOB_CHANGE_STATUS_INVALID); - } - - @Test - public void testUpdateJobStatus_changeStatusEquals() { - // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); - fillJobMonitorTimeoutEmpty(job); - jobMapper.insert(job); - // 调用,并断言异常 - assertServiceException(() -> jobService.updateJobStatus(job.getId(), job.getStatus()), JOB_CHANGE_STATUS_EQUALS); - } - - @Test - public void testUpdateJobStatus_NormalToStop_success() throws SchedulerException { - // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); - fillJobMonitorTimeoutEmpty(job); - jobMapper.insert(job); - // 调用 - jobService.updateJobStatus(job.getId(), InfJobStatusEnum.STOP.getStatus()); - // 校验记录的属性是否正确 - InfJobDO updateJob = jobMapper.selectById(job.getId()); - assertEquals(InfJobStatusEnum.STOP.getStatus(), updateJob.getStatus()); - // 校验调用 - verify(schedulerManager, times(1)).pauseJob(eq(job.getHandlerName())); - } - - @Test - public void testUpdateJobStatus_StopToNormal_success() throws SchedulerException { - // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.STOP.getStatus()); - fillJobMonitorTimeoutEmpty(job); - jobMapper.insert(job); - // 调用 - jobService.updateJobStatus(job.getId(), InfJobStatusEnum.NORMAL.getStatus()); - // 校验记录的属性是否正确 - InfJobDO updateJob = jobMapper.selectById(job.getId()); - assertEquals(InfJobStatusEnum.NORMAL.getStatus(), updateJob.getStatus()); - // 校验调用 - verify(schedulerManager, times(1)).resumeJob(eq(job.getHandlerName())); - } - - @Test - public void testTriggerJob_success() throws SchedulerException { - // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); - fillJobMonitorTimeoutEmpty(job); - jobMapper.insert(job); - // 调用 - jobService.triggerJob(job.getId()); - // 校验调用 - verify(schedulerManager, times(1)).triggerJob(eq(job.getId()), eq(job.getHandlerName()), eq(job.getHandlerParam())); - } - - @Test - public void testDeleteJob_success() throws SchedulerException { - // mock 数据 - InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); - InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); - job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); - fillJobMonitorTimeoutEmpty(job); - jobMapper.insert(job); - // 调用 UPDATE inf_job SET deleted=1 WHERE id=? AND deleted=0 - jobService.deleteJob(job.getId()); - // 校验数据不存在了 WHERE id=? AND deleted=0 查询为空正常 - assertNull(jobMapper.selectById(job.getId())); - // 校验调用 - verify(schedulerManager, times(1)).deleteJob(eq(job.getHandlerName())); - } - - @Test - public void testGetJobListByIds_success() { - // mock 数据 - InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { - o.setStatus(randomEle(InfJobStatusEnum.values()).getStatus()); // 保证 status 的范围 - }); - InfJobDO cloneJob = ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString())); - jobMapper.insert(dbJob); - // 测试 handlerName 不匹配 - jobMapper.insert(cloneJob); - // 准备参数 - ArrayList ids = new ArrayList<>(); - ids.add(dbJob.getId()); - ids.add(cloneJob.getId()); - // 调用 - List list = jobService.getJobList(ids); - // 断言 - assertEquals(2, list.size()); - assertPojoEquals(dbJob, list.get(0)); - } - - @Test - public void testGetJobPage_success() { - // mock 数据 - InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { - o.setName("定时任务测试"); - o.setHandlerName("handlerName 单元测试"); - o.setStatus(InfJobStatusEnum.INIT.getStatus()); - }); - jobMapper.insert(dbJob); - // 测试 name 不匹配 - jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setName("土豆"))); - // 测试 status 不匹配 - jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus()))); - // 测试 handlerName 不匹配 - jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString()))); - // 准备参数 - InfJobPageReqVO reqVo = new InfJobPageReqVO(); - reqVo.setName("定时"); - reqVo.setStatus(InfJobStatusEnum.INIT.getStatus()); - reqVo.setHandlerName("单元"); - // 调用 - PageResult pageResult = jobService.getJobPage(reqVo); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbJob, pageResult.getList().get(0)); - } - - @Test - public void testGetJobListForExport_success() { - // mock 数据 - InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { - o.setName("定时任务测试"); - o.setHandlerName("handlerName 单元测试"); - o.setStatus(InfJobStatusEnum.INIT.getStatus()); - }); - jobMapper.insert(dbJob); - // 测试 name 不匹配 - jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setName("土豆"))); - // 测试 status 不匹配 - jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus()))); - // 测试 handlerName 不匹配 - jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString()))); - // 准备参数 - InfJobExportReqVO reqVo = new InfJobExportReqVO(); - reqVo.setName("定时"); - reqVo.setStatus(InfJobStatusEnum.INIT.getStatus()); - reqVo.setHandlerName("单元"); - // 调用 - List list = jobService.getJobList(reqVo); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbJob, list.get(0)); - } - - private static void fillJobMonitorTimeoutEmpty(InfJobDO job) { - if (job.getMonitorTimeout() == null) { - job.setMonitorTimeout(0); - } - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java deleted file mode 100644 index 11a00cd..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java +++ /dev/null @@ -1,176 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.logger; - -import cn.hutool.core.util.RandomUtil; -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.logger.InfApiAccessLogMapper; -import cn.iocoder.dashboard.modules.infra.service.logger.impl.InfApiAccessLogServiceImpl; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.List; -import java.util.concurrent.Future; - -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** - * {@link InfApiAccessLogServiceImpl} 单元测试 - */ -@Import(InfApiAccessLogServiceImpl.class) -public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { - - @Resource - private InfApiAccessLogService infApiAccessLogServiceImpl; - - @Resource - private InfApiAccessLogMapper infApiAccessLogMapper; - - @Test - public void testCreateApiAccessLogAsync() throws Exception { - ApiAccessLogCreateDTO createDTO = RandomUtils.randomPojo( - ApiAccessLogCreateDTO.class, - dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()) - ); - - // 执行service方法 - Future future = infApiAccessLogServiceImpl.createApiAccessLogAsync(createDTO); - - // 等异步执行完 - future.get(); - - InfApiAccessLogDO infApiAccessLogDO = infApiAccessLogMapper.selectOne(null); - // 断言 - assertNotNull(infApiAccessLogDO); - // 断言,忽略基本字段 - assertPojoEquals(createDTO, infApiAccessLogDO); - } - - @Test - public void testGetApiAccessLogPage() { - // 构造测试数据 - long userId = 2233L; - int userType = UserTypeEnum.ADMIN.getValue(); - String applicationName = "yudao-test"; - String requestUrl = "foo"; - Date beginTime = buildTime(2021, 3, 13); - int duration = 1000; - int resultCode = GlobalErrorCodeConstants.SUCCESS.getCode(); - - InfApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(InfApiAccessLogDO.class, dto -> { - dto.setUserId(userId); - dto.setUserType(userType); - dto.setApplicationName(applicationName); - dto.setRequestUrl(requestUrl); - dto.setBeginTime(beginTime); - dto.setDuration(duration); - dto.setResultCode(resultCode); - }); - infApiAccessLogMapper.insert(infApiAccessLogDO); - - // 下面几个都是不匹配的数据 - // userId 不同的 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); - // userType - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); - // applicationName 不同的 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); - // requestUrl 不同的 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); - // 构造一个早期时间 2021-02-06 00:00:00 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); - // duration 不同的 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setDuration(100))); - // resultCode 不同的 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); - - // 构造调用参数 - InfApiAccessLogPageReqVO reqVO = new InfApiAccessLogPageReqVO(); - reqVO.setUserId(userId); - reqVO.setUserType(userType); - reqVO.setApplicationName(applicationName); - reqVO.setRequestUrl(requestUrl); - reqVO.setBeginBeginTime(buildTime(2021, 3, 12)); - reqVO.setEndBeginTime(buildTime(2021, 3, 14)); - reqVO.setDuration(duration); - reqVO.setResultCode(resultCode); - - // 调用service方法 - PageResult pageResult = infApiAccessLogServiceImpl.getApiAccessLogPage(reqVO); - - // 断言,只查到了一条符合条件的 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(infApiAccessLogDO, pageResult.getList().get(0)); - } - - @Test - public void testGetApiAccessLogList() { - // 构造测试数据 - long userId = 2233L; - int userType = UserTypeEnum.ADMIN.getValue(); - String applicationName = "yudao-test"; - String requestUrl = "foo"; - Date beginTime = buildTime(2021, 3, 13); - int duration = 1000; - int resultCode = GlobalErrorCodeConstants.SUCCESS.getCode(); - - InfApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(InfApiAccessLogDO.class, dto -> { - dto.setUserId(userId); - dto.setUserType(userType); - dto.setApplicationName(applicationName); - dto.setRequestUrl(requestUrl); - dto.setBeginTime(beginTime); - dto.setDuration(duration); - dto.setResultCode(resultCode); - }); - infApiAccessLogMapper.insert(infApiAccessLogDO); - - // 下面几个都是不匹配的数据 - // userId 不同的 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); - // userType - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); - // applicationName 不同的 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); - // requestUrl 不同的 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); - // 构造一个早期时间 2021-02-06 00:00:00 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); - // duration 不同的 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setDuration(100))); - // resultCode 不同的 - infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); - - // 构造调用参数 - InfApiAccessLogExportReqVO reqVO = new InfApiAccessLogExportReqVO(); - reqVO.setUserId(userId); - reqVO.setUserType(userType); - reqVO.setApplicationName(applicationName); - reqVO.setRequestUrl(requestUrl); - reqVO.setBeginBeginTime(buildTime(2021, 3, 12)); - reqVO.setEndBeginTime(buildTime(2021, 3, 14)); - reqVO.setDuration(duration); - reqVO.setResultCode(resultCode); - - // 调用service方法 - List list = infApiAccessLogServiceImpl.getApiAccessLogList(reqVO); - - // 断言,只查到了一条符合条件的 - assertEquals(1, list.size()); - assertPojoEquals(infApiAccessLogDO, list.get(0)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java deleted file mode 100644 index d82afad..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java +++ /dev/null @@ -1,207 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.logger; - -import cn.hutool.core.util.RandomUtil; -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.logger.InfApiErrorLogMapper; -import cn.iocoder.dashboard.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; -import cn.iocoder.dashboard.modules.infra.service.logger.impl.InfApiErrorLogServiceImpl; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.List; -import java.util.concurrent.Future; - -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; -import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_PROCESSED; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** - * {@link InfApiErrorLogServiceImpl} 单元测试 - */ -@Import(InfApiErrorLogServiceImpl.class) -public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { - - @Resource - private InfApiErrorLogService infApiErrorLogServiceImpl; - - @Resource - private InfApiErrorLogMapper infApiErrorLogMapper; - - - @Test - public void testCreateApiErrorLogAsync() throws Exception { - ApiErrorLogCreateDTO createDTO = RandomUtils.randomPojo( - ApiErrorLogCreateDTO.class, - dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()) - ); - - // 执行service方法 - Future future = infApiErrorLogServiceImpl.createApiErrorLogAsync(createDTO); - - // 等异步执行完 - future.get(); - - InfApiErrorLogDO infApiErrorLogDO = infApiErrorLogMapper.selectOne(null); - // 断言 - assertNotNull(infApiErrorLogDO); - // 断言,忽略基本字段 - assertPojoEquals(createDTO, infApiErrorLogDO); - } - - - @Test - public void testGetApiErrorLogPage() { - // 构造测试数据 - long userId = 2233L; - int userType = UserTypeEnum.ADMIN.getValue(); - String applicationName = "yudao-test"; - String requestUrl = "foo"; - Date beginTime = buildTime(2021, 3, 13); - int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus(); - - InfApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { - logDO.setUserId(userId); - logDO.setUserType(userType); - logDO.setApplicationName(applicationName); - logDO.setRequestUrl(requestUrl); - logDO.setExceptionTime(beginTime); - logDO.setProcessStatus(progressStatus); - }); - infApiErrorLogMapper.insert(infApiErrorLogDO); - - // 下面几个都是不匹配的数据 - // userId 不同的 - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserId(3344L))); - // userType - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); - // applicationName 不同的 - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setApplicationName("test"))); - // requestUrl 不同的 - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setRequestUrl("bar"))); - // 构造一个早期时间 2021-02-06 00:00:00 - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setExceptionTime(buildTime(2021, 2, 6)))); - // progressStatus 不同的 - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()))); - - // 构造调用参数 - InfApiErrorLogPageReqVO reqVO = new InfApiErrorLogPageReqVO(); - reqVO.setUserId(userId); - reqVO.setUserType(userType); - reqVO.setApplicationName(applicationName); - reqVO.setRequestUrl(requestUrl); - reqVO.setBeginExceptionTime(buildTime(2021, 3, 12)); - reqVO.setEndExceptionTime(buildTime(2021, 3, 14)); - reqVO.setProcessStatus(progressStatus); - - // 调用service方法 - PageResult pageResult = infApiErrorLogServiceImpl.getApiErrorLogPage(reqVO); - - // 断言,只查到了一条符合条件的 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(infApiErrorLogDO, pageResult.getList().get(0)); - } - - @Test - public void testGetApiErrorLogList() { - // 构造测试数据 - long userId = 2233L; - int userType = UserTypeEnum.ADMIN.getValue(); - String applicationName = "yudao-test"; - String requestUrl = "foo"; - Date beginTime = buildTime(2021, 3, 13); - int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus(); - - InfApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { - logDO.setUserId(userId); - logDO.setUserType(userType); - logDO.setApplicationName(applicationName); - logDO.setRequestUrl(requestUrl); - logDO.setExceptionTime(beginTime); - logDO.setProcessStatus(progressStatus); - }); - infApiErrorLogMapper.insert(infApiErrorLogDO); - - // 下面几个都是不匹配的数据 - // userId 不同的 - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserId(3344L))); - // userType - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); - // applicationName 不同的 - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setApplicationName("test"))); - // requestUrl 不同的 - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setRequestUrl("bar"))); - // 构造一个早期时间 2021-02-06 00:00:00 - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setExceptionTime(buildTime(2021, 2, 6)))); - // progressStatus 不同的 - infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()))); - - // 构造调用参数 - InfApiErrorLogExportReqVO reqVO = new InfApiErrorLogExportReqVO(); - reqVO.setUserId(userId); - reqVO.setUserType(userType); - reqVO.setApplicationName(applicationName); - reqVO.setRequestUrl(requestUrl); - reqVO.setBeginExceptionTime(buildTime(2021, 3, 12)); - reqVO.setEndExceptionTime(buildTime(2021, 3, 14)); - reqVO.setProcessStatus(progressStatus); - - // 调用service方法 - List list = infApiErrorLogServiceImpl.getApiErrorLogList(reqVO); - - // 断言,只查到了一条符合条件的 - assertEquals(1, list.size()); - assertPojoEquals(infApiErrorLogDO, list.get(0)); - } - - - @Test - public void testUpdateApiErrorLogProcess() { - // 先构造两条数据,第一条用于抛出异常,第二条用于正常的执行update操作 - Long processUserId = 2233L; - - InfApiErrorLogDO first = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { - logDO.setProcessUserId(processUserId); - logDO.setUserType(UserTypeEnum.ADMIN.getValue()); - logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()); - }); - infApiErrorLogMapper.insert(first); - - InfApiErrorLogDO second = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { - logDO.setProcessUserId(1122L); - logDO.setUserType(UserTypeEnum.ADMIN.getValue()); - logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.INIT.getStatus()); - }); - infApiErrorLogMapper.insert(second); - - Long firstId = first.getId(); - Long secondId = second.getId(); - - // 执行正常的 update 操作 - infApiErrorLogServiceImpl.updateApiErrorLogProcess(secondId, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId); - InfApiErrorLogDO secondSelect = infApiErrorLogMapper.selectOne("id", secondId); - - // id 为 0 查询不到,应该抛出异常 API_ERROR_LOG_NOT_FOUND - assertServiceException(() -> infApiErrorLogServiceImpl.updateApiErrorLogProcess(0L, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_NOT_FOUND); - // id 为 first 的 progressStatus 为 DONE ,应该抛出 API_ERROR_LOG_PROCESSED - assertServiceException(() -> infApiErrorLogServiceImpl.updateApiErrorLogProcess(firstId, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_PROCESSED); - // 验证 progressStatus 是否修改成功 - assertEquals(InfApiErrorLogProcessStatusEnum.DONE.getStatus(), secondSelect.getProcessStatus()); - // 验证 progressUserId 是否修改成功 - assertEquals(processUserId, secondSelect.getProcessUserId()); - } -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java deleted file mode 100644 index 5e621d0..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java +++ /dev/null @@ -1,269 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.auth; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.dashboard.modules.system.service.auth.impl.SysAuthServiceImpl; -import cn.iocoder.dashboard.modules.system.service.common.SysCaptchaService; -import cn.iocoder.dashboard.modules.system.service.logger.SysLoginLogService; -import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import cn.iocoder.yudao.framework.test.core.util.AssertUtils; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.DisabledException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.userdetails.UsernameNotFoundException; - -import javax.annotation.Resource; -import java.util.Set; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static java.util.Collections.singleton; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -/** - * {@link SysAuthServiceImpl} 的单元测试 - * - * @author 芋道源码 - */ -@Import(SysAuthServiceImpl.class) -public class SysAuthServiceImplTest extends BaseDbUnitTest { - - @Resource - private SysAuthServiceImpl authService; - - @MockBean - private SysUserService userService; - @MockBean - private SysPermissionService permissionService; - @MockBean - private AuthenticationManager authenticationManager; - @MockBean - private Authentication authentication; - @MockBean - private SysCaptchaService captchaService; - @MockBean - private SysLoginLogService loginLogService; - @MockBean - private SysUserSessionService userSessionService; - - @Test - public void testLoadUserByUsername_success() { - // 准备参数 - String username = randomString(); - // mock 方法 - SysUserDO user = randomPojo(SysUserDO.class, o -> o.setUsername(username)); - when(userService.getUserByUsername(eq(username))).thenReturn(user); - - // 调用 - LoginUser loginUser = (LoginUser) authService.loadUserByUsername(username); - // 校验 - AssertUtils.assertPojoEquals(user, loginUser, "updateTime"); - assertNull(loginUser.getRoleIds()); // 此时不会加载角色,所以是空的 - } - - @Test - public void testLoadUserByUsername_userNotFound() { - // 准备参数 - String username = randomString(); - // mock 方法 - - // 调用, 并断言异常 - assertThrows(UsernameNotFoundException.class, // 抛出 UsernameNotFoundException 异常 - () -> authService.loadUserByUsername(username), - username); // 异常提示为 username - } - - @Test - public void testMockLogin_success() { - // 准备参数 - Long userId = randomLongId(); - // mock 方法 01 - SysUserDO user = randomPojo(SysUserDO.class, o -> o.setId(userId)); - when(userService.getUser(eq(userId))).thenReturn(user); - // mock 方法 02 - Set roleIds = randomSet(Long.class); - when(permissionService.getUserRoleIds(eq(userId), eq(singleton(CommonStatusEnum.ENABLE.getStatus())))) - .thenReturn(roleIds); - - // 调用 - LoginUser loginUser = authService.mockLogin(userId); - // 断言 - AssertUtils.assertPojoEquals(user, loginUser, "updateTime"); - assertEquals(roleIds, loginUser.getRoleIds()); - } - - @Test - public void testMockLogin_userNotFound() { - // 准备参数 - Long userId = randomLongId(); - // mock 方法 - - // 调用, 并断言异常 - assertThrows(UsernameNotFoundException.class, // 抛出 UsernameNotFoundException 异常 - () -> authService.mockLogin(userId), - String.valueOf(userId)); // 异常提示为 userId - } - - @Test - public void testLogin_captchaNotFound() { - // 准备参数 - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); - String userIp = randomString(); - String userAgent = randomString(); - // 调用, 并断言异常 - assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_NOT_FOUND); - // 校验调用参数 - verify(loginLogService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.CAPTCHA_NOT_FOUND.getResult())) - ); - } - - @Test - public void testLogin_captchaCodeError() { - // 准备参数 - String userIp = randomString(); - String userAgent = randomString(); - String code = randomString(); - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); - // mock 验证码不正确 - when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(code); - // 调用, 并断言异常 - assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_CODE_ERROR); - // 校验调用参数 - verify(loginLogService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult())) - ); - } - - @Test - public void testLogin_badCredentials() { - // 准备参数 - String userIp = randomString(); - String userAgent = randomString(); - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); - // mock 验证码正确 - when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); - // mock 抛出异常 - when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword()))) - .thenThrow(new BadCredentialsException("测试账号或密码不正确")); - // 调用, 并断言异常 - assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_BAD_CREDENTIALS); - // 校验调用参数 - verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); - verify(loginLogService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.BAD_CREDENTIALS.getResult())) - ); - } - - @Test - public void testLogin_userDisabled() { - // 准备参数 - String userIp = randomString(); - String userAgent = randomString(); - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); - // mock 验证码正确 - when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); - // mock 抛出异常 - when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword()))) - .thenThrow(new DisabledException("测试用户被禁用")); - // 调用, 并断言异常 - assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_USER_DISABLED); - // 校验调用参数 - verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); - verify(loginLogService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.USER_DISABLED.getResult())) - ); - } - - @Test - public void testLogin_unknownError() { - // 准备参数 - String userIp = randomString(); - String userAgent = randomString(); - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); - // mock 验证码正确 - when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); - // mock 抛出异常 - when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword()))) - .thenThrow(new AuthenticationException("测试未知异常") {}); - // 调用, 并断言异常 - assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_FAIL_UNKNOWN); - // 校验调用参数 - verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); - verify(loginLogService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.UNKNOWN_ERROR.getResult())) - ); - } - - @Test - public void testLogin_success() { - // 准备参数 - String userIp = randomString(); - String userAgent = randomString(); - Long userId = randomLongId(); - Set userRoleIds = randomSet(Long.class); - String sessionId = randomString(); - SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); - LoginUser loginUser = randomPojo(LoginUser.class, o -> { - o.setId(userId); - o.setRoleIds(userRoleIds); - }); - // mock 验证码正确 - when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); - // mock authentication - when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword()))) - .thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(loginUser); - // mock 获得 User 拥有的角色编号数组 - when(permissionService.getUserRoleIds(userId, singleton(CommonStatusEnum.ENABLE.getStatus()))).thenReturn(userRoleIds); - // mock 缓存登陆用户到 Redis - when(userSessionService.createUserSession(loginUser, userIp, userAgent)).thenReturn(sessionId); - // 调用, 并断言异常 - String login = authService.login(reqVO, userIp, userAgent); - assertEquals(sessionId, login); - // 校验调用参数 - verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); - verify(loginLogService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) - && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult())) - ); - } - - @Test - public void testLogout_success() { - // 准备参数 - String token = randomString(); - LoginUser loginUser = randomPojo(LoginUser.class); - // mock - when(userSessionService.getLoginUser(token)).thenReturn(loginUser); - // 调用 - authService.logout(token); - // 校验调用参数 - verify(userSessionService, times(1)).deleteUserSession(token); - verify(loginLogService, times(1)).createLoginLog( - argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGOUT_SELF.getType()) - && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult())) - ); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionServiceImplTest.java deleted file mode 100644 index aa782d9..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionServiceImplTest.java +++ /dev/null @@ -1,227 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.auth; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomDate; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.mockito.Mockito.when; - -import java.time.Duration; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.Resource; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import cn.hutool.core.date.DateUtil; -import cn.iocoder.dashboard.BaseDbAndRedisUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.security.config.SecurityProperties; -import cn.iocoder.yudao.framework.security.core.LoginUser; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.auth.SysUserSessionDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.auth.SysUserSessionMapper; -import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper; -import cn.iocoder.dashboard.modules.system.dal.redis.auth.SysLoginUserRedisDAO; -import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum; -import cn.iocoder.dashboard.modules.system.service.auth.impl.SysUserSessionServiceImpl; -import cn.iocoder.dashboard.modules.system.service.dept.impl.SysDeptServiceImpl; -import cn.iocoder.dashboard.modules.system.service.logger.impl.SysLoginLogServiceImpl; -import cn.iocoder.dashboard.modules.system.service.user.SysUserServiceImpl; -import cn.iocoder.yudao.framework.test.core.util.AssertUtils; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; - -/** - * SysUserSessionServiceImpl Tester. - * - * @author Lyon - * @version 1.0 - * @since
3月 8, 2021
- */ -@Import({SysUserSessionServiceImpl.class, SysLoginUserRedisDAO.class}) -public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest { - - @Resource - private SysUserSessionServiceImpl sysUserSessionService; - @Resource - private SysUserSessionMapper sysUserSessionMapper; - @Resource - private SysLoginUserRedisDAO sysLoginUserRedisDAO; - @Resource - private SysUserMapper sysUserMapper; - - @MockBean - private SecurityProperties securityProperties; - @MockBean - private SysDeptServiceImpl sysDeptService; - @MockBean - private SysUserServiceImpl sysUserService; - @MockBean - private SysLoginLogServiceImpl sysLoginLogService; - - @Test - public void testCreateUserSession_success() { - // 准备参数 - String userIp = randomString(); - String userAgent = randomString(); - LoginUser loginUser = randomPojo(LoginUser.class); - // mock - when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); - // 调用 - String sessionId = sysUserSessionService.createUserSession(loginUser, userIp, userAgent); - // 校验记录的属性是否正确 - SysUserSessionDO sysUserSessionDO = sysUserSessionMapper.selectById(sessionId); - assertEquals(sysUserSessionDO.getId(), sessionId); - assertEquals(sysUserSessionDO.getUserId(), loginUser.getId()); - assertEquals(sysUserSessionDO.getUserIp(), userIp); - assertEquals(sysUserSessionDO.getUserAgent(), userAgent); - assertEquals(sysUserSessionDO.getUsername(), loginUser.getUsername()); - LoginUser redisLoginUser = sysLoginUserRedisDAO.get(sessionId); - AssertUtils.assertPojoEquals(redisLoginUser, loginUser, "username","password"); - } - - @Test - public void testCreateRefreshUserSession_success() { - // 准备参数 - String sessionId = randomString(); - String userIp = randomString(); - String userAgent = randomString(); - Long timeLong = randomLongId(); - String userName = randomString(); - Date date = randomDate(); - LoginUser loginUser = randomPojo(LoginUser.class); - // mock - when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); - loginUser.setUpdateTime(date); - sysLoginUserRedisDAO.set(sessionId, loginUser); - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) - .userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).username(userName) - .sessionTimeout(addTime(Duration.ofMillis(timeLong))) - .build(); - sysUserSessionMapper.insert(userSession); - SysUserSessionDO insertDO = sysUserSessionMapper.selectById(sessionId); - // 调用 - sysUserSessionService.refreshUserSession(sessionId, loginUser); - // 校验记录 redis - LoginUser redisLoginUser = sysLoginUserRedisDAO.get(sessionId); - assertNotEquals(redisLoginUser.getUpdateTime(), date); - // 校验记录 SysUserSessionDO - SysUserSessionDO updateDO = sysUserSessionMapper.selectById(sessionId); - assertEquals(updateDO.getUsername(), loginUser.getUsername()); - assertNotEquals(updateDO.getUpdateTime(), insertDO.getUpdateTime()); - assertNotEquals(updateDO.getSessionTimeout(), addTime(Duration.ofMillis(timeLong))); - } - - @Test - public void testDeleteUserSession_success() { - // 准备参数 - String sessionId = randomString(); - String userIp = randomString(); - String userAgent = randomString(); - Long timeLong = randomLongId(); - LoginUser loginUser = randomPojo(LoginUser.class); - // mock 存入 Redis - when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); - sysLoginUserRedisDAO.set(sessionId, loginUser); - // mock 存入 db - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) - .userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).username(loginUser.getUsername()) - .sessionTimeout(addTime(Duration.ofMillis(timeLong))) - .build(); - sysUserSessionMapper.insert(userSession); - // 校验数据存在 - assertNotNull(sysLoginUserRedisDAO.get(sessionId)); - assertNotNull(sysUserSessionMapper.selectById(sessionId)); - // 调用 - sysUserSessionService.deleteUserSession(sessionId); - // 校验数据不存在了 - assertNull(sysLoginUserRedisDAO.get(sessionId)); - assertNull(sysUserSessionMapper.selectById(sessionId)); - } - - @Test - public void testGetUserSessionPage_success() { - // mock 数据 - String userIp = randomString(); - SysUserDO dbUser1 = randomPojo(SysUserDO.class, o -> { - o.setUsername("testUsername1"); - o.setSex(randomEle(SysSexEnum.values()).getSex()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - SysUserDO dbUser2 = randomPojo(SysUserDO.class, o -> { - o.setUsername("testUsername2"); - o.setSex(randomEle(SysSexEnum.values()).getSex()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - SysUserSessionDO dbSession = randomPojo(SysUserSessionDO.class, o -> { - o.setUserId(dbUser1.getId()); - o.setUserIp(userIp); - }); - sysUserMapper.insert(dbUser1); - sysUserMapper.insert(dbUser2); - sysUserSessionMapper.insert(dbSession); - sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> { - o.setId(randomString()); - o.setUserId(dbUser2.getId()); - })); - // 测试 userId 不匹配 - sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> { - o.setId(randomString()); - o.setUserId(123456l); - })); - // 测试 userIp 不匹配 - sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> { - o.setId(randomString()); - o.setUserIp("testUserIp"); - })); - // 准备参数 - SysUserSessionPageReqVO reqVo = new SysUserSessionPageReqVO(); - reqVo.setUserIp(userIp); - // 调用 - PageResult pageResult = sysUserSessionService.getUserSessionPage(reqVo); - // 断言 - assertEquals(3, pageResult.getTotal()); - assertEquals(3, pageResult.getList().size()); - assertPojoEquals(dbSession, pageResult.getList().get(0)); - } - - @Test - public void testClearSessionTimeout_success() throws Exception { - // 准备超时数据 120 条, 在线用户 1 条 - int expectedTimeoutCount = 120, expectedTotal = 1; - - // 准备数据 - List prepareData = Stream - .iterate(0, i -> i) - .limit(expectedTimeoutCount) - .map(i -> RandomUtils.randomPojo(SysUserSessionDO.class, o -> o.setSessionTimeout(DateUtil.offsetSecond(new Date(), -1)))) - .collect(Collectors.toList()); - SysUserSessionDO sessionDO = RandomUtils.randomPojo(SysUserSessionDO.class, o -> o.setSessionTimeout(DateUtil.offsetMinute(new Date(), 30))); - prepareData.add(sessionDO); - prepareData.forEach(sysUserSessionMapper::insert); - - //清空超时数据 - long actualTimeoutCount = sysUserSessionService.clearSessionTimeout(); - //校验 - assertEquals(expectedTimeoutCount, actualTimeoutCount); - List userSessionDOS = sysUserSessionMapper.selectList(); - assertEquals(expectedTotal, userSessionDOS.size()); - AssertUtils.assertPojoEquals(sessionDO, userSessionDOS.get(0), "updateTime"); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaServiceTest.java deleted file mode 100644 index dadd68a..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/common/SysCaptchaServiceTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.common; - -import cn.iocoder.dashboard.BaseRedisUnitTest; -import cn.iocoder.dashboard.modules.system.framework.captcha.config.CaptchaProperties; -import cn.iocoder.dashboard.modules.system.controller.common.vo.SysCaptchaImageRespVO; -import cn.iocoder.dashboard.modules.system.dal.redis.common.SysCaptchaRedisDAO; -import cn.iocoder.dashboard.modules.system.service.common.impl.SysCaptchaServiceImpl; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; -import static org.junit.jupiter.api.Assertions.*; - -@Import({SysCaptchaServiceImpl.class, CaptchaProperties.class, SysCaptchaRedisDAO.class}) -public class SysCaptchaServiceTest extends BaseRedisUnitTest { - - @Resource - private SysCaptchaServiceImpl captchaService; - - @Resource - private SysCaptchaRedisDAO captchaRedisDAO; - @Resource - private CaptchaProperties captchaProperties; - - @Test - public void testGetCaptchaImage() { - // 调用 - SysCaptchaImageRespVO respVO = captchaService.getCaptchaImage(); - // 断言 - assertNotNull(respVO.getUuid()); - assertNotNull(respVO.getImg()); - String captchaCode = captchaRedisDAO.get(respVO.getUuid()); - assertNotNull(captchaCode); - } - - @Test - public void testGetCaptchaCode() { - // 准备参数 - String uuid = randomString(); - String code = randomString(); - // mock 数据 - captchaRedisDAO.set(uuid, code, captchaProperties.getTimeout()); - - // 调用 - String resultCode = captchaService.getCaptchaCode(uuid); - // 断言 - assertEquals(code, resultCode); - } - - @Test - public void testDeleteCaptchaCode() { - // 准备参数 - String uuid = randomString(); - String code = randomString(); - // mock 数据 - captchaRedisDAO.set(uuid, code, captchaProperties.getTimeout()); - - // 调用 - captchaService.deleteCaptchaCode(uuid); - // 断言 - assertNull(captchaRedisDAO.get(uuid)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java deleted file mode 100644 index 4913f6a..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java +++ /dev/null @@ -1,274 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dept; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysDeptMapper; -import cn.iocoder.dashboard.modules.system.enums.dept.DeptIdEnum; -import cn.iocoder.dashboard.modules.system.mq.producer.dept.SysDeptProducer; -import cn.iocoder.dashboard.modules.system.service.dept.impl.SysDeptServiceImpl; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import com.google.common.collect.Multimap; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -import static cn.hutool.core.bean.BeanUtil.getFieldValue; -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -/** - * {@link SysDeptServiceImpl} 的单元测试类 - * - * @author niudehua - */ -@Import(SysDeptServiceImpl.class) -class SysDeptServiceTest extends BaseDbUnitTest { - - @Resource - private SysDeptServiceImpl deptService; - @Resource - private SysDeptMapper deptMapper; - @MockBean - private SysDeptProducer deptProducer; - - @Test - @SuppressWarnings("unchecked") - void testInitLocalCache() { - // mock 数据 - SysDeptDO deptDO1 = randomDeptDO(); - deptMapper.insert(deptDO1); - SysDeptDO deptDO2 = randomDeptDO(); - deptMapper.insert(deptDO2); - - // 调用 - deptService.initLocalCache(); - // 断言 deptCache 缓存 - Map deptCache = (Map) getFieldValue(deptService, "deptCache"); - assertEquals(2, deptCache.size()); - assertPojoEquals(deptDO1, deptCache.get(deptDO1.getId())); - assertPojoEquals(deptDO2, deptCache.get(deptDO2.getId())); - // 断言 parentDeptCache 缓存 - Multimap parentDeptCache = (Multimap) getFieldValue(deptService, "parentDeptCache"); - assertEquals(2, parentDeptCache.size()); - assertPojoEquals(deptDO1, parentDeptCache.get(deptDO1.getParentId())); - assertPojoEquals(deptDO2, parentDeptCache.get(deptDO2.getParentId())); - // 断言 maxUpdateTime 缓存 - Date maxUpdateTime = (Date) getFieldValue(deptService, "maxUpdateTime"); - assertEquals(ObjectUtils.max(deptDO1.getUpdateTime(), deptDO2.getUpdateTime()), maxUpdateTime); - } - - @Test - void testListDepts() { - // mock 数据 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { // 等会查询到 - o.setName("开发部"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - deptMapper.insert(dept); - // 测试 name 不匹配 - deptMapper.insert(ObjectUtils.clone(dept, o -> o.setName("发"))); - // 测试 status 不匹配 - deptMapper.insert(ObjectUtils.clone(dept, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 准备参数 - SysDeptListReqVO reqVO = new SysDeptListReqVO(); - reqVO.setName("开"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - // 调用 - List sysDeptDOS = deptService.getSimpleDepts(reqVO); - // 断言 - assertEquals(1, sysDeptDOS.size()); - assertPojoEquals(dept, sysDeptDOS.get(0)); - } - - @Test - void testCreateDept_success() { - // 准备参数 - SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, - o -> { - o.setParentId(DeptIdEnum.ROOT.getId()); - o.setStatus(randomCommonStatus()); - }); - // 调用 - Long deptId = deptService.createDept(reqVO); - // 断言 - assertNotNull(deptId); - // 校验记录的属性是否正确 - SysDeptDO deptDO = deptMapper.selectById(deptId); - assertPojoEquals(reqVO, deptDO); - // 校验调用 - verify(deptProducer, times(1)).sendDeptRefreshMessage(); - } - - @Test - void testUpdateDept_success() { - // mock 数据 - SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); - deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, o -> { - // 设置更新的 ID - o.setParentId(DeptIdEnum.ROOT.getId()); - o.setId(dbDeptDO.getId()); - o.setStatus(randomCommonStatus()); - }); - // 调用 - deptService.updateDept(reqVO); - // 校验是否更新正确 - SysDeptDO deptDO = deptMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, deptDO); - } - - @Test - void testDeleteDept_success() { - // mock 数据 - SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); - deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbDeptDO.getId(); - // 调用 - deptService.deleteDept(id); - // 校验数据不存在了 - assertNull(deptMapper.selectById(id)); - } - - @Test - void testCheckDept_nameDuplicateForUpdate() { - // mock 数据 - SysDeptDO deptDO = randomDeptDO(); - // 设置根节点部门 - deptDO.setParentId(DeptIdEnum.ROOT.getId()); - deptMapper.insert(deptDO); - // mock 数据 稍后模拟重复它的 name - SysDeptDO nameDeptDO = randomDeptDO(); - // 设置根节点部门 - nameDeptDO.setParentId(DeptIdEnum.ROOT.getId()); - deptMapper.insert(nameDeptDO); - // 准备参数 - SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, - o -> { - // 设置根节点部门 - o.setParentId(DeptIdEnum.ROOT.getId()); - // 设置更新的 ID - o.setId(deptDO.getId()); - // 模拟 name 重复 - o.setName(nameDeptDO.getName()); - }); - // 调用, 并断言异常 - assertServiceException(() -> deptService.updateDept(reqVO), DEPT_NAME_DUPLICATE); - - } - - @Test - void testCheckDept_parentNotExitsForCreate() { - SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, - o -> o.setStatus(randomCommonStatus())); - // 调用,并断言异常 - assertServiceException(() -> deptService.createDept(reqVO), DEPT_PARENT_NOT_EXITS); - } - - @Test - void testCheckDept_notFoundForDelete() { - // 准备参数 - Long id = randomLongId(); - // 调用, 并断言异常 - assertServiceException(() -> deptService.deleteDept(id), DEPT_NOT_FOUND); - } - - @Test - void testCheckDept_exitsChildrenForDelete() { - // mock 数据 - SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); - deptMapper.insert(parentDept);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SysDeptDO childrenDeptDO = randomPojo(SysDeptDO.class, o -> { - o.setParentId(parentDept.getId()); - o.setStatus(randomCommonStatus()); - }); - // 插入子部门 - deptMapper.insert(childrenDeptDO); - // 调用, 并断言异常 - assertServiceException(() -> deptService.deleteDept(parentDept.getId()), DEPT_EXITS_CHILDREN); - } - - @Test - void testCheckDept_parentErrorForUpdate() { - // mock 数据 - SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); - deptMapper.insert(dbDeptDO); - // 准备参数 - SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, - o -> { - // 设置自己为父部门 - o.setParentId(dbDeptDO.getId()); - // 设置更新的 ID - o.setId(dbDeptDO.getId()); - }); - // 调用, 并断言异常 - assertServiceException(() -> deptService.updateDept(reqVO), DEPT_PARENT_ERROR); - } - - @Test - void testCheckDept_notEnableForCreate() { - // mock 数据 - SysDeptDO deptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); - deptMapper.insert(deptDO); - // 准备参数 - SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, - o -> { - // 设置未启用的部门为副部门 - o.setParentId(deptDO.getId()); - }); - // 调用, 并断言异常 - assertServiceException(() -> deptService.createDept(reqVO), DEPT_NOT_ENABLE); - } - - @Test - void testCheckDept_parentIsChildForUpdate() { - // mock 数据 - SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); - deptMapper.insert(parentDept); - SysDeptDO childDept = randomPojo(SysDeptDO.class, o -> { - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setParentId(parentDept.getId()); - }); - deptMapper.insert(childDept); - // 初始化本地缓存 - deptService.initLocalCache(); - // 准备参数 - SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, - o -> { - // 设置自己的子部门为父部门 - o.setParentId(childDept.getId()); - // 设置更新的 ID - o.setId(parentDept.getId()); - }); - // 调用, 并断言异常 - assertServiceException(() -> deptService.updateDept(reqVO), DEPT_PARENT_IS_CHILD); - } - - @SafeVarargs - private static SysDeptDO randomDeptDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - }; - return randomPojo(SysDeptDO.class, ArrayUtils.append(consumer, consumers)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java deleted file mode 100644 index 97fe199..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java +++ /dev/null @@ -1,200 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dept; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysPostMapper; -import cn.iocoder.dashboard.modules.system.service.dept.impl.SysPostServiceImpl; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.*; - -/** - * {@link SysPostServiceImpl} 的单元测试类 - * - * @author niudehua - */ -@Import(SysPostServiceImpl.class) -class SysPostServiceTest extends BaseDbUnitTest { - - @Resource - private SysPostServiceImpl postService; - @Resource - private SysPostMapper postMapper; - - @Test - void testPagePosts() { - // mock 数据 - SysPostDO postDO = randomPojo(SysPostDO.class, o -> { - o.setName("码仔"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - postMapper.insert(postDO); - // 测试 name 不匹配 - postMapper.insert(ObjectUtils.clone(postDO, o -> o.setName("程序员"))); - // 测试 status 不匹配 - postMapper.insert(ObjectUtils.clone(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - - // 准备参数 - SysPostPageReqVO reqVO = new SysPostPageReqVO(); - reqVO.setName("码"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - - // 调用 - PageResult pageResult = postService.getPostPage(reqVO); - - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(postDO, pageResult.getList().get(0)); - } - - @Test - void testListPosts() { - // mock 数据 - SysPostDO postDO = randomPojo(SysPostDO.class, o -> { - o.setName("码仔"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - postMapper.insert(postDO); - // 测试 name 不匹配 - postMapper.insert(ObjectUtils.clone(postDO, o -> o.setName("程序员"))); - // 测试 status 不匹配 - postMapper.insert(ObjectUtils.clone(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 准备参数 - SysPostExportReqVO reqVO = new SysPostExportReqVO(); - reqVO.setName("码"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - - // 调用 - List list = postService.getPosts(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(postDO, list.get(0)); - } - - @Test - void testGetPost() { - // mock 数据 - SysPostDO dbPostDO = randomPostDO(); - postMapper.insert(dbPostDO); - // 准备参数 - Long id = dbPostDO.getId(); - // 调用 - SysPostDO post = postService.getPost(id); - // 断言 - assertNotNull(post); - assertPojoEquals(dbPostDO, post); - } - - @Test - void testCreatePost_success() { - // 准备参数 - SysPostCreateReqVO reqVO = randomPojo(SysPostCreateReqVO.class, - o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())); - // 调用 - Long postId = postService.createPost(reqVO); - // 断言 - assertNotNull(postId); - // 校验记录的属性是否正确 - SysPostDO post = postMapper.selectById(postId); - assertPojoEquals(reqVO, post); - } - - @Test - void testUpdatePost_success() { - // mock 数据 - SysPostDO postDO = randomPostDO(); - postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SysPostUpdateReqVO reqVO = randomPojo(SysPostUpdateReqVO.class, - o -> { - // 设置更新的 ID - o.setId(postDO.getId()); - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); - }); - // 调用 - postService.updatePost(reqVO); - // 校验是否更新正确 - SysPostDO post = postMapper.selectById(reqVO.getId());// 获取最新的 - assertPojoEquals(reqVO, post); - } - - @Test - void testDeletePost_success() { - // mock 数据 - SysPostDO postDO = randomPostDO(); - postMapper.insert(postDO); - // 准备参数 - Long id = postDO.getId(); - // 调用 - postService.deletePost(id); - assertNull(postMapper.selectById(id)); - } - - @Test - void testCheckPost_notFoundForDelete() { - // 准备参数 - Long id = randomLongId(); - // 调用, 并断言异常 - assertServiceException(() -> postService.deletePost(id), POST_NOT_FOUND); - } - - @Test - void testCheckPost_nameDuplicateForCreate() { - // mock 数据 - SysPostDO postDO = randomPostDO(); - postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SysPostCreateReqVO reqVO = randomPojo(SysPostCreateReqVO.class, - // 模拟 name 重复 - o -> o.setName(postDO.getName())); - assertServiceException(() -> postService.createPost(reqVO), POST_NAME_DUPLICATE); - } - - @Test - void testCheckPost_codeDuplicateForUpdate() { - // mock 数据 - SysPostDO postDO = randomPostDO(); - postMapper.insert(postDO); - // mock 数据 稍后模拟重复它的 code - SysPostDO codePostDO = randomPostDO(); - postMapper.insert(codePostDO); - // 准备参数 - SysPostUpdateReqVO reqVO = randomPojo(SysPostUpdateReqVO.class, - o -> { - // 设置更新的 ID - o.setId(postDO.getId()); - // 模拟 code 重复 - o.setCode(codePostDO.getCode()); - }); - // 调用, 并断言异常 - assertServiceException(() -> postService.updatePost(reqVO), POST_CODE_DUPLICATE); - } - - @SafeVarargs - private static SysPostDO randomPostDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - }; - return randomPojo(SysPostDO.class, ArrayUtils.append(consumer, consumers)); - } -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataServiceTest.java deleted file mode 100644 index 1ed2bb2..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataServiceTest.java +++ /dev/null @@ -1,302 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dict; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dict.SysDictDataMapper; -import cn.iocoder.dashboard.modules.system.mq.producer.dict.SysDictDataProducer; -import cn.iocoder.dashboard.modules.system.service.dict.impl.SysDictDataServiceImpl; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import com.google.common.collect.ImmutableTable; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.List; -import java.util.function.Consumer; - -import static cn.hutool.core.bean.BeanUtil.getFieldValue; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -/** -* {@link SysDictDataServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(SysDictDataServiceImpl.class) -public class SysDictDataServiceTest extends BaseDbUnitTest { - - @Resource - private SysDictDataServiceImpl dictDataService; - - @Resource - private SysDictDataMapper dictDataMapper; - @MockBean - private SysDictTypeService dictTypeService; - @MockBean - private SysDictDataProducer dictDataProducer; - - /** - * 测试加载到新的字典数据的情况 - */ - @Test - @SuppressWarnings("unchecked") - public void testInitLocalCache() { - // mock 数据 - SysDictDataDO dictData01 = randomDictDataDO(); - dictDataMapper.insert(dictData01); - SysDictDataDO dictData02 = randomDictDataDO(); - dictDataMapper.insert(dictData02); - - // 调用 - dictDataService.initLocalCache(); - // 断言 labelDictDataCache 缓存 - ImmutableTable labelDictDataCache = - (ImmutableTable) getFieldValue(dictDataService, "labelDictDataCache"); - assertEquals(2, labelDictDataCache.size()); - assertPojoEquals(dictData01, labelDictDataCache.get(dictData01.getDictType(), dictData01.getLabel())); - assertPojoEquals(dictData02, labelDictDataCache.get(dictData02.getDictType(), dictData02.getLabel())); - // 断言 valueDictDataCache 缓存 - ImmutableTable valueDictDataCache = - (ImmutableTable) getFieldValue(dictDataService, "valueDictDataCache"); - assertEquals(2, valueDictDataCache.size()); - assertPojoEquals(dictData01, valueDictDataCache.get(dictData01.getDictType(), dictData01.getValue())); - assertPojoEquals(dictData02, valueDictDataCache.get(dictData02.getDictType(), dictData02.getValue())); - // 断言 maxUpdateTime 缓存 - Date maxUpdateTime = (Date) getFieldValue(dictDataService, "maxUpdateTime"); - assertEquals(ObjectUtils.max(dictData01.getUpdateTime(), dictData02.getUpdateTime()), maxUpdateTime); - } - - @Test - public void testGetDictDataPage() { - // mock 数据 - SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class, o -> { // 等会查询到 - o.setLabel("芋艿"); - o.setDictType("yunai"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - dictDataMapper.insert(dbDictData); - // 测试 label 不匹配 - dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setLabel("艿"))); - // 测试 dictType 不匹配 - dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setDictType("nai"))); - // 测试 status 不匹配 - dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 准备参数 - SysDictDataPageReqVO reqVO = new SysDictDataPageReqVO(); - reqVO.setLabel("芋"); - reqVO.setDictType("yu"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - - // 调用 - PageResult pageResult = dictDataService.getDictDataPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbDictData, pageResult.getList().get(0)); - } - - @Test - public void testGetDictDataList() { - // mock 数据 - SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class, o -> { // 等会查询到 - o.setLabel("芋艿"); - o.setDictType("yunai"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - dictDataMapper.insert(dbDictData); - // 测试 label 不匹配 - dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setLabel("艿"))); - // 测试 dictType 不匹配 - dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setDictType("nai"))); - // 测试 status 不匹配 - dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 准备参数 - SysDictDataExportReqVO reqVO = new SysDictDataExportReqVO(); - reqVO.setLabel("芋"); - reqVO.setDictType("yu"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - - // 调用 - List list = dictDataService.getDictDatas(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbDictData, list.get(0)); - } - - @Test - public void testCreateDictData_success() { - // 准备参数 - SysDictDataCreateReqVO reqVO = randomPojo(SysDictDataCreateReqVO.class, - o -> o.setStatus(randomCommonStatus())); - // mock 方法 - when(dictTypeService.getDictType(eq(reqVO.getDictType()))).thenReturn(randomDictTypeDO(reqVO.getDictType())); - - // 调用 - Long dictDataId = dictDataService.createDictData(reqVO); - // 断言 - assertNotNull(dictDataId); - // 校验记录的属性是否正确 - SysDictDataDO dictData = dictDataMapper.selectById(dictDataId); - assertPojoEquals(reqVO, dictData); - // 校验调用 - verify(dictDataProducer, times(1)).sendDictDataRefreshMessage(); - } - - @Test - public void testUpdateDictData_success() { - // mock 数据 - SysDictDataDO dbDictData = randomDictDataDO(); - dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SysDictDataUpdateReqVO reqVO = randomPojo(SysDictDataUpdateReqVO.class, o -> { - o.setId(dbDictData.getId()); // 设置更新的 ID - o.setStatus(randomCommonStatus()); - }); - // mock 方法,字典类型 - when(dictTypeService.getDictType(eq(reqVO.getDictType()))).thenReturn(randomDictTypeDO(reqVO.getDictType())); - - // 调用 - dictDataService.updateDictData(reqVO); - // 校验是否更新正确 - SysDictDataDO dictData = dictDataMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, dictData); - // 校验调用 - verify(dictDataProducer, times(1)).sendDictDataRefreshMessage(); - } - - @Test - public void testDeleteDictData_success() { - // mock 数据 - SysDictDataDO dbDictData = randomDictDataDO(); - dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbDictData.getId(); - - // 调用 - dictDataService.deleteDictData(id); - // 校验数据不存在了 - assertNull(dictDataMapper.selectById(id)); - // 校验调用 - verify(dictDataProducer, times(1)).sendDictDataRefreshMessage(); - } - - @Test - public void testCheckDictDataExists_success() { - // mock 数据 - SysDictDataDO dbDictData = randomDictDataDO(); - dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 - - // 调用成功 - dictDataService.checkDictDataExists(dbDictData.getId()); - } - - @Test - public void testCheckDictDataExists_notExists() { - assertServiceException(() -> dictDataService.checkDictDataExists(randomLongId()), DICT_DATA_NOT_EXISTS); - } - - @Test - public void testCheckDictTypeValid_success() { - // mock 方法,数据类型被禁用 - String type = randomString(); - when(dictTypeService.getDictType(eq(type))).thenReturn(randomDictTypeDO(type)); - - // 调用, 成功 - dictDataService.checkDictTypeValid(type); - } - - @Test - public void testCheckDictTypeValid_notExists() { - assertServiceException(() -> dictDataService.checkDictTypeValid(randomString()), DICT_TYPE_NOT_EXISTS); - } - - @Test - public void testCheckDictTypeValid_notEnable() { - // mock 方法,数据类型被禁用 - String dictType = randomString(); - when(dictTypeService.getDictType(eq(dictType))).thenReturn( - randomPojo(SysDictTypeDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - - // 调用, 并断言异常 - assertServiceException(() -> dictDataService.checkDictTypeValid(dictType), DICT_TYPE_NOT_ENABLE); - } - - @Test - public void testCheckDictDataValueUnique_success() { - // 调用,成功 - dictDataService.checkDictDataValueUnique(randomLongId(), randomString(), randomString()); - } - - @Test - public void testCheckDictDataValueUnique_valueDuplicateForCreate() { - // 准备参数 - String dictType = randomString(); - String value = randomString(); - // mock 数据 - dictDataMapper.insert(randomDictDataDO(o -> { - o.setDictType(dictType); - o.setValue(value); - })); - - // 调用,校验异常 - assertServiceException(() -> dictDataService.checkDictDataValueUnique(null, dictType, value), - DICT_DATA_VALUE_DUPLICATE); - } - - @Test - public void testCheckDictDataValueUnique_valueDuplicateForUpdate() { - // 准备参数 - Long id = randomLongId(); - String dictType = randomString(); - String value = randomString(); - // mock 数据 - dictDataMapper.insert(randomDictDataDO(o -> { - o.setDictType(dictType); - o.setValue(value); - })); - - // 调用,校验异常 - assertServiceException(() -> dictDataService.checkDictDataValueUnique(id, dictType, value), - DICT_DATA_VALUE_DUPLICATE); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static SysDictDataDO randomDictDataDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomCommonStatus()); // 保证 status 的范围 - }; - return randomPojo(SysDictDataDO.class, ArrayUtils.append(consumer, consumers)); - } - - /** - * 生成一个有效的字典类型 - * - * @param type 字典类型 - * @return SysDictTypeDO 对象 - */ - private static SysDictTypeDO randomDictTypeDO(String type) { - return randomPojo(SysDictTypeDO.class, o -> { - o.setType(type); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 是开启 - }); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java deleted file mode 100644 index 5e9de95..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java +++ /dev/null @@ -1,279 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.dict; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dict.SysDictTypeMapper; -import cn.iocoder.dashboard.modules.system.service.dict.impl.SysDictTypeServiceImpl; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -/** -* {@link SysDictTypeServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(SysDictTypeServiceImpl.class) -public class SysDictTypeServiceTest extends BaseDbUnitTest { - - @Resource - private SysDictTypeServiceImpl dictTypeService; - - @Resource - private SysDictTypeMapper dictTypeMapper; - @MockBean - private SysDictDataService dictDataService; - - @Test - public void testGetDictTypePage() { - // mock 数据 - SysDictTypeDO dbDictType = randomPojo(SysDictTypeDO.class, o -> { // 等会查询到 - o.setName("yunai"); - o.setType("芋艿"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setCreateTime(buildTime(2021, 1, 15)); - }); - dictTypeMapper.insert(dbDictType); - // 测试 name 不匹配 - dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setName("tudou"))); - // 测试 type 不匹配 - dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setType("土豆"))); - // 测试 status 不匹配 - dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 createTime 不匹配 - dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setCreateTime(buildTime(2021, 1, 1)))); - // 准备参数 - SysDictTypePageReqVO reqVO = new SysDictTypePageReqVO(); - reqVO.setName("nai"); - reqVO.setType("艿"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setBeginCreateTime(buildTime(2021, 1, 10)); - reqVO.setEndCreateTime(buildTime(2021, 1, 20)); - - // 调用 - PageResult pageResult = dictTypeService.getDictTypePage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbDictType, pageResult.getList().get(0)); - } - - @Test - public void testGetDictTypeList() { - // mock 数据 - SysDictTypeDO dbDictType = randomPojo(SysDictTypeDO.class, o -> { // 等会查询到 - o.setName("yunai"); - o.setType("芋艿"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setCreateTime(buildTime(2021, 1, 15)); - }); - dictTypeMapper.insert(dbDictType); - // 测试 name 不匹配 - dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setName("tudou"))); - // 测试 type 不匹配 - dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setType("土豆"))); - // 测试 status 不匹配 - dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 createTime 不匹配 - dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setCreateTime(buildTime(2021, 1, 1)))); - // 准备参数 - SysDictTypeExportReqVO reqVO = new SysDictTypeExportReqVO(); - reqVO.setName("nai"); - reqVO.setType("艿"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setBeginCreateTime(buildTime(2021, 1, 10)); - reqVO.setEndCreateTime(buildTime(2021, 1, 20)); - - // 调用 - List list = dictTypeService.getDictTypeList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbDictType, list.get(0)); - } - - @Test - public void testGetDictType() { - // mock 数据 - SysDictTypeDO dbDictType = randomDictTypeDO(); - dictTypeMapper.insert(dbDictType); - // 准备参数 - String type = dbDictType.getType(); - - // 调用 - SysDictTypeDO dictType = dictTypeService.getDictType(type); - // 断言 - assertNotNull(dictType); - assertPojoEquals(dbDictType, dictType); - } - - @Test - public void testCreateDictType_success() { - // 准备参数 - SysDictTypeCreateReqVO reqVO = randomPojo(SysDictTypeCreateReqVO.class, - o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())); - - // 调用 - Long dictTypeId = dictTypeService.createDictType(reqVO); - // 断言 - assertNotNull(dictTypeId); - // 校验记录的属性是否正确 - SysDictTypeDO dictType = dictTypeMapper.selectById(dictTypeId); - assertPojoEquals(reqVO, dictType); - } - - @Test - public void testUpdateDictType_success() { - // mock 数据 - SysDictTypeDO dbDictType = randomDictTypeDO(); - dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SysDictTypeUpdateReqVO reqVO = randomPojo(SysDictTypeUpdateReqVO.class, o -> { - o.setId(dbDictType.getId()); // 设置更新的 ID - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); - }); - - // 调用 - dictTypeService.updateDictType(reqVO); - // 校验是否更新正确 - SysDictTypeDO dictType = dictTypeMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, dictType); - } - - @Test - public void testDeleteDictType_success() { - // mock 数据 - SysDictTypeDO dbDictType = randomDictTypeDO(); - dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbDictType.getId(); - - // 调用 - dictTypeService.deleteDictType(id); - // 校验数据不存在了 - assertNull(dictTypeMapper.selectById(id)); - } - - @Test - public void testDeleteDictType_hasChildren() { - // mock 数据 - SysDictTypeDO dbDictType = randomDictTypeDO(); - dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbDictType.getId(); - // mock 方法 - when(dictDataService.countByDictType(eq(dbDictType.getType()))).thenReturn(1); - - // 调用, 并断言异常 - assertServiceException(() -> dictTypeService.deleteDictType(id), DICT_TYPE_HAS_CHILDREN); - } - - @Test - public void testCheckDictDataExists_success() { - // mock 数据 - SysDictTypeDO dbDictType = randomDictTypeDO(); - dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 - - // 调用成功 - dictTypeService.checkDictTypeExists(dbDictType.getId()); - } - - @Test - public void testCheckDictDataExists_notExists() { - assertServiceException(() -> dictTypeService.checkDictTypeExists(randomLongId()), DICT_TYPE_NOT_EXISTS); - } - - @Test - public void testCheckDictTypeUnique_success() { - // 调用,成功 - dictTypeService.checkDictTypeUnique(randomLongId(), randomString()); - } - - @Test - public void testCheckDictTypeUnique_valueDuplicateForCreate() { - // 准备参数 - String type = randomString(); - // mock 数据 - dictTypeMapper.insert(randomDictTypeDO(o -> o.setType(type))); - - // 调用,校验异常 - assertServiceException(() -> dictTypeService.checkDictTypeUnique(null, type), - DICT_TYPE_TYPE_DUPLICATE); - } - - @Test - public void testCheckDictTypeUnique_valueDuplicateForUpdate() { - // 准备参数 - Long id = randomLongId(); - String type = randomString(); - // mock 数据 - dictTypeMapper.insert(randomDictTypeDO(o -> o.setType(type))); - - // 调用,校验异常 - assertServiceException(() -> dictTypeService.checkDictTypeUnique(id, type), - DICT_TYPE_TYPE_DUPLICATE); - } - - @Test - public void testCheckDictTypNameUnique_success() { - // 调用,成功 - dictTypeService.checkDictTypeNameUnique(randomLongId(), randomString()); - } - - @Test - public void testCheckDictTypeNameUnique_nameDuplicateForCreate() { - // 准备参数 - String name = randomString(); - // mock 数据 - dictTypeMapper.insert(randomDictTypeDO(o -> o.setName(name))); - - // 调用,校验异常 - assertServiceException(() -> dictTypeService.checkDictTypeNameUnique(null, name), - DICT_TYPE_NAME_DUPLICATE); - } - - @Test - public void testCheckDictTypeNameUnique_nameDuplicateForUpdate() { - // 准备参数 - Long id = randomLongId(); - String name = randomString(); - // mock 数据 - dictTypeMapper.insert(randomDictTypeDO(o -> o.setName(name))); - - // 调用,校验异常 - assertServiceException(() -> dictTypeService.checkDictTypeNameUnique(id, name), - DICT_TYPE_NAME_DUPLICATE); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static SysDictTypeDO randomDictTypeDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - }; - return randomPojo(SysDictTypeDO.class, ArrayUtils.append(consumer, consumers)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeServiceTest.java deleted file mode 100644 index ee55185..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeServiceTest.java +++ /dev/null @@ -1,305 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.errorcode; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; -import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.errorcode.SysErrorCodeMapper; -import cn.iocoder.dashboard.modules.system.enums.errorcode.SysErrorCodeTypeEnum; -import cn.iocoder.dashboard.modules.system.service.errorcode.impl.SysErrorCodeServiceImpl; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.assertj.core.util.Lists; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.slf4j.Logger; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_DUPLICATE; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_NOT_EXISTS; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; - -/** -* {@link SysErrorCodeServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(SysErrorCodeServiceImpl.class) -public class SysErrorCodeServiceTest extends BaseDbUnitTest { - - @Resource - private SysErrorCodeServiceImpl errorCodeService; - - @Resource - private SysErrorCodeMapper errorCodeMapper; - - @Mock - private Logger log; - - @Test - public void testCreateErrorCode_success() { - // 准备参数 - SysErrorCodeCreateReqVO reqVO = randomPojo(SysErrorCodeCreateReqVO.class); - - // 调用 - Long errorCodeId = errorCodeService.createErrorCode(reqVO); - // 断言 - assertNotNull(errorCodeId); - // 校验记录的属性是否正确 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(errorCodeId); - assertPojoEquals(reqVO, errorCode); - assertEquals(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType()); - } - - @Test - public void testUpdateErrorCode_success() { - // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(); - errorCodeMapper.insert(dbErrorCode);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SysErrorCodeUpdateReqVO reqVO = randomPojo(SysErrorCodeUpdateReqVO.class, o -> { - o.setId(dbErrorCode.getId()); // 设置更新的 ID - }); - - // 调用 - errorCodeService.updateErrorCode(reqVO); - // 校验是否更新正确 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, errorCode); - assertEquals(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType()); - } - - @Test - public void testDeleteErrorCode_success() { - // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(); - errorCodeMapper.insert(dbErrorCode);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbErrorCode.getId(); - - // 调用 - errorCodeService.deleteErrorCode(id); - // 校验数据不存在了 - assertNull(errorCodeMapper.selectById(id)); - } - - @Test - public void testGetErrorCodePage() { - // mock 数据 - SysErrorCodeDO dbErrorCode = initGetErrorCodePage(); - // 准备参数 - SysErrorCodePageReqVO reqVO = new SysErrorCodePageReqVO(); - reqVO.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); - reqVO.setApplicationName("yudao"); - reqVO.setCode(1); - reqVO.setMessage("yu"); - reqVO.setBeginCreateTime(buildTime(2020, 11, 1)); - reqVO.setEndCreateTime(buildTime(2020, 11, 30)); - - // 调用 - PageResult pageResult = errorCodeService.getErrorCodePage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbErrorCode, pageResult.getList().get(0)); - } - - /** - * 初始化 getErrorCodePage 方法的测试数据 - */ - private SysErrorCodeDO initGetErrorCodePage() { - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> { // 等会查询到 - o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); - o.setApplicationName("yudaoyuanma"); - o.setCode(1); - o.setMessage("yudao"); - o.setCreateTime(buildTime(2020, 11, 11)); - }); - errorCodeMapper.insert(dbErrorCode); - // 测试 type 不匹配 - errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType()))); - // 测试 applicationName 不匹配 - errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setApplicationName("yunai"))); - // 测试 code 不匹配 - errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setCode(2))); - // 测试 message 不匹配 - errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setMessage("nai"))); - // 测试 createTime 不匹配 - errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setCreateTime(buildTime(2020, 12, 12)))); - return dbErrorCode; - } - - @Test - public void testGetErrorCodeList() { - // mock 数据 - SysErrorCodeDO dbErrorCode = initGetErrorCodePage(); - // 准备参数 - SysErrorCodeExportReqVO reqVO = new SysErrorCodeExportReqVO(); - reqVO.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); - reqVO.setApplicationName("yudao"); - reqVO.setCode(1); - reqVO.setMessage("yu"); - reqVO.setBeginCreateTime(buildTime(2020, 11, 1)); - reqVO.setEndCreateTime(buildTime(2020, 11, 30)); - - // 调用 - List list = errorCodeService.getErrorCodeList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbErrorCode, list.get(0)); - } - - @Test - public void testValidateCodeDuplicate_codeDuplicateForCreate() { - // 准备参数 - Integer code = randomInteger(); - // mock 数据 - errorCodeMapper.insert(randomInfErrorCodeDO(o -> o.setCode(code))); - - // 调用,校验异常 - assertServiceException(() -> errorCodeService.validateCodeDuplicate(code, null), - ERROR_CODE_DUPLICATE); - } - - @Test - public void testValidateCodeDuplicate_codeDuplicateForUpdate() { - // 准备参数 - Long id = randomLongId(); - Integer code = randomInteger(); - // mock 数据 - errorCodeMapper.insert(randomInfErrorCodeDO(o -> o.setCode(code))); - - // 调用,校验异常 - assertServiceException(() -> errorCodeService.validateCodeDuplicate(code, id), - ERROR_CODE_DUPLICATE); - } - - @Test - public void testValidateErrorCodeExists_notExists() { - assertServiceException(() -> errorCodeService.validateErrorCodeExists(null), - ERROR_CODE_NOT_EXISTS); - } - - /** - * 情况 1,错误码不存在的情况 - */ - @Test - public void testAutoGenerateErrorCodes_01() { - // 准备参数 - ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class); - // mock 方法 - - // 调用 - errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); - // 断言 - SysErrorCodeDO errorCode = errorCodeMapper.selectOne(null); - assertPojoEquals(generateReqDTO, errorCode); - assertEquals(SysErrorCodeTypeEnum.AUTO_GENERATION.getType(), errorCode.getType()); - } - - /** - * 情况 2.1,错误码存在,但是是 SysErrorCodeTypeEnum.MANUAL_OPERATION 类型 - */ - @Test - public void testAutoGenerateErrorCodes_021() { - // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType())); - errorCodeMapper.insert(dbErrorCode); - // 准备参数 - ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, - o -> o.setCode(dbErrorCode.getCode())); - // mock 方法 - - // 调用 - errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); - // 断言,相等,说明不会更新 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); - assertPojoEquals(dbErrorCode, errorCode); - } - - /** - * 情况 2.2,错误码存在,但是是 applicationName 不匹配 - */ - @Test - public void testAutoGenerateErrorCodes_022() { - // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType())); - errorCodeMapper.insert(dbErrorCode); - // 准备参数 - ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, - o -> o.setCode(dbErrorCode.getCode()).setApplicationName(randomString())); - // mock 方法 - - // 调用 - errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); - // 断言,相等,说明不会更新 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); - assertPojoEquals(dbErrorCode, errorCode); - } - - /** - * 情况 2.3,错误码存在,但是是 message 相同 - */ - @Test - public void testAutoGenerateErrorCodes_023() { - // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType())); - errorCodeMapper.insert(dbErrorCode); - // 准备参数 - ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, - o -> o.setCode(dbErrorCode.getCode()).setApplicationName(dbErrorCode.getApplicationName()) - .setMessage(dbErrorCode.getMessage())); - // mock 方法 - - // 调用 - errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); - // 断言,相等,说明不会更新 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); - assertPojoEquals(dbErrorCode, errorCode); - } - - /** - * 情况 2.3,错误码存在,但是是 message 不同,则进行更新 - */ - @Test - public void testAutoGenerateErrorCodes_024() { - // mock 数据 - SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType())); - errorCodeMapper.insert(dbErrorCode); - // 准备参数 - ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, - o -> o.setCode(dbErrorCode.getCode()).setApplicationName(dbErrorCode.getApplicationName())); - // mock 方法 - - // 调用 - errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); - // 断言,匹配 - SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); - assertPojoEquals(generateReqDTO, errorCode); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static SysErrorCodeDO randomInfErrorCodeDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setType(randomEle(InfConfigTypeEnum.values()).getType()); // 保证 key 的范围 - }; - return randomPojo(SysErrorCodeDO.class, ArrayUtils.append(consumer, consumers)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java deleted file mode 100644 index 715e99e..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java +++ /dev/null @@ -1,145 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.logger; - -import cn.hutool.core.util.RandomUtil; -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysLoginLogMapper; -import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginLogTypeEnum; -import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginResultEnum; -import cn.iocoder.dashboard.modules.system.service.logger.impl.SysLoginLogServiceImpl; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; - -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static org.junit.jupiter.api.Assertions.assertEquals; - -@Import(SysLoginLogServiceImpl.class) -public class SysLoginLogServiceImplTest extends BaseDbUnitTest { - - @Resource - private SysLoginLogServiceImpl sysLoginLogService; - - @Resource - private SysLoginLogMapper loginLogMapper; - - @Test - public void testCreateLoginLog() { - String traceId = TracerUtils.getTraceId(); - SysLoginLogCreateReqVO reqVO = RandomUtils.randomPojo(SysLoginLogCreateReqVO.class, vo -> { - // 指定随机的范围,避免超出范围入库失败 - vo.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); - vo.setResult(RandomUtil.randomEle(SysLoginResultEnum.values()).getResult()); - // 使用TracerUtils生成的TraceId - vo.setTraceId(traceId); - }); - - // 执行service方法 - sysLoginLogService.createLoginLog(reqVO); - - // 断言,忽略基本字段 - SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne(null); - assertPojoEquals(reqVO, sysLoginLogDO); - } - - - @Test - public void testGetLoginLogPage() { - - // 构造测试数据 - - // 登录成功的 - SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { - logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); - logDO.setTraceId(TracerUtils.getTraceId()); - - logDO.setUserIp("192.168.199.16"); - logDO.setUsername("wangkai"); - logDO.setCreateTime(buildTime(2021, 3, 6)); - logDO.setResult(SysLoginResultEnum.SUCCESS.getResult()); - }); - loginLogMapper.insert(loginLogDO); - - // 下面几个都是不匹配的数据 - // 登录失败的 - loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setResult(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); - // 不同ip段的 - loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); - // 不同username - loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUsername("yunai"))); - // 构造一个早期时间 2021-02-06 00:00:00 - loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setCreateTime(buildTime(2021, 2, 6)))); - - - // 构造调用参数 - SysLoginLogPageReqVO reqVO = new SysLoginLogPageReqVO(); - reqVO.setUsername("wangkai"); - reqVO.setUserIp("192.168.199"); - reqVO.setStatus(true); - reqVO.setBeginTime(buildTime(2021, 3, 5)); - reqVO.setEndTime(buildTime(2021, 3, 7)); - - // 调用service方法 - PageResult pageResult = sysLoginLogService.getLoginLogPage(reqVO); - - // 断言,只查到了一条符合条件的 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(loginLogDO, pageResult.getList().get(0)); - } - - @Test - public void testGetLoginLogList() { - - // 构造测试数据 - - // 登录成功的 - SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { - logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); - logDO.setTraceId(TracerUtils.getTraceId()); - - logDO.setUserIp("192.168.111.16"); - logDO.setUsername("wangxiaokai"); - logDO.setCreateTime(buildTime(2021, 3, 6)); - logDO.setResult(SysLoginResultEnum.SUCCESS.getResult()); - }); - loginLogMapper.insert(loginLogDO); - - // 下面几个都是不匹配的数据 - // 登录失败的 - loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setResult(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); - // 不同ip段的 - loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); - // 不同username - loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUsername("yunai"))); - // 构造一个早期时间 2021-02-06 00:00:00 - loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setCreateTime(buildTime(2021, 2, 6)))); - - - // 构造调用参数 - SysLoginLogExportReqVO reqVO = new SysLoginLogExportReqVO(); - reqVO.setUsername("wangxiaokai"); - reqVO.setUserIp("192.168.111"); - reqVO.setStatus(true); - reqVO.setBeginTime(buildTime(2021, 3, 5)); - reqVO.setEndTime(buildTime(2021, 3, 7)); - - - // 调用service方法 - List loginLogList = sysLoginLogService.getLoginLogList(reqVO); - - // 断言 - assertEquals(1, loginLogList.size()); - assertPojoEquals(loginLogDO, loginLogList.get(0)); - } -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java deleted file mode 100644 index 3407caf..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java +++ /dev/null @@ -1,166 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.logger; - -import cn.hutool.core.map.MapUtil; -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; -import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; -import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysOperateLogMapper; -import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum; -import cn.iocoder.dashboard.modules.system.service.logger.impl.SysOperateLogServiceImpl; -import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.*; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - -@Import({SysOperateLogServiceImpl.class}) -public class SysOperateLogServiceImplTest extends BaseDbUnitTest { - - @Resource - private SysOperateLogService operateLogServiceImpl; - - @Resource - private SysOperateLogMapper operateLogMapper; - - @MockBean - private SysUserService userService; - - @Test - public void testCreateOperateLogAsync() throws InterruptedException, ExecutionException { - String traceId = TracerUtils.getTraceId(); - OperateLogCreateReqDTO reqVO = RandomUtils.randomPojo(OperateLogCreateReqDTO.class, o -> { - o.setTraceId(traceId); - o.setUserId(randomLongId()); - o.setExts(MapUtil.builder("orderId", randomLongId()).build()); - }); - - // 执行service方法 - Future future = operateLogServiceImpl.createOperateLogAsync(reqVO); - future.get(); - // 断言插入是否正确 - SysOperateLogDO sysOperateLogDO = operateLogMapper.selectOne("trace_id", traceId); - assertPojoEquals(reqVO, sysOperateLogDO); - } - - @Test - public void testGetOperateLogPage() { - // 构造测试数据 - // 先构造用户 - SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, o -> { - o.setNickname("wangkai"); - o.setSex(SysSexEnum.MALE.getSex()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user)); - Long userId = user.getId(); - // 构造操作日志 - SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, o -> { - o.setUserId(userId); - o.setModule("order"); - o.setType(OperateTypeEnum.CREATE.getType()); - o.setStartTime(buildTime(2021, 3, 6)); - o.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()); - o.setExts(MapUtil.builder("orderId", randomLongId()).build()); - }); - operateLogMapper.insert(sysOperateLogDO); - - // 下面几个是不匹配的数据 - // 随机 userId - operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1))); - // module 不同 - operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user"))); - // type 不同 - operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType()))); - // createTime 不同 - operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6)))); - // resultCode 不同 - operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode()))); - - // 构造调用参数 - SysOperateLogPageReqVO reqVO = new SysOperateLogPageReqVO(); - reqVO.setUserNickname("wangkai"); - reqVO.setModule("order"); - reqVO.setType(OperateTypeEnum.CREATE.getType()); - reqVO.setBeginTime(buildTime(2021, 3, 5)); - reqVO.setEndTime(buildTime(2021, 3, 7)); - reqVO.setSuccess(true); - - // 调用service方法 - PageResult pageResult = operateLogServiceImpl.getOperateLogPage(reqVO); - // 断言,只查到了一条符合条件的 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(sysOperateLogDO, pageResult.getList().get(0)); - } - - @Test - public void testGetOperateLogs() { - // 构造测试数据 - // 先构造用户 - SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, o -> { - o.setNickname("wangkai"); - o.setSex(SysSexEnum.MALE.getSex()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user)); - Long userId = user.getId(); - // 构造操作日志 - SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, o -> { - o.setUserId(userId); - o.setModule("order"); - o.setType(OperateTypeEnum.CREATE.getType()); - o.setStartTime(buildTime(2021, 3, 6)); - o.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()); - o.setExts(MapUtil.builder("orderId", randomLongId()).build()); - }); - operateLogMapper.insert(sysOperateLogDO); - - // 下面几个是不匹配的数据 - // 随机 userId - operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1))); - // module 不同 - operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user"))); - // type 不同 - operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType()))); - // createTime 不同 - operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6)))); - // resultCode 不同 - operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode()))); - - // 构造调用参数 - SysOperateLogExportReqVO reqVO = new SysOperateLogExportReqVO(); - reqVO.setUserNickname("wangkai"); - reqVO.setModule("order"); - reqVO.setType(OperateTypeEnum.CREATE.getType()); - reqVO.setBeginTime(buildTime(2021, 3, 5)); - reqVO.setEndTime(buildTime(2021, 3, 7)); - reqVO.setSuccess(true); - - // 调用 service 方法 - List list = operateLogServiceImpl.getOperateLogs(reqVO); - // 断言,只查到了一条符合条件的 - assertEquals(1, list.size()); - assertPojoEquals(sysOperateLogDO, list.get(0)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java deleted file mode 100644 index b680eca..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeServiceImplTest.java +++ /dev/null @@ -1,164 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.notice; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.notice.SysNoticeDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.notice.SysNoticeMapper; -import cn.iocoder.dashboard.modules.system.enums.notice.SysNoticeTypeEnum; -import cn.iocoder.dashboard.modules.system.service.notice.impl.SysNoticeServiceImpl; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.NOTICE_NOT_FOUND; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.*; - -@Import(SysNoticeServiceImpl.class) -class SysNoticeServiceImplTest extends BaseDbUnitTest { - - @Resource - private SysNoticeServiceImpl sysNoticeService; - - @Resource - private SysNoticeMapper sysNoticeMapper; - - @Test - public void testPageNotices_success() { - // 插入前置数据 - SysNoticeDO dbNotice = randomPojo(SysNoticeDO.class, o -> { - o.setTitle("尼古拉斯赵四来啦!"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setType(randomEle(SysNoticeTypeEnum.values()).getType()); - }); - sysNoticeMapper.insert(dbNotice); - - // 测试 title 不匹配 - sysNoticeMapper.insert(ObjectUtils.clone(dbNotice, o -> o.setTitle("尼古拉斯凯奇也来啦!"))); - // 测试 status 不匹配 - sysNoticeMapper.insert(ObjectUtils.clone(dbNotice, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - - - // 查询 - SysNoticePageReqVO reqVO = new SysNoticePageReqVO(); - reqVO.setTitle("尼古拉斯赵四来啦!"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - PageResult pageResult = sysNoticeService.pageNotices(reqVO); - - // 验证查询结果经过筛选 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbNotice, pageResult.getList().get(0)); - - } - - @Test - public void testGetNotice_success() { - // 插入前置数据 - SysNoticeDO dbNotice = randomSysNoticeDO(); - sysNoticeMapper.insert(dbNotice); - - // 查询 - SysNoticeDO notice = sysNoticeService.getNotice(dbNotice.getId()); - - // 验证插入与读取对象是否一致 - assertNotNull(notice); - assertPojoEquals(dbNotice, notice); - } - - @Test - public void testCreateNotice_success() { - // 准备参数 - SysNoticeCreateReqVO reqVO = randomSysNoticeCreateReqVO(); - - // 校验插入是否成功 - Long noticeId = sysNoticeService.createNotice(reqVO); - assertNotNull(noticeId); - - // 校验插入属性是否正确 - SysNoticeDO notice = sysNoticeMapper.selectById(noticeId); - assertPojoEquals(reqVO, notice); - } - - @Test - public void testUpdateNotice_success() { - // 插入前置数据 - SysNoticeDO dbNoticeDO = randomSysNoticeDO(); - sysNoticeMapper.insert(dbNoticeDO); - - // 准备更新参数 - SysNoticeUpdateReqVO reqVO = randomSysNoticeUpdateReqVO(o -> o.setId(dbNoticeDO.getId())); - - // 更新 - sysNoticeService.updateNotice(reqVO); - - // 检验是否更新成功 - SysNoticeDO notice = sysNoticeMapper.selectById(reqVO.getId()); - assertPojoEquals(reqVO, notice); - } - - @Test - public void testDeleteNotice_success() { - // 插入前置数据 - SysNoticeDO dbNotice = randomSysNoticeDO(); - sysNoticeMapper.insert(dbNotice); - - // 删除 - sysNoticeService.deleteNotice(dbNotice.getId()); - - // 检查是否删除成功 - assertNull(sysNoticeMapper.selectById(dbNotice.getId())); - } - - @Test - public void checkNoticeExists_success() { - // 插入前置数据 - SysNoticeDO dbNotice = randomSysNoticeDO(); - sysNoticeMapper.insert(dbNotice); - - // 成功调用 - sysNoticeService.checkNoticeExists(dbNotice.getId()); - } - - @Test - public void checkNoticeExists_noExists() { - assertServiceException(() -> sysNoticeService.checkNoticeExists(randomLongId()), NOTICE_NOT_FOUND); - } - - @SafeVarargs - private static SysNoticeDO randomSysNoticeDO(Consumer... consumers) { - SysNoticeDO notice = randomPojo(SysNoticeDO.class, consumers); - notice.setType(randomEle(SysNoticeTypeEnum.values()).getType()); - notice.setStatus(CommonStatusEnum.ENABLE.getStatus()); - return notice; - } - - @SafeVarargs - private static SysNoticeUpdateReqVO randomSysNoticeUpdateReqVO(Consumer... consumers) { - SysNoticeUpdateReqVO reqVO = randomPojo(SysNoticeUpdateReqVO.class, consumers); - reqVO.setType(randomEle(SysNoticeTypeEnum.values()).getType()); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - return reqVO; - } - - private static SysNoticeCreateReqVO randomSysNoticeCreateReqVO() { - SysNoticeCreateReqVO reqVO = randomPojo(SysNoticeCreateReqVO.class); - reqVO.setType(randomEle(SysNoticeTypeEnum.values()).getType()); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - return reqVO; - } - - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuServiceTest.java deleted file mode 100644 index deda173..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuServiceTest.java +++ /dev/null @@ -1,366 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.permission; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.lang.Assert; -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuListReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysMenuMapper; -import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; -import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysMenuProducer; -import cn.iocoder.dashboard.modules.system.service.permission.impl.SysMenuServiceImpl; -import cn.iocoder.yudao.framework.common.util.sping.SpringAopUtils; -import cn.iocoder.yudao.framework.test.core.util.RandomUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import com.google.common.collect.Multimap; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.*; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.verify; - -@Import(SysMenuServiceImpl.class) -public class SysMenuServiceTest extends BaseDbUnitTest { - - @Resource - private SysMenuServiceImpl sysMenuService; - - @MockBean - private SysPermissionService sysPermissionService; - - @MockBean - private SysMenuProducer sysMenuProducer; - - @Resource - private SysMenuMapper menuMapper; - - @Test - public void testInitLocalCache_success() throws Exception { - SysMenuDO menuDO1 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); - menuMapper.insert(menuDO1); - SysMenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); - menuMapper.insert(menuDO2); - - // 调用 - sysMenuService.initLocalCache(); - - // 获取代理对象 - SysMenuServiceImpl target = (SysMenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); - - Map menuCache = - (Map) BeanUtil.getFieldValue(target, "menuCache"); - Assert.isTrue(menuCache.size() == 2); - assertPojoEquals(menuDO1, menuCache.get(menuDO1.getId())); - assertPojoEquals(menuDO2, menuCache.get(menuDO2.getId())); - - Multimap permissionMenuCache = - (Multimap) BeanUtil.getFieldValue(target, "permissionMenuCache"); - Assert.isTrue(permissionMenuCache.size() == 2); - assertPojoEquals(menuDO1, permissionMenuCache.get(menuDO1.getPermission())); - assertPojoEquals(menuDO2, permissionMenuCache.get(menuDO2.getPermission())); - - Date maxUpdateTime = (Date) BeanUtil.getFieldValue(target, "maxUpdateTime"); - assertEquals(ObjectUtils.max(menuDO1.getUpdateTime(), menuDO2.getUpdateTime()), maxUpdateTime); - } - - @Test - public void testCreateMenu_success() { - //构造父目录 - SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); - menuMapper.insert(menuDO); - Long parentId = menuDO.getId(); - - //调用 - SysMenuCreateReqVO vo = randomPojo(SysMenuCreateReqVO.class, o -> { - o.setParentId(parentId); - o.setName("testSonName"); - o.setType(MenuTypeEnum.MENU.getType()); - o.setStatus(RandomUtils.randomCommonStatus()); - }); - Long menuId = sysMenuService.createMenu(vo); - - //断言 - Assertions.assertNotNull(menuId); - // 校验记录的属性是否正确 - SysMenuDO ret = menuMapper.selectById(menuId); - assertPojoEquals(vo, ret); - // 校验调用 - verify(sysMenuProducer).sendMenuRefreshMessage(); - } - - @Test - public void testUpdateMenu_success() { - //构造父子目录 - SysMenuDO sonMenuDO = initParentAndSonMenuDO(); - Long sonId = sonMenuDO.getId(); - Long parentId = sonMenuDO.getParentId(); - - //调用 - SysMenuUpdateReqVO vo = randomPojo(SysMenuUpdateReqVO.class, o -> { - o.setId(sonId); - o.setParentId(parentId); - o.setType(MenuTypeEnum.MENU.getType()); - o.setStatus(RandomUtils.randomCommonStatus()); - o.setName("pppppp"); //修改名字 - }); - sysMenuService.updateMenu(vo); - - //断言 - // 校验记录的属性是否正确 - SysMenuDO ret = menuMapper.selectById(sonId); - assertPojoEquals(vo, ret); - // 校验调用 - verify(sysMenuProducer).sendMenuRefreshMessage(); - } - - @Test - public void testUpdateMenu_sonIdNotExist() { - Long sonId = 99999L; - Long parentId = 10000L; - - //调用 - SysMenuUpdateReqVO vo = randomPojo(SysMenuUpdateReqVO.class, o -> { - o.setId(sonId); - o.setParentId(parentId); - o.setType(MenuTypeEnum.MENU.getType()); - o.setStatus(RandomUtils.randomCommonStatus()); - }); - //断言 - assertServiceException(() -> sysMenuService.updateMenu(vo), MENU_NOT_EXISTS); - } - - @Test - public void testDeleteMenu_success() { - SysMenuDO sonMenuDO = initParentAndSonMenuDO(); - Long sonId = sonMenuDO.getId(); - - //调用 - sysMenuService.deleteMenu(sonId); - - //断言 - SysMenuDO menuDO = menuMapper.selectById(sonId); - Assert.isNull(menuDO); - verify(sysPermissionService).processMenuDeleted(sonId); - verify(sysMenuProducer).sendMenuRefreshMessage(); - } - - @Test - public void testDeleteMenu_menuNotExist() { - Long sonId = 99999L; - - assertServiceException(() -> sysMenuService.deleteMenu(sonId), MENU_NOT_EXISTS); - } - - @Test - public void testDeleteMenu_existChildren() { - SysMenuDO sonMenu = initParentAndSonMenuDO(); - Long parentId = sonMenu.getParentId(); - - assertServiceException(() -> sysMenuService.deleteMenu(parentId), MENU_EXISTS_CHILDREN); - } - - @Test - public void testGetMenus_success() { - Map idMenuMap = new HashMap<>(); - SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); - menuMapper.insert(menuDO); - idMenuMap.put(menuDO.getId(), menuDO); - - SysMenuDO sonMenu = createMenuDO(MenuTypeEnum.MENU, "son", menuDO.getId()); - menuMapper.insert(sonMenu); - idMenuMap.put(sonMenu.getId(), sonMenu); - - //调用 - List menuDOS = sysMenuService.getMenus(); - - //断言 - Assert.isTrue(menuDOS.size() == idMenuMap.size()); - menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m)); - } - - @Test - public void testGetMenusReqVo_success() { - Map idMenuMap = new HashMap<>(); - //用于验证可以模糊搜索名称包含"name",状态为1的menu - SysMenuDO menu = createMenuDO(MenuTypeEnum.MENU, "name2", 0L, 1); - menuMapper.insert(menu); - idMenuMap.put(menu.getId(), menu); - - menu = createMenuDO(MenuTypeEnum.MENU, "11name111", 0L, 1); - menuMapper.insert(menu); - idMenuMap.put(menu.getId(), menu); - - menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 1); - menuMapper.insert(menu); - idMenuMap.put(menu.getId(), menu); - - //以下是不符合搜索条件的的menu - menu = createMenuDO(MenuTypeEnum.MENU, "xxxxxx", 0L, 1); - menuMapper.insert(menu); - menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 2); - menuMapper.insert(menu); - - //调用 - SysMenuListReqVO reqVO = new SysMenuListReqVO(); - reqVO.setStatus(1); - reqVO.setName("name"); - List menuDOS = sysMenuService.getMenus(reqVO); - - //断言 - Assert.isTrue(menuDOS.size() == idMenuMap.size()); - menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m)); - } - - @Test - public void testListMenusFromCache_success() throws Exception { - Map mockCacheMap = new HashMap<>(); - //获取代理对象 - SysMenuServiceImpl target = (SysMenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); - BeanUtil.setFieldValue(target, "menuCache", mockCacheMap); - - Map idMenuMap = new HashMap<>(); - //用于验证搜索类型为MENU,状态为1的menu - SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1); - mockCacheMap.put(menuDO.getId(), menuDO); - idMenuMap.put(menuDO.getId(), menuDO); - - menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1); - mockCacheMap.put(menuDO.getId(), menuDO); - idMenuMap.put(menuDO.getId(), menuDO); - - //以下是不符合搜索条件的menu - menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1); - mockCacheMap.put(menuDO.getId(), menuDO); - menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2); - mockCacheMap.put(menuDO.getId(), menuDO); - - List menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(MenuTypeEnum.MENU.getType()), - Collections.singletonList(CommonStatusEnum.DISABLE.getStatus())); - Assert.isTrue(menuDOS.size() == idMenuMap.size()); - menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m)); - } - - @Test - public void testListMenusFromCache2_success() throws Exception { - Map mockCacheMap = new HashMap<>(); - //获取代理对象 - SysMenuServiceImpl target = (SysMenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); - BeanUtil.setFieldValue(target, "menuCache", mockCacheMap); - - Map idMenuMap = new HashMap<>(); - //验证搜索id为1, 类型为MENU, 状态为1 的menu - SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1); - mockCacheMap.put(menuDO.getId(), menuDO); - idMenuMap.put(menuDO.getId(), menuDO); - - //以下是不符合搜索条件的menu - menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1); - mockCacheMap.put(menuDO.getId(), menuDO); - menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1); - mockCacheMap.put(menuDO.getId(), menuDO); - menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2); - mockCacheMap.put(menuDO.getId(), menuDO); - - List menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(1L), - Collections.singletonList(MenuTypeEnum.MENU.getType()), Collections.singletonList(1)); - Assert.isTrue(menuDOS.size() == idMenuMap.size()); - menuDOS.forEach(menu -> assertPojoEquals(idMenuMap.get(menu.getId()), menu)); - } - - @Test - public void testCheckParentResource_success() { - SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); - menuMapper.insert(menuDO); - Long parentId = menuDO.getId(); - - sysMenuService.checkParentResource(parentId, null); - } - - @Test - public void testCheckParentResource_canNotSetSelfToBeParent() { - assertServiceException(() -> sysMenuService.checkParentResource(1L, 1L), MENU_PARENT_ERROR); - } - - @Test - public void testCheckParentResource_parentNotExist() { - assertServiceException(() -> sysMenuService.checkParentResource(randomLongId(), null), MENU_PARENT_NOT_EXISTS); - } - - @Test - public void testCheckParentResource_parentTypeError() { - SysMenuDO menuDO = createMenuDO(MenuTypeEnum.BUTTON, "parent", 0L); - menuMapper.insert(menuDO); - Long parentId = menuDO.getId(); - - assertServiceException(() -> sysMenuService.checkParentResource(parentId, null), MENU_PARENT_NOT_DIR_OR_MENU); - } - - @Test - public void testCheckResource_success() { - SysMenuDO sonMenu = initParentAndSonMenuDO(); - Long parentId = sonMenu.getParentId(); - - Long otherSonMenuId = randomLongId(); - String otherSonMenuName = randomString(); - - sysMenuService.checkResource(parentId, otherSonMenuName, otherSonMenuId); - } - - @Test - public void testCheckResource_sonMenuNameDuplicate(){ - SysMenuDO sonMenu=initParentAndSonMenuDO(); - Long parentId=sonMenu.getParentId(); - - Long otherSonMenuId=randomLongId(); - String otherSonMenuName=sonMenu.getName(); //相同名称 - - assertServiceException(() -> sysMenuService.checkResource(parentId, otherSonMenuName, otherSonMenuId), MENU_NAME_DUPLICATE); - } - - /** - * 构造父子目录,返回子目录 - * - * @return - */ - private SysMenuDO initParentAndSonMenuDO() { - //构造父子目录 - SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); - menuMapper.insert(menuDO); - Long parentId = menuDO.getId(); - - SysMenuDO sonMenuDO = createMenuDO(MenuTypeEnum.MENU, "testSonName", parentId); - menuMapper.insert(sonMenuDO); - return sonMenuDO; - } - - private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId) { - return createMenuDO(typeEnum, menuName, parentId, RandomUtils.randomCommonStatus()); - } - - private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) { - return createMenuDO(null, typeEnum, menuName, parentId, status); - } - - private SysMenuDO createMenuDO(Long id, MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) { - return randomPojo(SysMenuDO.class, o -> { - o.setId(id); - o.setParentId(parentId); - o.setType(typeEnum.getType()); - o.setStatus(status); - o.setName(menuName); - }); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionServiceTest.java deleted file mode 100644 index 1091d58..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionServiceTest.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.permission; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleMenuDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysUserRoleDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysRoleMenuMapper; -import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysUserRoleMapper; -import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysPermissionProducer; -import cn.iocoder.dashboard.modules.system.service.permission.impl.SysPermissionServiceImpl; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; - -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.verify; - -@Import(SysPermissionServiceImpl.class) -public class SysPermissionServiceTest extends BaseDbUnitTest { - - @Resource - private SysPermissionServiceImpl permissionService; - - @Resource - private SysRoleMenuMapper roleMenuMapper; - @Resource - private SysUserRoleMapper userRoleMapper; - - @MockBean - private SysRoleService roleService; - @MockBean - private SysMenuService menuService; - - @MockBean - private SysPermissionProducer permissionProducer; - - @Test - public void testProcessRoleDeleted() { - // 准备参数 - Long roleId = randomLongId(); - // mock 数据 UserRole - SysUserRoleDO userRoleDO01 = randomPojo(SysUserRoleDO.class, o -> o.setRoleId(roleId)); // 被删除 - userRoleMapper.insert(userRoleDO01); - SysUserRoleDO userRoleDO02 = randomPojo(SysUserRoleDO.class); // 不被删除 - userRoleMapper.insert(userRoleDO02); - // mock 数据 RoleMenu - SysRoleMenuDO roleMenuDO01 = randomPojo(SysRoleMenuDO.class, o -> o.setRoleId(roleId)); // 被删除 - roleMenuMapper.insert(roleMenuDO01); - SysRoleMenuDO roleMenuDO02 = randomPojo(SysRoleMenuDO.class); // 不被删除 - roleMenuMapper.insert(roleMenuDO02); - - // 调用 - permissionService.processRoleDeleted(roleId); - // 断言数据 RoleMenuDO - List dbRoleMenus = roleMenuMapper.selectList(); - assertEquals(1, dbRoleMenus.size()); - assertPojoEquals(dbRoleMenus.get(0), roleMenuDO02); - // 断言数据 UserRoleDO - List dbUserRoles = userRoleMapper.selectList(); - assertEquals(1, dbUserRoles.size()); - assertPojoEquals(dbUserRoles.get(0), userRoleDO02); - // 断言调用 - verify(permissionProducer).sendRoleMenuRefreshMessage(); - } - - @Test - public void testProcessMenuDeleted() { - // 准备参数 - Long menuId = randomLongId(); - // mock 数据 - SysRoleMenuDO roleMenuDO01 = randomPojo(SysRoleMenuDO.class, o -> o.setMenuId(menuId)); // 被删除 - roleMenuMapper.insert(roleMenuDO01); - SysRoleMenuDO roleMenuDO02 = randomPojo(SysRoleMenuDO.class); // 不被删除 - roleMenuMapper.insert(roleMenuDO02); - - // 调用 - permissionService.processMenuDeleted(menuId); - // 断言数据 - List dbRoleMenus = roleMenuMapper.selectList(); - assertEquals(1, dbRoleMenus.size()); - assertPojoEquals(dbRoleMenus.get(0), roleMenuDO02); - // 断言调用 - verify(permissionProducer).sendRoleMenuRefreshMessage(); - } - - @Test - public void testProcessUserDeleted() { - // 准备参数 - Long userId = randomLongId(); - // mock 数据 - SysUserRoleDO userRoleDO01 = randomPojo(SysUserRoleDO.class, o -> o.setUserId(userId)); // 被删除 - userRoleMapper.insert(userRoleDO01); - SysUserRoleDO userRoleDO02 = randomPojo(SysUserRoleDO.class); // 不被删除 - userRoleMapper.insert(userRoleDO02); - - // 调用 - permissionService.processUserDeleted(userId); - // 断言数据 - List dbUserRoles = userRoleMapper.selectList(); - assertEquals(1, dbUserRoles.size()); - assertPojoEquals(dbUserRoles.get(0), userRoleDO02); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleServiceTest.java deleted file mode 100644 index 41696df..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleServiceTest.java +++ /dev/null @@ -1,302 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.permission; - -import cn.hutool.core.bean.BeanUtil; -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysRoleMapper; -import cn.iocoder.dashboard.modules.system.enums.permission.SysRoleTypeEnum; -import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysRoleProducer; -import cn.iocoder.dashboard.modules.system.service.permission.impl.SysRoleServiceImpl; -import cn.iocoder.yudao.framework.common.util.sping.SpringAopUtils; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.*; -import java.util.stream.Collectors; - -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.verify; - -@Import(SysRoleServiceImpl.class) -public class SysRoleServiceTest extends BaseDbUnitTest { - - @Resource - private SysRoleServiceImpl sysRoleService; - - @Resource - private SysRoleMapper roleMapper; - - @MockBean - private SysPermissionService sysPermissionService; - - @MockBean - private SysRoleProducer sysRoleProducer; - - @Test - public void testInitLocalCache_success() throws Exception { - SysRoleDO roleDO1 = createRoleDO("role1", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); - roleMapper.insert(roleDO1); - SysRoleDO roleDO2 = createRoleDO("role2", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); - roleMapper.insert(roleDO2); - - //调用 - sysRoleService.initLocalCache(); - - //断言 - //获取代理对象 - SysRoleServiceImpl target = (SysRoleServiceImpl) SpringAopUtils.getTarget(sysRoleService); - - Map roleCache = (Map) BeanUtil.getFieldValue(target, "roleCache"); - assertPojoEquals(roleDO1, roleCache.get(roleDO1.getId())); - assertPojoEquals(roleDO2, roleCache.get(roleDO2.getId())); - - Date maxUpdateTime = (Date) BeanUtil.getFieldValue(target, "maxUpdateTime"); - assertEquals(max(roleDO1.getUpdateTime(), roleDO2.getUpdateTime()), maxUpdateTime); - } - - @Test - public void testCreateRole_success() { - SysRoleCreateReqVO reqVO = randomPojo(SysRoleCreateReqVO.class, o -> { - o.setCode("role_code"); - o.setName("role_name"); - o.setRemark("remark"); - o.setType(SysRoleTypeEnum.CUSTOM.getType()); - o.setSort(1); - }); - Long roleId = sysRoleService.createRole(reqVO); - - //断言 - assertNotNull(roleId); - SysRoleDO roleDO = roleMapper.selectById(roleId); - assertPojoEquals(reqVO, roleDO); - - verify(sysRoleProducer).sendRoleRefreshMessage(); - } - - @Test - public void testUpdateRole_success() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); - roleMapper.insert(roleDO); - Long roleId = roleDO.getId(); - - //调用 - SysRoleUpdateReqVO reqVO = randomPojo(SysRoleUpdateReqVO.class, o -> { - o.setId(roleId); - o.setCode("role_code"); - o.setName("update_name"); - o.setType(SysRoleTypeEnum.SYSTEM.getType()); - o.setSort(999); - }); - sysRoleService.updateRole(reqVO); - - //断言 - SysRoleDO newRoleDO = roleMapper.selectById(roleId); - assertPojoEquals(reqVO, newRoleDO); - - verify(sysRoleProducer).sendRoleRefreshMessage(); - } - - @Test - public void testUpdateRoleStatus_success() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, CommonStatusEnum.ENABLE.getStatus()); - roleMapper.insert(roleDO); - Long roleId = roleDO.getId(); - - //调用 - sysRoleService.updateRoleStatus(roleId, CommonStatusEnum.DISABLE.getStatus()); - - //断言 - SysRoleDO newRoleDO = roleMapper.selectById(roleId); - assertEquals(CommonStatusEnum.DISABLE.getStatus(), newRoleDO.getStatus()); - - verify(sysRoleProducer).sendRoleRefreshMessage(); - } - - @Test - public void testUpdateRoleDataScope_success() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); - roleMapper.insert(roleDO); - Long roleId = roleDO.getId(); - - //调用 - Set deptIdSet = Arrays.asList(1L, 2L, 3L, 4L, 5L).stream().collect(Collectors.toSet()); - sysRoleService.updateRoleDataScope(roleId, DataScopeEnum.DEPT_CUSTOM.getScore(), deptIdSet); - - //断言 - SysRoleDO newRoleDO = roleMapper.selectById(roleId); - assertEquals(DataScopeEnum.DEPT_CUSTOM.getScore(), newRoleDO.getDataScope()); - - Set newDeptIdSet = newRoleDO.getDataScopeDeptIds(); - assertTrue(deptIdSet.size() == newDeptIdSet.size()); - deptIdSet.stream().forEach(d -> assertTrue(newDeptIdSet.contains(d))); - - verify(sysRoleProducer).sendRoleRefreshMessage(); - } - - @Test - public void testDeleteRole_success() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); - roleMapper.insert(roleDO); - Long roleId = roleDO.getId(); - - //调用 - sysRoleService.deleteRole(roleId); - - //断言 - SysRoleDO newRoleDO = roleMapper.selectById(roleId); - assertNull(newRoleDO); - - verify(sysRoleProducer).sendRoleRefreshMessage(); - } - - @Test - public void testGetRoles_success() { - Map idRoleMap = new HashMap<>(); - // 验证查询状态为1的角色 - SysRoleDO roleDO1 = createRoleDO("role1", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); - roleMapper.insert(roleDO1); - idRoleMap.put(roleDO1.getId(), roleDO1); - - SysRoleDO roleDO2 = createRoleDO("role2", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); - roleMapper.insert(roleDO2); - idRoleMap.put(roleDO2.getId(), roleDO2); - - // 以下是排除的角色 - SysRoleDO roleDO3 = createRoleDO("role3", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 2); - roleMapper.insert(roleDO3); - - //调用 - List roles = sysRoleService.getRoles(Arrays.asList(1)); - - //断言 - assertEquals(2, roles.size()); - roles.stream().forEach(r -> assertPojoEquals(idRoleMap.get(r.getId()), r)); - - } - - @Test - public void testGetRolePage_success() { - Map idRoleMap = new HashMap<>(); - // 验证名称包含"role", 状态为1,code为"code"的角色 - // 第一页 - SysRoleDO roleDO = createRoleDO("role1", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "code"); - roleMapper.insert(roleDO); - idRoleMap.put(roleDO.getId(), roleDO); - // 第二页 - roleDO = createRoleDO("role2", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "code"); - roleMapper.insert(roleDO); - - // 以下是排除的角色 - roleDO = createRoleDO("role3", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 2, "code"); - roleMapper.insert(roleDO); - roleDO = createRoleDO("role4", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "xxxxx"); - roleMapper.insert(roleDO); - - //调用 - SysRolePageReqVO reqVO = randomPojo(SysRolePageReqVO.class, o -> { - o.setName("role"); - o.setCode("code"); - o.setStatus(1); - o.setPageNo(1); - o.setPageSize(1); - o.setBeginTime(null); - o.setEndTime(null); - }); - PageResult result = sysRoleService.getRolePage(reqVO); - assertEquals(2, result.getTotal()); - result.getList().stream().forEach(r -> assertPojoEquals(idRoleMap.get(r.getId()), r)); - } - - @Test - public void testCheckDuplicateRole_success() { - sysRoleService.checkDuplicateRole(randomString(), randomString(), null); - } - - @Test - public void testCheckDuplicateRole_nameDuplicate() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); - roleMapper.insert(roleDO); - - String duplicateName = "role_name"; - - assertServiceException(() -> sysRoleService.checkDuplicateRole(duplicateName, randomString(), null), ROLE_NAME_DUPLICATE, duplicateName); - } - - @Test - public void testCheckDuplicateRole_codeDuplicate() { - SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> { - o.setName("role_999"); - o.setCode("code"); - o.setType(SysRoleTypeEnum.CUSTOM.getType()); - o.setStatus(1); - o.setDataScope(DataScopeEnum.ALL.getScore()); - }); - roleMapper.insert(roleDO); - - String randomName = randomString(); - String duplicateCode = "code"; - - assertServiceException(() -> sysRoleService.checkDuplicateRole(randomName, duplicateCode, null), ROLE_CODE_DUPLICATE, duplicateCode); - } - - @Test - public void testCheckUpdateRole_success() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); - roleMapper.insert(roleDO); - Long roleId = roleDO.getId(); - - sysRoleService.checkUpdateRole(roleId); - } - - @Test - public void testCheckUpdateRole_roleIdNotExist() { - assertServiceException(() -> sysRoleService.checkUpdateRole(randomLongId()), ROLE_NOT_EXISTS); - } - - @Test - public void testCheckUpdateRole_systemRoleCanNotBeUpdate() { - SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.SYSTEM, DataScopeEnum.ALL); - roleMapper.insert(roleDO); - Long roleId = roleDO.getId(); - - assertServiceException(() -> sysRoleService.checkUpdateRole(roleId), ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE); - } - - private SysRoleDO createRoleDO(String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status) { - return createRoleDO( name, typeEnum, scopeEnum, status, randomString()); - } - - private SysRoleDO createRoleDO(String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { - return createRoleDO(null, name, typeEnum, scopeEnum, status, code); - } - - private SysRoleDO createRoleDO(String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum) { - return createRoleDO(null, name, typeEnum, scopeEnum, randomCommonStatus(), randomString()); - } - - private SysRoleDO createRoleDO(Long id, String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { - SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> { - o.setId(id); - o.setName(name); - o.setType(typeEnum.getType()); - o.setStatus(status); - o.setDataScope(scopeEnum.getScore()); - o.setCode(code); - }); - return roleDO; - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelServiceTest.java deleted file mode 100644 index 252c31d..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelServiceTest.java +++ /dev/null @@ -1,202 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms; - -import cn.hutool.core.bean.BeanUtil; -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsChannelMapper; -import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsChannelServiceImpl; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -/** -* {@link SysSmsChannelServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(SysSmsChannelServiceImpl.class) -public class SysSmsChannelServiceTest extends BaseDbUnitTest { - - @Resource - private SysSmsChannelServiceImpl smsChannelService; - - @Resource - private SysSmsChannelMapper smsChannelMapper; - - @MockBean - private SmsClientFactory smsClientFactory; - @MockBean - private SysSmsTemplateService smsTemplateService; - @MockBean - private SysSmsProducer smsProducer; - - @Test - public void testInitLocalCache_success() { - // mock 数据 - SysSmsChannelDO smsChannelDO01 = randomSmsChannelDO(); - smsChannelMapper.insert(smsChannelDO01); - SysSmsChannelDO smsChannelDO02 = randomSmsChannelDO(); - smsChannelMapper.insert(smsChannelDO02); - - // 调用 - smsChannelService.initSmsClients(); - // 校验 maxUpdateTime 属性 - Date maxUpdateTime = (Date) BeanUtil.getFieldValue(smsChannelService, "maxUpdateTime"); - assertEquals(max(smsChannelDO01.getUpdateTime(), smsChannelDO02.getUpdateTime()), maxUpdateTime); - // 校验调用 - verify(smsClientFactory, times(1)).createOrUpdateSmsClient( - argThat(properties -> isPojoEquals(smsChannelDO01, properties))); - verify(smsClientFactory, times(1)).createOrUpdateSmsClient( - argThat(properties -> isPojoEquals(smsChannelDO02, properties))); - } - - @Test - public void testCreateSmsChannel_success() { - // 准备参数 - SysSmsChannelCreateReqVO reqVO = randomPojo(SysSmsChannelCreateReqVO.class, o -> o.setStatus(randomCommonStatus())); - - // 调用 - Long smsChannelId = smsChannelService.createSmsChannel(reqVO); - // 断言 - assertNotNull(smsChannelId); - // 校验记录的属性是否正确 - SysSmsChannelDO smsChannel = smsChannelMapper.selectById(smsChannelId); - assertPojoEquals(reqVO, smsChannel); - // 校验调用 - verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); - } - - @Test - public void testUpdateSmsChannel_success() { - // mock 数据 - SysSmsChannelDO dbSmsChannel = randomSmsChannelDO(); - smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SysSmsChannelUpdateReqVO reqVO = randomPojo(SysSmsChannelUpdateReqVO.class, o -> { - o.setId(dbSmsChannel.getId()); // 设置更新的 ID - o.setStatus(randomCommonStatus()); - o.setCallbackUrl(randomString()); - }); - - // 调用 - smsChannelService.updateSmsChannel(reqVO); - // 校验是否更新正确 - SysSmsChannelDO smsChannel = smsChannelMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, smsChannel); - // 校验调用 - verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); - } - - @Test - public void testUpdateSmsChannel_notExists() { - // 准备参数 - SysSmsChannelUpdateReqVO reqVO = randomPojo(SysSmsChannelUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> smsChannelService.updateSmsChannel(reqVO), SMS_CHANNEL_NOT_EXISTS); - } - - @Test - public void testDeleteSmsChannel_success() { - // mock 数据 - SysSmsChannelDO dbSmsChannel = randomSmsChannelDO(); - smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbSmsChannel.getId(); - - // 调用 - smsChannelService.deleteSmsChannel(id); - // 校验数据不存在了 - assertNull(smsChannelMapper.selectById(id)); - // 校验调用 - verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); - } - - @Test - public void testDeleteSmsChannel_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> smsChannelService.deleteSmsChannel(id), SMS_CHANNEL_NOT_EXISTS); - } - - @Test - public void testDeleteSmsChannel_hasChildren() { - // mock 数据 - SysSmsChannelDO dbSmsChannel = randomSmsChannelDO(); - smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbSmsChannel.getId(); - // mock 方法 - when(smsTemplateService.countByChannelId(eq(id))).thenReturn(10); - - // 调用, 并断言异常 - assertServiceException(() -> smsChannelService.deleteSmsChannel(id), SMS_CHANNEL_HAS_CHILDREN); - } - - @Test - public void testGetSmsChannelPage() { - // mock 数据 - SysSmsChannelDO dbSmsChannel = randomPojo(SysSmsChannelDO.class, o -> { // 等会查询到 - o.setSignature("芋道源码"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setCreateTime(buildTime(2020, 12, 12)); - }); - smsChannelMapper.insert(dbSmsChannel); - // 测试 signature 不匹配 - smsChannelMapper.insert(ObjectUtils.clone(dbSmsChannel, o -> o.setSignature("源码"))); - // 测试 status 不匹配 - smsChannelMapper.insert(ObjectUtils.clone(dbSmsChannel, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 createTime 不匹配 - smsChannelMapper.insert(ObjectUtils.clone(dbSmsChannel, o -> o.setCreateTime(buildTime(2020, 11, 11)))); - // 准备参数 - SysSmsChannelPageReqVO reqVO = new SysSmsChannelPageReqVO(); - reqVO.setSignature("芋道"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setBeginCreateTime(buildTime(2020, 12, 1)); - reqVO.setEndCreateTime(buildTime(2020, 12, 24)); - - // 调用 - PageResult pageResult = smsChannelService.getSmsChannelPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbSmsChannel, pageResult.getList().get(0)); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static SysSmsChannelDO randomSmsChannelDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - }; - return randomPojo(SysSmsChannelDO.class, ArrayUtils.append(consumer, consumers)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogServiceTest.java deleted file mode 100644 index aa59bf5..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogServiceTest.java +++ /dev/null @@ -1,248 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms; - -import cn.hutool.core.map.MapUtil; -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsLogMapper; -import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsReceiveStatusEnum; -import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; -import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum; -import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsLogServiceImpl; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomBoolean; -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; - -/** -* {@link SysSmsLogServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(SysSmsLogServiceImpl.class) -public class SysSmsLogServiceTest extends BaseDbUnitTest { - - @Resource - private SysSmsLogServiceImpl smsLogService; - - @Resource - private SysSmsLogMapper smsLogMapper; - - @Test - public void testCreateSmsLog() { - // 准备参数 - String mobile = randomString(); - Long userId = randomLongId(); - Integer userType = randomEle(UserTypeEnum.values()).getValue(); - Boolean isSend = randomBoolean(); - SysSmsTemplateDO templateDO = randomPojo(SysSmsTemplateDO.class, - o -> o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType())); - String templateContent = randomString(); - Map templateParams = randomTemplateParams(); - // mock 方法 - - // 调用 - Long logId = smsLogService.createSmsLog(mobile, userId, userType, isSend, - templateDO, templateContent, templateParams); - // 断言 - SysSmsLogDO logDO = smsLogMapper.selectById(logId); - assertEquals(isSend ? SysSmsSendStatusEnum.INIT.getStatus() : SysSmsSendStatusEnum.IGNORE.getStatus(), - logDO.getSendStatus()); - assertEquals(mobile, logDO.getMobile()); - assertEquals(userType, logDO.getUserType()); - assertEquals(userId, logDO.getUserId()); - assertEquals(templateDO.getId(), logDO.getTemplateId()); - assertEquals(templateDO.getCode(), logDO.getTemplateCode()); - assertEquals(templateDO.getType(), logDO.getTemplateType()); - assertEquals(templateDO.getChannelId(), logDO.getChannelId()); - assertEquals(templateDO.getChannelCode(), logDO.getChannelCode()); - assertEquals(templateContent, logDO.getTemplateContent()); - assertEquals(templateParams, logDO.getTemplateParams()); - assertEquals(SysSmsReceiveStatusEnum.INIT.getStatus(), logDO.getReceiveStatus()); - } - - @Test - public void testUpdateSmsSendResult() { - // mock 数据 - SysSmsLogDO dbSmsLog = randomSmsLogDO( - o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus())); - smsLogMapper.insert(dbSmsLog); - // 准备参数 - Long id = dbSmsLog.getId(); - Integer sendCode = randomInteger(); - String sendMsg = randomString(); - String apiSendCode = randomString(); - String apiSendMsg = randomString(); - String apiRequestId = randomString(); - String apiSerialNo = randomString(); - - // 调用 - smsLogService.updateSmsSendResult(id, sendCode, sendMsg, - apiSendCode, apiSendMsg, apiRequestId, apiSerialNo); - // 断言 - dbSmsLog = smsLogMapper.selectById(id); - assertEquals(CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS.getStatus() - : SysSmsSendStatusEnum.FAILURE.getStatus(), dbSmsLog.getSendStatus()); - assertNotNull(dbSmsLog.getSendTime()); - assertEquals(sendMsg, dbSmsLog.getSendMsg()); - assertEquals(apiSendCode, dbSmsLog.getApiSendCode()); - assertEquals(apiSendMsg, dbSmsLog.getApiSendMsg()); - assertEquals(apiRequestId, dbSmsLog.getApiRequestId()); - assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo()); - } - - @Test - public void testUpdateSmsReceiveResult() { - // mock 数据 - SysSmsLogDO dbSmsLog = randomSmsLogDO( - o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus())); - smsLogMapper.insert(dbSmsLog); - // 准备参数 - Long id = dbSmsLog.getId(); - Boolean success = randomBoolean(); - Date receiveTime = randomDate(); - String apiReceiveCode = randomString(); - String apiReceiveMsg = randomString(); - - // 调用 - smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg); - // 断言 - dbSmsLog = smsLogMapper.selectById(id); - assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus() - : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus()); - assertEquals(receiveTime, dbSmsLog.getReceiveTime()); - assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode()); - assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg()); - } - - @Test - public void testGetSmsLogPage() { - // mock 数据 - SysSmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 - o.setChannelId(1L); - o.setTemplateId(10L); - o.setMobile("15601691300"); - o.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); - o.setSendTime(buildTime(2020, 11, 11)); - o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); - o.setReceiveTime(buildTime(2021, 11, 11)); - }); - smsLogMapper.insert(dbSmsLog); - // 测试 channelId 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setChannelId(2L))); - // 测试 templateId 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setTemplateId(20L))); - // 测试 mobile 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setMobile("18818260999"))); - // 测试 sendStatus 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()))); - // 测试 sendTime 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12)))); - // 测试 receiveStatus 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.SUCCESS.getStatus()))); - // 测试 receiveTime 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); - // 准备参数 - SysSmsLogPageReqVO reqVO = new SysSmsLogPageReqVO(); - reqVO.setChannelId(1L); - reqVO.setTemplateId(10L); - reqVO.setMobile("156"); - reqVO.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); - reqVO.setBeginSendTime(buildTime(2020, 11, 1)); - reqVO.setEndSendTime(buildTime(2020, 11, 30)); - reqVO.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); - reqVO.setBeginReceiveTime(buildTime(2021, 11, 1)); - reqVO.setEndReceiveTime(buildTime(2021, 11, 30)); - - // 调用 - PageResult pageResult = smsLogService.getSmsLogPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbSmsLog, pageResult.getList().get(0)); - } - - @Test - public void testGetSmsLogList() { - // mock 数据 - SysSmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 - o.setChannelId(1L); - o.setTemplateId(10L); - o.setMobile("15601691300"); - o.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); - o.setSendTime(buildTime(2020, 11, 11)); - o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); - o.setReceiveTime(buildTime(2021, 11, 11)); - }); - smsLogMapper.insert(dbSmsLog); - // 测试 channelId 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setChannelId(2L))); - // 测试 templateId 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setTemplateId(20L))); - // 测试 mobile 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setMobile("18818260999"))); - // 测试 sendStatus 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()))); - // 测试 sendTime 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12)))); - // 测试 receiveStatus 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.SUCCESS.getStatus()))); - // 测试 receiveTime 不匹配 - smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); - // 准备参数 - SysSmsLogExportReqVO reqVO = new SysSmsLogExportReqVO(); - reqVO.setChannelId(1L); - reqVO.setTemplateId(10L); - reqVO.setMobile("156"); - reqVO.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); - reqVO.setBeginSendTime(buildTime(2020, 11, 1)); - reqVO.setEndSendTime(buildTime(2020, 11, 30)); - reqVO.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); - reqVO.setBeginReceiveTime(buildTime(2021, 11, 1)); - reqVO.setEndReceiveTime(buildTime(2021, 11, 30)); - - // 调用 - List list = smsLogService.getSmsLogList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbSmsLog, list.get(0)); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static SysSmsLogDO randomSmsLogDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setTemplateParams(randomTemplateParams()); - o.setTemplateType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围 - o.setUserType(randomEle(UserTypeEnum.values()).getValue()); // 保证 userType 的范围 - o.setSendStatus(randomEle(SysSmsSendStatusEnum.values()).getStatus()); // 保证 sendStatus 的范围 - o.setReceiveStatus(randomEle(SysSmsReceiveStatusEnum.values()).getStatus()); // 保证 receiveStatus 的范围 - }; - return randomPojo(SysSmsLogDO.class, ArrayUtils.append(consumer, consumers)); - } - - - private static Map randomTemplateParams() { - return MapUtil.builder().put(randomString(), randomString()) - .put(randomString(), randomString()).build(); - } -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsServiceTest.java deleted file mode 100644 index c07f08b..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsServiceTest.java +++ /dev/null @@ -1,201 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms; - -import cn.hutool.core.map.MapUtil; -import cn.iocoder.dashboard.BaseMockitoUnitTest; -import cn.iocoder.yudao.framework.common.core.KeyValue; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.sms.core.client.SmsClient; -import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; -import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; -import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO; -import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage; -import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsServiceImpl; -import org.assertj.core.util.Lists; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -/** - * {@link SysSmsServiceImpl} 的单元测试类 - * - * @author 芋道源码 - */ -public class SysSmsServiceTest extends BaseMockitoUnitTest { - - @InjectMocks - private SysSmsServiceImpl smsService; - - @Mock - private SysSmsTemplateService smsTemplateService; - @Mock - private SysSmsLogService smsLogService; - @Mock - private SysSmsProducer smsProducer; - @Mock - private SmsClientFactory smsClientFactory; - - /** - * 发送成功,当短信模板开启时 - */ - @Test - public void testSendSingleSms_successWhenSmsTemplateEnable() { - // 准备参数 - String mobile = randomString(); - Long userId = randomLongId(); - Integer userType = randomEle(UserTypeEnum.values()).getValue(); - String templateCode = randomString(); - Map templateParams = MapUtil.builder().put("code", "1234") - .put("op", "login").build(); - // mock SmsTemplateService 的方法 - SysSmsTemplateDO template = randomPojo(SysSmsTemplateDO.class, o -> { - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setContent("验证码为{code}, 操作为{op}"); - o.setParams(Lists.newArrayList("code", "op")); - }); - when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); - String content = randomString(); - when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) - .thenReturn(content); - // mock SmsLogService 的方法 - Long smsLogId = randomLongId(); - when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.TRUE), eq(template), - eq(content), eq(templateParams))).thenReturn(smsLogId); - - // 调用 - Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); - // 断言 - assertEquals(smsLogId, resultSmsLogId); - // 断言调用 - verify(smsProducer, times(1)).sendSmsSendMessage(eq(smsLogId), eq(mobile), - eq(template.getChannelId()), eq(template.getApiTemplateId()), - eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login")))); - } - - /** - * 发送成功,当短信模板关闭时 - */ - @Test - public void testSendSingleSms_successWhenSmsTemplateDisable() { - // 准备参数 - String mobile = randomString(); - Long userId = randomLongId(); - Integer userType = randomEle(UserTypeEnum.values()).getValue(); - String templateCode = randomString(); - Map templateParams = MapUtil.builder().put("code", "1234") - .put("op", "login").build(); - // mock SmsTemplateService 的方法 - SysSmsTemplateDO template = randomPojo(SysSmsTemplateDO.class, o -> { - o.setStatus(CommonStatusEnum.DISABLE.getStatus()); - o.setContent("验证码为{code}, 操作为{op}"); - o.setParams(Lists.newArrayList("code", "op")); - }); - when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); - String content = randomString(); - when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) - .thenReturn(content); - // mock SmsLogService 的方法 - Long smsLogId = randomLongId(); - when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.FALSE), eq(template), - eq(content), eq(templateParams))).thenReturn(smsLogId); - - // 调用 - Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); - // 断言 - assertEquals(smsLogId, resultSmsLogId); - // 断言调用 - verify(smsProducer, times(0)).sendSmsSendMessage(anyLong(), anyString(), - anyLong(), any(), anyList()); - } - - @Test - public void testCheckSmsTemplateValid_notExists() { - // 准备参数 - String templateCode = randomString(); - // mock 方法 - - // 调用,并断言异常 - assertServiceException(() -> smsService.checkSmsTemplateValid(templateCode), - SMS_TEMPLATE_NOT_EXISTS); - } - - @Test - public void testBuildTemplateParams_paramMiss() { - // 准备参数 - SysSmsTemplateDO template = randomPojo(SysSmsTemplateDO.class, - o -> o.setParams(Lists.newArrayList("code"))); - Map templateParams = new HashMap<>(); - // mock 方法 - - // 调用,并断言异常 - assertServiceException(() -> smsService.buildTemplateParams(template, templateParams), - SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, "code"); - } - - @Test - public void testCheckMobile_notExists() { - // 准备参数 - // mock 方法 - - // 调用,并断言异常 - assertServiceException(() -> smsService.checkMobile(null), - SMS_SEND_MOBILE_NOT_EXISTS); - } - - @Test - @SuppressWarnings("unchecked") - public void testDoSendSms() { - // 准备参数 - SysSmsSendMessage message = randomPojo(SysSmsSendMessage.class); - // mock SmsClientFactory 的方法 - SmsClient smsClient = spy(SmsClient.class); - when(smsClientFactory.getSmsClient(eq(message.getChannelId()))).thenReturn(smsClient); - // mock SmsClient 的方法 - SmsCommonResult sendResult = randomPojo(SmsCommonResult.class, SmsSendRespDTO.class); - when(smsClient.sendSms(eq(message.getLogId()), eq(message.getMobile()), eq(message.getApiTemplateId()), - eq(message.getTemplateParams()))).thenReturn(sendResult); - - // 调用 - smsService.doSendSms(message); - // 断言 - verify(smsLogService, times(1)).updateSmsSendResult(eq(message.getLogId()), - eq(sendResult.getCode()), eq(sendResult.getMsg()), eq(sendResult.getApiCode()), - eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo())); - } - - @Test - public void testReceiveSmsStatus() throws Throwable { - // 准备参数 - String channelCode = randomString(); - String text = randomString(); - // mock SmsClientFactory 的方法 - SmsClient smsClient = spy(SmsClient.class); - when(smsClientFactory.getSmsClient(eq(channelCode))).thenReturn(smsClient); - // mock SmsClient 的方法 - List receiveResults = randomPojoList(SmsReceiveRespDTO.class); - - // 调用 - smsService.receiveSmsStatus(channelCode, text); - // 断言 - receiveResults.forEach(result -> { - smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()), - eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode())); - }); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateServiceTest.java deleted file mode 100644 index 295e9de..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateServiceTest.java +++ /dev/null @@ -1,380 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.sms; - -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.sms.core.client.SmsClient; -import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; -import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; -import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper; -import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum; -import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer; -import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsTemplateServiceImpl; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import com.google.common.collect.Lists; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -import static cn.hutool.core.bean.BeanUtil.getFieldValue; -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -/** -* {@link SysSmsTemplateServiceImpl} 的单元测试类 -* -* @author 芋道源码 -*/ -@Import(SysSmsTemplateServiceImpl.class) -public class SysSmsTemplateServiceTest extends BaseDbUnitTest { - - @Resource - private SysSmsTemplateServiceImpl smsTemplateService; - - @Resource - private SysSmsTemplateMapper smsTemplateMapper; - - @MockBean - private SysSmsChannelService smsChannelService; - @MockBean - private SmsClientFactory smsClientFactory; - @MockBean - private SmsClient smsClient; - @MockBean - private SysSmsProducer smsProducer; - - @Test - @SuppressWarnings("unchecked") - void testInitLocalCache() { - // mock 数据 - SysSmsTemplateDO smsTemplate01 = randomSmsTemplateDO(); - smsTemplateMapper.insert(smsTemplate01); - SysSmsTemplateDO smsTemplate02 = randomSmsTemplateDO(); - smsTemplateMapper.insert(smsTemplate02); - - // 调用 - smsTemplateService.initLocalCache(); - // 断言 deptCache 缓存 - Map smsTemplateCache = (Map) getFieldValue(smsTemplateService, "smsTemplateCache"); - assertEquals(2, smsTemplateCache.size()); - assertPojoEquals(smsTemplate01, smsTemplateCache.get(smsTemplate01.getCode())); - assertPojoEquals(smsTemplate02, smsTemplateCache.get(smsTemplate02.getCode())); - // 断言 maxUpdateTime 缓存 - Date maxUpdateTime = (Date) getFieldValue(smsTemplateService, "maxUpdateTime"); - assertEquals(max(smsTemplate01.getUpdateTime(), smsTemplate02.getUpdateTime()), maxUpdateTime); - } - - @Test - public void testParseTemplateContentParams() { - // 准备参数 - String content = "正在进行登录操作{operation},您的验证码是{code}"; - // mock 方法 - - // 调用 - List params = smsTemplateService.parseTemplateContentParams(content); - // 断言 - assertEquals(Lists.newArrayList("operation", "code"), params); - } - - @Test - @SuppressWarnings("unchecked") - public void testCreateSmsTemplate_success() { - // 准备参数 - SysSmsTemplateCreateReqVO reqVO = randomPojo(SysSmsTemplateCreateReqVO.class, o -> { - o.setContent("正在进行登录操作{operation},您的验证码是{code}"); - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 - }); - // mock Channel 的方法 - SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { - o.setId(reqVO.getChannelId()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 - }); - when(smsChannelService.getSmsChannel(eq(channelDO.getId()))).thenReturn(channelDO); - // mock 获得 API 短信模板成功 - when(smsClientFactory.getSmsClient(eq(reqVO.getChannelId()))).thenReturn(smsClient); - when(smsClient.getSmsTemplate(eq(reqVO.getApiTemplateId()))).thenReturn(randomPojo(SmsCommonResult.class, SmsTemplateRespDTO.class, - o -> o.setCode(GlobalErrorCodeConstants.SUCCESS.getCode()))); - - // 调用 - Long smsTemplateId = smsTemplateService.createSmsTemplate(reqVO); - // 断言 - assertNotNull(smsTemplateId); - // 校验记录的属性是否正确 - SysSmsTemplateDO smsTemplate = smsTemplateMapper.selectById(smsTemplateId); - assertPojoEquals(reqVO, smsTemplate); - assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); - assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); - // 校验调用 - verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); - } - - @Test - @SuppressWarnings("unchecked") - public void testUpdateSmsTemplate_success() { - // mock 数据 - SysSmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); - smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据 - // 准备参数 - SysSmsTemplateUpdateReqVO reqVO = randomPojo(SysSmsTemplateUpdateReqVO.class, o -> { - o.setId(dbSmsTemplate.getId()); // 设置更新的 ID - o.setContent("正在进行登录操作{operation},您的验证码是{code}"); - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 - }); - // mock 方法 - SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { - o.setId(reqVO.getChannelId()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 - }); - when(smsChannelService.getSmsChannel(eq(channelDO.getId()))).thenReturn(channelDO); - // mock 获得 API 短信模板成功 - when(smsClientFactory.getSmsClient(eq(reqVO.getChannelId()))).thenReturn(smsClient); - when(smsClient.getSmsTemplate(eq(reqVO.getApiTemplateId()))).thenReturn(randomPojo(SmsCommonResult.class, SmsTemplateRespDTO.class, - o -> o.setCode(GlobalErrorCodeConstants.SUCCESS.getCode()))); - - // 调用 - smsTemplateService.updateSmsTemplate(reqVO); - // 校验是否更新正确 - SysSmsTemplateDO smsTemplate = smsTemplateMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, smsTemplate); - assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); - assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); - // 校验调用 - verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); - } - - @Test - public void testUpdateSmsTemplate_notExists() { - // 准备参数 - SysSmsTemplateUpdateReqVO reqVO = randomPojo(SysSmsTemplateUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> smsTemplateService.updateSmsTemplate(reqVO), SMS_TEMPLATE_NOT_EXISTS); - } - - @Test - public void testDeleteSmsTemplate_success() { - // mock 数据 - SysSmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); - smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbSmsTemplate.getId(); - - // 调用 - smsTemplateService.deleteSmsTemplate(id); - // 校验数据不存在了 - assertNull(smsTemplateMapper.selectById(id)); - // 校验调用 - verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); - } - - @Test - public void testDeleteSmsTemplate_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> smsTemplateService.deleteSmsTemplate(id), SMS_TEMPLATE_NOT_EXISTS); - } - - @Test - public void testGetSmsTemplatePage() { - // mock 数据 - SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class, o -> { // 等会查询到 - o.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setCode("yudaoyuanma"); - o.setContent("芋道源码"); - o.setApiTemplateId("yunai"); - o.setChannelId(1L); - o.setCreateTime(buildTime(2021, 11, 11)); - }); - smsTemplateMapper.insert(dbSmsTemplate); - // 测试 type 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setType(SysSmsTemplateTypeEnum.VERIFICATION_CODE.getType()))); - // 测试 status 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 code 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCode("yuanma"))); - // 测试 content 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setContent("源码"))); - // 测试 apiTemplateId 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setApiTemplateId("nai"))); - // 测试 channelId 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setChannelId(2L))); - // 测试 createTime 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12)))); - // 准备参数 - SysSmsTemplatePageReqVO reqVO = new SysSmsTemplatePageReqVO(); - reqVO.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setCode("yudao"); - reqVO.setContent("芋道"); - reqVO.setApiTemplateId("yu"); - reqVO.setChannelId(1L); - reqVO.setBeginCreateTime(buildTime(2021, 11, 1)); - reqVO.setEndCreateTime(buildTime(2021, 12, 1)); - - // 调用 - PageResult pageResult = smsTemplateService.getSmsTemplatePage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbSmsTemplate, pageResult.getList().get(0)); - } - - @Test - public void testGetSmsTemplateList() { - // mock 数据 - SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class, o -> { // 等会查询到 - o.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setCode("yudaoyuanma"); - o.setContent("芋道源码"); - o.setApiTemplateId("yunai"); - o.setChannelId(1L); - o.setCreateTime(buildTime(2021, 11, 11)); - }); - smsTemplateMapper.insert(dbSmsTemplate); - // 测试 type 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setType(SysSmsTemplateTypeEnum.VERIFICATION_CODE.getType()))); - // 测试 status 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 code 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCode("yuanma"))); - // 测试 content 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setContent("源码"))); - // 测试 apiTemplateId 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setApiTemplateId("nai"))); - // 测试 channelId 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setChannelId(2L))); - // 测试 createTime 不匹配 - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12)))); - // 准备参数 - SysSmsTemplateExportReqVO reqVO = new SysSmsTemplateExportReqVO(); - reqVO.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setCode("yudao"); - reqVO.setContent("芋道"); - reqVO.setApiTemplateId("yu"); - reqVO.setChannelId(1L); - reqVO.setBeginCreateTime(buildTime(2021, 11, 1)); - reqVO.setEndCreateTime(buildTime(2021, 12, 1)); - - // 调用 - List list = smsTemplateService.getSmsTemplateList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbSmsTemplate, list.get(0)); - } - - @Test - public void testCheckSmsChannel_success() { - // 准备参数 - Long channelId = randomLongId(); - // mock 方法 - SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { - o.setId(channelId); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 - }); - when(smsChannelService.getSmsChannel(eq(channelId))).thenReturn(channelDO); - - // 调用 - SysSmsChannelDO returnChannelDO = smsTemplateService.checkSmsChannel(channelId); - // 断言 - assertPojoEquals(returnChannelDO, channelDO); - } - - @Test - public void testCheckSmsChannel_notExists() { - // 准备参数 - Long channelId = randomLongId(); - - // 调用,校验异常 - assertServiceException(() -> smsTemplateService.checkSmsChannel(channelId), - SMS_CHANNEL_NOT_EXISTS); - } - - @Test - public void testCheckSmsChannel_disable() { - // 准备参数 - Long channelId = randomLongId(); - // mock 方法 - SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { - o.setId(channelId); - o.setStatus(CommonStatusEnum.DISABLE.getStatus()); // 保证 status 禁用,触发失败 - }); - when(smsChannelService.getSmsChannel(eq(channelId))).thenReturn(channelDO); - - // 调用,校验异常 - assertServiceException(() -> smsTemplateService.checkSmsChannel(channelId), - SMS_CHANNEL_DISABLE); - } - - @Test - public void testCheckDictDataValueUnique_success() { - // 调用,成功 - smsTemplateService.checkSmsTemplateCodeDuplicate(randomLongId(), randomString()); - } - - @Test - public void testCheckSmsTemplateCodeDuplicate_valueDuplicateForCreate() { - // 准备参数 - String code = randomString(); - // mock 数据 - smsTemplateMapper.insert(randomSmsTemplateDO(o -> o.setCode(code))); - - // 调用,校验异常 - assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(null, code), - SMS_TEMPLATE_CODE_DUPLICATE, code); - } - - @Test - public void testCheckDictDataValueUnique_valueDuplicateForUpdate() { - // 准备参数 - Long id = randomLongId(); - String code = randomString(); - // mock 数据 - smsTemplateMapper.insert(randomSmsTemplateDO(o -> o.setCode(code))); - - // 调用,校验异常 - assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(id, code), - SMS_TEMPLATE_CODE_DUPLICATE, code); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static SysSmsTemplateDO randomSmsTemplateDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 - }; - return randomPojo(SysSmsTemplateDO.class, ArrayUtils.append(consumer, consumers)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImplTest.java deleted file mode 100644 index 9d55050..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImplTest.java +++ /dev/null @@ -1,590 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.user; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.RandomUtil; -import cn.iocoder.dashboard.BaseDbUnitTest; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.service.file.InfFileService; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper; -import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum; -import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; -import cn.iocoder.dashboard.modules.system.service.dept.SysPostService; -import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; -import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.mockito.stubbing.Answer; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; -import org.springframework.security.crypto.password.PasswordEncoder; - -import javax.annotation.Resource; -import java.io.ByteArrayInputStream; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; - -import static cn.hutool.core.util.RandomUtil.randomBytes; -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static org.assertj.core.util.Lists.newArrayList; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -/** - * {@link SysUserService} 的单元测试类 - * - * @author zxl - */ -@Import(SysUserServiceImpl.class) -public class SysUserServiceImplTest extends BaseDbUnitTest { - - @Resource - private SysUserServiceImpl userService; - - @Resource - private SysUserMapper userMapper; - - @MockBean - private SysDeptService deptService; - @MockBean - private SysPostService postService; - @MockBean - private SysPermissionService permissionService; - @MockBean - private PasswordEncoder passwordEncoder; - @MockBean - private InfFileService fileService; - - @Test - public void testCreatUser_success() { - // 准备参数 - SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class, o -> { - o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); - o.setMobile(randomString()); - }); - // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { - o.setId(reqVO.getDeptId()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); - // mock postService 的方法 - List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> - randomPojo(SysPostDO.class, o -> { - o.setId(postId); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - })); - when(postService.getPosts(eq(reqVO.getPostIds()), isNull())).thenReturn(posts); - // mock passwordEncoder 的方法 - when(passwordEncoder.encode(eq(reqVO.getPassword()))).thenReturn("yudaoyuanma"); - - // 调用 - Long userId = userService.createUser(reqVO); - // 断言 - SysUserDO user = userMapper.selectById(userId); - assertPojoEquals(reqVO, user, "password"); - assertEquals("yudaoyuanma", user.getPassword()); - assertEquals(CommonStatusEnum.ENABLE.getStatus(), user.getStatus()); - } - - @Test - public void testUpdateUser_success() { - // mock 数据 - SysUserDO dbUser = randomSysUserDO(); - userMapper.insert(dbUser); - // 准备参数 - SysUserUpdateReqVO reqVO = randomPojo(SysUserUpdateReqVO.class, o -> { - o.setId(dbUser.getId()); - o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); - o.setMobile(randomString()); - }); - // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { - o.setId(reqVO.getDeptId()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); - // mock postService 的方法 - List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> - randomPojo(SysPostDO.class, o -> { - o.setId(postId); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - })); - when(postService.getPosts(eq(reqVO.getPostIds()), isNull())).thenReturn(posts); - - // 调用 - userService.updateUser(reqVO); - // 断言 - SysUserDO user = userMapper.selectById(reqVO.getId()); - assertPojoEquals(reqVO, user); - } - - @Test - public void testUpdateUserProfile_success() { - // mock 数据 - SysUserDO dbUser = randomSysUserDO(); - userMapper.insert(dbUser); - // 准备参数 - Long userId = dbUser.getId(); - SysUserProfileUpdateReqVO reqVO = randomPojo(SysUserProfileUpdateReqVO.class, o -> { - o.setMobile(randomString()); - o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); - }); - - // 调用 - userService.updateUserProfile(userId, reqVO); - // 断言 - SysUserDO user = userMapper.selectById(userId); - assertPojoEquals(reqVO, user); - } - - @Test - public void testUpdateUserPassword_success() { - // mock 数据 - SysUserDO dbUser = randomSysUserDO(o -> o.setPassword("encode:yudao")); - userMapper.insert(dbUser); - // 准备参数 - Long userId = dbUser.getId(); - SysUserProfileUpdatePasswordReqVO reqVO = randomPojo(SysUserProfileUpdatePasswordReqVO.class, o -> { - o.setOldPassword("yudao"); - o.setNewPassword("yuanma"); - }); - // mock 方法 - when(passwordEncoder.encode(anyString())).then( - (Answer) invocationOnMock -> "encode:" + invocationOnMock.getArgument(0)); - when(passwordEncoder.matches(eq(reqVO.getOldPassword()), eq(dbUser.getPassword()))).thenReturn(true); - - // 调用 - userService.updateUserPassword(userId, reqVO); - // 断言 - SysUserDO user = userMapper.selectById(userId); - assertEquals("encode:yuanma", user.getPassword()); - } - - @Test - public void testUpdateUserAvatar_success() { - // mock 数据 - SysUserDO dbUser = randomSysUserDO(); - userMapper.insert(dbUser); - // 准备参数 - Long userId = dbUser.getId(); - byte[] avatarFileBytes = randomBytes(10); - ByteArrayInputStream avatarFile = new ByteArrayInputStream(avatarFileBytes); - // mock 方法 - String avatar = randomString(); - when(fileService.createFile(anyString(), eq(avatarFileBytes))).thenReturn(avatar); - - // 调用 - userService.updateUserAvatar(userId, avatarFile); - // 断言 - SysUserDO user = userMapper.selectById(userId); - assertEquals(avatar, user.getAvatar()); - } - - @Test - public void testUpdateUserPassword02_success() { - // mock 数据 - SysUserDO dbUser = randomSysUserDO(); - userMapper.insert(dbUser); - // 准备参数 - Long userId = dbUser.getId(); - String password = "yudao"; - // mock 方法 - when(passwordEncoder.encode(anyString())).then( - (Answer) invocationOnMock -> "encode:" + invocationOnMock.getArgument(0)); - - // 调用 - userService.updateUserPassword(userId, password); - // 断言 - SysUserDO user = userMapper.selectById(userId); - assertEquals("encode:" + password, user.getPassword()); - } - - @Test - public void testUpdateUserStatus() { - // mock 数据 - SysUserDO dbUser = randomSysUserDO(); - userMapper.insert(dbUser); - // 准备参数 - Long userId = dbUser.getId(); - Integer status = randomCommonStatus(); - - // 调用 - userService.updateUserStatus(userId, status); - // 断言 - SysUserDO user = userMapper.selectById(userId); - assertEquals(status, user.getStatus()); - } - - @Test - public void testDeleteUser_success(){ - // mock 数据 - SysUserDO dbUser = randomSysUserDO(); - userMapper.insert(dbUser); - // 准备参数 - Long userId = dbUser.getId(); - - // 调用数据 - userService.deleteUser(userId); - // 校验结果 - assertNull(userService.getUser(userId)); - // 校验调用次数 - verify(permissionService, times(1)).processUserDeleted(eq(userId)); - } - - @Test - public void testGetUserPage() { - // mock 数据 - SysUserDO dbUser = initGetUserPageData(); - // 准备参数 - SysUserPageReqVO reqVO = new SysUserPageReqVO(); - reqVO.setUsername("yudao"); - reqVO.setMobile("1560"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setBeginTime(buildTime(2020, 12, 1)); - reqVO.setEndTime(buildTime(2020, 12, 24)); - reqVO.setDeptId(1L); // 其中,1L 是 2L 的父部门 - // mock 方法 - List deptList = newArrayList(randomPojo(SysDeptDO.class, o -> o.setId(2L))); - when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); - - // 调用 - PageResult pageResult = userService.getUserPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbUser, pageResult.getList().get(0)); - } - - @Test - public void testGetUsers() { - // mock 数据 - SysUserDO dbUser = initGetUserPageData(); - // 准备参数 - SysUserExportReqVO reqVO = new SysUserExportReqVO(); - reqVO.setUsername("yudao"); - reqVO.setMobile("1560"); - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - reqVO.setBeginTime(buildTime(2020, 12, 1)); - reqVO.setEndTime(buildTime(2020, 12, 24)); - reqVO.setDeptId(1L); // 其中,1L 是 2L 的父部门 - // mock 方法 - List deptList = newArrayList(randomPojo(SysDeptDO.class, o -> o.setId(2L))); - when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); - - // 调用 - List list = userService.getUsers(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbUser, list.get(0)); - } - - /** - * 初始化 getUserPage 方法的测试数据 - */ - private SysUserDO initGetUserPageData() { - // mock 数据 - SysUserDO dbUser = randomSysUserDO(o -> { // 等会查询到 - o.setUsername("yudaoyuanma"); - o.setMobile("15601691300"); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - o.setCreateTime(buildTime(2020, 12, 12)); - o.setDeptId(2L); - }); - userMapper.insert(dbUser); - // 测试 username 不匹配 - userMapper.insert(ObjectUtils.clone(dbUser, o -> o.setUsername("yuanma"))); - // 测试 mobile 不匹配 - userMapper.insert(ObjectUtils.clone(dbUser, o -> o.setMobile("18818260888"))); - // 测试 status 不匹配 - userMapper.insert(ObjectUtils.clone(dbUser, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); - // 测试 createTime 不匹配 - userMapper.insert(ObjectUtils.clone(dbUser, o -> o.setCreateTime(buildTime(2020, 11, 11)))); - // 测试 dept 不匹配 - userMapper.insert(ObjectUtils.clone(dbUser, o -> o.setDeptId(0L))); - return dbUser; - } - - /** - * 情况一,校验不通过,导致插入失败 - */ - @Test - public void testImportUsers_01() { - // 准备参数 - SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class); - // mock 方法 - - // 调用 - SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); - // 断言 - assertEquals(0, respVO.getCreateUsernames().size()); - assertEquals(0, respVO.getUpdateUsernames().size()); - assertEquals(1, respVO.getFailureUsernames().size()); - assertEquals(DEPT_NOT_FOUND.getMsg(), respVO.getFailureUsernames().get(importUser.getUsername())); - } - - /** - * 情况二,不存在,进行插入 - */ - @Test - public void testImportUsers_02() { - // 准备参数 - SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class, o -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 - }); - // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { - o.setId(importUser.getDeptId()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); - // mock passwordEncoder 的方法 - when(passwordEncoder.encode(eq("yudaoyuanma"))).thenReturn("java"); - - // 调用 - SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); - // 断言 - assertEquals(1, respVO.getCreateUsernames().size()); - SysUserDO user = userMapper.selectByUsername(respVO.getCreateUsernames().get(0)); - assertPojoEquals(importUser, user); - assertEquals("java", user.getPassword()); - assertEquals(0, respVO.getUpdateUsernames().size()); - assertEquals(0, respVO.getFailureUsernames().size()); - } - - /** - * 情况三,存在,但是不强制更新 - */ - @Test - public void testImportUsers_03() { - // mock 数据 - SysUserDO dbUser = randomSysUserDO(); - userMapper.insert(dbUser); - // 准备参数 - SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class, o -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 - o.setUsername(dbUser.getUsername()); - }); - // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { - o.setId(importUser.getDeptId()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); - - // 调用 - SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), false); - // 断言 - assertEquals(0, respVO.getCreateUsernames().size()); - assertEquals(0, respVO.getUpdateUsernames().size()); - assertEquals(1, respVO.getFailureUsernames().size()); - assertEquals(USER_USERNAME_EXISTS.getMsg(), respVO.getFailureUsernames().get(importUser.getUsername())); - } - - /** - * 情况四,存在,强制更新 - */ - @Test - public void testImportUsers_04() { - // mock 数据 - SysUserDO dbUser = randomSysUserDO(); - userMapper.insert(dbUser); - // 准备参数 - SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class, o -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 - o.setUsername(dbUser.getUsername()); - }); - // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { - o.setId(importUser.getDeptId()); - o.setStatus(CommonStatusEnum.ENABLE.getStatus()); - }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); - - // 调用 - SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); - // 断言 - assertEquals(0, respVO.getCreateUsernames().size()); - assertEquals(1, respVO.getUpdateUsernames().size()); - SysUserDO user = userMapper.selectByUsername(respVO.getUpdateUsernames().get(0)); - assertPojoEquals(importUser, user); - assertEquals(0, respVO.getFailureUsernames().size()); - } - - @Test - public void testCheckUserExists_notExists() { - assertServiceException(() -> userService.checkUserExists(randomLongId()), USER_NOT_EXISTS); - } - - @Test - public void testCheckUsernameUnique_usernameExistsForCreate() { - // 准备参数 - String username = randomString(); - // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setUsername(username))); - - // 调用,校验异常 - assertServiceException(() -> userService.checkUsernameUnique(null, username), - USER_USERNAME_EXISTS); - } - - @Test - public void testCheckUsernameUnique_usernameExistsForUpdate() { - // 准备参数 - Long id = randomLongId(); - String username = randomString(); - // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setUsername(username))); - - // 调用,校验异常 - assertServiceException(() -> userService.checkUsernameUnique(id, username), - USER_USERNAME_EXISTS); - } - - @Test - public void testCheckEmailUnique_emailExistsForCreate() { - // 准备参数 - String email = randomString(); - // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setEmail(email))); - - // 调用,校验异常 - assertServiceException(() -> userService.checkEmailUnique(null, email), - USER_EMAIL_EXISTS); - } - - @Test - public void testCheckEmailUnique_emailExistsForUpdate() { - // 准备参数 - Long id = randomLongId(); - String email = randomString(); - // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setEmail(email))); - - // 调用,校验异常 - assertServiceException(() -> userService.checkEmailUnique(id, email), - USER_EMAIL_EXISTS); - } - - @Test - public void testCheckMobileUnique_mobileExistsForCreate() { - // 准备参数 - String mobile = randomString(); - // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setMobile(mobile))); - - // 调用,校验异常 - assertServiceException(() -> userService.checkMobileUnique(null, mobile), - USER_MOBILE_EXISTS); - } - - @Test - public void testCheckMobileUnique_mobileExistsForUpdate() { - // 准备参数 - Long id = randomLongId(); - String mobile = randomString(); - // mock 数据 - userMapper.insert(randomSysUserDO(o -> o.setMobile(mobile))); - - // 调用,校验异常 - assertServiceException(() -> userService.checkMobileUnique(id, mobile), - USER_MOBILE_EXISTS); - } - - @Test - public void testCheckDeptEnable_notFound() { - assertServiceException(() -> userService.checkDeptEnable(randomLongId()), - DEPT_NOT_FOUND); - } - - @Test - public void testCheckDeptEnable_notEnable() { - // 准备参数 - Long deptId = randomLongId(); - // mock deptService 的方法 - SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { - o.setId(deptId); - o.setStatus(CommonStatusEnum.DISABLE.getStatus()); - }); - when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); - - // 调用,校验异常 - assertServiceException(() -> userService.checkDeptEnable(deptId), - DEPT_NOT_ENABLE); - } - - @Test - public void testCheckPostEnable_notFound() { - assertServiceException(() -> userService.checkPostEnable(randomSet(Long.class)), - POST_NOT_FOUND); - } - - @Test - public void testCheckPostEnable_notEnable() { - // 准备参数 - Set postIds = randomSet(Long.class); - // mock postService 的方法 - List posts = CollectionUtils.convertList(postIds, postId -> - randomPojo(SysPostDO.class, o -> { - o.setId(postId); - o.setStatus(CommonStatusEnum.DISABLE.getStatus()); - })); - when(postService.getPosts(eq(postIds), isNull())).thenReturn(posts); - - // 调用,校验异常 - assertServiceException(() -> userService.checkPostEnable(postIds), - POST_NOT_ENABLE, CollUtil.getFirst(posts).getName()); - } - - @Test - public void testCheckOldPassword_notExists() { - assertServiceException(() -> userService.checkOldPassword(randomLongId(), randomString()), - USER_NOT_EXISTS); - } - - @Test - public void testCheckOldPassword_passwordFailed() { - // mock 数据 - SysUserDO user = randomSysUserDO(); - userMapper.insert(user); - // 准备参数 - Long id = user.getId(); - String oldPassword = user.getPassword(); - - // 调用,校验异常 - assertServiceException(() -> userService.checkOldPassword(id, oldPassword), - USER_PASSWORD_FAILED); - // 校验调用 - verify(passwordEncoder, times(1)).matches(eq(oldPassword), eq(user.getPassword())); - } - - // ========== 随机对象 ========== - - @SafeVarargs - private static SysUserDO randomSysUserDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 - o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 - }; - return randomPojo(SysUserDO.class, ArrayUtils.append(consumer, consumers)); - } - -} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisUnitTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisUnitTest.java new file mode 100644 index 0000000..2cc60cc --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbAndRedisUnitTest.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.adminserver; + +import cn.iocoder.yudao.adminserver.config.RedisTestConfiguration; +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; +import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; +import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB + Redis 的单元测试 + * + * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis + * + * @author 芋道源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbAndRedisUnitTest { + + @Import({ + // DB 配置类 + YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + // MyBatis 配置类 + YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + // Redis 配置类 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java new file mode 100644 index 0000000..5f7daed --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.adminserver; + +import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; +import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB 的单元测试 + * + * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 + * + * @author 芋道源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbUnitTest { + + @Import({ + // DB 配置类 + YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + // MyBatis 配置类 + YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + }) + public static class Application { + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseMockitoUnitTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseMockitoUnitTest.java new file mode 100644 index 0000000..74e9d7f --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseMockitoUnitTest.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.adminserver; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +/** + * 纯 Mockito 的单元测试 + * + * @author 芋道源码 + */ +@ExtendWith(MockitoExtension.class) +public class BaseMockitoUnitTest { +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseRedisUnitTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseRedisUnitTest.java new file mode 100644 index 0000000..fa6bd63 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseRedisUnitTest.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.adminserver; + +import cn.iocoder.yudao.adminserver.config.RedisTestConfiguration; +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; +import cn.iocoder.yudao.framework.tracer.config.YudaoTracerAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +/** + * 依赖内存 Redis 的单元测试 + * + * 相比 {@link BaseDbUnitTest} 来说,从内存 DB 改成了内存 Redis + * + * @author 芋道源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +public class BaseRedisUnitTest { + + @Import({ + // Redis 配置类 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + YudaoTracerAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/QuartzTestConfiguration.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/QuartzTestConfiguration.java new file mode 100644 index 0000000..0bbce19 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/QuartzTestConfiguration.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.adminserver.config; + +import org.mockito.Mockito; +import org.quartz.Scheduler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QuartzTestConfiguration { + + @Bean + public Scheduler scheduler() { + return Mockito.mock(Scheduler.class); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/RedisTestConfiguration.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/RedisTestConfiguration.java new file mode 100644 index 0000000..15a39f7 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/config/RedisTestConfiguration.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.adminserver.config; + +import com.github.fppt.jedismock.RedisServer; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +import java.io.IOException; + +@Configuration(proxyBeanMethods = false) +@Lazy(false) // 禁止延迟加载 +@EnableConfigurationProperties(RedisProperties.class) +public class RedisTestConfiguration { + + /** + * 创建模拟的 Redis Server 服务器 + */ + @Bean + public RedisServer redisServer(RedisProperties properties) throws IOException { + RedisServer redisServer = new RedisServer(properties.getPort()); + // TODO 芋艿:一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。 + try { + redisServer.start(); + } catch (Exception ignore) {} + return redisServer; + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigServiceTest.java new file mode 100644 index 0000000..4ef105d --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigServiceTest.java @@ -0,0 +1,256 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.config; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config.InfConfigMapper; +import cn.iocoder.yudao.adminserver.modules.infra.enums.config.InfConfigTypeEnum; +import cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config.InfConfigProducer; +import cn.iocoder.yudao.adminserver.modules.infra.service.config.impl.InfConfigServiceImpl; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +/** + * {@link InfConfigServiceImpl} 的单元测试类 + * + * @author 芋道源码 + */ +@Import(InfConfigServiceImpl.class) +public class InfConfigServiceTest extends BaseDbUnitTest { + + @Resource + private InfConfigServiceImpl configService; + + @Resource + private InfConfigMapper configMapper; + @MockBean + private InfConfigProducer configProducer; + + @Test + public void testCreateConfig_success() { + // 准备参数 + InfConfigCreateReqVO reqVO = randomPojo(InfConfigCreateReqVO.class); + + // 调用 + Long configId = configService.createConfig(reqVO); + // 断言 + assertNotNull(configId); + // 校验记录的属性是否正确 + InfConfigDO config = configMapper.selectById(configId); + assertPojoEquals(reqVO, config); + assertEquals(InfConfigTypeEnum.CUSTOM.getType(), config.getType()); + // 校验调用 + verify(configProducer, times(1)).sendConfigRefreshMessage(); + } + + @Test + public void testUpdateConfig_success() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class, o -> { + o.setId(dbConfig.getId()); // 设置更新的 ID + }); + + // 调用 + configService.updateConfig(reqVO); + // 校验是否更新正确 + InfConfigDO config = configMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, config); + // 校验调用 + verify(configProducer, times(1)).sendConfigRefreshMessage(); + } + + @Test + public void testDeleteConfig_success() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(o -> { + o.setType(InfConfigTypeEnum.CUSTOM.getType()); // 只能删除 CUSTOM 类型 + }); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbConfig.getId(); + + // 调用 + configService.deleteConfig(id); + // 校验数据不存在了 + assertNull(configMapper.selectById(id)); + // 校验调用 + verify(configProducer, times(1)).sendConfigRefreshMessage(); + } + + @Test + public void testDeleteConfig_canNotDeleteSystemType() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(o -> { + o.setType(InfConfigTypeEnum.SYSTEM.getType()); // SYSTEM 不允许删除 + }); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbConfig.getId(); + + // 调用, 并断言异常 + assertServiceException(() -> configService.deleteConfig(id), CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); + } + + @Test + public void testCheckConfigExists_success() { + // mock 数据 + InfConfigDO dbConfigDO = randomInfConfigDO(); + configMapper.insert(dbConfigDO);// @Sql: 先插入出一条存在的数据 + + // 调用成功 + configService.checkConfigExists(dbConfigDO.getId()); + } + + @Test + public void testCheckConfigExist_notExists() { + assertServiceException(() -> configService.checkConfigExists(randomLongId()), CONFIG_NOT_EXISTS); + } + + @Test + public void testCheckConfigKeyUnique_success() { + // 调用,成功 + configService.checkConfigKeyUnique(randomLongId(), randomString()); + } + + @Test + public void testCheckConfigKeyUnique_keyDuplicateForCreate() { + // 准备参数 + String key = randomString(); + // mock 数据 + configMapper.insert(randomInfConfigDO(o -> o.setKey(key))); + + // 调用,校验异常 + assertServiceException(() -> configService.checkConfigKeyUnique(null, key), + CONFIG_KEY_DUPLICATE); + } + + @Test + public void testCheckConfigKeyUnique_keyDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + String key = randomString(); + // mock 数据 + configMapper.insert(randomInfConfigDO(o -> o.setKey(key))); + + // 调用,校验异常 + assertServiceException(() -> configService.checkConfigKeyUnique(id, key), + CONFIG_KEY_DUPLICATE); + } + + @Test + public void testGetConfigPage() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 + o.setName("芋艿"); + o.setKey("yunai"); + o.setType(InfConfigTypeEnum.SYSTEM.getType()); + o.setCreateTime(buildTime(2021, 2, 1)); + }); + configMapper.insert(dbConfig); + // 测试 name 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); + // 测试 key 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); + // 测试 type 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); + // 测试 createTime 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + InfConfigPageReqVO reqVO = new InfConfigPageReqVO(); + reqVO.setName("艿"); + reqVO.setKey("nai"); + reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); + reqVO.setBeginTime(buildTime(2021, 1, 15)); + reqVO.setEndTime(buildTime(2021, 2, 15)); + + // 调用 + PageResult pageResult = configService.getConfigPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbConfig, pageResult.getList().get(0)); + } + + @Test + public void testGetConfigList() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 + o.setName("芋艿"); + o.setKey("yunai"); + o.setType(InfConfigTypeEnum.SYSTEM.getType()); + o.setCreateTime(buildTime(2021, 2, 1)); + }); + configMapper.insert(dbConfig); + // 测试 name 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); + // 测试 key 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); + // 测试 type 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); + // 测试 createTime 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + InfConfigExportReqVO reqVO = new InfConfigExportReqVO(); + reqVO.setName("艿"); + reqVO.setKey("nai"); + reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); + reqVO.setBeginTime(buildTime(2021, 1, 15)); + reqVO.setEndTime(buildTime(2021, 2, 15)); + + // 调用 + List list = configService.getConfigList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbConfig, list.get(0)); + } + + @Test + public void testGetConfigByKey() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + String key = dbConfig.getKey(); + + // 调用 + InfConfigDO config = configService.getConfigByKey(key); + // 断言 + assertNotNull(config); + assertPojoEquals(dbConfig, config); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static InfConfigDO randomInfConfigDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setType(randomEle(InfConfigTypeEnum.values()).getType()); // 保证 key 的范围 + }; + return randomPojo(InfConfigDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java new file mode 100644 index 0000000..260ae7c --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java @@ -0,0 +1,126 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.file; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.framework.file.config.FileProperties; +import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file.InfFileMapper; +import cn.iocoder.yudao.adminserver.modules.infra.service.file.impl.InfFileServiceImpl; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.FILE_NOT_EXISTS; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.*; + +@Import({InfFileServiceImpl.class, FileProperties.class}) +public class InfFileServiceTest extends BaseDbUnitTest { + + @Resource + private InfFileServiceImpl fileService; + + @Resource + private FileProperties fileProperties; + @Resource + private InfFileMapper fileMapper; + + @Test + public void testCreateFile_success() { + // 准备参数 + String path = randomString(); + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + + // 调用 + String url = fileService.createFile(path, content); + // 断言 + assertEquals(fileProperties.getBasePath() + path, url); + // 校验数据 + InfFileDO file = fileMapper.selectById(path); + assertEquals(path, file.getId()); + assertEquals("jpg", file.getType()); + assertArrayEquals(content, file.getContent()); + } + + @Test + public void testCreateFile_exists() { + // mock 数据 + InfFileDO dbFile = randomPojo(InfFileDO.class); + fileMapper.insert(dbFile); + // 准备参数 + String path = dbFile.getId(); // 模拟已存在 + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + + // 调用,并断言异常 + assertServiceException(() -> fileService.createFile(path, content), FILE_PATH_EXISTS); + } + + @Test + public void testDeleteFile_success() { + // mock 数据 + InfFileDO dbFile = randomPojo(InfFileDO.class); + fileMapper.insert(dbFile);// @Sql: 先插入出一条存在的数据 + // 准备参数 + String id = dbFile.getId(); + + // 调用 + fileService.deleteFile(id); + // 校验数据不存在了 + assertNull(fileMapper.selectById(id)); + } + + @Test + public void testDeleteFile_notExists() { + // 准备参数 + String id = randomString(); + + // 调用, 并断言异常 + assertServiceException(() -> fileService.deleteFile(id), FILE_NOT_EXISTS); + } + + @Test + public void testGetFilePage() { + // mock 数据 + InfFileDO dbFile = randomPojo(InfFileDO.class, o -> { // 等会查询到 + o.setId("yudao"); + o.setType("jpg"); + o.setCreateTime(buildTime(2021, 1, 15)); + }); + fileMapper.insert(dbFile); + // 测试 id 不匹配 + fileMapper.insert(ObjectUtils.clone(dbFile, o -> o.setId("tudou"))); + // 测试 type 不匹配 + fileMapper.insert(ObjectUtils.clone(dbFile, o -> { + o.setId("yudao02"); + o.setType("png"); + })); + // 测试 createTime 不匹配 + fileMapper.insert(ObjectUtils.clone(dbFile, o -> { + o.setId("yudao03"); + o.setCreateTime(buildTime(2020, 1, 15)); + })); + // 准备参数 + InfFilePageReqVO reqVO = new InfFilePageReqVO(); + reqVO.setId("yudao"); + reqVO.setType("jp"); + reqVO.setBeginCreateTime(buildTime(2021, 1, 10)); + reqVO.setEndCreateTime(buildTime(2021, 1, 20)); + + // 调用 + PageResult pageResult = fileService.getFilePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbFile, pageResult.getList().get(0), "content"); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogServiceTest.java new file mode 100644 index 0000000..4e4f172 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobLogServiceTest.java @@ -0,0 +1,173 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.job; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job.InfJobLogMapper; +import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobLogStatusEnum; +import cn.iocoder.yudao.adminserver.modules.infra.service.job.impl.InfJobLogServiceImpl; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; + +/** + * {@link InfJobLogServiceImpl} 的单元测试 + * + * @author neilz + */ +@Import(InfJobLogServiceImpl.class) +public class InfJobLogServiceTest extends BaseDbUnitTest { + + @Resource + private InfJobLogServiceImpl jobLogService; + @Resource + private InfJobLogMapper jobLogMapper; + + @Test + public void testCreateJobLog_success() { + // 准备参数 + InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> { + o.setExecuteIndex(1); + }); + // 调用 + Long jobLogId = jobLogService.createJobLog(reqVO.getJobId(), reqVO.getBeginTime(), reqVO.getHandlerName(), reqVO.getHandlerParam(), reqVO.getExecuteIndex()); + // 断言 + assertNotNull(jobLogId); + // 校验记录的属性是否正确 + InfJobLogDO job = jobLogMapper.selectById(jobLogId); + assertEquals(InfJobLogStatusEnum.RUNNING.getStatus(), job.getStatus()); + } + + @Test + public void testUpdateJobLogResultAsync_success() { + // 准备参数 + InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> { + o.setExecuteIndex(1); + }); + InfJobLogDO log = InfJobLogDO.builder().jobId(reqVO.getJobId()).handlerName(reqVO.getHandlerName()).handlerParam(reqVO.getHandlerParam()).executeIndex(reqVO.getExecuteIndex()) + .beginTime(reqVO.getBeginTime()).status(InfJobLogStatusEnum.RUNNING.getStatus()).build(); + jobLogMapper.insert(log); + // 调用 + jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), true,reqVO.getResult()); + // 校验记录的属性是否正确 + InfJobLogDO job = jobLogMapper.selectById(log.getId()); + assertEquals(InfJobLogStatusEnum.SUCCESS.getStatus(), job.getStatus()); + + // 调用 + jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), false,reqVO.getResult()); + // 校验记录的属性是否正确 + InfJobLogDO job2 = jobLogMapper.selectById(log.getId()); + assertEquals(InfJobLogStatusEnum.FAILURE.getStatus(), job2.getStatus()); + } + + @Test + public void testGetJobLogListByIds_success() { + // mock 数据 + InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { + o.setExecuteIndex(1); + o.setStatus(randomEle(InfJobLogStatusEnum.values()).getStatus()); // 保证 status 的范围 + }); + InfJobLogDO cloneJobLog = ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString())); + jobLogMapper.insert(dbJobLog); + // 测试 handlerName 不匹配 + jobLogMapper.insert(cloneJobLog); + // 准备参数 + ArrayList ids = new ArrayList<>(); + ids.add(dbJobLog.getId()); + ids.add(cloneJobLog.getId()); + // 调用 + List list = jobLogService.getJobLogList(ids); + // 断言 + assertEquals(2, list.size()); + assertPojoEquals(dbJobLog, list.get(0)); + } + + @Test + public void testGetJobPage_success() { + // mock 数据 + InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { + o.setExecuteIndex(1); + o.setHandlerName("handlerName 单元测试"); + o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); + o.setBeginTime(buildTime(2021, 1, 8)); + o.setEndTime(buildTime(2021, 1, 8)); + }); + jobLogMapper.insert(dbJobLog); + // 测试 jobId 不匹配 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setJobId(randomLongId()))); + // 测试 handlerName 不匹配 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString()))); + // 测试 beginTime 不匹配 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7)))); + // 测试 endTime 不匹配 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9)))); + // 测试 status 不匹配 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus()))); + // 准备参数 + InfJobLogPageReqVO reqVo = new InfJobLogPageReqVO(); + reqVo.setJobId(dbJobLog.getJobId()); + reqVo.setHandlerName("单元"); + reqVo.setBeginTime(dbJobLog.getBeginTime()); + reqVo.setEndTime(dbJobLog.getEndTime()); + reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); + // 调用 + PageResult pageResult = jobLogService.getJobLogPage(reqVo); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbJobLog, pageResult.getList().get(0)); + } + + @Test + public void testGetJobListForExport_success() { + // mock 数据 + InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { + o.setExecuteIndex(1); + o.setHandlerName("handlerName 单元测试"); + o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); + o.setBeginTime(buildTime(2021, 1, 8)); + o.setEndTime(buildTime(2021, 1, 8)); + }); + jobLogMapper.insert(dbJobLog); + // 测试 jobId 不匹配 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setJobId(randomLongId()))); + // 测试 handlerName 不匹配 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString()))); + // 测试 beginTime 不匹配 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7)))); + // 测试 endTime 不匹配 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9)))); + // 测试 status 不匹配 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus()))); + // 准备参数 + InfJobLogExportReqVO reqVo = new InfJobLogExportReqVO(); + reqVo.setJobId(dbJobLog.getJobId()); + reqVo.setHandlerName("单元"); + reqVo.setBeginTime(dbJobLog.getBeginTime()); + reqVo.setEndTime(dbJobLog.getEndTime()); + reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); + // 调用 + List list = jobLogService.getJobLogList(reqVo); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbJobLog, list.get(0)); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobServiceTest.java new file mode 100644 index 0000000..a767519 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/job/InfJobServiceTest.java @@ -0,0 +1,309 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.job; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_EQUALS; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_INVALID; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_CRON_EXPRESSION_VALID; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_HANDLER_EXISTS; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_NOT_EXISTS; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.JOB_UPDATE_ONLY_NORMAL_STATUS; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import org.junit.jupiter.api.Test; +import org.quartz.SchedulerException; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.convert.job.InfJobConvert; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job.InfJobMapper; +import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobStatusEnum; +import cn.iocoder.yudao.adminserver.modules.infra.service.job.impl.InfJobServiceImpl; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; + +/** + * {@link InfJobServiceImpl} 的单元测试 + * + * @author neilz + */ +@Import(InfJobServiceImpl.class) +public class InfJobServiceTest extends BaseDbUnitTest { + + @Resource + private InfJobServiceImpl jobService; + @Resource + private InfJobMapper jobMapper; + @MockBean + private SchedulerManager schedulerManager; + + @Test + public void testCreateJob_cronExpressionValid() { + // 准备参数。Cron 表达式为 String 类型,默认随机字符串。 + InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class); + // 调用,并断言异常 + assertServiceException(() -> jobService.createJob(reqVO), JOB_CRON_EXPRESSION_VALID); + } + + @Test + public void testCreateJob_jobHandlerExists() throws SchedulerException { + // 准备参数 指定 Cron 表达式 + InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + // 调用 + jobService.createJob(reqVO); + // 调用,并断言异常 + assertServiceException(() -> jobService.createJob(reqVO), JOB_HANDLER_EXISTS); + } + + @Test + public void testCreateJob_success() throws SchedulerException { + // 准备参数 指定 Cron 表达式 + InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + // 调用 + Long jobId = jobService.createJob(reqVO); + // 断言 + assertNotNull(jobId); + // 校验记录的属性是否正确 + InfJobDO job = jobMapper.selectById(jobId); + assertPojoEquals(reqVO, job); + assertEquals(InfJobStatusEnum.NORMAL.getStatus(), job.getStatus()); + // 校验调用 + verify(schedulerManager, times(1)).addJob(eq(job.getId()), eq(job.getHandlerName()), eq(job.getHandlerParam()), eq(job.getCronExpression()), + eq(reqVO.getRetryCount()), eq(reqVO.getRetryInterval())); + } + + @Test + public void testUpdateJob_jobNotExists(){ + // 准备参数 + InfJobUpdateReqVO reqVO = randomPojo(InfJobUpdateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + // 调用,并断言异常 + assertServiceException(() -> jobService.updateJob(reqVO), JOB_NOT_EXISTS); + } + + @Test + public void testUpdateJob_onlyNormalStatus(){ + // mock 数据 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); + job.setStatus(InfJobStatusEnum.INIT.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 准备参数 + InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> { + o.setId(job.getId()); + o.setName(createReqVO.getName()); + o.setCronExpression(createReqVO.getCronExpression()); + }); + // 调用,并断言异常 + assertServiceException(() -> jobService.updateJob(updateReqVO), JOB_UPDATE_ONLY_NORMAL_STATUS); + } + + @Test + public void testUpdateJob_success() throws SchedulerException { + // mock 数据 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); + job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 准备参数 + InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> { + o.setId(job.getId()); + o.setName(createReqVO.getName()); + o.setCronExpression(createReqVO.getCronExpression()); + }); + // 调用 + jobService.updateJob(updateReqVO); + // 校验记录的属性是否正确 + InfJobDO updateJob = jobMapper.selectById(updateReqVO.getId()); + assertPojoEquals(updateReqVO, updateJob); + // 校验调用 + verify(schedulerManager, times(1)).updateJob(eq(job.getHandlerName()), eq(updateReqVO.getHandlerParam()), eq(updateReqVO.getCronExpression()), + eq(updateReqVO.getRetryCount()), eq(updateReqVO.getRetryInterval())); + } + + @Test + public void testUpdateJobStatus_changeStatusInvalid() { + // 调用,并断言异常 + assertServiceException(() -> jobService.updateJobStatus(1l, InfJobStatusEnum.INIT.getStatus()), JOB_CHANGE_STATUS_INVALID); + } + + @Test + public void testUpdateJobStatus_changeStatusEquals() { + // mock 数据 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); + job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 调用,并断言异常 + assertServiceException(() -> jobService.updateJobStatus(job.getId(), job.getStatus()), JOB_CHANGE_STATUS_EQUALS); + } + + @Test + public void testUpdateJobStatus_NormalToStop_success() throws SchedulerException { + // mock 数据 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); + job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 调用 + jobService.updateJobStatus(job.getId(), InfJobStatusEnum.STOP.getStatus()); + // 校验记录的属性是否正确 + InfJobDO updateJob = jobMapper.selectById(job.getId()); + assertEquals(InfJobStatusEnum.STOP.getStatus(), updateJob.getStatus()); + // 校验调用 + verify(schedulerManager, times(1)).pauseJob(eq(job.getHandlerName())); + } + + @Test + public void testUpdateJobStatus_StopToNormal_success() throws SchedulerException { + // mock 数据 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); + job.setStatus(InfJobStatusEnum.STOP.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 调用 + jobService.updateJobStatus(job.getId(), InfJobStatusEnum.NORMAL.getStatus()); + // 校验记录的属性是否正确 + InfJobDO updateJob = jobMapper.selectById(job.getId()); + assertEquals(InfJobStatusEnum.NORMAL.getStatus(), updateJob.getStatus()); + // 校验调用 + verify(schedulerManager, times(1)).resumeJob(eq(job.getHandlerName())); + } + + @Test + public void testTriggerJob_success() throws SchedulerException { + // mock 数据 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); + job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 调用 + jobService.triggerJob(job.getId()); + // 校验调用 + verify(schedulerManager, times(1)).triggerJob(eq(job.getId()), eq(job.getHandlerName()), eq(job.getHandlerParam())); + } + + @Test + public void testDeleteJob_success() throws SchedulerException { + // mock 数据 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); + job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 调用 UPDATE inf_job SET deleted=1 WHERE id=? AND deleted=0 + jobService.deleteJob(job.getId()); + // 校验数据不存在了 WHERE id=? AND deleted=0 查询为空正常 + assertNull(jobMapper.selectById(job.getId())); + // 校验调用 + verify(schedulerManager, times(1)).deleteJob(eq(job.getHandlerName())); + } + + @Test + public void testGetJobListByIds_success() { + // mock 数据 + InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { + o.setStatus(randomEle(InfJobStatusEnum.values()).getStatus()); // 保证 status 的范围 + }); + InfJobDO cloneJob = ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString())); + jobMapper.insert(dbJob); + // 测试 handlerName 不匹配 + jobMapper.insert(cloneJob); + // 准备参数 + ArrayList ids = new ArrayList<>(); + ids.add(dbJob.getId()); + ids.add(cloneJob.getId()); + // 调用 + List list = jobService.getJobList(ids); + // 断言 + assertEquals(2, list.size()); + assertPojoEquals(dbJob, list.get(0)); + } + + @Test + public void testGetJobPage_success() { + // mock 数据 + InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { + o.setName("定时任务测试"); + o.setHandlerName("handlerName 单元测试"); + o.setStatus(InfJobStatusEnum.INIT.getStatus()); + }); + jobMapper.insert(dbJob); + // 测试 name 不匹配 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setName("土豆"))); + // 测试 status 不匹配 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus()))); + // 测试 handlerName 不匹配 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString()))); + // 准备参数 + InfJobPageReqVO reqVo = new InfJobPageReqVO(); + reqVo.setName("定时"); + reqVo.setStatus(InfJobStatusEnum.INIT.getStatus()); + reqVo.setHandlerName("单元"); + // 调用 + PageResult pageResult = jobService.getJobPage(reqVo); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbJob, pageResult.getList().get(0)); + } + + @Test + public void testGetJobListForExport_success() { + // mock 数据 + InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { + o.setName("定时任务测试"); + o.setHandlerName("handlerName 单元测试"); + o.setStatus(InfJobStatusEnum.INIT.getStatus()); + }); + jobMapper.insert(dbJob); + // 测试 name 不匹配 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setName("土豆"))); + // 测试 status 不匹配 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus()))); + // 测试 handlerName 不匹配 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString()))); + // 准备参数 + InfJobExportReqVO reqVo = new InfJobExportReqVO(); + reqVo.setName("定时"); + reqVo.setStatus(InfJobStatusEnum.INIT.getStatus()); + reqVo.setHandlerName("单元"); + // 调用 + List list = jobService.getJobList(reqVo); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbJob, list.get(0)); + } + + private static void fillJobMonitorTimeoutEmpty(InfJobDO job) { + if (job.getMonitorTimeout() == null) { + job.setMonitorTimeout(0); + } + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java new file mode 100644 index 0000000..689b88e --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java @@ -0,0 +1,176 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.logger; + +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiAccessLogMapper; +import cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl.InfApiAccessLogServiceImpl; +import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.concurrent.Future; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * {@link InfApiAccessLogServiceImpl} 单元测试 + */ +@Import(InfApiAccessLogServiceImpl.class) +public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private InfApiAccessLogService infApiAccessLogServiceImpl; + + @Resource + private InfApiAccessLogMapper infApiAccessLogMapper; + + @Test + public void testCreateApiAccessLogAsync() throws Exception { + ApiAccessLogCreateDTO createDTO = RandomUtils.randomPojo( + ApiAccessLogCreateDTO.class, + dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()) + ); + + // 执行service方法 + Future future = infApiAccessLogServiceImpl.createApiAccessLogAsync(createDTO); + + // 等异步执行完 + future.get(); + + InfApiAccessLogDO infApiAccessLogDO = infApiAccessLogMapper.selectOne(null); + // 断言 + assertNotNull(infApiAccessLogDO); + // 断言,忽略基本字段 + assertPojoEquals(createDTO, infApiAccessLogDO); + } + + @Test + public void testGetApiAccessLogPage() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "yudao-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int duration = 1000; + int resultCode = GlobalErrorCodeConstants.SUCCESS.getCode(); + + InfApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(InfApiAccessLogDO.class, dto -> { + dto.setUserId(userId); + dto.setUserType(userType); + dto.setApplicationName(applicationName); + dto.setRequestUrl(requestUrl); + dto.setBeginTime(beginTime); + dto.setDuration(duration); + dto.setResultCode(resultCode); + }); + infApiAccessLogMapper.insert(infApiAccessLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); + // userType + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); + // duration 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setDuration(100))); + // resultCode 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); + + // 构造调用参数 + InfApiAccessLogPageReqVO reqVO = new InfApiAccessLogPageReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setBeginBeginTime(buildTime(2021, 3, 12)); + reqVO.setEndBeginTime(buildTime(2021, 3, 14)); + reqVO.setDuration(duration); + reqVO.setResultCode(resultCode); + + // 调用service方法 + PageResult pageResult = infApiAccessLogServiceImpl.getApiAccessLogPage(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(infApiAccessLogDO, pageResult.getList().get(0)); + } + + @Test + public void testGetApiAccessLogList() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "yudao-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int duration = 1000; + int resultCode = GlobalErrorCodeConstants.SUCCESS.getCode(); + + InfApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(InfApiAccessLogDO.class, dto -> { + dto.setUserId(userId); + dto.setUserType(userType); + dto.setApplicationName(applicationName); + dto.setRequestUrl(requestUrl); + dto.setBeginTime(beginTime); + dto.setDuration(duration); + dto.setResultCode(resultCode); + }); + infApiAccessLogMapper.insert(infApiAccessLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); + // userType + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); + // duration 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setDuration(100))); + // resultCode 不同的 + infApiAccessLogMapper.insert(ObjectUtils.clone(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); + + // 构造调用参数 + InfApiAccessLogExportReqVO reqVO = new InfApiAccessLogExportReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setBeginBeginTime(buildTime(2021, 3, 12)); + reqVO.setEndBeginTime(buildTime(2021, 3, 14)); + reqVO.setDuration(duration); + reqVO.setResultCode(resultCode); + + // 调用service方法 + List list = infApiAccessLogServiceImpl.getApiAccessLogList(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, list.size()); + assertPojoEquals(infApiAccessLogDO, list.get(0)); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java new file mode 100644 index 0000000..0a0c26c --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java @@ -0,0 +1,207 @@ +package cn.iocoder.yudao.adminserver.modules.infra.service.logger; + +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO; +import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiErrorLogMapper; +import cn.iocoder.yudao.adminserver.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; +import cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl.InfApiErrorLogServiceImpl; +import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.concurrent.Future; + +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; +import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_PROCESSED; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * {@link InfApiErrorLogServiceImpl} 单元测试 + */ +@Import(InfApiErrorLogServiceImpl.class) +public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private InfApiErrorLogService infApiErrorLogServiceImpl; + + @Resource + private InfApiErrorLogMapper infApiErrorLogMapper; + + + @Test + public void testCreateApiErrorLogAsync() throws Exception { + ApiErrorLogCreateDTO createDTO = RandomUtils.randomPojo( + ApiErrorLogCreateDTO.class, + dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()) + ); + + // 执行service方法 + Future future = infApiErrorLogServiceImpl.createApiErrorLogAsync(createDTO); + + // 等异步执行完 + future.get(); + + InfApiErrorLogDO infApiErrorLogDO = infApiErrorLogMapper.selectOne(null); + // 断言 + assertNotNull(infApiErrorLogDO); + // 断言,忽略基本字段 + assertPojoEquals(createDTO, infApiErrorLogDO); + } + + + @Test + public void testGetApiErrorLogPage() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "yudao-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus(); + + InfApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + logDO.setUserId(userId); + logDO.setUserType(userType); + logDO.setApplicationName(applicationName); + logDO.setRequestUrl(requestUrl); + logDO.setExceptionTime(beginTime); + logDO.setProcessStatus(progressStatus); + }); + infApiErrorLogMapper.insert(infApiErrorLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserId(3344L))); + // userType + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setExceptionTime(buildTime(2021, 2, 6)))); + // progressStatus 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()))); + + // 构造调用参数 + InfApiErrorLogPageReqVO reqVO = new InfApiErrorLogPageReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setBeginExceptionTime(buildTime(2021, 3, 12)); + reqVO.setEndExceptionTime(buildTime(2021, 3, 14)); + reqVO.setProcessStatus(progressStatus); + + // 调用service方法 + PageResult pageResult = infApiErrorLogServiceImpl.getApiErrorLogPage(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(infApiErrorLogDO, pageResult.getList().get(0)); + } + + @Test + public void testGetApiErrorLogList() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "yudao-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus(); + + InfApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + logDO.setUserId(userId); + logDO.setUserType(userType); + logDO.setApplicationName(applicationName); + logDO.setRequestUrl(requestUrl); + logDO.setExceptionTime(beginTime); + logDO.setProcessStatus(progressStatus); + }); + infApiErrorLogMapper.insert(infApiErrorLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserId(3344L))); + // userType + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setExceptionTime(buildTime(2021, 2, 6)))); + // progressStatus 不同的 + infApiErrorLogMapper.insert(ObjectUtils.clone(infApiErrorLogDO, logDO -> logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()))); + + // 构造调用参数 + InfApiErrorLogExportReqVO reqVO = new InfApiErrorLogExportReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setBeginExceptionTime(buildTime(2021, 3, 12)); + reqVO.setEndExceptionTime(buildTime(2021, 3, 14)); + reqVO.setProcessStatus(progressStatus); + + // 调用service方法 + List list = infApiErrorLogServiceImpl.getApiErrorLogList(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, list.size()); + assertPojoEquals(infApiErrorLogDO, list.get(0)); + } + + + @Test + public void testUpdateApiErrorLogProcess() { + // 先构造两条数据,第一条用于抛出异常,第二条用于正常的执行update操作 + Long processUserId = 2233L; + + InfApiErrorLogDO first = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + logDO.setProcessUserId(processUserId); + logDO.setUserType(UserTypeEnum.ADMIN.getValue()); + logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.DONE.getStatus()); + }); + infApiErrorLogMapper.insert(first); + + InfApiErrorLogDO second = RandomUtils.randomPojo(InfApiErrorLogDO.class, logDO -> { + logDO.setProcessUserId(1122L); + logDO.setUserType(UserTypeEnum.ADMIN.getValue()); + logDO.setProcessStatus(InfApiErrorLogProcessStatusEnum.INIT.getStatus()); + }); + infApiErrorLogMapper.insert(second); + + Long firstId = first.getId(); + Long secondId = second.getId(); + + // 执行正常的 update 操作 + infApiErrorLogServiceImpl.updateApiErrorLogProcess(secondId, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId); + InfApiErrorLogDO secondSelect = infApiErrorLogMapper.selectOne("id", secondId); + + // id 为 0 查询不到,应该抛出异常 API_ERROR_LOG_NOT_FOUND + assertServiceException(() -> infApiErrorLogServiceImpl.updateApiErrorLogProcess(0L, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_NOT_FOUND); + // id 为 first 的 progressStatus 为 DONE ,应该抛出 API_ERROR_LOG_PROCESSED + assertServiceException(() -> infApiErrorLogServiceImpl.updateApiErrorLogProcess(firstId, InfApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_PROCESSED); + // 验证 progressStatus 是否修改成功 + assertEquals(InfApiErrorLogProcessStatusEnum.DONE.getStatus(), secondSelect.getProcessStatus()); + // 验证 progressUserId 是否修改成功 + assertEquals(processUserId, secondSelect.getProcessUserId()); + } +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java new file mode 100644 index 0000000..092d72f --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java @@ -0,0 +1,269 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.auth; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl; +import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService; +import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.framework.test.core.util.AssertUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.DisabledException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import javax.annotation.Resource; +import java.util.Set; + +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static java.util.Collections.singleton; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +/** + * {@link SysAuthServiceImpl} 的单元测试 + * + * @author 芋道源码 + */ +@Import(SysAuthServiceImpl.class) +public class SysAuthServiceImplTest extends BaseDbUnitTest { + + @Resource + private SysAuthServiceImpl authService; + + @MockBean + private SysUserService userService; + @MockBean + private SysPermissionService permissionService; + @MockBean + private AuthenticationManager authenticationManager; + @MockBean + private Authentication authentication; + @MockBean + private SysCaptchaService captchaService; + @MockBean + private SysLoginLogService loginLogService; + @MockBean + private SysUserSessionService userSessionService; + + @Test + public void testLoadUserByUsername_success() { + // 准备参数 + String username = randomString(); + // mock 方法 + SysUserDO user = randomPojo(SysUserDO.class, o -> o.setUsername(username)); + when(userService.getUserByUsername(eq(username))).thenReturn(user); + + // 调用 + LoginUser loginUser = (LoginUser) authService.loadUserByUsername(username); + // 校验 + AssertUtils.assertPojoEquals(user, loginUser, "updateTime"); + assertNull(loginUser.getRoleIds()); // 此时不会加载角色,所以是空的 + } + + @Test + public void testLoadUserByUsername_userNotFound() { + // 准备参数 + String username = randomString(); + // mock 方法 + + // 调用, 并断言异常 + assertThrows(UsernameNotFoundException.class, // 抛出 UsernameNotFoundException 异常 + () -> authService.loadUserByUsername(username), + username); // 异常提示为 username + } + + @Test + public void testMockLogin_success() { + // 准备参数 + Long userId = randomLongId(); + // mock 方法 01 + SysUserDO user = randomPojo(SysUserDO.class, o -> o.setId(userId)); + when(userService.getUser(eq(userId))).thenReturn(user); + // mock 方法 02 + Set roleIds = randomSet(Long.class); + when(permissionService.getUserRoleIds(eq(userId), eq(singleton(CommonStatusEnum.ENABLE.getStatus())))) + .thenReturn(roleIds); + + // 调用 + LoginUser loginUser = authService.mockLogin(userId); + // 断言 + AssertUtils.assertPojoEquals(user, loginUser, "updateTime"); + assertEquals(roleIds, loginUser.getRoleIds()); + } + + @Test + public void testMockLogin_userNotFound() { + // 准备参数 + Long userId = randomLongId(); + // mock 方法 + + // 调用, 并断言异常 + assertThrows(UsernameNotFoundException.class, // 抛出 UsernameNotFoundException 异常 + () -> authService.mockLogin(userId), + String.valueOf(userId)); // 异常提示为 userId + } + + @Test + public void testLogin_captchaNotFound() { + // 准备参数 + SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + String userIp = randomString(); + String userAgent = randomString(); + // 调用, 并断言异常 + assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_NOT_FOUND); + // 校验调用参数 + verify(loginLogService, times(1)).createLoginLog( + argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(SysLoginResultEnum.CAPTCHA_NOT_FOUND.getResult())) + ); + } + + @Test + public void testLogin_captchaCodeError() { + // 准备参数 + String userIp = randomString(); + String userAgent = randomString(); + String code = randomString(); + SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + // mock 验证码不正确 + when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(code); + // 调用, 并断言异常 + assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_CODE_ERROR); + // 校验调用参数 + verify(loginLogService, times(1)).createLoginLog( + argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult())) + ); + } + + @Test + public void testLogin_badCredentials() { + // 准备参数 + String userIp = randomString(); + String userAgent = randomString(); + SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + // mock 验证码正确 + when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); + // mock 抛出异常 + when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword()))) + .thenThrow(new BadCredentialsException("测试账号或密码不正确")); + // 调用, 并断言异常 + assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_BAD_CREDENTIALS); + // 校验调用参数 + verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); + verify(loginLogService, times(1)).createLoginLog( + argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(SysLoginResultEnum.BAD_CREDENTIALS.getResult())) + ); + } + + @Test + public void testLogin_userDisabled() { + // 准备参数 + String userIp = randomString(); + String userAgent = randomString(); + SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + // mock 验证码正确 + when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); + // mock 抛出异常 + when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword()))) + .thenThrow(new DisabledException("测试用户被禁用")); + // 调用, 并断言异常 + assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_USER_DISABLED); + // 校验调用参数 + verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); + verify(loginLogService, times(1)).createLoginLog( + argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(SysLoginResultEnum.USER_DISABLED.getResult())) + ); + } + + @Test + public void testLogin_unknownError() { + // 准备参数 + String userIp = randomString(); + String userAgent = randomString(); + SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + // mock 验证码正确 + when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); + // mock 抛出异常 + when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword()))) + .thenThrow(new AuthenticationException("测试未知异常") {}); + // 调用, 并断言异常 + assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_FAIL_UNKNOWN); + // 校验调用参数 + verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); + verify(loginLogService, times(1)).createLoginLog( + argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(SysLoginResultEnum.UNKNOWN_ERROR.getResult())) + ); + } + + @Test + public void testLogin_success() { + // 准备参数 + String userIp = randomString(); + String userAgent = randomString(); + Long userId = randomLongId(); + Set userRoleIds = randomSet(Long.class); + String sessionId = randomString(); + SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class); + LoginUser loginUser = randomPojo(LoginUser.class, o -> { + o.setId(userId); + o.setRoleIds(userRoleIds); + }); + // mock 验证码正确 + when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); + // mock authentication + when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword()))) + .thenReturn(authentication); + when(authentication.getPrincipal()).thenReturn(loginUser); + // mock 获得 User 拥有的角色编号数组 + when(permissionService.getUserRoleIds(userId, singleton(CommonStatusEnum.ENABLE.getStatus()))).thenReturn(userRoleIds); + // mock 缓存登陆用户到 Redis + when(userSessionService.createUserSession(loginUser, userIp, userAgent)).thenReturn(sessionId); + // 调用, 并断言异常 + String login = authService.login(reqVO, userIp, userAgent); + assertEquals(sessionId, login); + // 校验调用参数 + verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); + verify(loginLogService, times(1)).createLoginLog( + argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult())) + ); + } + + @Test + public void testLogout_success() { + // 准备参数 + String token = randomString(); + LoginUser loginUser = randomPojo(LoginUser.class); + // mock + when(userSessionService.getLoginUser(token)).thenReturn(loginUser); + // 调用 + authService.logout(token); + // 校验调用参数 + verify(userSessionService, times(1)).deleteUserSession(token); + verify(loginLogService, times(1)).createLoginLog( + argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGOUT_SELF.getType()) + && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult())) + ); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java new file mode 100644 index 0000000..026b23d --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java @@ -0,0 +1,227 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.auth; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomDate; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.Mockito.when; + +import java.time.Duration; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.annotation.Resource; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import cn.hutool.core.date.DateUtil; +import cn.iocoder.yudao.adminserver.BaseDbAndRedisUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.security.config.SecurityProperties; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth.SysUserSessionMapper; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper; +import cn.iocoder.yudao.adminserver.modules.system.dal.redis.auth.SysLoginUserRedisDAO; +import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysUserSessionServiceImpl; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.impl.SysDeptServiceImpl; +import cn.iocoder.yudao.adminserver.modules.system.service.logger.impl.SysLoginLogServiceImpl; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserServiceImpl; +import cn.iocoder.yudao.framework.test.core.util.AssertUtils; +import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; + +/** + * SysUserSessionServiceImpl Tester. + * + * @author Lyon + * @version 1.0 + * @since
3月 8, 2021
+ */ +@Import({SysUserSessionServiceImpl.class, SysLoginUserRedisDAO.class}) +public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest { + + @Resource + private SysUserSessionServiceImpl sysUserSessionService; + @Resource + private SysUserSessionMapper sysUserSessionMapper; + @Resource + private SysLoginUserRedisDAO sysLoginUserRedisDAO; + @Resource + private SysUserMapper sysUserMapper; + + @MockBean + private SecurityProperties securityProperties; + @MockBean + private SysDeptServiceImpl sysDeptService; + @MockBean + private SysUserServiceImpl sysUserService; + @MockBean + private SysLoginLogServiceImpl sysLoginLogService; + + @Test + public void testCreateUserSession_success() { + // 准备参数 + String userIp = randomString(); + String userAgent = randomString(); + LoginUser loginUser = randomPojo(LoginUser.class); + // mock + when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); + // 调用 + String sessionId = sysUserSessionService.createUserSession(loginUser, userIp, userAgent); + // 校验记录的属性是否正确 + SysUserSessionDO sysUserSessionDO = sysUserSessionMapper.selectById(sessionId); + assertEquals(sysUserSessionDO.getId(), sessionId); + assertEquals(sysUserSessionDO.getUserId(), loginUser.getId()); + assertEquals(sysUserSessionDO.getUserIp(), userIp); + assertEquals(sysUserSessionDO.getUserAgent(), userAgent); + assertEquals(sysUserSessionDO.getUsername(), loginUser.getUsername()); + LoginUser redisLoginUser = sysLoginUserRedisDAO.get(sessionId); + AssertUtils.assertPojoEquals(redisLoginUser, loginUser, "username","password"); + } + + @Test + public void testCreateRefreshUserSession_success() { + // 准备参数 + String sessionId = randomString(); + String userIp = randomString(); + String userAgent = randomString(); + Long timeLong = randomLongId(); + String userName = randomString(); + Date date = randomDate(); + LoginUser loginUser = randomPojo(LoginUser.class); + // mock + when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); + loginUser.setUpdateTime(date); + sysLoginUserRedisDAO.set(sessionId, loginUser); + SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) + .userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).username(userName) + .sessionTimeout(addTime(Duration.ofMillis(timeLong))) + .build(); + sysUserSessionMapper.insert(userSession); + SysUserSessionDO insertDO = sysUserSessionMapper.selectById(sessionId); + // 调用 + sysUserSessionService.refreshUserSession(sessionId, loginUser); + // 校验记录 redis + LoginUser redisLoginUser = sysLoginUserRedisDAO.get(sessionId); + assertNotEquals(redisLoginUser.getUpdateTime(), date); + // 校验记录 SysUserSessionDO + SysUserSessionDO updateDO = sysUserSessionMapper.selectById(sessionId); + assertEquals(updateDO.getUsername(), loginUser.getUsername()); + assertNotEquals(updateDO.getUpdateTime(), insertDO.getUpdateTime()); + assertNotEquals(updateDO.getSessionTimeout(), addTime(Duration.ofMillis(timeLong))); + } + + @Test + public void testDeleteUserSession_success() { + // 准备参数 + String sessionId = randomString(); + String userIp = randomString(); + String userAgent = randomString(); + Long timeLong = randomLongId(); + LoginUser loginUser = randomPojo(LoginUser.class); + // mock 存入 Redis + when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1)); + sysLoginUserRedisDAO.set(sessionId, loginUser); + // mock 存入 db + SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) + .userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).username(loginUser.getUsername()) + .sessionTimeout(addTime(Duration.ofMillis(timeLong))) + .build(); + sysUserSessionMapper.insert(userSession); + // 校验数据存在 + assertNotNull(sysLoginUserRedisDAO.get(sessionId)); + assertNotNull(sysUserSessionMapper.selectById(sessionId)); + // 调用 + sysUserSessionService.deleteUserSession(sessionId); + // 校验数据不存在了 + assertNull(sysLoginUserRedisDAO.get(sessionId)); + assertNull(sysUserSessionMapper.selectById(sessionId)); + } + + @Test + public void testGetUserSessionPage_success() { + // mock 数据 + String userIp = randomString(); + SysUserDO dbUser1 = randomPojo(SysUserDO.class, o -> { + o.setUsername("testUsername1"); + o.setSex(randomEle(SysSexEnum.values()).getSex()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + SysUserDO dbUser2 = randomPojo(SysUserDO.class, o -> { + o.setUsername("testUsername2"); + o.setSex(randomEle(SysSexEnum.values()).getSex()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + SysUserSessionDO dbSession = randomPojo(SysUserSessionDO.class, o -> { + o.setUserId(dbUser1.getId()); + o.setUserIp(userIp); + }); + sysUserMapper.insert(dbUser1); + sysUserMapper.insert(dbUser2); + sysUserSessionMapper.insert(dbSession); + sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> { + o.setId(randomString()); + o.setUserId(dbUser2.getId()); + })); + // 测试 userId 不匹配 + sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> { + o.setId(randomString()); + o.setUserId(123456l); + })); + // 测试 userIp 不匹配 + sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> { + o.setId(randomString()); + o.setUserIp("testUserIp"); + })); + // 准备参数 + SysUserSessionPageReqVO reqVo = new SysUserSessionPageReqVO(); + reqVo.setUserIp(userIp); + // 调用 + PageResult pageResult = sysUserSessionService.getUserSessionPage(reqVo); + // 断言 + assertEquals(3, pageResult.getTotal()); + assertEquals(3, pageResult.getList().size()); + assertPojoEquals(dbSession, pageResult.getList().get(0)); + } + + @Test + public void testClearSessionTimeout_success() throws Exception { + // 准备超时数据 120 条, 在线用户 1 条 + int expectedTimeoutCount = 120, expectedTotal = 1; + + // 准备数据 + List prepareData = Stream + .iterate(0, i -> i) + .limit(expectedTimeoutCount) + .map(i -> RandomUtils.randomPojo(SysUserSessionDO.class, o -> o.setSessionTimeout(DateUtil.offsetSecond(new Date(), -1)))) + .collect(Collectors.toList()); + SysUserSessionDO sessionDO = RandomUtils.randomPojo(SysUserSessionDO.class, o -> o.setSessionTimeout(DateUtil.offsetMinute(new Date(), 30))); + prepareData.add(sessionDO); + prepareData.forEach(sysUserSessionMapper::insert); + + //清空超时数据 + long actualTimeoutCount = sysUserSessionService.clearSessionTimeout(); + //校验 + assertEquals(expectedTimeoutCount, actualTimeoutCount); + List userSessionDOS = sysUserSessionMapper.selectList(); + assertEquals(expectedTotal, userSessionDOS.size()); + AssertUtils.assertPojoEquals(sessionDO, userSessionDOS.get(0), "updateTime"); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaServiceTest.java new file mode 100644 index 0000000..c45ed4c --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/common/SysCaptchaServiceTest.java @@ -0,0 +1,66 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.common; + +import cn.iocoder.yudao.adminserver.BaseRedisUnitTest; +import cn.iocoder.yudao.adminserver.modules.system.framework.captcha.config.CaptchaProperties; +import cn.iocoder.yudao.adminserver.modules.system.controller.common.vo.SysCaptchaImageRespVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.redis.common.SysCaptchaRedisDAO; +import cn.iocoder.yudao.adminserver.modules.system.service.common.impl.SysCaptchaServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; +import static org.junit.jupiter.api.Assertions.*; + +@Import({SysCaptchaServiceImpl.class, CaptchaProperties.class, SysCaptchaRedisDAO.class}) +public class SysCaptchaServiceTest extends BaseRedisUnitTest { + + @Resource + private SysCaptchaServiceImpl captchaService; + + @Resource + private SysCaptchaRedisDAO captchaRedisDAO; + @Resource + private CaptchaProperties captchaProperties; + + @Test + public void testGetCaptchaImage() { + // 调用 + SysCaptchaImageRespVO respVO = captchaService.getCaptchaImage(); + // 断言 + assertNotNull(respVO.getUuid()); + assertNotNull(respVO.getImg()); + String captchaCode = captchaRedisDAO.get(respVO.getUuid()); + assertNotNull(captchaCode); + } + + @Test + public void testGetCaptchaCode() { + // 准备参数 + String uuid = randomString(); + String code = randomString(); + // mock 数据 + captchaRedisDAO.set(uuid, code, captchaProperties.getTimeout()); + + // 调用 + String resultCode = captchaService.getCaptchaCode(uuid); + // 断言 + assertEquals(code, resultCode); + } + + @Test + public void testDeleteCaptchaCode() { + // 准备参数 + String uuid = randomString(); + String code = randomString(); + // mock 数据 + captchaRedisDAO.set(uuid, code, captchaProperties.getTimeout()); + + // 调用 + captchaService.deleteCaptchaCode(uuid); + // 断言 + assertNull(captchaRedisDAO.get(uuid)); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java new file mode 100644 index 0000000..076a5aa --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysDeptServiceTest.java @@ -0,0 +1,274 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dept; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptListReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysDeptMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.dept.DeptIdEnum; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dept.SysDeptProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.impl.SysDeptServiceImpl; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import com.google.common.collect.Multimap; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import static cn.hutool.core.bean.BeanUtil.getFieldValue; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +/** + * {@link SysDeptServiceImpl} 的单元测试类 + * + * @author niudehua + */ +@Import(SysDeptServiceImpl.class) +class SysDeptServiceTest extends BaseDbUnitTest { + + @Resource + private SysDeptServiceImpl deptService; + @Resource + private SysDeptMapper deptMapper; + @MockBean + private SysDeptProducer deptProducer; + + @Test + @SuppressWarnings("unchecked") + void testInitLocalCache() { + // mock 数据 + SysDeptDO deptDO1 = randomDeptDO(); + deptMapper.insert(deptDO1); + SysDeptDO deptDO2 = randomDeptDO(); + deptMapper.insert(deptDO2); + + // 调用 + deptService.initLocalCache(); + // 断言 deptCache 缓存 + Map deptCache = (Map) getFieldValue(deptService, "deptCache"); + assertEquals(2, deptCache.size()); + assertPojoEquals(deptDO1, deptCache.get(deptDO1.getId())); + assertPojoEquals(deptDO2, deptCache.get(deptDO2.getId())); + // 断言 parentDeptCache 缓存 + Multimap parentDeptCache = (Multimap) getFieldValue(deptService, "parentDeptCache"); + assertEquals(2, parentDeptCache.size()); + assertPojoEquals(deptDO1, parentDeptCache.get(deptDO1.getParentId())); + assertPojoEquals(deptDO2, parentDeptCache.get(deptDO2.getParentId())); + // 断言 maxUpdateTime 缓存 + Date maxUpdateTime = (Date) getFieldValue(deptService, "maxUpdateTime"); + assertEquals(ObjectUtils.max(deptDO1.getUpdateTime(), deptDO2.getUpdateTime()), maxUpdateTime); + } + + @Test + void testListDepts() { + // mock 数据 + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { // 等会查询到 + o.setName("开发部"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + deptMapper.insert(dept); + // 测试 name 不匹配 + deptMapper.insert(ObjectUtils.clone(dept, o -> o.setName("发"))); + // 测试 status 不匹配 + deptMapper.insert(ObjectUtils.clone(dept, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + SysDeptListReqVO reqVO = new SysDeptListReqVO(); + reqVO.setName("开"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + // 调用 + List sysDeptDOS = deptService.getSimpleDepts(reqVO); + // 断言 + assertEquals(1, sysDeptDOS.size()); + assertPojoEquals(dept, sysDeptDOS.get(0)); + } + + @Test + void testCreateDept_success() { + // 准备参数 + SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + o -> { + o.setParentId(DeptIdEnum.ROOT.getId()); + o.setStatus(randomCommonStatus()); + }); + // 调用 + Long deptId = deptService.createDept(reqVO); + // 断言 + assertNotNull(deptId); + // 校验记录的属性是否正确 + SysDeptDO deptDO = deptMapper.selectById(deptId); + assertPojoEquals(reqVO, deptDO); + // 校验调用 + verify(deptProducer, times(1)).sendDeptRefreshMessage(); + } + + @Test + void testUpdateDept_success() { + // mock 数据 + SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, o -> { + // 设置更新的 ID + o.setParentId(DeptIdEnum.ROOT.getId()); + o.setId(dbDeptDO.getId()); + o.setStatus(randomCommonStatus()); + }); + // 调用 + deptService.updateDept(reqVO); + // 校验是否更新正确 + SysDeptDO deptDO = deptMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, deptDO); + } + + @Test + void testDeleteDept_success() { + // mock 数据 + SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDeptDO.getId(); + // 调用 + deptService.deleteDept(id); + // 校验数据不存在了 + assertNull(deptMapper.selectById(id)); + } + + @Test + void testCheckDept_nameDuplicateForUpdate() { + // mock 数据 + SysDeptDO deptDO = randomDeptDO(); + // 设置根节点部门 + deptDO.setParentId(DeptIdEnum.ROOT.getId()); + deptMapper.insert(deptDO); + // mock 数据 稍后模拟重复它的 name + SysDeptDO nameDeptDO = randomDeptDO(); + // 设置根节点部门 + nameDeptDO.setParentId(DeptIdEnum.ROOT.getId()); + deptMapper.insert(nameDeptDO); + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + o -> { + // 设置根节点部门 + o.setParentId(DeptIdEnum.ROOT.getId()); + // 设置更新的 ID + o.setId(deptDO.getId()); + // 模拟 name 重复 + o.setName(nameDeptDO.getName()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_NAME_DUPLICATE); + + } + + @Test + void testCheckDept_parentNotExitsForCreate() { + SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + o -> o.setStatus(randomCommonStatus())); + // 调用,并断言异常 + assertServiceException(() -> deptService.createDept(reqVO), DEPT_PARENT_NOT_EXITS); + } + + @Test + void testCheckDept_notFoundForDelete() { + // 准备参数 + Long id = randomLongId(); + // 调用, 并断言异常 + assertServiceException(() -> deptService.deleteDept(id), DEPT_NOT_FOUND); + } + + @Test + void testCheckDept_exitsChildrenForDelete() { + // mock 数据 + SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(parentDept);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDeptDO childrenDeptDO = randomPojo(SysDeptDO.class, o -> { + o.setParentId(parentDept.getId()); + o.setStatus(randomCommonStatus()); + }); + // 插入子部门 + deptMapper.insert(childrenDeptDO); + // 调用, 并断言异常 + assertServiceException(() -> deptService.deleteDept(parentDept.getId()), DEPT_EXITS_CHILDREN); + } + + @Test + void testCheckDept_parentErrorForUpdate() { + // mock 数据 + SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO); + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + o -> { + // 设置自己为父部门 + o.setParentId(dbDeptDO.getId()); + // 设置更新的 ID + o.setId(dbDeptDO.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_PARENT_ERROR); + } + + @Test + void testCheckDept_notEnableForCreate() { + // mock 数据 + SysDeptDO deptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); + deptMapper.insert(deptDO); + // 准备参数 + SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + o -> { + // 设置未启用的部门为副部门 + o.setParentId(deptDO.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.createDept(reqVO), DEPT_NOT_ENABLE); + } + + @Test + void testCheckDept_parentIsChildForUpdate() { + // mock 数据 + SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); + deptMapper.insert(parentDept); + SysDeptDO childDept = randomPojo(SysDeptDO.class, o -> { + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setParentId(parentDept.getId()); + }); + deptMapper.insert(childDept); + // 初始化本地缓存 + deptService.initLocalCache(); + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + o -> { + // 设置自己的子部门为父部门 + o.setParentId(childDept.getId()); + // 设置更新的 ID + o.setId(parentDept.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_PARENT_IS_CHILD); + } + + @SafeVarargs + private static SysDeptDO randomDeptDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(SysDeptDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java new file mode 100644 index 0000000..c036a7e --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dept/SysPostServiceTest.java @@ -0,0 +1,200 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dept; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.impl.SysPostServiceImpl; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link SysPostServiceImpl} 的单元测试类 + * + * @author niudehua + */ +@Import(SysPostServiceImpl.class) +class SysPostServiceTest extends BaseDbUnitTest { + + @Resource + private SysPostServiceImpl postService; + @Resource + private SysPostMapper postMapper; + + @Test + void testPagePosts() { + // mock 数据 + SysPostDO postDO = randomPojo(SysPostDO.class, o -> { + o.setName("码仔"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + postMapper.insert(postDO); + // 测试 name 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setName("程序员"))); + // 测试 status 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + + // 准备参数 + SysPostPageReqVO reqVO = new SysPostPageReqVO(); + reqVO.setName("码"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + PageResult pageResult = postService.getPostPage(reqVO); + + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(postDO, pageResult.getList().get(0)); + } + + @Test + void testListPosts() { + // mock 数据 + SysPostDO postDO = randomPojo(SysPostDO.class, o -> { + o.setName("码仔"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + postMapper.insert(postDO); + // 测试 name 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setName("程序员"))); + // 测试 status 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + SysPostExportReqVO reqVO = new SysPostExportReqVO(); + reqVO.setName("码"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + List list = postService.getPosts(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(postDO, list.get(0)); + } + + @Test + void testGetPost() { + // mock 数据 + SysPostDO dbPostDO = randomPostDO(); + postMapper.insert(dbPostDO); + // 准备参数 + Long id = dbPostDO.getId(); + // 调用 + SysPostDO post = postService.getPost(id); + // 断言 + assertNotNull(post); + assertPojoEquals(dbPostDO, post); + } + + @Test + void testCreatePost_success() { + // 准备参数 + SysPostCreateReqVO reqVO = randomPojo(SysPostCreateReqVO.class, + o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())); + // 调用 + Long postId = postService.createPost(reqVO); + // 断言 + assertNotNull(postId); + // 校验记录的属性是否正确 + SysPostDO post = postMapper.selectById(postId); + assertPojoEquals(reqVO, post); + } + + @Test + void testUpdatePost_success() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysPostUpdateReqVO reqVO = randomPojo(SysPostUpdateReqVO.class, + o -> { + // 设置更新的 ID + o.setId(postDO.getId()); + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); + }); + // 调用 + postService.updatePost(reqVO); + // 校验是否更新正确 + SysPostDO post = postMapper.selectById(reqVO.getId());// 获取最新的 + assertPojoEquals(reqVO, post); + } + + @Test + void testDeletePost_success() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO); + // 准备参数 + Long id = postDO.getId(); + // 调用 + postService.deletePost(id); + assertNull(postMapper.selectById(id)); + } + + @Test + void testCheckPost_notFoundForDelete() { + // 准备参数 + Long id = randomLongId(); + // 调用, 并断言异常 + assertServiceException(() -> postService.deletePost(id), POST_NOT_FOUND); + } + + @Test + void testCheckPost_nameDuplicateForCreate() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysPostCreateReqVO reqVO = randomPojo(SysPostCreateReqVO.class, + // 模拟 name 重复 + o -> o.setName(postDO.getName())); + assertServiceException(() -> postService.createPost(reqVO), POST_NAME_DUPLICATE); + } + + @Test + void testCheckPost_codeDuplicateForUpdate() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO); + // mock 数据 稍后模拟重复它的 code + SysPostDO codePostDO = randomPostDO(); + postMapper.insert(codePostDO); + // 准备参数 + SysPostUpdateReqVO reqVO = randomPojo(SysPostUpdateReqVO.class, + o -> { + // 设置更新的 ID + o.setId(postDO.getId()); + // 模拟 code 重复 + o.setCode(codePostDO.getCode()); + }); + // 调用, 并断言异常 + assertServiceException(() -> postService.updatePost(reqVO), POST_CODE_DUPLICATE); + } + + @SafeVarargs + private static SysPostDO randomPostDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(SysPostDO.class, ArrayUtils.append(consumer, consumers)); + } +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataServiceTest.java new file mode 100644 index 0000000..ecb0093 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataServiceTest.java @@ -0,0 +1,302 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dict; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictDataMapper; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict.SysDictDataProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.dict.impl.SysDictDataServiceImpl; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import com.google.common.collect.ImmutableTable; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.bean.BeanUtil.getFieldValue; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +/** +* {@link SysDictDataServiceImpl} 的单元测试类 +* +* @author 芋道源码 +*/ +@Import(SysDictDataServiceImpl.class) +public class SysDictDataServiceTest extends BaseDbUnitTest { + + @Resource + private SysDictDataServiceImpl dictDataService; + + @Resource + private SysDictDataMapper dictDataMapper; + @MockBean + private SysDictTypeService dictTypeService; + @MockBean + private SysDictDataProducer dictDataProducer; + + /** + * 测试加载到新的字典数据的情况 + */ + @Test + @SuppressWarnings("unchecked") + public void testInitLocalCache() { + // mock 数据 + SysDictDataDO dictData01 = randomDictDataDO(); + dictDataMapper.insert(dictData01); + SysDictDataDO dictData02 = randomDictDataDO(); + dictDataMapper.insert(dictData02); + + // 调用 + dictDataService.initLocalCache(); + // 断言 labelDictDataCache 缓存 + ImmutableTable labelDictDataCache = + (ImmutableTable) getFieldValue(dictDataService, "labelDictDataCache"); + assertEquals(2, labelDictDataCache.size()); + assertPojoEquals(dictData01, labelDictDataCache.get(dictData01.getDictType(), dictData01.getLabel())); + assertPojoEquals(dictData02, labelDictDataCache.get(dictData02.getDictType(), dictData02.getLabel())); + // 断言 valueDictDataCache 缓存 + ImmutableTable valueDictDataCache = + (ImmutableTable) getFieldValue(dictDataService, "valueDictDataCache"); + assertEquals(2, valueDictDataCache.size()); + assertPojoEquals(dictData01, valueDictDataCache.get(dictData01.getDictType(), dictData01.getValue())); + assertPojoEquals(dictData02, valueDictDataCache.get(dictData02.getDictType(), dictData02.getValue())); + // 断言 maxUpdateTime 缓存 + Date maxUpdateTime = (Date) getFieldValue(dictDataService, "maxUpdateTime"); + assertEquals(ObjectUtils.max(dictData01.getUpdateTime(), dictData02.getUpdateTime()), maxUpdateTime); + } + + @Test + public void testGetDictDataPage() { + // mock 数据 + SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class, o -> { // 等会查询到 + o.setLabel("芋艿"); + o.setDictType("yunai"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + dictDataMapper.insert(dbDictData); + // 测试 label 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setLabel("艿"))); + // 测试 dictType 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setDictType("nai"))); + // 测试 status 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + SysDictDataPageReqVO reqVO = new SysDictDataPageReqVO(); + reqVO.setLabel("芋"); + reqVO.setDictType("yu"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + PageResult pageResult = dictDataService.getDictDataPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbDictData, pageResult.getList().get(0)); + } + + @Test + public void testGetDictDataList() { + // mock 数据 + SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class, o -> { // 等会查询到 + o.setLabel("芋艿"); + o.setDictType("yunai"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + dictDataMapper.insert(dbDictData); + // 测试 label 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setLabel("艿"))); + // 测试 dictType 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setDictType("nai"))); + // 测试 status 不匹配 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + SysDictDataExportReqVO reqVO = new SysDictDataExportReqVO(); + reqVO.setLabel("芋"); + reqVO.setDictType("yu"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + List list = dictDataService.getDictDatas(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbDictData, list.get(0)); + } + + @Test + public void testCreateDictData_success() { + // 准备参数 + SysDictDataCreateReqVO reqVO = randomPojo(SysDictDataCreateReqVO.class, + o -> o.setStatus(randomCommonStatus())); + // mock 方法 + when(dictTypeService.getDictType(eq(reqVO.getDictType()))).thenReturn(randomDictTypeDO(reqVO.getDictType())); + + // 调用 + Long dictDataId = dictDataService.createDictData(reqVO); + // 断言 + assertNotNull(dictDataId); + // 校验记录的属性是否正确 + SysDictDataDO dictData = dictDataMapper.selectById(dictDataId); + assertPojoEquals(reqVO, dictData); + // 校验调用 + verify(dictDataProducer, times(1)).sendDictDataRefreshMessage(); + } + + @Test + public void testUpdateDictData_success() { + // mock 数据 + SysDictDataDO dbDictData = randomDictDataDO(); + dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDictDataUpdateReqVO reqVO = randomPojo(SysDictDataUpdateReqVO.class, o -> { + o.setId(dbDictData.getId()); // 设置更新的 ID + o.setStatus(randomCommonStatus()); + }); + // mock 方法,字典类型 + when(dictTypeService.getDictType(eq(reqVO.getDictType()))).thenReturn(randomDictTypeDO(reqVO.getDictType())); + + // 调用 + dictDataService.updateDictData(reqVO); + // 校验是否更新正确 + SysDictDataDO dictData = dictDataMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, dictData); + // 校验调用 + verify(dictDataProducer, times(1)).sendDictDataRefreshMessage(); + } + + @Test + public void testDeleteDictData_success() { + // mock 数据 + SysDictDataDO dbDictData = randomDictDataDO(); + dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDictData.getId(); + + // 调用 + dictDataService.deleteDictData(id); + // 校验数据不存在了 + assertNull(dictDataMapper.selectById(id)); + // 校验调用 + verify(dictDataProducer, times(1)).sendDictDataRefreshMessage(); + } + + @Test + public void testCheckDictDataExists_success() { + // mock 数据 + SysDictDataDO dbDictData = randomDictDataDO(); + dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 + + // 调用成功 + dictDataService.checkDictDataExists(dbDictData.getId()); + } + + @Test + public void testCheckDictDataExists_notExists() { + assertServiceException(() -> dictDataService.checkDictDataExists(randomLongId()), DICT_DATA_NOT_EXISTS); + } + + @Test + public void testCheckDictTypeValid_success() { + // mock 方法,数据类型被禁用 + String type = randomString(); + when(dictTypeService.getDictType(eq(type))).thenReturn(randomDictTypeDO(type)); + + // 调用, 成功 + dictDataService.checkDictTypeValid(type); + } + + @Test + public void testCheckDictTypeValid_notExists() { + assertServiceException(() -> dictDataService.checkDictTypeValid(randomString()), DICT_TYPE_NOT_EXISTS); + } + + @Test + public void testCheckDictTypeValid_notEnable() { + // mock 方法,数据类型被禁用 + String dictType = randomString(); + when(dictTypeService.getDictType(eq(dictType))).thenReturn( + randomPojo(SysDictTypeDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + + // 调用, 并断言异常 + assertServiceException(() -> dictDataService.checkDictTypeValid(dictType), DICT_TYPE_NOT_ENABLE); + } + + @Test + public void testCheckDictDataValueUnique_success() { + // 调用,成功 + dictDataService.checkDictDataValueUnique(randomLongId(), randomString(), randomString()); + } + + @Test + public void testCheckDictDataValueUnique_valueDuplicateForCreate() { + // 准备参数 + String dictType = randomString(); + String value = randomString(); + // mock 数据 + dictDataMapper.insert(randomDictDataDO(o -> { + o.setDictType(dictType); + o.setValue(value); + })); + + // 调用,校验异常 + assertServiceException(() -> dictDataService.checkDictDataValueUnique(null, dictType, value), + DICT_DATA_VALUE_DUPLICATE); + } + + @Test + public void testCheckDictDataValueUnique_valueDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + String dictType = randomString(); + String value = randomString(); + // mock 数据 + dictDataMapper.insert(randomDictDataDO(o -> { + o.setDictType(dictType); + o.setValue(value); + })); + + // 调用,校验异常 + assertServiceException(() -> dictDataService.checkDictDataValueUnique(id, dictType, value), + DICT_DATA_VALUE_DUPLICATE); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static SysDictDataDO randomDictDataDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomCommonStatus()); // 保证 status 的范围 + }; + return randomPojo(SysDictDataDO.class, ArrayUtils.append(consumer, consumers)); + } + + /** + * 生成一个有效的字典类型 + * + * @param type 字典类型 + * @return SysDictTypeDO 对象 + */ + private static SysDictTypeDO randomDictTypeDO(String type) { + return randomPojo(SysDictTypeDO.class, o -> { + o.setType(type); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 是开启 + }); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeServiceTest.java new file mode 100644 index 0000000..212701d --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictTypeServiceTest.java @@ -0,0 +1,279 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.dict; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.type.SysDictTypeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictTypeMapper; +import cn.iocoder.yudao.adminserver.modules.system.service.dict.impl.SysDictTypeServiceImpl; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +/** +* {@link SysDictTypeServiceImpl} 的单元测试类 +* +* @author 芋道源码 +*/ +@Import(SysDictTypeServiceImpl.class) +public class SysDictTypeServiceTest extends BaseDbUnitTest { + + @Resource + private SysDictTypeServiceImpl dictTypeService; + + @Resource + private SysDictTypeMapper dictTypeMapper; + @MockBean + private SysDictDataService dictDataService; + + @Test + public void testGetDictTypePage() { + // mock 数据 + SysDictTypeDO dbDictType = randomPojo(SysDictTypeDO.class, o -> { // 等会查询到 + o.setName("yunai"); + o.setType("芋艿"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2021, 1, 15)); + }); + dictTypeMapper.insert(dbDictType); + // 测试 name 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setName("tudou"))); + // 测试 type 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setType("土豆"))); + // 测试 status 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + SysDictTypePageReqVO reqVO = new SysDictTypePageReqVO(); + reqVO.setName("nai"); + reqVO.setType("艿"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setBeginCreateTime(buildTime(2021, 1, 10)); + reqVO.setEndCreateTime(buildTime(2021, 1, 20)); + + // 调用 + PageResult pageResult = dictTypeService.getDictTypePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbDictType, pageResult.getList().get(0)); + } + + @Test + public void testGetDictTypeList() { + // mock 数据 + SysDictTypeDO dbDictType = randomPojo(SysDictTypeDO.class, o -> { // 等会查询到 + o.setName("yunai"); + o.setType("芋艿"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2021, 1, 15)); + }); + dictTypeMapper.insert(dbDictType); + // 测试 name 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setName("tudou"))); + // 测试 type 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setType("土豆"))); + // 测试 status 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + dictTypeMapper.insert(ObjectUtils.clone(dbDictType, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + SysDictTypeExportReqVO reqVO = new SysDictTypeExportReqVO(); + reqVO.setName("nai"); + reqVO.setType("艿"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setBeginCreateTime(buildTime(2021, 1, 10)); + reqVO.setEndCreateTime(buildTime(2021, 1, 20)); + + // 调用 + List list = dictTypeService.getDictTypeList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbDictType, list.get(0)); + } + + @Test + public void testGetDictType() { + // mock 数据 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType); + // 准备参数 + String type = dbDictType.getType(); + + // 调用 + SysDictTypeDO dictType = dictTypeService.getDictType(type); + // 断言 + assertNotNull(dictType); + assertPojoEquals(dbDictType, dictType); + } + + @Test + public void testCreateDictType_success() { + // 准备参数 + SysDictTypeCreateReqVO reqVO = randomPojo(SysDictTypeCreateReqVO.class, + o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())); + + // 调用 + Long dictTypeId = dictTypeService.createDictType(reqVO); + // 断言 + assertNotNull(dictTypeId); + // 校验记录的属性是否正确 + SysDictTypeDO dictType = dictTypeMapper.selectById(dictTypeId); + assertPojoEquals(reqVO, dictType); + } + + @Test + public void testUpdateDictType_success() { + // mock 数据 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDictTypeUpdateReqVO reqVO = randomPojo(SysDictTypeUpdateReqVO.class, o -> { + o.setId(dbDictType.getId()); // 设置更新的 ID + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); + }); + + // 调用 + dictTypeService.updateDictType(reqVO); + // 校验是否更新正确 + SysDictTypeDO dictType = dictTypeMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, dictType); + } + + @Test + public void testDeleteDictType_success() { + // mock 数据 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDictType.getId(); + + // 调用 + dictTypeService.deleteDictType(id); + // 校验数据不存在了 + assertNull(dictTypeMapper.selectById(id)); + } + + @Test + public void testDeleteDictType_hasChildren() { + // mock 数据 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDictType.getId(); + // mock 方法 + when(dictDataService.countByDictType(eq(dbDictType.getType()))).thenReturn(1); + + // 调用, 并断言异常 + assertServiceException(() -> dictTypeService.deleteDictType(id), DICT_TYPE_HAS_CHILDREN); + } + + @Test + public void testCheckDictDataExists_success() { + // mock 数据 + SysDictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + + // 调用成功 + dictTypeService.checkDictTypeExists(dbDictType.getId()); + } + + @Test + public void testCheckDictDataExists_notExists() { + assertServiceException(() -> dictTypeService.checkDictTypeExists(randomLongId()), DICT_TYPE_NOT_EXISTS); + } + + @Test + public void testCheckDictTypeUnique_success() { + // 调用,成功 + dictTypeService.checkDictTypeUnique(randomLongId(), randomString()); + } + + @Test + public void testCheckDictTypeUnique_valueDuplicateForCreate() { + // 准备参数 + String type = randomString(); + // mock 数据 + dictTypeMapper.insert(randomDictTypeDO(o -> o.setType(type))); + + // 调用,校验异常 + assertServiceException(() -> dictTypeService.checkDictTypeUnique(null, type), + DICT_TYPE_TYPE_DUPLICATE); + } + + @Test + public void testCheckDictTypeUnique_valueDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + String type = randomString(); + // mock 数据 + dictTypeMapper.insert(randomDictTypeDO(o -> o.setType(type))); + + // 调用,校验异常 + assertServiceException(() -> dictTypeService.checkDictTypeUnique(id, type), + DICT_TYPE_TYPE_DUPLICATE); + } + + @Test + public void testCheckDictTypNameUnique_success() { + // 调用,成功 + dictTypeService.checkDictTypeNameUnique(randomLongId(), randomString()); + } + + @Test + public void testCheckDictTypeNameUnique_nameDuplicateForCreate() { + // 准备参数 + String name = randomString(); + // mock 数据 + dictTypeMapper.insert(randomDictTypeDO(o -> o.setName(name))); + + // 调用,校验异常 + assertServiceException(() -> dictTypeService.checkDictTypeNameUnique(null, name), + DICT_TYPE_NAME_DUPLICATE); + } + + @Test + public void testCheckDictTypeNameUnique_nameDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + String name = randomString(); + // mock 数据 + dictTypeMapper.insert(randomDictTypeDO(o -> o.setName(name))); + + // 调用,校验异常 + assertServiceException(() -> dictTypeService.checkDictTypeNameUnique(id, name), + DICT_TYPE_NAME_DUPLICATE); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static SysDictTypeDO randomDictTypeDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(SysDictTypeDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeServiceTest.java new file mode 100644 index 0000000..f5dbc71 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/errorcode/SysErrorCodeServiceTest.java @@ -0,0 +1,305 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.errorcode; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO; +import cn.iocoder.yudao.adminserver.modules.infra.enums.config.InfConfigTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.errorcode.SysErrorCodeDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.errorcode.SysErrorCodeMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.errorcode.SysErrorCodeTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.errorcode.impl.SysErrorCodeServiceImpl; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.slf4j.Logger; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_DUPLICATE; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_NOT_EXISTS; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; + +/** +* {@link SysErrorCodeServiceImpl} 的单元测试类 +* +* @author 芋道源码 +*/ +@Import(SysErrorCodeServiceImpl.class) +public class SysErrorCodeServiceTest extends BaseDbUnitTest { + + @Resource + private SysErrorCodeServiceImpl errorCodeService; + + @Resource + private SysErrorCodeMapper errorCodeMapper; + + @Mock + private Logger log; + + @Test + public void testCreateErrorCode_success() { + // 准备参数 + SysErrorCodeCreateReqVO reqVO = randomPojo(SysErrorCodeCreateReqVO.class); + + // 调用 + Long errorCodeId = errorCodeService.createErrorCode(reqVO); + // 断言 + assertNotNull(errorCodeId); + // 校验记录的属性是否正确 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(errorCodeId); + assertPojoEquals(reqVO, errorCode); + assertEquals(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType()); + } + + @Test + public void testUpdateErrorCode_success() { + // mock 数据 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(); + errorCodeMapper.insert(dbErrorCode);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysErrorCodeUpdateReqVO reqVO = randomPojo(SysErrorCodeUpdateReqVO.class, o -> { + o.setId(dbErrorCode.getId()); // 设置更新的 ID + }); + + // 调用 + errorCodeService.updateErrorCode(reqVO); + // 校验是否更新正确 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, errorCode); + assertEquals(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType()); + } + + @Test + public void testDeleteErrorCode_success() { + // mock 数据 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(); + errorCodeMapper.insert(dbErrorCode);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbErrorCode.getId(); + + // 调用 + errorCodeService.deleteErrorCode(id); + // 校验数据不存在了 + assertNull(errorCodeMapper.selectById(id)); + } + + @Test + public void testGetErrorCodePage() { + // mock 数据 + SysErrorCodeDO dbErrorCode = initGetErrorCodePage(); + // 准备参数 + SysErrorCodePageReqVO reqVO = new SysErrorCodePageReqVO(); + reqVO.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); + reqVO.setApplicationName("yudao"); + reqVO.setCode(1); + reqVO.setMessage("yu"); + reqVO.setBeginCreateTime(buildTime(2020, 11, 1)); + reqVO.setEndCreateTime(buildTime(2020, 11, 30)); + + // 调用 + PageResult pageResult = errorCodeService.getErrorCodePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbErrorCode, pageResult.getList().get(0)); + } + + /** + * 初始化 getErrorCodePage 方法的测试数据 + */ + private SysErrorCodeDO initGetErrorCodePage() { + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> { // 等会查询到 + o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); + o.setApplicationName("yudaoyuanma"); + o.setCode(1); + o.setMessage("yudao"); + o.setCreateTime(buildTime(2020, 11, 11)); + }); + errorCodeMapper.insert(dbErrorCode); + // 测试 type 不匹配 + errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType()))); + // 测试 applicationName 不匹配 + errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setApplicationName("yunai"))); + // 测试 code 不匹配 + errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setCode(2))); + // 测试 message 不匹配 + errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setMessage("nai"))); + // 测试 createTime 不匹配 + errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setCreateTime(buildTime(2020, 12, 12)))); + return dbErrorCode; + } + + @Test + public void testGetErrorCodeList() { + // mock 数据 + SysErrorCodeDO dbErrorCode = initGetErrorCodePage(); + // 准备参数 + SysErrorCodeExportReqVO reqVO = new SysErrorCodeExportReqVO(); + reqVO.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()); + reqVO.setApplicationName("yudao"); + reqVO.setCode(1); + reqVO.setMessage("yu"); + reqVO.setBeginCreateTime(buildTime(2020, 11, 1)); + reqVO.setEndCreateTime(buildTime(2020, 11, 30)); + + // 调用 + List list = errorCodeService.getErrorCodeList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbErrorCode, list.get(0)); + } + + @Test + public void testValidateCodeDuplicate_codeDuplicateForCreate() { + // 准备参数 + Integer code = randomInteger(); + // mock 数据 + errorCodeMapper.insert(randomInfErrorCodeDO(o -> o.setCode(code))); + + // 调用,校验异常 + assertServiceException(() -> errorCodeService.validateCodeDuplicate(code, null), + ERROR_CODE_DUPLICATE); + } + + @Test + public void testValidateCodeDuplicate_codeDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + Integer code = randomInteger(); + // mock 数据 + errorCodeMapper.insert(randomInfErrorCodeDO(o -> o.setCode(code))); + + // 调用,校验异常 + assertServiceException(() -> errorCodeService.validateCodeDuplicate(code, id), + ERROR_CODE_DUPLICATE); + } + + @Test + public void testValidateErrorCodeExists_notExists() { + assertServiceException(() -> errorCodeService.validateErrorCodeExists(null), + ERROR_CODE_NOT_EXISTS); + } + + /** + * 情况 1,错误码不存在的情况 + */ + @Test + public void testAutoGenerateErrorCodes_01() { + // 准备参数 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class); + // mock 方法 + + // 调用 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); + // 断言 + SysErrorCodeDO errorCode = errorCodeMapper.selectOne(null); + assertPojoEquals(generateReqDTO, errorCode); + assertEquals(SysErrorCodeTypeEnum.AUTO_GENERATION.getType(), errorCode.getType()); + } + + /** + * 情况 2.1,错误码存在,但是是 SysErrorCodeTypeEnum.MANUAL_OPERATION 类型 + */ + @Test + public void testAutoGenerateErrorCodes_021() { + // mock 数据 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType())); + errorCodeMapper.insert(dbErrorCode); + // 准备参数 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, + o -> o.setCode(dbErrorCode.getCode())); + // mock 方法 + + // 调用 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); + // 断言,相等,说明不会更新 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + assertPojoEquals(dbErrorCode, errorCode); + } + + /** + * 情况 2.2,错误码存在,但是是 applicationName 不匹配 + */ + @Test + public void testAutoGenerateErrorCodes_022() { + // mock 数据 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType())); + errorCodeMapper.insert(dbErrorCode); + // 准备参数 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, + o -> o.setCode(dbErrorCode.getCode()).setApplicationName(randomString())); + // mock 方法 + + // 调用 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); + // 断言,相等,说明不会更新 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + assertPojoEquals(dbErrorCode, errorCode); + } + + /** + * 情况 2.3,错误码存在,但是是 message 相同 + */ + @Test + public void testAutoGenerateErrorCodes_023() { + // mock 数据 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType())); + errorCodeMapper.insert(dbErrorCode); + // 准备参数 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, + o -> o.setCode(dbErrorCode.getCode()).setApplicationName(dbErrorCode.getApplicationName()) + .setMessage(dbErrorCode.getMessage())); + // mock 方法 + + // 调用 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); + // 断言,相等,说明不会更新 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + assertPojoEquals(dbErrorCode, errorCode); + } + + /** + * 情况 2.3,错误码存在,但是是 message 不同,则进行更新 + */ + @Test + public void testAutoGenerateErrorCodes_024() { + // mock 数据 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType())); + errorCodeMapper.insert(dbErrorCode); + // 准备参数 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, + o -> o.setCode(dbErrorCode.getCode()).setApplicationName(dbErrorCode.getApplicationName())); + // mock 方法 + + // 调用 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); + // 断言,匹配 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + assertPojoEquals(generateReqDTO, errorCode); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static SysErrorCodeDO randomInfErrorCodeDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setType(randomEle(InfConfigTypeEnum.values()).getType()); // 保证 key 的范围 + }; + return randomPojo(SysErrorCodeDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogServiceImplTest.java new file mode 100644 index 0000000..d6a921f --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogServiceImplTest.java @@ -0,0 +1,145 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.logger; + +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysLoginLogMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.logger.impl.SysLoginLogServiceImpl; +import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Import(SysLoginLogServiceImpl.class) +public class SysLoginLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private SysLoginLogServiceImpl sysLoginLogService; + + @Resource + private SysLoginLogMapper loginLogMapper; + + @Test + public void testCreateLoginLog() { + String traceId = TracerUtils.getTraceId(); + SysLoginLogCreateReqVO reqVO = RandomUtils.randomPojo(SysLoginLogCreateReqVO.class, vo -> { + // 指定随机的范围,避免超出范围入库失败 + vo.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); + vo.setResult(RandomUtil.randomEle(SysLoginResultEnum.values()).getResult()); + // 使用TracerUtils生成的TraceId + vo.setTraceId(traceId); + }); + + // 执行service方法 + sysLoginLogService.createLoginLog(reqVO); + + // 断言,忽略基本字段 + SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne(null); + assertPojoEquals(reqVO, sysLoginLogDO); + } + + + @Test + public void testGetLoginLogPage() { + + // 构造测试数据 + + // 登录成功的 + SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { + logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); + logDO.setTraceId(TracerUtils.getTraceId()); + + logDO.setUserIp("192.168.199.16"); + logDO.setUsername("wangkai"); + logDO.setCreateTime(buildTime(2021, 3, 6)); + logDO.setResult(SysLoginResultEnum.SUCCESS.getResult()); + }); + loginLogMapper.insert(loginLogDO); + + // 下面几个都是不匹配的数据 + // 登录失败的 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setResult(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); + // 不同ip段的 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); + // 不同username + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUsername("yunai"))); + // 构造一个早期时间 2021-02-06 00:00:00 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setCreateTime(buildTime(2021, 2, 6)))); + + + // 构造调用参数 + SysLoginLogPageReqVO reqVO = new SysLoginLogPageReqVO(); + reqVO.setUsername("wangkai"); + reqVO.setUserIp("192.168.199"); + reqVO.setStatus(true); + reqVO.setBeginTime(buildTime(2021, 3, 5)); + reqVO.setEndTime(buildTime(2021, 3, 7)); + + // 调用service方法 + PageResult pageResult = sysLoginLogService.getLoginLogPage(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(loginLogDO, pageResult.getList().get(0)); + } + + @Test + public void testGetLoginLogList() { + + // 构造测试数据 + + // 登录成功的 + SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { + logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); + logDO.setTraceId(TracerUtils.getTraceId()); + + logDO.setUserIp("192.168.111.16"); + logDO.setUsername("wangxiaokai"); + logDO.setCreateTime(buildTime(2021, 3, 6)); + logDO.setResult(SysLoginResultEnum.SUCCESS.getResult()); + }); + loginLogMapper.insert(loginLogDO); + + // 下面几个都是不匹配的数据 + // 登录失败的 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setResult(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); + // 不同ip段的 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); + // 不同username + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUsername("yunai"))); + // 构造一个早期时间 2021-02-06 00:00:00 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setCreateTime(buildTime(2021, 2, 6)))); + + + // 构造调用参数 + SysLoginLogExportReqVO reqVO = new SysLoginLogExportReqVO(); + reqVO.setUsername("wangxiaokai"); + reqVO.setUserIp("192.168.111"); + reqVO.setStatus(true); + reqVO.setBeginTime(buildTime(2021, 3, 5)); + reqVO.setEndTime(buildTime(2021, 3, 7)); + + + // 调用service方法 + List loginLogList = sysLoginLogService.getLoginLogList(reqVO); + + // 断言 + assertEquals(1, loginLogList.size()); + assertPojoEquals(loginLogDO, loginLogList.get(0)); + } +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogServiceImplTest.java new file mode 100644 index 0000000..48cc4c5 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogServiceImplTest.java @@ -0,0 +1,166 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.logger; + +import cn.hutool.core.map.MapUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; +import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; +import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysOperateLogMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.logger.impl.SysOperateLogServiceImpl; +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +@Import({SysOperateLogServiceImpl.class}) +public class SysOperateLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private SysOperateLogService operateLogServiceImpl; + + @Resource + private SysOperateLogMapper operateLogMapper; + + @MockBean + private SysUserService userService; + + @Test + public void testCreateOperateLogAsync() throws InterruptedException, ExecutionException { + String traceId = TracerUtils.getTraceId(); + OperateLogCreateReqDTO reqVO = RandomUtils.randomPojo(OperateLogCreateReqDTO.class, o -> { + o.setTraceId(traceId); + o.setUserId(randomLongId()); + o.setExts(MapUtil.builder("orderId", randomLongId()).build()); + }); + + // 执行service方法 + Future future = operateLogServiceImpl.createOperateLogAsync(reqVO); + future.get(); + // 断言插入是否正确 + SysOperateLogDO sysOperateLogDO = operateLogMapper.selectOne("trace_id", traceId); + assertPojoEquals(reqVO, sysOperateLogDO); + } + + @Test + public void testGetOperateLogPage() { + // 构造测试数据 + // 先构造用户 + SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, o -> { + o.setNickname("wangkai"); + o.setSex(SysSexEnum.MALE.getSex()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user)); + Long userId = user.getId(); + // 构造操作日志 + SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, o -> { + o.setUserId(userId); + o.setModule("order"); + o.setType(OperateTypeEnum.CREATE.getType()); + o.setStartTime(buildTime(2021, 3, 6)); + o.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()); + o.setExts(MapUtil.builder("orderId", randomLongId()).build()); + }); + operateLogMapper.insert(sysOperateLogDO); + + // 下面几个是不匹配的数据 + // 随机 userId + operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1))); + // module 不同 + operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user"))); + // type 不同 + operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType()))); + // createTime 不同 + operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6)))); + // resultCode 不同 + operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode()))); + + // 构造调用参数 + SysOperateLogPageReqVO reqVO = new SysOperateLogPageReqVO(); + reqVO.setUserNickname("wangkai"); + reqVO.setModule("order"); + reqVO.setType(OperateTypeEnum.CREATE.getType()); + reqVO.setBeginTime(buildTime(2021, 3, 5)); + reqVO.setEndTime(buildTime(2021, 3, 7)); + reqVO.setSuccess(true); + + // 调用service方法 + PageResult pageResult = operateLogServiceImpl.getOperateLogPage(reqVO); + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(sysOperateLogDO, pageResult.getList().get(0)); + } + + @Test + public void testGetOperateLogs() { + // 构造测试数据 + // 先构造用户 + SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, o -> { + o.setNickname("wangkai"); + o.setSex(SysSexEnum.MALE.getSex()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user)); + Long userId = user.getId(); + // 构造操作日志 + SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, o -> { + o.setUserId(userId); + o.setModule("order"); + o.setType(OperateTypeEnum.CREATE.getType()); + o.setStartTime(buildTime(2021, 3, 6)); + o.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()); + o.setExts(MapUtil.builder("orderId", randomLongId()).build()); + }); + operateLogMapper.insert(sysOperateLogDO); + + // 下面几个是不匹配的数据 + // 随机 userId + operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1))); + // module 不同 + operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user"))); + // type 不同 + operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType()))); + // createTime 不同 + operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6)))); + // resultCode 不同 + operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode()))); + + // 构造调用参数 + SysOperateLogExportReqVO reqVO = new SysOperateLogExportReqVO(); + reqVO.setUserNickname("wangkai"); + reqVO.setModule("order"); + reqVO.setType(OperateTypeEnum.CREATE.getType()); + reqVO.setBeginTime(buildTime(2021, 3, 5)); + reqVO.setEndTime(buildTime(2021, 3, 7)); + reqVO.setSuccess(true); + + // 调用 service 方法 + List list = operateLogServiceImpl.getOperateLogs(reqVO); + // 断言,只查到了一条符合条件的 + assertEquals(1, list.size()); + assertPojoEquals(sysOperateLogDO, list.get(0)); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeServiceImplTest.java new file mode 100644 index 0000000..9b66262 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/notice/SysNoticeServiceImplTest.java @@ -0,0 +1,164 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.notice; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.notice.vo.SysNoticeUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice.SysNoticeDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.notice.SysNoticeMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.notice.SysNoticeTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.notice.impl.SysNoticeServiceImpl; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.NOTICE_NOT_FOUND; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.*; + +@Import(SysNoticeServiceImpl.class) +class SysNoticeServiceImplTest extends BaseDbUnitTest { + + @Resource + private SysNoticeServiceImpl sysNoticeService; + + @Resource + private SysNoticeMapper sysNoticeMapper; + + @Test + public void testPageNotices_success() { + // 插入前置数据 + SysNoticeDO dbNotice = randomPojo(SysNoticeDO.class, o -> { + o.setTitle("尼古拉斯赵四来啦!"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + }); + sysNoticeMapper.insert(dbNotice); + + // 测试 title 不匹配 + sysNoticeMapper.insert(ObjectUtils.clone(dbNotice, o -> o.setTitle("尼古拉斯凯奇也来啦!"))); + // 测试 status 不匹配 + sysNoticeMapper.insert(ObjectUtils.clone(dbNotice, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + + + // 查询 + SysNoticePageReqVO reqVO = new SysNoticePageReqVO(); + reqVO.setTitle("尼古拉斯赵四来啦!"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + PageResult pageResult = sysNoticeService.pageNotices(reqVO); + + // 验证查询结果经过筛选 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbNotice, pageResult.getList().get(0)); + + } + + @Test + public void testGetNotice_success() { + // 插入前置数据 + SysNoticeDO dbNotice = randomSysNoticeDO(); + sysNoticeMapper.insert(dbNotice); + + // 查询 + SysNoticeDO notice = sysNoticeService.getNotice(dbNotice.getId()); + + // 验证插入与读取对象是否一致 + assertNotNull(notice); + assertPojoEquals(dbNotice, notice); + } + + @Test + public void testCreateNotice_success() { + // 准备参数 + SysNoticeCreateReqVO reqVO = randomSysNoticeCreateReqVO(); + + // 校验插入是否成功 + Long noticeId = sysNoticeService.createNotice(reqVO); + assertNotNull(noticeId); + + // 校验插入属性是否正确 + SysNoticeDO notice = sysNoticeMapper.selectById(noticeId); + assertPojoEquals(reqVO, notice); + } + + @Test + public void testUpdateNotice_success() { + // 插入前置数据 + SysNoticeDO dbNoticeDO = randomSysNoticeDO(); + sysNoticeMapper.insert(dbNoticeDO); + + // 准备更新参数 + SysNoticeUpdateReqVO reqVO = randomSysNoticeUpdateReqVO(o -> o.setId(dbNoticeDO.getId())); + + // 更新 + sysNoticeService.updateNotice(reqVO); + + // 检验是否更新成功 + SysNoticeDO notice = sysNoticeMapper.selectById(reqVO.getId()); + assertPojoEquals(reqVO, notice); + } + + @Test + public void testDeleteNotice_success() { + // 插入前置数据 + SysNoticeDO dbNotice = randomSysNoticeDO(); + sysNoticeMapper.insert(dbNotice); + + // 删除 + sysNoticeService.deleteNotice(dbNotice.getId()); + + // 检查是否删除成功 + assertNull(sysNoticeMapper.selectById(dbNotice.getId())); + } + + @Test + public void checkNoticeExists_success() { + // 插入前置数据 + SysNoticeDO dbNotice = randomSysNoticeDO(); + sysNoticeMapper.insert(dbNotice); + + // 成功调用 + sysNoticeService.checkNoticeExists(dbNotice.getId()); + } + + @Test + public void checkNoticeExists_noExists() { + assertServiceException(() -> sysNoticeService.checkNoticeExists(randomLongId()), NOTICE_NOT_FOUND); + } + + @SafeVarargs + private static SysNoticeDO randomSysNoticeDO(Consumer... consumers) { + SysNoticeDO notice = randomPojo(SysNoticeDO.class, consumers); + notice.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + notice.setStatus(CommonStatusEnum.ENABLE.getStatus()); + return notice; + } + + @SafeVarargs + private static SysNoticeUpdateReqVO randomSysNoticeUpdateReqVO(Consumer... consumers) { + SysNoticeUpdateReqVO reqVO = randomPojo(SysNoticeUpdateReqVO.class, consumers); + reqVO.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + return reqVO; + } + + private static SysNoticeCreateReqVO randomSysNoticeCreateReqVO() { + SysNoticeCreateReqVO reqVO = randomPojo(SysNoticeCreateReqVO.class); + reqVO.setType(randomEle(SysNoticeTypeEnum.values()).getType()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + return reqVO; + } + + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuServiceTest.java new file mode 100644 index 0000000..81dcfd7 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysMenuServiceTest.java @@ -0,0 +1,366 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.permission; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuListReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysMenuMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysMenuProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.impl.SysMenuServiceImpl; +import cn.iocoder.yudao.framework.common.util.sping.SpringAopUtils; +import cn.iocoder.yudao.framework.test.core.util.RandomUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import com.google.common.collect.Multimap; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.*; + +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.verify; + +@Import(SysMenuServiceImpl.class) +public class SysMenuServiceTest extends BaseDbUnitTest { + + @Resource + private SysMenuServiceImpl sysMenuService; + + @MockBean + private SysPermissionService sysPermissionService; + + @MockBean + private SysMenuProducer sysMenuProducer; + + @Resource + private SysMenuMapper menuMapper; + + @Test + public void testInitLocalCache_success() throws Exception { + SysMenuDO menuDO1 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); + menuMapper.insert(menuDO1); + SysMenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); + menuMapper.insert(menuDO2); + + // 调用 + sysMenuService.initLocalCache(); + + // 获取代理对象 + SysMenuServiceImpl target = (SysMenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); + + Map menuCache = + (Map) BeanUtil.getFieldValue(target, "menuCache"); + Assert.isTrue(menuCache.size() == 2); + assertPojoEquals(menuDO1, menuCache.get(menuDO1.getId())); + assertPojoEquals(menuDO2, menuCache.get(menuDO2.getId())); + + Multimap permissionMenuCache = + (Multimap) BeanUtil.getFieldValue(target, "permissionMenuCache"); + Assert.isTrue(permissionMenuCache.size() == 2); + assertPojoEquals(menuDO1, permissionMenuCache.get(menuDO1.getPermission())); + assertPojoEquals(menuDO2, permissionMenuCache.get(menuDO2.getPermission())); + + Date maxUpdateTime = (Date) BeanUtil.getFieldValue(target, "maxUpdateTime"); + assertEquals(ObjectUtils.max(menuDO1.getUpdateTime(), menuDO2.getUpdateTime()), maxUpdateTime); + } + + @Test + public void testCreateMenu_success() { + //构造父目录 + SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); + menuMapper.insert(menuDO); + Long parentId = menuDO.getId(); + + //调用 + SysMenuCreateReqVO vo = randomPojo(SysMenuCreateReqVO.class, o -> { + o.setParentId(parentId); + o.setName("testSonName"); + o.setType(MenuTypeEnum.MENU.getType()); + o.setStatus(RandomUtils.randomCommonStatus()); + }); + Long menuId = sysMenuService.createMenu(vo); + + //断言 + Assertions.assertNotNull(menuId); + // 校验记录的属性是否正确 + SysMenuDO ret = menuMapper.selectById(menuId); + assertPojoEquals(vo, ret); + // 校验调用 + verify(sysMenuProducer).sendMenuRefreshMessage(); + } + + @Test + public void testUpdateMenu_success() { + //构造父子目录 + SysMenuDO sonMenuDO = initParentAndSonMenuDO(); + Long sonId = sonMenuDO.getId(); + Long parentId = sonMenuDO.getParentId(); + + //调用 + SysMenuUpdateReqVO vo = randomPojo(SysMenuUpdateReqVO.class, o -> { + o.setId(sonId); + o.setParentId(parentId); + o.setType(MenuTypeEnum.MENU.getType()); + o.setStatus(RandomUtils.randomCommonStatus()); + o.setName("pppppp"); //修改名字 + }); + sysMenuService.updateMenu(vo); + + //断言 + // 校验记录的属性是否正确 + SysMenuDO ret = menuMapper.selectById(sonId); + assertPojoEquals(vo, ret); + // 校验调用 + verify(sysMenuProducer).sendMenuRefreshMessage(); + } + + @Test + public void testUpdateMenu_sonIdNotExist() { + Long sonId = 99999L; + Long parentId = 10000L; + + //调用 + SysMenuUpdateReqVO vo = randomPojo(SysMenuUpdateReqVO.class, o -> { + o.setId(sonId); + o.setParentId(parentId); + o.setType(MenuTypeEnum.MENU.getType()); + o.setStatus(RandomUtils.randomCommonStatus()); + }); + //断言 + assertServiceException(() -> sysMenuService.updateMenu(vo), MENU_NOT_EXISTS); + } + + @Test + public void testDeleteMenu_success() { + SysMenuDO sonMenuDO = initParentAndSonMenuDO(); + Long sonId = sonMenuDO.getId(); + + //调用 + sysMenuService.deleteMenu(sonId); + + //断言 + SysMenuDO menuDO = menuMapper.selectById(sonId); + Assert.isNull(menuDO); + verify(sysPermissionService).processMenuDeleted(sonId); + verify(sysMenuProducer).sendMenuRefreshMessage(); + } + + @Test + public void testDeleteMenu_menuNotExist() { + Long sonId = 99999L; + + assertServiceException(() -> sysMenuService.deleteMenu(sonId), MENU_NOT_EXISTS); + } + + @Test + public void testDeleteMenu_existChildren() { + SysMenuDO sonMenu = initParentAndSonMenuDO(); + Long parentId = sonMenu.getParentId(); + + assertServiceException(() -> sysMenuService.deleteMenu(parentId), MENU_EXISTS_CHILDREN); + } + + @Test + public void testGetMenus_success() { + Map idMenuMap = new HashMap<>(); + SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); + menuMapper.insert(menuDO); + idMenuMap.put(menuDO.getId(), menuDO); + + SysMenuDO sonMenu = createMenuDO(MenuTypeEnum.MENU, "son", menuDO.getId()); + menuMapper.insert(sonMenu); + idMenuMap.put(sonMenu.getId(), sonMenu); + + //调用 + List menuDOS = sysMenuService.getMenus(); + + //断言 + Assert.isTrue(menuDOS.size() == idMenuMap.size()); + menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m)); + } + + @Test + public void testGetMenusReqVo_success() { + Map idMenuMap = new HashMap<>(); + //用于验证可以模糊搜索名称包含"name",状态为1的menu + SysMenuDO menu = createMenuDO(MenuTypeEnum.MENU, "name2", 0L, 1); + menuMapper.insert(menu); + idMenuMap.put(menu.getId(), menu); + + menu = createMenuDO(MenuTypeEnum.MENU, "11name111", 0L, 1); + menuMapper.insert(menu); + idMenuMap.put(menu.getId(), menu); + + menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 1); + menuMapper.insert(menu); + idMenuMap.put(menu.getId(), menu); + + //以下是不符合搜索条件的的menu + menu = createMenuDO(MenuTypeEnum.MENU, "xxxxxx", 0L, 1); + menuMapper.insert(menu); + menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 2); + menuMapper.insert(menu); + + //调用 + SysMenuListReqVO reqVO = new SysMenuListReqVO(); + reqVO.setStatus(1); + reqVO.setName("name"); + List menuDOS = sysMenuService.getMenus(reqVO); + + //断言 + Assert.isTrue(menuDOS.size() == idMenuMap.size()); + menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m)); + } + + @Test + public void testListMenusFromCache_success() throws Exception { + Map mockCacheMap = new HashMap<>(); + //获取代理对象 + SysMenuServiceImpl target = (SysMenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); + BeanUtil.setFieldValue(target, "menuCache", mockCacheMap); + + Map idMenuMap = new HashMap<>(); + //用于验证搜索类型为MENU,状态为1的menu + SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + idMenuMap.put(menuDO.getId(), menuDO); + + menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + idMenuMap.put(menuDO.getId(), menuDO); + + //以下是不符合搜索条件的menu + menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2); + mockCacheMap.put(menuDO.getId(), menuDO); + + List menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(MenuTypeEnum.MENU.getType()), + Collections.singletonList(CommonStatusEnum.DISABLE.getStatus())); + Assert.isTrue(menuDOS.size() == idMenuMap.size()); + menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m)); + } + + @Test + public void testListMenusFromCache2_success() throws Exception { + Map mockCacheMap = new HashMap<>(); + //获取代理对象 + SysMenuServiceImpl target = (SysMenuServiceImpl) SpringAopUtils.getTarget(sysMenuService); + BeanUtil.setFieldValue(target, "menuCache", mockCacheMap); + + Map idMenuMap = new HashMap<>(); + //验证搜索id为1, 类型为MENU, 状态为1 的menu + SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + idMenuMap.put(menuDO.getId(), menuDO); + + //以下是不符合搜索条件的menu + menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2); + mockCacheMap.put(menuDO.getId(), menuDO); + + List menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(1L), + Collections.singletonList(MenuTypeEnum.MENU.getType()), Collections.singletonList(1)); + Assert.isTrue(menuDOS.size() == idMenuMap.size()); + menuDOS.forEach(menu -> assertPojoEquals(idMenuMap.get(menu.getId()), menu)); + } + + @Test + public void testCheckParentResource_success() { + SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); + menuMapper.insert(menuDO); + Long parentId = menuDO.getId(); + + sysMenuService.checkParentResource(parentId, null); + } + + @Test + public void testCheckParentResource_canNotSetSelfToBeParent() { + assertServiceException(() -> sysMenuService.checkParentResource(1L, 1L), MENU_PARENT_ERROR); + } + + @Test + public void testCheckParentResource_parentNotExist() { + assertServiceException(() -> sysMenuService.checkParentResource(randomLongId(), null), MENU_PARENT_NOT_EXISTS); + } + + @Test + public void testCheckParentResource_parentTypeError() { + SysMenuDO menuDO = createMenuDO(MenuTypeEnum.BUTTON, "parent", 0L); + menuMapper.insert(menuDO); + Long parentId = menuDO.getId(); + + assertServiceException(() -> sysMenuService.checkParentResource(parentId, null), MENU_PARENT_NOT_DIR_OR_MENU); + } + + @Test + public void testCheckResource_success() { + SysMenuDO sonMenu = initParentAndSonMenuDO(); + Long parentId = sonMenu.getParentId(); + + Long otherSonMenuId = randomLongId(); + String otherSonMenuName = randomString(); + + sysMenuService.checkResource(parentId, otherSonMenuName, otherSonMenuId); + } + + @Test + public void testCheckResource_sonMenuNameDuplicate(){ + SysMenuDO sonMenu=initParentAndSonMenuDO(); + Long parentId=sonMenu.getParentId(); + + Long otherSonMenuId=randomLongId(); + String otherSonMenuName=sonMenu.getName(); //相同名称 + + assertServiceException(() -> sysMenuService.checkResource(parentId, otherSonMenuName, otherSonMenuId), MENU_NAME_DUPLICATE); + } + + /** + * 构造父子目录,返回子目录 + * + * @return + */ + private SysMenuDO initParentAndSonMenuDO() { + //构造父子目录 + SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); + menuMapper.insert(menuDO); + Long parentId = menuDO.getId(); + + SysMenuDO sonMenuDO = createMenuDO(MenuTypeEnum.MENU, "testSonName", parentId); + menuMapper.insert(sonMenuDO); + return sonMenuDO; + } + + private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId) { + return createMenuDO(typeEnum, menuName, parentId, RandomUtils.randomCommonStatus()); + } + + private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) { + return createMenuDO(null, typeEnum, menuName, parentId, status); + } + + private SysMenuDO createMenuDO(Long id, MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) { + return randomPojo(SysMenuDO.class, o -> { + o.setId(id); + o.setParentId(parentId); + o.setType(typeEnum.getType()); + o.setStatus(status); + o.setName(menuName); + }); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java new file mode 100644 index 0000000..f00e162 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionServiceTest.java @@ -0,0 +1,109 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.permission; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.impl.SysPermissionServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.verify; + +@Import(SysPermissionServiceImpl.class) +public class SysPermissionServiceTest extends BaseDbUnitTest { + + @Resource + private SysPermissionServiceImpl permissionService; + + @Resource + private SysRoleMenuMapper roleMenuMapper; + @Resource + private SysUserRoleMapper userRoleMapper; + + @MockBean + private SysRoleService roleService; + @MockBean + private SysMenuService menuService; + + @MockBean + private SysPermissionProducer permissionProducer; + + @Test + public void testProcessRoleDeleted() { + // 准备参数 + Long roleId = randomLongId(); + // mock 数据 UserRole + SysUserRoleDO userRoleDO01 = randomPojo(SysUserRoleDO.class, o -> o.setRoleId(roleId)); // 被删除 + userRoleMapper.insert(userRoleDO01); + SysUserRoleDO userRoleDO02 = randomPojo(SysUserRoleDO.class); // 不被删除 + userRoleMapper.insert(userRoleDO02); + // mock 数据 RoleMenu + SysRoleMenuDO roleMenuDO01 = randomPojo(SysRoleMenuDO.class, o -> o.setRoleId(roleId)); // 被删除 + roleMenuMapper.insert(roleMenuDO01); + SysRoleMenuDO roleMenuDO02 = randomPojo(SysRoleMenuDO.class); // 不被删除 + roleMenuMapper.insert(roleMenuDO02); + + // 调用 + permissionService.processRoleDeleted(roleId); + // 断言数据 RoleMenuDO + List dbRoleMenus = roleMenuMapper.selectList(); + assertEquals(1, dbRoleMenus.size()); + assertPojoEquals(dbRoleMenus.get(0), roleMenuDO02); + // 断言数据 UserRoleDO + List dbUserRoles = userRoleMapper.selectList(); + assertEquals(1, dbUserRoles.size()); + assertPojoEquals(dbUserRoles.get(0), userRoleDO02); + // 断言调用 + verify(permissionProducer).sendRoleMenuRefreshMessage(); + } + + @Test + public void testProcessMenuDeleted() { + // 准备参数 + Long menuId = randomLongId(); + // mock 数据 + SysRoleMenuDO roleMenuDO01 = randomPojo(SysRoleMenuDO.class, o -> o.setMenuId(menuId)); // 被删除 + roleMenuMapper.insert(roleMenuDO01); + SysRoleMenuDO roleMenuDO02 = randomPojo(SysRoleMenuDO.class); // 不被删除 + roleMenuMapper.insert(roleMenuDO02); + + // 调用 + permissionService.processMenuDeleted(menuId); + // 断言数据 + List dbRoleMenus = roleMenuMapper.selectList(); + assertEquals(1, dbRoleMenus.size()); + assertPojoEquals(dbRoleMenus.get(0), roleMenuDO02); + // 断言调用 + verify(permissionProducer).sendRoleMenuRefreshMessage(); + } + + @Test + public void testProcessUserDeleted() { + // 准备参数 + Long userId = randomLongId(); + // mock 数据 + SysUserRoleDO userRoleDO01 = randomPojo(SysUserRoleDO.class, o -> o.setUserId(userId)); // 被删除 + userRoleMapper.insert(userRoleDO01); + SysUserRoleDO userRoleDO02 = randomPojo(SysUserRoleDO.class); // 不被删除 + userRoleMapper.insert(userRoleDO02); + + // 调用 + permissionService.processUserDeleted(userId); + // 断言数据 + List dbUserRoles = userRoleMapper.selectList(); + assertEquals(1, dbUserRoles.size()); + assertPojoEquals(dbUserRoles.get(0), userRoleDO02); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java new file mode 100644 index 0000000..3943268 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysRoleServiceTest.java @@ -0,0 +1,302 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.permission; + +import cn.hutool.core.bean.BeanUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRolePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.permission.SysRoleTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysRoleProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.impl.SysRoleServiceImpl; +import cn.iocoder.yudao.framework.common.util.sping.SpringAopUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.verify; + +@Import(SysRoleServiceImpl.class) +public class SysRoleServiceTest extends BaseDbUnitTest { + + @Resource + private SysRoleServiceImpl sysRoleService; + + @Resource + private SysRoleMapper roleMapper; + + @MockBean + private SysPermissionService sysPermissionService; + + @MockBean + private SysRoleProducer sysRoleProducer; + + @Test + public void testInitLocalCache_success() throws Exception { + SysRoleDO roleDO1 = createRoleDO("role1", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO1); + SysRoleDO roleDO2 = createRoleDO("role2", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO2); + + //调用 + sysRoleService.initLocalCache(); + + //断言 + //获取代理对象 + SysRoleServiceImpl target = (SysRoleServiceImpl) SpringAopUtils.getTarget(sysRoleService); + + Map roleCache = (Map) BeanUtil.getFieldValue(target, "roleCache"); + assertPojoEquals(roleDO1, roleCache.get(roleDO1.getId())); + assertPojoEquals(roleDO2, roleCache.get(roleDO2.getId())); + + Date maxUpdateTime = (Date) BeanUtil.getFieldValue(target, "maxUpdateTime"); + assertEquals(max(roleDO1.getUpdateTime(), roleDO2.getUpdateTime()), maxUpdateTime); + } + + @Test + public void testCreateRole_success() { + SysRoleCreateReqVO reqVO = randomPojo(SysRoleCreateReqVO.class, o -> { + o.setCode("role_code"); + o.setName("role_name"); + o.setRemark("remark"); + o.setType(SysRoleTypeEnum.CUSTOM.getType()); + o.setSort(1); + }); + Long roleId = sysRoleService.createRole(reqVO); + + //断言 + assertNotNull(roleId); + SysRoleDO roleDO = roleMapper.selectById(roleId); + assertPojoEquals(reqVO, roleDO); + + verify(sysRoleProducer).sendRoleRefreshMessage(); + } + + @Test + public void testUpdateRole_success() { + SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + //调用 + SysRoleUpdateReqVO reqVO = randomPojo(SysRoleUpdateReqVO.class, o -> { + o.setId(roleId); + o.setCode("role_code"); + o.setName("update_name"); + o.setType(SysRoleTypeEnum.SYSTEM.getType()); + o.setSort(999); + }); + sysRoleService.updateRole(reqVO); + + //断言 + SysRoleDO newRoleDO = roleMapper.selectById(roleId); + assertPojoEquals(reqVO, newRoleDO); + + verify(sysRoleProducer).sendRoleRefreshMessage(); + } + + @Test + public void testUpdateRoleStatus_success() { + SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, CommonStatusEnum.ENABLE.getStatus()); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + //调用 + sysRoleService.updateRoleStatus(roleId, CommonStatusEnum.DISABLE.getStatus()); + + //断言 + SysRoleDO newRoleDO = roleMapper.selectById(roleId); + assertEquals(CommonStatusEnum.DISABLE.getStatus(), newRoleDO.getStatus()); + + verify(sysRoleProducer).sendRoleRefreshMessage(); + } + + @Test + public void testUpdateRoleDataScope_success() { + SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + //调用 + Set deptIdSet = Arrays.asList(1L, 2L, 3L, 4L, 5L).stream().collect(Collectors.toSet()); + sysRoleService.updateRoleDataScope(roleId, DataScopeEnum.DEPT_CUSTOM.getScore(), deptIdSet); + + //断言 + SysRoleDO newRoleDO = roleMapper.selectById(roleId); + assertEquals(DataScopeEnum.DEPT_CUSTOM.getScore(), newRoleDO.getDataScope()); + + Set newDeptIdSet = newRoleDO.getDataScopeDeptIds(); + assertTrue(deptIdSet.size() == newDeptIdSet.size()); + deptIdSet.stream().forEach(d -> assertTrue(newDeptIdSet.contains(d))); + + verify(sysRoleProducer).sendRoleRefreshMessage(); + } + + @Test + public void testDeleteRole_success() { + SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + //调用 + sysRoleService.deleteRole(roleId); + + //断言 + SysRoleDO newRoleDO = roleMapper.selectById(roleId); + assertNull(newRoleDO); + + verify(sysRoleProducer).sendRoleRefreshMessage(); + } + + @Test + public void testGetRoles_success() { + Map idRoleMap = new HashMap<>(); + // 验证查询状态为1的角色 + SysRoleDO roleDO1 = createRoleDO("role1", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); + roleMapper.insert(roleDO1); + idRoleMap.put(roleDO1.getId(), roleDO1); + + SysRoleDO roleDO2 = createRoleDO("role2", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1); + roleMapper.insert(roleDO2); + idRoleMap.put(roleDO2.getId(), roleDO2); + + // 以下是排除的角色 + SysRoleDO roleDO3 = createRoleDO("role3", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 2); + roleMapper.insert(roleDO3); + + //调用 + List roles = sysRoleService.getRoles(Arrays.asList(1)); + + //断言 + assertEquals(2, roles.size()); + roles.stream().forEach(r -> assertPojoEquals(idRoleMap.get(r.getId()), r)); + + } + + @Test + public void testGetRolePage_success() { + Map idRoleMap = new HashMap<>(); + // 验证名称包含"role", 状态为1,code为"code"的角色 + // 第一页 + SysRoleDO roleDO = createRoleDO("role1", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "code"); + roleMapper.insert(roleDO); + idRoleMap.put(roleDO.getId(), roleDO); + // 第二页 + roleDO = createRoleDO("role2", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "code"); + roleMapper.insert(roleDO); + + // 以下是排除的角色 + roleDO = createRoleDO("role3", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 2, "code"); + roleMapper.insert(roleDO); + roleDO = createRoleDO("role4", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL, 1, "xxxxx"); + roleMapper.insert(roleDO); + + //调用 + SysRolePageReqVO reqVO = randomPojo(SysRolePageReqVO.class, o -> { + o.setName("role"); + o.setCode("code"); + o.setStatus(1); + o.setPageNo(1); + o.setPageSize(1); + o.setBeginTime(null); + o.setEndTime(null); + }); + PageResult result = sysRoleService.getRolePage(reqVO); + assertEquals(2, result.getTotal()); + result.getList().stream().forEach(r -> assertPojoEquals(idRoleMap.get(r.getId()), r)); + } + + @Test + public void testCheckDuplicateRole_success() { + sysRoleService.checkDuplicateRole(randomString(), randomString(), null); + } + + @Test + public void testCheckDuplicateRole_nameDuplicate() { + SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + + String duplicateName = "role_name"; + + assertServiceException(() -> sysRoleService.checkDuplicateRole(duplicateName, randomString(), null), ROLE_NAME_DUPLICATE, duplicateName); + } + + @Test + public void testCheckDuplicateRole_codeDuplicate() { + SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> { + o.setName("role_999"); + o.setCode("code"); + o.setType(SysRoleTypeEnum.CUSTOM.getType()); + o.setStatus(1); + o.setDataScope(DataScopeEnum.ALL.getScore()); + }); + roleMapper.insert(roleDO); + + String randomName = randomString(); + String duplicateCode = "code"; + + assertServiceException(() -> sysRoleService.checkDuplicateRole(randomName, duplicateCode, null), ROLE_CODE_DUPLICATE, duplicateCode); + } + + @Test + public void testCheckUpdateRole_success() { + SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + sysRoleService.checkUpdateRole(roleId); + } + + @Test + public void testCheckUpdateRole_roleIdNotExist() { + assertServiceException(() -> sysRoleService.checkUpdateRole(randomLongId()), ROLE_NOT_EXISTS); + } + + @Test + public void testCheckUpdateRole_systemRoleCanNotBeUpdate() { + SysRoleDO roleDO = createRoleDO("role_name", SysRoleTypeEnum.SYSTEM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + assertServiceException(() -> sysRoleService.checkUpdateRole(roleId), ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE); + } + + private SysRoleDO createRoleDO(String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status) { + return createRoleDO( name, typeEnum, scopeEnum, status, randomString()); + } + + private SysRoleDO createRoleDO(String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { + return createRoleDO(null, name, typeEnum, scopeEnum, status, code); + } + + private SysRoleDO createRoleDO(String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum) { + return createRoleDO(null, name, typeEnum, scopeEnum, randomCommonStatus(), randomString()); + } + + private SysRoleDO createRoleDO(Long id, String name, SysRoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { + SysRoleDO roleDO = randomPojo(SysRoleDO.class, o -> { + o.setId(id); + o.setName(name); + o.setType(typeEnum.getType()); + o.setStatus(status); + o.setDataScope(scopeEnum.getScore()); + o.setCode(code); + }); + return roleDO; + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelServiceTest.java new file mode 100644 index 0000000..76337aa --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelServiceTest.java @@ -0,0 +1,202 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms; + +import cn.hutool.core.bean.BeanUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsChannelMapper; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsChannelServiceImpl; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +/** +* {@link SysSmsChannelServiceImpl} 的单元测试类 +* +* @author 芋道源码 +*/ +@Import(SysSmsChannelServiceImpl.class) +public class SysSmsChannelServiceTest extends BaseDbUnitTest { + + @Resource + private SysSmsChannelServiceImpl smsChannelService; + + @Resource + private SysSmsChannelMapper smsChannelMapper; + + @MockBean + private SmsClientFactory smsClientFactory; + @MockBean + private SysSmsTemplateService smsTemplateService; + @MockBean + private SysSmsProducer smsProducer; + + @Test + public void testInitLocalCache_success() { + // mock 数据 + SysSmsChannelDO smsChannelDO01 = randomSmsChannelDO(); + smsChannelMapper.insert(smsChannelDO01); + SysSmsChannelDO smsChannelDO02 = randomSmsChannelDO(); + smsChannelMapper.insert(smsChannelDO02); + + // 调用 + smsChannelService.initSmsClients(); + // 校验 maxUpdateTime 属性 + Date maxUpdateTime = (Date) BeanUtil.getFieldValue(smsChannelService, "maxUpdateTime"); + assertEquals(max(smsChannelDO01.getUpdateTime(), smsChannelDO02.getUpdateTime()), maxUpdateTime); + // 校验调用 + verify(smsClientFactory, times(1)).createOrUpdateSmsClient( + argThat(properties -> isPojoEquals(smsChannelDO01, properties))); + verify(smsClientFactory, times(1)).createOrUpdateSmsClient( + argThat(properties -> isPojoEquals(smsChannelDO02, properties))); + } + + @Test + public void testCreateSmsChannel_success() { + // 准备参数 + SysSmsChannelCreateReqVO reqVO = randomPojo(SysSmsChannelCreateReqVO.class, o -> o.setStatus(randomCommonStatus())); + + // 调用 + Long smsChannelId = smsChannelService.createSmsChannel(reqVO); + // 断言 + assertNotNull(smsChannelId); + // 校验记录的属性是否正确 + SysSmsChannelDO smsChannel = smsChannelMapper.selectById(smsChannelId); + assertPojoEquals(reqVO, smsChannel); + // 校验调用 + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); + } + + @Test + public void testUpdateSmsChannel_success() { + // mock 数据 + SysSmsChannelDO dbSmsChannel = randomSmsChannelDO(); + smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysSmsChannelUpdateReqVO reqVO = randomPojo(SysSmsChannelUpdateReqVO.class, o -> { + o.setId(dbSmsChannel.getId()); // 设置更新的 ID + o.setStatus(randomCommonStatus()); + o.setCallbackUrl(randomString()); + }); + + // 调用 + smsChannelService.updateSmsChannel(reqVO); + // 校验是否更新正确 + SysSmsChannelDO smsChannel = smsChannelMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, smsChannel); + // 校验调用 + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); + } + + @Test + public void testUpdateSmsChannel_notExists() { + // 准备参数 + SysSmsChannelUpdateReqVO reqVO = randomPojo(SysSmsChannelUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> smsChannelService.updateSmsChannel(reqVO), SMS_CHANNEL_NOT_EXISTS); + } + + @Test + public void testDeleteSmsChannel_success() { + // mock 数据 + SysSmsChannelDO dbSmsChannel = randomSmsChannelDO(); + smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbSmsChannel.getId(); + + // 调用 + smsChannelService.deleteSmsChannel(id); + // 校验数据不存在了 + assertNull(smsChannelMapper.selectById(id)); + // 校验调用 + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); + } + + @Test + public void testDeleteSmsChannel_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> smsChannelService.deleteSmsChannel(id), SMS_CHANNEL_NOT_EXISTS); + } + + @Test + public void testDeleteSmsChannel_hasChildren() { + // mock 数据 + SysSmsChannelDO dbSmsChannel = randomSmsChannelDO(); + smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbSmsChannel.getId(); + // mock 方法 + when(smsTemplateService.countByChannelId(eq(id))).thenReturn(10); + + // 调用, 并断言异常 + assertServiceException(() -> smsChannelService.deleteSmsChannel(id), SMS_CHANNEL_HAS_CHILDREN); + } + + @Test + public void testGetSmsChannelPage() { + // mock 数据 + SysSmsChannelDO dbSmsChannel = randomPojo(SysSmsChannelDO.class, o -> { // 等会查询到 + o.setSignature("芋道源码"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2020, 12, 12)); + }); + smsChannelMapper.insert(dbSmsChannel); + // 测试 signature 不匹配 + smsChannelMapper.insert(ObjectUtils.clone(dbSmsChannel, o -> o.setSignature("源码"))); + // 测试 status 不匹配 + smsChannelMapper.insert(ObjectUtils.clone(dbSmsChannel, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + smsChannelMapper.insert(ObjectUtils.clone(dbSmsChannel, o -> o.setCreateTime(buildTime(2020, 11, 11)))); + // 准备参数 + SysSmsChannelPageReqVO reqVO = new SysSmsChannelPageReqVO(); + reqVO.setSignature("芋道"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setBeginCreateTime(buildTime(2020, 12, 1)); + reqVO.setEndCreateTime(buildTime(2020, 12, 24)); + + // 调用 + PageResult pageResult = smsChannelService.getSmsChannelPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbSmsChannel, pageResult.getList().get(0)); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static SysSmsChannelDO randomSmsChannelDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(SysSmsChannelDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogServiceTest.java new file mode 100644 index 0000000..4ea3745 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogServiceTest.java @@ -0,0 +1,248 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms; + +import cn.hutool.core.map.MapUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsLogMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsReceiveStatusEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsSendStatusEnum; +import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsTemplateTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsLogServiceImpl; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomBoolean; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; + +/** +* {@link SysSmsLogServiceImpl} 的单元测试类 +* +* @author 芋道源码 +*/ +@Import(SysSmsLogServiceImpl.class) +public class SysSmsLogServiceTest extends BaseDbUnitTest { + + @Resource + private SysSmsLogServiceImpl smsLogService; + + @Resource + private SysSmsLogMapper smsLogMapper; + + @Test + public void testCreateSmsLog() { + // 准备参数 + String mobile = randomString(); + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + Boolean isSend = randomBoolean(); + SysSmsTemplateDO templateDO = randomPojo(SysSmsTemplateDO.class, + o -> o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType())); + String templateContent = randomString(); + Map templateParams = randomTemplateParams(); + // mock 方法 + + // 调用 + Long logId = smsLogService.createSmsLog(mobile, userId, userType, isSend, + templateDO, templateContent, templateParams); + // 断言 + SysSmsLogDO logDO = smsLogMapper.selectById(logId); + assertEquals(isSend ? SysSmsSendStatusEnum.INIT.getStatus() : SysSmsSendStatusEnum.IGNORE.getStatus(), + logDO.getSendStatus()); + assertEquals(mobile, logDO.getMobile()); + assertEquals(userType, logDO.getUserType()); + assertEquals(userId, logDO.getUserId()); + assertEquals(templateDO.getId(), logDO.getTemplateId()); + assertEquals(templateDO.getCode(), logDO.getTemplateCode()); + assertEquals(templateDO.getType(), logDO.getTemplateType()); + assertEquals(templateDO.getChannelId(), logDO.getChannelId()); + assertEquals(templateDO.getChannelCode(), logDO.getChannelCode()); + assertEquals(templateContent, logDO.getTemplateContent()); + assertEquals(templateParams, logDO.getTemplateParams()); + assertEquals(SysSmsReceiveStatusEnum.INIT.getStatus(), logDO.getReceiveStatus()); + } + + @Test + public void testUpdateSmsSendResult() { + // mock 数据 + SysSmsLogDO dbSmsLog = randomSmsLogDO( + o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus())); + smsLogMapper.insert(dbSmsLog); + // 准备参数 + Long id = dbSmsLog.getId(); + Integer sendCode = randomInteger(); + String sendMsg = randomString(); + String apiSendCode = randomString(); + String apiSendMsg = randomString(); + String apiRequestId = randomString(); + String apiSerialNo = randomString(); + + // 调用 + smsLogService.updateSmsSendResult(id, sendCode, sendMsg, + apiSendCode, apiSendMsg, apiRequestId, apiSerialNo); + // 断言 + dbSmsLog = smsLogMapper.selectById(id); + assertEquals(CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS.getStatus() + : SysSmsSendStatusEnum.FAILURE.getStatus(), dbSmsLog.getSendStatus()); + assertNotNull(dbSmsLog.getSendTime()); + assertEquals(sendMsg, dbSmsLog.getSendMsg()); + assertEquals(apiSendCode, dbSmsLog.getApiSendCode()); + assertEquals(apiSendMsg, dbSmsLog.getApiSendMsg()); + assertEquals(apiRequestId, dbSmsLog.getApiRequestId()); + assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo()); + } + + @Test + public void testUpdateSmsReceiveResult() { + // mock 数据 + SysSmsLogDO dbSmsLog = randomSmsLogDO( + o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus())); + smsLogMapper.insert(dbSmsLog); + // 准备参数 + Long id = dbSmsLog.getId(); + Boolean success = randomBoolean(); + Date receiveTime = randomDate(); + String apiReceiveCode = randomString(); + String apiReceiveMsg = randomString(); + + // 调用 + smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg); + // 断言 + dbSmsLog = smsLogMapper.selectById(id); + assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus() + : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus()); + assertEquals(receiveTime, dbSmsLog.getReceiveTime()); + assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode()); + assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg()); + } + + @Test + public void testGetSmsLogPage() { + // mock 数据 + SysSmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 + o.setChannelId(1L); + o.setTemplateId(10L); + o.setMobile("15601691300"); + o.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); + o.setSendTime(buildTime(2020, 11, 11)); + o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); + o.setReceiveTime(buildTime(2021, 11, 11)); + }); + smsLogMapper.insert(dbSmsLog); + // 测试 channelId 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setChannelId(2L))); + // 测试 templateId 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setTemplateId(20L))); + // 测试 mobile 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setMobile("18818260999"))); + // 测试 sendStatus 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()))); + // 测试 sendTime 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12)))); + // 测试 receiveStatus 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.SUCCESS.getStatus()))); + // 测试 receiveTime 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); + // 准备参数 + SysSmsLogPageReqVO reqVO = new SysSmsLogPageReqVO(); + reqVO.setChannelId(1L); + reqVO.setTemplateId(10L); + reqVO.setMobile("156"); + reqVO.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); + reqVO.setBeginSendTime(buildTime(2020, 11, 1)); + reqVO.setEndSendTime(buildTime(2020, 11, 30)); + reqVO.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); + reqVO.setBeginReceiveTime(buildTime(2021, 11, 1)); + reqVO.setEndReceiveTime(buildTime(2021, 11, 30)); + + // 调用 + PageResult pageResult = smsLogService.getSmsLogPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbSmsLog, pageResult.getList().get(0)); + } + + @Test + public void testGetSmsLogList() { + // mock 数据 + SysSmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 + o.setChannelId(1L); + o.setTemplateId(10L); + o.setMobile("15601691300"); + o.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); + o.setSendTime(buildTime(2020, 11, 11)); + o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); + o.setReceiveTime(buildTime(2021, 11, 11)); + }); + smsLogMapper.insert(dbSmsLog); + // 测试 channelId 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setChannelId(2L))); + // 测试 templateId 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setTemplateId(20L))); + // 测试 mobile 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setMobile("18818260999"))); + // 测试 sendStatus 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()))); + // 测试 sendTime 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12)))); + // 测试 receiveStatus 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.SUCCESS.getStatus()))); + // 测试 receiveTime 不匹配 + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); + // 准备参数 + SysSmsLogExportReqVO reqVO = new SysSmsLogExportReqVO(); + reqVO.setChannelId(1L); + reqVO.setTemplateId(10L); + reqVO.setMobile("156"); + reqVO.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); + reqVO.setBeginSendTime(buildTime(2020, 11, 1)); + reqVO.setEndSendTime(buildTime(2020, 11, 30)); + reqVO.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); + reqVO.setBeginReceiveTime(buildTime(2021, 11, 1)); + reqVO.setEndReceiveTime(buildTime(2021, 11, 30)); + + // 调用 + List list = smsLogService.getSmsLogList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbSmsLog, list.get(0)); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static SysSmsLogDO randomSmsLogDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setTemplateParams(randomTemplateParams()); + o.setTemplateType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围 + o.setUserType(randomEle(UserTypeEnum.values()).getValue()); // 保证 userType 的范围 + o.setSendStatus(randomEle(SysSmsSendStatusEnum.values()).getStatus()); // 保证 sendStatus 的范围 + o.setReceiveStatus(randomEle(SysSmsReceiveStatusEnum.values()).getStatus()); // 保证 receiveStatus 的范围 + }; + return randomPojo(SysSmsLogDO.class, ArrayUtils.append(consumer, consumers)); + } + + + private static Map randomTemplateParams() { + return MapUtil.builder().put(randomString(), randomString()) + .put(randomString(), randomString()).build(); + } +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceTest.java new file mode 100644 index 0000000..2a25125 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceTest.java @@ -0,0 +1,201 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms; + +import cn.hutool.core.map.MapUtil; +import cn.iocoder.yudao.adminserver.BaseMockitoUnitTest; +import cn.iocoder.yudao.framework.common.core.KeyValue; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.sms.core.client.SmsClient; +import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; +import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO; +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsServiceImpl; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +/** + * {@link SysSmsServiceImpl} 的单元测试类 + * + * @author 芋道源码 + */ +public class SysSmsServiceTest extends BaseMockitoUnitTest { + + @InjectMocks + private SysSmsServiceImpl smsService; + + @Mock + private SysSmsTemplateService smsTemplateService; + @Mock + private SysSmsLogService smsLogService; + @Mock + private SysSmsProducer smsProducer; + @Mock + private SmsClientFactory smsClientFactory; + + /** + * 发送成功,当短信模板开启时 + */ + @Test + public void testSendSingleSms_successWhenSmsTemplateEnable() { + // 准备参数 + String mobile = randomString(); + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String templateCode = randomString(); + Map templateParams = MapUtil.builder().put("code", "1234") + .put("op", "login").build(); + // mock SmsTemplateService 的方法 + SysSmsTemplateDO template = randomPojo(SysSmsTemplateDO.class, o -> { + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setContent("验证码为{code}, 操作为{op}"); + o.setParams(Lists.newArrayList("code", "op")); + }); + when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); + String content = randomString(); + when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) + .thenReturn(content); + // mock SmsLogService 的方法 + Long smsLogId = randomLongId(); + when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.TRUE), eq(template), + eq(content), eq(templateParams))).thenReturn(smsLogId); + + // 调用 + Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); + // 断言 + assertEquals(smsLogId, resultSmsLogId); + // 断言调用 + verify(smsProducer, times(1)).sendSmsSendMessage(eq(smsLogId), eq(mobile), + eq(template.getChannelId()), eq(template.getApiTemplateId()), + eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login")))); + } + + /** + * 发送成功,当短信模板关闭时 + */ + @Test + public void testSendSingleSms_successWhenSmsTemplateDisable() { + // 准备参数 + String mobile = randomString(); + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String templateCode = randomString(); + Map templateParams = MapUtil.builder().put("code", "1234") + .put("op", "login").build(); + // mock SmsTemplateService 的方法 + SysSmsTemplateDO template = randomPojo(SysSmsTemplateDO.class, o -> { + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); + o.setContent("验证码为{code}, 操作为{op}"); + o.setParams(Lists.newArrayList("code", "op")); + }); + when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); + String content = randomString(); + when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) + .thenReturn(content); + // mock SmsLogService 的方法 + Long smsLogId = randomLongId(); + when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.FALSE), eq(template), + eq(content), eq(templateParams))).thenReturn(smsLogId); + + // 调用 + Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); + // 断言 + assertEquals(smsLogId, resultSmsLogId); + // 断言调用 + verify(smsProducer, times(0)).sendSmsSendMessage(anyLong(), anyString(), + anyLong(), any(), anyList()); + } + + @Test + public void testCheckSmsTemplateValid_notExists() { + // 准备参数 + String templateCode = randomString(); + // mock 方法 + + // 调用,并断言异常 + assertServiceException(() -> smsService.checkSmsTemplateValid(templateCode), + SMS_TEMPLATE_NOT_EXISTS); + } + + @Test + public void testBuildTemplateParams_paramMiss() { + // 准备参数 + SysSmsTemplateDO template = randomPojo(SysSmsTemplateDO.class, + o -> o.setParams(Lists.newArrayList("code"))); + Map templateParams = new HashMap<>(); + // mock 方法 + + // 调用,并断言异常 + assertServiceException(() -> smsService.buildTemplateParams(template, templateParams), + SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, "code"); + } + + @Test + public void testCheckMobile_notExists() { + // 准备参数 + // mock 方法 + + // 调用,并断言异常 + assertServiceException(() -> smsService.checkMobile(null), + SMS_SEND_MOBILE_NOT_EXISTS); + } + + @Test + @SuppressWarnings("unchecked") + public void testDoSendSms() { + // 准备参数 + SysSmsSendMessage message = randomPojo(SysSmsSendMessage.class); + // mock SmsClientFactory 的方法 + SmsClient smsClient = spy(SmsClient.class); + when(smsClientFactory.getSmsClient(eq(message.getChannelId()))).thenReturn(smsClient); + // mock SmsClient 的方法 + SmsCommonResult sendResult = randomPojo(SmsCommonResult.class, SmsSendRespDTO.class); + when(smsClient.sendSms(eq(message.getLogId()), eq(message.getMobile()), eq(message.getApiTemplateId()), + eq(message.getTemplateParams()))).thenReturn(sendResult); + + // 调用 + smsService.doSendSms(message); + // 断言 + verify(smsLogService, times(1)).updateSmsSendResult(eq(message.getLogId()), + eq(sendResult.getCode()), eq(sendResult.getMsg()), eq(sendResult.getApiCode()), + eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo())); + } + + @Test + public void testReceiveSmsStatus() throws Throwable { + // 准备参数 + String channelCode = randomString(); + String text = randomString(); + // mock SmsClientFactory 的方法 + SmsClient smsClient = spy(SmsClient.class); + when(smsClientFactory.getSmsClient(eq(channelCode))).thenReturn(smsClient); + // mock SmsClient 的方法 + List receiveResults = randomPojoList(SmsReceiveRespDTO.class); + + // 调用 + smsService.receiveSmsStatus(channelCode, text); + // 断言 + receiveResults.forEach(result -> { + smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()), + eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode())); + }); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateServiceTest.java new file mode 100644 index 0000000..4707b91 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateServiceTest.java @@ -0,0 +1,380 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.sms; + +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.sms.core.client.SmsClient; +import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory; +import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsTemplateMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsTemplateTypeEnum; +import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer; +import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsTemplateServiceImpl; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import com.google.common.collect.Lists; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import static cn.hutool.core.bean.BeanUtil.getFieldValue; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +/** +* {@link SysSmsTemplateServiceImpl} 的单元测试类 +* +* @author 芋道源码 +*/ +@Import(SysSmsTemplateServiceImpl.class) +public class SysSmsTemplateServiceTest extends BaseDbUnitTest { + + @Resource + private SysSmsTemplateServiceImpl smsTemplateService; + + @Resource + private SysSmsTemplateMapper smsTemplateMapper; + + @MockBean + private SysSmsChannelService smsChannelService; + @MockBean + private SmsClientFactory smsClientFactory; + @MockBean + private SmsClient smsClient; + @MockBean + private SysSmsProducer smsProducer; + + @Test + @SuppressWarnings("unchecked") + void testInitLocalCache() { + // mock 数据 + SysSmsTemplateDO smsTemplate01 = randomSmsTemplateDO(); + smsTemplateMapper.insert(smsTemplate01); + SysSmsTemplateDO smsTemplate02 = randomSmsTemplateDO(); + smsTemplateMapper.insert(smsTemplate02); + + // 调用 + smsTemplateService.initLocalCache(); + // 断言 deptCache 缓存 + Map smsTemplateCache = (Map) getFieldValue(smsTemplateService, "smsTemplateCache"); + assertEquals(2, smsTemplateCache.size()); + assertPojoEquals(smsTemplate01, smsTemplateCache.get(smsTemplate01.getCode())); + assertPojoEquals(smsTemplate02, smsTemplateCache.get(smsTemplate02.getCode())); + // 断言 maxUpdateTime 缓存 + Date maxUpdateTime = (Date) getFieldValue(smsTemplateService, "maxUpdateTime"); + assertEquals(max(smsTemplate01.getUpdateTime(), smsTemplate02.getUpdateTime()), maxUpdateTime); + } + + @Test + public void testParseTemplateContentParams() { + // 准备参数 + String content = "正在进行登录操作{operation},您的验证码是{code}"; + // mock 方法 + + // 调用 + List params = smsTemplateService.parseTemplateContentParams(content); + // 断言 + assertEquals(Lists.newArrayList("operation", "code"), params); + } + + @Test + @SuppressWarnings("unchecked") + public void testCreateSmsTemplate_success() { + // 准备参数 + SysSmsTemplateCreateReqVO reqVO = randomPojo(SysSmsTemplateCreateReqVO.class, o -> { + o.setContent("正在进行登录操作{operation},您的验证码是{code}"); + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 + }); + // mock Channel 的方法 + SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { + o.setId(reqVO.getChannelId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 + }); + when(smsChannelService.getSmsChannel(eq(channelDO.getId()))).thenReturn(channelDO); + // mock 获得 API 短信模板成功 + when(smsClientFactory.getSmsClient(eq(reqVO.getChannelId()))).thenReturn(smsClient); + when(smsClient.getSmsTemplate(eq(reqVO.getApiTemplateId()))).thenReturn(randomPojo(SmsCommonResult.class, SmsTemplateRespDTO.class, + o -> o.setCode(GlobalErrorCodeConstants.SUCCESS.getCode()))); + + // 调用 + Long smsTemplateId = smsTemplateService.createSmsTemplate(reqVO); + // 断言 + assertNotNull(smsTemplateId); + // 校验记录的属性是否正确 + SysSmsTemplateDO smsTemplate = smsTemplateMapper.selectById(smsTemplateId); + assertPojoEquals(reqVO, smsTemplate); + assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); + assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); + // 校验调用 + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); + } + + @Test + @SuppressWarnings("unchecked") + public void testUpdateSmsTemplate_success() { + // mock 数据 + SysSmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); + smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysSmsTemplateUpdateReqVO reqVO = randomPojo(SysSmsTemplateUpdateReqVO.class, o -> { + o.setId(dbSmsTemplate.getId()); // 设置更新的 ID + o.setContent("正在进行登录操作{operation},您的验证码是{code}"); + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 + }); + // mock 方法 + SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { + o.setId(reqVO.getChannelId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 + }); + when(smsChannelService.getSmsChannel(eq(channelDO.getId()))).thenReturn(channelDO); + // mock 获得 API 短信模板成功 + when(smsClientFactory.getSmsClient(eq(reqVO.getChannelId()))).thenReturn(smsClient); + when(smsClient.getSmsTemplate(eq(reqVO.getApiTemplateId()))).thenReturn(randomPojo(SmsCommonResult.class, SmsTemplateRespDTO.class, + o -> o.setCode(GlobalErrorCodeConstants.SUCCESS.getCode()))); + + // 调用 + smsTemplateService.updateSmsTemplate(reqVO); + // 校验是否更新正确 + SysSmsTemplateDO smsTemplate = smsTemplateMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, smsTemplate); + assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); + assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); + // 校验调用 + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); + } + + @Test + public void testUpdateSmsTemplate_notExists() { + // 准备参数 + SysSmsTemplateUpdateReqVO reqVO = randomPojo(SysSmsTemplateUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> smsTemplateService.updateSmsTemplate(reqVO), SMS_TEMPLATE_NOT_EXISTS); + } + + @Test + public void testDeleteSmsTemplate_success() { + // mock 数据 + SysSmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); + smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbSmsTemplate.getId(); + + // 调用 + smsTemplateService.deleteSmsTemplate(id); + // 校验数据不存在了 + assertNull(smsTemplateMapper.selectById(id)); + // 校验调用 + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); + } + + @Test + public void testDeleteSmsTemplate_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> smsTemplateService.deleteSmsTemplate(id), SMS_TEMPLATE_NOT_EXISTS); + } + + @Test + public void testGetSmsTemplatePage() { + // mock 数据 + SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class, o -> { // 等会查询到 + o.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCode("yudaoyuanma"); + o.setContent("芋道源码"); + o.setApiTemplateId("yunai"); + o.setChannelId(1L); + o.setCreateTime(buildTime(2021, 11, 11)); + }); + smsTemplateMapper.insert(dbSmsTemplate); + // 测试 type 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setType(SysSmsTemplateTypeEnum.VERIFICATION_CODE.getType()))); + // 测试 status 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 code 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCode("yuanma"))); + // 测试 content 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setContent("源码"))); + // 测试 apiTemplateId 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setApiTemplateId("nai"))); + // 测试 channelId 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setChannelId(2L))); + // 测试 createTime 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12)))); + // 准备参数 + SysSmsTemplatePageReqVO reqVO = new SysSmsTemplatePageReqVO(); + reqVO.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCode("yudao"); + reqVO.setContent("芋道"); + reqVO.setApiTemplateId("yu"); + reqVO.setChannelId(1L); + reqVO.setBeginCreateTime(buildTime(2021, 11, 1)); + reqVO.setEndCreateTime(buildTime(2021, 12, 1)); + + // 调用 + PageResult pageResult = smsTemplateService.getSmsTemplatePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbSmsTemplate, pageResult.getList().get(0)); + } + + @Test + public void testGetSmsTemplateList() { + // mock 数据 + SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class, o -> { // 等会查询到 + o.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCode("yudaoyuanma"); + o.setContent("芋道源码"); + o.setApiTemplateId("yunai"); + o.setChannelId(1L); + o.setCreateTime(buildTime(2021, 11, 11)); + }); + smsTemplateMapper.insert(dbSmsTemplate); + // 测试 type 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setType(SysSmsTemplateTypeEnum.VERIFICATION_CODE.getType()))); + // 测试 status 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 code 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCode("yuanma"))); + // 测试 content 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setContent("源码"))); + // 测试 apiTemplateId 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setApiTemplateId("nai"))); + // 测试 channelId 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setChannelId(2L))); + // 测试 createTime 不匹配 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12)))); + // 准备参数 + SysSmsTemplateExportReqVO reqVO = new SysSmsTemplateExportReqVO(); + reqVO.setType(SysSmsTemplateTypeEnum.PROMOTION.getType()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCode("yudao"); + reqVO.setContent("芋道"); + reqVO.setApiTemplateId("yu"); + reqVO.setChannelId(1L); + reqVO.setBeginCreateTime(buildTime(2021, 11, 1)); + reqVO.setEndCreateTime(buildTime(2021, 12, 1)); + + // 调用 + List list = smsTemplateService.getSmsTemplateList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbSmsTemplate, list.get(0)); + } + + @Test + public void testCheckSmsChannel_success() { + // 准备参数 + Long channelId = randomLongId(); + // mock 方法 + SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { + o.setId(channelId); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 + }); + when(smsChannelService.getSmsChannel(eq(channelId))).thenReturn(channelDO); + + // 调用 + SysSmsChannelDO returnChannelDO = smsTemplateService.checkSmsChannel(channelId); + // 断言 + assertPojoEquals(returnChannelDO, channelDO); + } + + @Test + public void testCheckSmsChannel_notExists() { + // 准备参数 + Long channelId = randomLongId(); + + // 调用,校验异常 + assertServiceException(() -> smsTemplateService.checkSmsChannel(channelId), + SMS_CHANNEL_NOT_EXISTS); + } + + @Test + public void testCheckSmsChannel_disable() { + // 准备参数 + Long channelId = randomLongId(); + // mock 方法 + SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { + o.setId(channelId); + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); // 保证 status 禁用,触发失败 + }); + when(smsChannelService.getSmsChannel(eq(channelId))).thenReturn(channelDO); + + // 调用,校验异常 + assertServiceException(() -> smsTemplateService.checkSmsChannel(channelId), + SMS_CHANNEL_DISABLE); + } + + @Test + public void testCheckDictDataValueUnique_success() { + // 调用,成功 + smsTemplateService.checkSmsTemplateCodeDuplicate(randomLongId(), randomString()); + } + + @Test + public void testCheckSmsTemplateCodeDuplicate_valueDuplicateForCreate() { + // 准备参数 + String code = randomString(); + // mock 数据 + smsTemplateMapper.insert(randomSmsTemplateDO(o -> o.setCode(code))); + + // 调用,校验异常 + assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(null, code), + SMS_TEMPLATE_CODE_DUPLICATE, code); + } + + @Test + public void testCheckDictDataValueUnique_valueDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + String code = randomString(); + // mock 数据 + smsTemplateMapper.insert(randomSmsTemplateDO(o -> o.setCode(code))); + + // 调用,校验异常 + assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(id, code), + SMS_TEMPLATE_CODE_DUPLICATE, code); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static SysSmsTemplateDO randomSmsTemplateDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 + }; + return randomPojo(SysSmsTemplateDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java new file mode 100644 index 0000000..95833e0 --- /dev/null +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java @@ -0,0 +1,590 @@ +package cn.iocoder.yudao.adminserver.modules.system.service.user; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.yudao.adminserver.BaseDbUnitTest; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper; +import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; +import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.mockito.stubbing.Answer; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; +import org.springframework.security.crypto.password.PasswordEncoder; + +import javax.annotation.Resource; +import java.io.ByteArrayInputStream; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomBytes; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static org.assertj.core.util.Lists.newArrayList; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +/** + * {@link SysUserService} 的单元测试类 + * + * @author zxl + */ +@Import(SysUserServiceImpl.class) +public class SysUserServiceImplTest extends BaseDbUnitTest { + + @Resource + private SysUserServiceImpl userService; + + @Resource + private SysUserMapper userMapper; + + @MockBean + private SysDeptService deptService; + @MockBean + private SysPostService postService; + @MockBean + private SysPermissionService permissionService; + @MockBean + private PasswordEncoder passwordEncoder; + @MockBean + private InfFileService fileService; + + @Test + public void testCreatUser_success() { + // 准备参数 + SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class, o -> { + o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); + o.setMobile(randomString()); + }); + // mock deptService 的方法 + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { + o.setId(reqVO.getDeptId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + // mock postService 的方法 + List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> + randomPojo(SysPostDO.class, o -> { + o.setId(postId); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + })); + when(postService.getPosts(eq(reqVO.getPostIds()), isNull())).thenReturn(posts); + // mock passwordEncoder 的方法 + when(passwordEncoder.encode(eq(reqVO.getPassword()))).thenReturn("yudaoyuanma"); + + // 调用 + Long userId = userService.createUser(reqVO); + // 断言 + SysUserDO user = userMapper.selectById(userId); + assertPojoEquals(reqVO, user, "password"); + assertEquals("yudaoyuanma", user.getPassword()); + assertEquals(CommonStatusEnum.ENABLE.getStatus(), user.getStatus()); + } + + @Test + public void testUpdateUser_success() { + // mock 数据 + SysUserDO dbUser = randomSysUserDO(); + userMapper.insert(dbUser); + // 准备参数 + SysUserUpdateReqVO reqVO = randomPojo(SysUserUpdateReqVO.class, o -> { + o.setId(dbUser.getId()); + o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); + o.setMobile(randomString()); + }); + // mock deptService 的方法 + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { + o.setId(reqVO.getDeptId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + // mock postService 的方法 + List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> + randomPojo(SysPostDO.class, o -> { + o.setId(postId); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + })); + when(postService.getPosts(eq(reqVO.getPostIds()), isNull())).thenReturn(posts); + + // 调用 + userService.updateUser(reqVO); + // 断言 + SysUserDO user = userMapper.selectById(reqVO.getId()); + assertPojoEquals(reqVO, user); + } + + @Test + public void testUpdateUserProfile_success() { + // mock 数据 + SysUserDO dbUser = randomSysUserDO(); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + SysUserProfileUpdateReqVO reqVO = randomPojo(SysUserProfileUpdateReqVO.class, o -> { + o.setMobile(randomString()); + o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex()); + }); + + // 调用 + userService.updateUserProfile(userId, reqVO); + // 断言 + SysUserDO user = userMapper.selectById(userId); + assertPojoEquals(reqVO, user); + } + + @Test + public void testUpdateUserPassword_success() { + // mock 数据 + SysUserDO dbUser = randomSysUserDO(o -> o.setPassword("encode:yudao")); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + SysUserProfileUpdatePasswordReqVO reqVO = randomPojo(SysUserProfileUpdatePasswordReqVO.class, o -> { + o.setOldPassword("yudao"); + o.setNewPassword("yuanma"); + }); + // mock 方法 + when(passwordEncoder.encode(anyString())).then( + (Answer) invocationOnMock -> "encode:" + invocationOnMock.getArgument(0)); + when(passwordEncoder.matches(eq(reqVO.getOldPassword()), eq(dbUser.getPassword()))).thenReturn(true); + + // 调用 + userService.updateUserPassword(userId, reqVO); + // 断言 + SysUserDO user = userMapper.selectById(userId); + assertEquals("encode:yuanma", user.getPassword()); + } + + @Test + public void testUpdateUserAvatar_success() { + // mock 数据 + SysUserDO dbUser = randomSysUserDO(); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + byte[] avatarFileBytes = randomBytes(10); + ByteArrayInputStream avatarFile = new ByteArrayInputStream(avatarFileBytes); + // mock 方法 + String avatar = randomString(); + when(fileService.createFile(anyString(), eq(avatarFileBytes))).thenReturn(avatar); + + // 调用 + userService.updateUserAvatar(userId, avatarFile); + // 断言 + SysUserDO user = userMapper.selectById(userId); + assertEquals(avatar, user.getAvatar()); + } + + @Test + public void testUpdateUserPassword02_success() { + // mock 数据 + SysUserDO dbUser = randomSysUserDO(); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + String password = "yudao"; + // mock 方法 + when(passwordEncoder.encode(anyString())).then( + (Answer) invocationOnMock -> "encode:" + invocationOnMock.getArgument(0)); + + // 调用 + userService.updateUserPassword(userId, password); + // 断言 + SysUserDO user = userMapper.selectById(userId); + assertEquals("encode:" + password, user.getPassword()); + } + + @Test + public void testUpdateUserStatus() { + // mock 数据 + SysUserDO dbUser = randomSysUserDO(); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + Integer status = randomCommonStatus(); + + // 调用 + userService.updateUserStatus(userId, status); + // 断言 + SysUserDO user = userMapper.selectById(userId); + assertEquals(status, user.getStatus()); + } + + @Test + public void testDeleteUser_success(){ + // mock 数据 + SysUserDO dbUser = randomSysUserDO(); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + + // 调用数据 + userService.deleteUser(userId); + // 校验结果 + assertNull(userService.getUser(userId)); + // 校验调用次数 + verify(permissionService, times(1)).processUserDeleted(eq(userId)); + } + + @Test + public void testGetUserPage() { + // mock 数据 + SysUserDO dbUser = initGetUserPageData(); + // 准备参数 + SysUserPageReqVO reqVO = new SysUserPageReqVO(); + reqVO.setUsername("yudao"); + reqVO.setMobile("1560"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setBeginTime(buildTime(2020, 12, 1)); + reqVO.setEndTime(buildTime(2020, 12, 24)); + reqVO.setDeptId(1L); // 其中,1L 是 2L 的父部门 + // mock 方法 + List deptList = newArrayList(randomPojo(SysDeptDO.class, o -> o.setId(2L))); + when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); + + // 调用 + PageResult pageResult = userService.getUserPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUser, pageResult.getList().get(0)); + } + + @Test + public void testGetUsers() { + // mock 数据 + SysUserDO dbUser = initGetUserPageData(); + // 准备参数 + SysUserExportReqVO reqVO = new SysUserExportReqVO(); + reqVO.setUsername("yudao"); + reqVO.setMobile("1560"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setBeginTime(buildTime(2020, 12, 1)); + reqVO.setEndTime(buildTime(2020, 12, 24)); + reqVO.setDeptId(1L); // 其中,1L 是 2L 的父部门 + // mock 方法 + List deptList = newArrayList(randomPojo(SysDeptDO.class, o -> o.setId(2L))); + when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); + + // 调用 + List list = userService.getUsers(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUser, list.get(0)); + } + + /** + * 初始化 getUserPage 方法的测试数据 + */ + private SysUserDO initGetUserPageData() { + // mock 数据 + SysUserDO dbUser = randomSysUserDO(o -> { // 等会查询到 + o.setUsername("yudaoyuanma"); + o.setMobile("15601691300"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2020, 12, 12)); + o.setDeptId(2L); + }); + userMapper.insert(dbUser); + // 测试 username 不匹配 + userMapper.insert(ObjectUtils.clone(dbUser, o -> o.setUsername("yuanma"))); + // 测试 mobile 不匹配 + userMapper.insert(ObjectUtils.clone(dbUser, o -> o.setMobile("18818260888"))); + // 测试 status 不匹配 + userMapper.insert(ObjectUtils.clone(dbUser, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + userMapper.insert(ObjectUtils.clone(dbUser, o -> o.setCreateTime(buildTime(2020, 11, 11)))); + // 测试 dept 不匹配 + userMapper.insert(ObjectUtils.clone(dbUser, o -> o.setDeptId(0L))); + return dbUser; + } + + /** + * 情况一,校验不通过,导致插入失败 + */ + @Test + public void testImportUsers_01() { + // 准备参数 + SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class); + // mock 方法 + + // 调用 + SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); + // 断言 + assertEquals(0, respVO.getCreateUsernames().size()); + assertEquals(0, respVO.getUpdateUsernames().size()); + assertEquals(1, respVO.getFailureUsernames().size()); + assertEquals(DEPT_NOT_FOUND.getMsg(), respVO.getFailureUsernames().get(importUser.getUsername())); + } + + /** + * 情况二,不存在,进行插入 + */ + @Test + public void testImportUsers_02() { + // 准备参数 + SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class, o -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 + }); + // mock deptService 的方法 + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { + o.setId(importUser.getDeptId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + // mock passwordEncoder 的方法 + when(passwordEncoder.encode(eq("yudaoyuanma"))).thenReturn("java"); + + // 调用 + SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); + // 断言 + assertEquals(1, respVO.getCreateUsernames().size()); + SysUserDO user = userMapper.selectByUsername(respVO.getCreateUsernames().get(0)); + assertPojoEquals(importUser, user); + assertEquals("java", user.getPassword()); + assertEquals(0, respVO.getUpdateUsernames().size()); + assertEquals(0, respVO.getFailureUsernames().size()); + } + + /** + * 情况三,存在,但是不强制更新 + */ + @Test + public void testImportUsers_03() { + // mock 数据 + SysUserDO dbUser = randomSysUserDO(); + userMapper.insert(dbUser); + // 准备参数 + SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class, o -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 + o.setUsername(dbUser.getUsername()); + }); + // mock deptService 的方法 + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { + o.setId(importUser.getDeptId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + + // 调用 + SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), false); + // 断言 + assertEquals(0, respVO.getCreateUsernames().size()); + assertEquals(0, respVO.getUpdateUsernames().size()); + assertEquals(1, respVO.getFailureUsernames().size()); + assertEquals(USER_USERNAME_EXISTS.getMsg(), respVO.getFailureUsernames().get(importUser.getUsername())); + } + + /** + * 情况四,存在,强制更新 + */ + @Test + public void testImportUsers_04() { + // mock 数据 + SysUserDO dbUser = randomSysUserDO(); + userMapper.insert(dbUser); + // 准备参数 + SysUserImportExcelVO importUser = randomPojo(SysUserImportExcelVO.class, o -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 + o.setUsername(dbUser.getUsername()); + }); + // mock deptService 的方法 + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { + o.setId(importUser.getDeptId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + + // 调用 + SysUserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); + // 断言 + assertEquals(0, respVO.getCreateUsernames().size()); + assertEquals(1, respVO.getUpdateUsernames().size()); + SysUserDO user = userMapper.selectByUsername(respVO.getUpdateUsernames().get(0)); + assertPojoEquals(importUser, user); + assertEquals(0, respVO.getFailureUsernames().size()); + } + + @Test + public void testCheckUserExists_notExists() { + assertServiceException(() -> userService.checkUserExists(randomLongId()), USER_NOT_EXISTS); + } + + @Test + public void testCheckUsernameUnique_usernameExistsForCreate() { + // 准备参数 + String username = randomString(); + // mock 数据 + userMapper.insert(randomSysUserDO(o -> o.setUsername(username))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkUsernameUnique(null, username), + USER_USERNAME_EXISTS); + } + + @Test + public void testCheckUsernameUnique_usernameExistsForUpdate() { + // 准备参数 + Long id = randomLongId(); + String username = randomString(); + // mock 数据 + userMapper.insert(randomSysUserDO(o -> o.setUsername(username))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkUsernameUnique(id, username), + USER_USERNAME_EXISTS); + } + + @Test + public void testCheckEmailUnique_emailExistsForCreate() { + // 准备参数 + String email = randomString(); + // mock 数据 + userMapper.insert(randomSysUserDO(o -> o.setEmail(email))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkEmailUnique(null, email), + USER_EMAIL_EXISTS); + } + + @Test + public void testCheckEmailUnique_emailExistsForUpdate() { + // 准备参数 + Long id = randomLongId(); + String email = randomString(); + // mock 数据 + userMapper.insert(randomSysUserDO(o -> o.setEmail(email))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkEmailUnique(id, email), + USER_EMAIL_EXISTS); + } + + @Test + public void testCheckMobileUnique_mobileExistsForCreate() { + // 准备参数 + String mobile = randomString(); + // mock 数据 + userMapper.insert(randomSysUserDO(o -> o.setMobile(mobile))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkMobileUnique(null, mobile), + USER_MOBILE_EXISTS); + } + + @Test + public void testCheckMobileUnique_mobileExistsForUpdate() { + // 准备参数 + Long id = randomLongId(); + String mobile = randomString(); + // mock 数据 + userMapper.insert(randomSysUserDO(o -> o.setMobile(mobile))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkMobileUnique(id, mobile), + USER_MOBILE_EXISTS); + } + + @Test + public void testCheckDeptEnable_notFound() { + assertServiceException(() -> userService.checkDeptEnable(randomLongId()), + DEPT_NOT_FOUND); + } + + @Test + public void testCheckDeptEnable_notEnable() { + // 准备参数 + Long deptId = randomLongId(); + // mock deptService 的方法 + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { + o.setId(deptId); + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); + }); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + + // 调用,校验异常 + assertServiceException(() -> userService.checkDeptEnable(deptId), + DEPT_NOT_ENABLE); + } + + @Test + public void testCheckPostEnable_notFound() { + assertServiceException(() -> userService.checkPostEnable(randomSet(Long.class)), + POST_NOT_FOUND); + } + + @Test + public void testCheckPostEnable_notEnable() { + // 准备参数 + Set postIds = randomSet(Long.class); + // mock postService 的方法 + List posts = CollectionUtils.convertList(postIds, postId -> + randomPojo(SysPostDO.class, o -> { + o.setId(postId); + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); + })); + when(postService.getPosts(eq(postIds), isNull())).thenReturn(posts); + + // 调用,校验异常 + assertServiceException(() -> userService.checkPostEnable(postIds), + POST_NOT_ENABLE, CollUtil.getFirst(posts).getName()); + } + + @Test + public void testCheckOldPassword_notExists() { + assertServiceException(() -> userService.checkOldPassword(randomLongId(), randomString()), + USER_NOT_EXISTS); + } + + @Test + public void testCheckOldPassword_passwordFailed() { + // mock 数据 + SysUserDO user = randomSysUserDO(); + userMapper.insert(user); + // 准备参数 + Long id = user.getId(); + String oldPassword = user.getPassword(); + + // 调用,校验异常 + assertServiceException(() -> userService.checkOldPassword(id, oldPassword), + USER_PASSWORD_FAILED); + // 校验调用 + verify(passwordEncoder, times(1)).matches(eq(oldPassword), eq(user.getPassword())); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static SysUserDO randomSysUserDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围 + }; + return randomPojo(SysUserDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/yudao-admin-server/src/test/resources/application-unit-test.yaml b/yudao-admin-server/src/test/resources/application-unit-test.yaml index 70cecc4..5b14614 100644 --- a/yudao-admin-server/src/test/resources/application-unit-test.yaml +++ b/yudao-admin-server/src/test/resources/application-unit-test.yaml @@ -51,12 +51,6 @@ resilience4j: # 芋道配置项,设置当前项目所有自定义的配置 yudao: - info: - version: 1.0.0 - base-package: cn.iocoder.dashboard - web: - api-prefix: /api - controller-package: ${yudao.info.base-package} security: token-header: Authorization token-secret: abcdefghijklmnopqrstuvwxyz @@ -66,15 +60,8 @@ yudao: mock-secret: test swagger: enable: false # 单元测试,禁用 Swagger - captcha: - timeout: 5m - width: 160 - height: 60 file: base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ - codegen: - base-package: ${yudao.info.base-package}.modules - db-schemas: ${spring.datasource.name} xss: enable: false exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 -- libgit2 0.21.4