1
13693261870
2024-08-16 0f8fd77e9b323cd3712d6ab18723c8716def5311
1
已重命名56个文件
已添加142个文件
已删除241个文件
42398 ■■■■■ 文件已修改
ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/form/RegisterBody.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysRecordLogService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/resources/banner.txt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/RuoYiGatewayApplication.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CaptchaConfig.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/KaptchaTextCreator.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/CaptchaProperties.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/IgnoreWhiteProperties.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/XssProperties.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListUrlFilter.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/ValidateCodeHandler.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/ValidateCodeService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/resources/banner.txt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/MinioConfig.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/ResourcesConfig.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/RuoYiGenApplication.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/config/GenConfig.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/controller/GenController.java 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/domain/GenTable.java 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/domain/GenTableColumn.java 374 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/mapper/GenTableColumnMapper.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/mapper/GenTableMapper.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableColumnServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableServiceImpl.java 521 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/IGenTableColumnService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/IGenTableService.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/GenUtils.java 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityInitializer.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java 408 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/RuoYiJobApplication.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobController.java 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobLogController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/SysJob.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/SysJobLog.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/mapper/SysJobLogMapper.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/mapper/SysJobMapper.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/ISysJobLogService.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/ISysJobService.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SysJobLogServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SysJobServiceImpl.java 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/RyTask.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/AbstractQuartzJob.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/CronUtils.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/JobInvokeUtil.java 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/QuartzDisallowConcurrentExecution.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/QuartzJobExecution.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/ScheduleUtils.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLogininforController.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMenuController.java 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysNoticeController.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOperlogController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java 341 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserOnlineController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenu.java 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TreeSelect.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPermissionService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java 543 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPermissionServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java 427 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 551 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/pom.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/java/com/se/file/SeFileApplication.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/java/com/se/file/config/MinioConfig.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/java/com/se/file/config/ResourcesConfig.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/java/com/se/file/controller/SysFileController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/java/com/se/file/service/FastDfsSysFileServiceImpl.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/java/com/se/file/service/ISysFileService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/java/com/se/file/service/LocalSysFileServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/java/com/se/file/service/MinioSysFileServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/java/com/se/file/utils/FileUploadUtils.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/resources/banner.txt 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/resources/bootstrap.yml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-file/src/main/resources/logback.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/pom.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/SeGenApplication.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/config/GenConfig.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/controller/GenController.java 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/domain/GenTable.java 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/domain/GenTableColumn.java 374 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/mapper/GenTableColumnMapper.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/mapper/GenTableMapper.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/service/GenTableColumnServiceImpl.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/service/GenTableServiceImpl.java 522 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/service/IGenTableColumnService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/service/IGenTableService.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/util/GenUtils.java 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/util/VelocityInitializer.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/java/com/se/gen/util/VelocityUtils.java 409 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/banner.txt 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/bootstrap.yml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/logback.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/mapper/generator/GenTableMapper.xml 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/java/controller.java.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/java/domain.java.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/java/mapper.java.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/java/service.java.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/java/serviceImpl.java.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/java/sub-domain.java.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/js/api.js.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/sql/sql.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/vue/index-tree.vue.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/vue/index.vue.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/vue/v3/index-tree.vue.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/vue/v3/index.vue.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-gen/src/main/resources/vm/xml/mapper.xml.vm 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/pom.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/SeJobApplication.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/config/ScheduleConfig.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/controller/SysJobController.java 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/controller/SysJobLogController.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/domain/SysJob.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/domain/SysJobLog.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/mapper/SysJobLogMapper.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/mapper/SysJobMapper.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/service/ISysJobLogService.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/service/ISysJobService.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/service/SysJobLogServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/service/SysJobServiceImpl.java 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/task/RyTask.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/util/AbstractQuartzJob.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/util/CronUtils.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/util/JobInvokeUtil.java 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/util/QuartzDisallowConcurrentExecution.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/util/QuartzJobExecution.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/java/com/se/job/util/ScheduleUtils.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/resources/banner.txt 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/resources/bootstrap.yml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/resources/logback.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/resources/mapper/job/SysJobLogMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-job/src/main/resources/mapper/job/SysJobMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/pom.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/RuoYiSystemApplication.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysConfigController.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysDeptController.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysDictDataController.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysDictTypeController.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysLogininforController.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysMenuController.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysNoticeController.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysOperlogController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysPostController.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysProfileController.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysRoleController.java 240 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysUserController.java 341 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysUserOnlineController.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysConfig.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysMenu.java 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysNotice.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysPost.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysRoleDept.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysRoleMenu.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysUserOnline.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysUserPost.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysUserRole.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/vo/MetaVo.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/vo/RouterVo.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/domain/vo/TreeSelect.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysConfigMapper.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysDeptMapper.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysDictDataMapper.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysDictTypeMapper.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysLogininforMapper.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysMenuMapper.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysNoticeMapper.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysOperLogMapper.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysPostMapper.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysRoleDeptMapper.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysRoleMapper.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysRoleMenuMapper.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysUserMapper.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysUserPostMapper.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysUserRoleMapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysConfigService.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysDeptService.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysDictDataService.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysDictTypeService.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysLogininforService.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysMenuService.java 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysNoticeService.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysOperLogService.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysPermissionService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysPostService.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysRoleService.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysUserOnlineService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysUserService.java 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysConfigServiceImpl.java 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysDeptServiceImpl.java 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysDictDataServiceImpl.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysDictTypeServiceImpl.java 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysLogininforServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysMenuServiceImpl.java 544 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysNoticeServiceImpl.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysOperLogServiceImpl.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysPermissionServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysPostServiceImpl.java 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysRoleServiceImpl.java 428 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysUserOnlineServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysUserServiceImpl.java 552 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/banner.txt 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/bootstrap.yml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/logback.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysConfigMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysDeptMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysDictDataMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysDictTypeMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysLogininforMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysMenuMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysNoticeMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysOperLogMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysPostMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysRoleMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysUserMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysUserPostMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/se-system/src/main/resources/mapper/system/SysUserRoleMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/pom.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteLogService.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysFile.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLogininfor.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java 241 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java 323 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteLogFallbackFactory.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUser.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/pom.xml 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/java/com/se/auth/SeAuthApplication.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/java/com/se/auth/controller/TokenController.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/java/com/se/auth/form/LoginBody.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/java/com/se/auth/form/RegisterBody.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/java/com/se/auth/service/SysLoginService.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/java/com/se/auth/service/SysPasswordService.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/java/com/se/auth/service/SysRecordLogService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/resources/banner.txt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/resources/bootstrap.yml 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/resources/logback.xml 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/pom.xml 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excels.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/UserConstants.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/R.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/UserStatus.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/CaptchaException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/CheckedException.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/GlobalException.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/ServiceException.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotPermissionException.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotRoleException.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileNameLengthLimitExceededException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileSizeLimitExceededException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/InvalidExtensionException.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/CaptchaExpireException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/Convert.java 1016 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/StrFormatter.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ExceptionUtil.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/PageUtils.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ServletUtils.java 333 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/SpringUtils.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java 607 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanUtils.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileTypeUtils.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/EscapeUtil.java 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java 570 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java 382 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelHandlerAdapter.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/IdUtils.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/Seq.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/UUID.java 484 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/controller/BaseController.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/AjaxResult.java 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseEntity.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/TreeEntity.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/PageDomain.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableDataInfo.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableSupport.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-datascope/pom.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/annotation/DataScope.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-datascope/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-datasource/src/main/java/com/ruoyi/common/datasource/annotation/Slave.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-log/pom.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/filter/PropertyPreExcludeFilter.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-redis/pom.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/FastJson2JsonRedisSerializer.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java 268 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/pom.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/EnableCustomConfig.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/EnableRyFeignClients.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/Logical.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresLogin.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresPermissions.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresRoles.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/aspect/PreAuthorizeAspect.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java 373 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/ApplicationConfig.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/WebMvcConfig.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignAutoConfiguration.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignRequestInterceptor.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-sensitive/pom.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-sensitive/src/main/java/com/ruoyi/common/sensitive/annotation/Sensitive.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-swagger/pom.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerAutoConfiguration.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerProperties.java 343 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerWebConfiguration.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/ruoyi-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/pom.xml 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/SeGatewayApplication.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/config/CaptchaConfig.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/config/GatewayConfig.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/config/KaptchaTextCreator.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/config/RouterFunctionConfiguration.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/config/SwaggerProvider.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/config/properties/CaptchaProperties.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/config/properties/IgnoreWhiteProperties.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/config/properties/XssProperties.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/filter/AuthFilter.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/filter/BlackListUrlFilter.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/filter/CacheRequestFilter.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/filter/ValidateCodeFilter.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/filter/XssFilter.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/handler/GatewayExceptionHandler.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/handler/SentinelFallbackHandler.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/handler/SwaggerHandler.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/handler/ValidateCodeHandler.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/service/ValidateCodeService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/java/com/se/gateway/service/impl/ValidateCodeServiceImpl.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/resources/banner.txt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/resources/bootstrap.yml 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/resources/logback.xml 补丁 | 查看 | 原始文档 | blame | 历史
se-visual/ruoyi-monitor/src/main/java/com/ruoyi/modules/monitor/RuoYiMonitorApplication.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-visual/ruoyi-monitor/src/main/java/com/ruoyi/modules/monitor/config/WebSecurityConfigurer.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-visual/ruoyi-monitor/src/main/resources/banner.txt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-visual/se-monitor/pom.xml 补丁 | 查看 | 原始文档 | blame | 历史
se-visual/se-monitor/src/main/java/com/se/modules/monitor/SeMonitorApplication.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-visual/se-monitor/src/main/java/com/se/modules/monitor/config/WebSecurityConfigurer.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-visual/se-monitor/src/main/resources/banner.txt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-visual/se-monitor/src/main/resources/bootstrap.yml 补丁 | 查看 | 原始文档 | blame | 历史
se-visual/se-monitor/src/main/resources/logback.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java
ÎļþÒÑɾ³ý
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
ÎļþÒÑɾ³ý
ruoyi-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java
ÎļþÒÑɾ³ý
ruoyi-auth/src/main/java/com/ruoyi/auth/form/RegisterBody.java
ÎļþÒÑɾ³ý
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
ÎļþÒÑɾ³ý
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java
ÎļþÒÑɾ³ý
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysRecordLogService.java
ÎļþÒÑɾ³ý
ruoyi-auth/src/main/resources/banner.txt
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/RuoYiGatewayApplication.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CaptchaConfig.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/KaptchaTextCreator.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/CaptchaProperties.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/IgnoreWhiteProperties.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/XssProperties.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListUrlFilter.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/ValidateCodeHandler.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/ValidateCodeService.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-gateway/src/main/resources/banner.txt
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/MinioConfig.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/ResourcesConfig.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/RuoYiGenApplication.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/config/GenConfig.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/controller/GenController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/domain/GenTable.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/domain/GenTableColumn.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/mapper/GenTableColumnMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/mapper/GenTableMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableColumnServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/IGenTableColumnService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/IGenTableService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/GenUtils.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityInitializer.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/RuoYiJobApplication.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobLogController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/SysJob.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/SysJobLog.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/mapper/SysJobLogMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/mapper/SysJobMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/ISysJobLogService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/ISysJobService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SysJobLogServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SysJobServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/RyTask.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/AbstractQuartzJob.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/CronUtils.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/JobInvokeUtil.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/QuartzDisallowConcurrentExecution.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/QuartzJobExecution.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/ScheduleUtils.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLogininforController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMenuController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysNoticeController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOperlogController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserOnlineController.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenu.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TreeSelect.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPermissionService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPermissionServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/se-file/pom.xml
ruoyi-modules/se-file/src/main/java/com/se/file/SeFileApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.se.file;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import com.se.common.swagger.annotation.EnableCustomSwagger2;
/**
 * æ–‡ä»¶æœåŠ¡
 *
 * @author admin
 */
@EnableCustomSwagger2
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
public class SeFileApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(SeFileApplication.class, args);
        System.out.println("    æ–‡ä»¶æ¨¡å—启动成功    ");
    }
}
ruoyi-modules/se-file/src/main/java/com/se/file/config/MinioConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.se.file.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import io.minio.MinioClient;
/**
 * Minio é…ç½®ä¿¡æ¯
 *
 * @author admin
 */
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig
{
    /**
     * æœåŠ¡åœ°å€
     */
    private String url;
    /**
     * ç”¨æˆ·å
     */
    private String accessKey;
    /**
     * å¯†ç 
     */
    private String secretKey;
    /**
     * å­˜å‚¨æ¡¶åç§°
     */
    private String bucketName;
    public String getUrl()
    {
        return url;
    }
    public void setUrl(String url)
    {
        this.url = url;
    }
    public String getAccessKey()
    {
        return accessKey;
    }
    public void setAccessKey(String accessKey)
    {
        this.accessKey = accessKey;
    }
    public String getSecretKey()
    {
        return secretKey;
    }
    public void setSecretKey(String secretKey)
    {
        this.secretKey = secretKey;
    }
    public String getBucketName()
    {
        return bucketName;
    }
    public void setBucketName(String bucketName)
    {
        this.bucketName = bucketName;
    }
    @Bean
    public MinioClient getMinioClient()
    {
        return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
    }
}
ruoyi-modules/se-file/src/main/java/com/se/file/config/ResourcesConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.se.file.config;
import java.io.File;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
 * é€šç”¨æ˜ å°„配置
 *
 * @author admin
 */
@Configuration
public class ResourcesConfig implements WebMvcConfigurer
{
    /**
     * ä¸Šä¼ æ–‡ä»¶å­˜å‚¨åœ¨æœ¬åœ°çš„æ ¹è·¯å¾„
     */
    @Value("${file.path}")
    private String localFilePath;
    /**
     * èµ„源映射路径 å‰ç¼€
     */
    @Value("${file.prefix}")
    public String localFilePrefix;
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry)
    {
        /** æœ¬åœ°æ–‡ä»¶ä¸Šä¼ è·¯å¾„ */
        registry.addResourceHandler(localFilePrefix + "/**")
                .addResourceLocations("file:" + localFilePath + File.separator);
    }
    /**
     * å¼€å¯è·¨åŸŸ
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // è®¾ç½®å…è®¸è·¨åŸŸçš„路由
        registry.addMapping(localFilePrefix  + "/**")
                // è®¾ç½®å…è®¸è·¨åŸŸè¯·æ±‚的域名
                .allowedOrigins("*")
                // è®¾ç½®å…è®¸çš„æ–¹æ³•
                .allowedMethods("GET");
    }
}
ruoyi-modules/se-file/src/main/java/com/se/file/controller/SysFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.se.file.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.se.common.core.domain.R;
import com.se.common.core.utils.file.FileUtils;
import com.se.file.service.ISysFileService;
import com.se.system.api.domain.SysFile;
/**
 * æ–‡ä»¶è¯·æ±‚处理
 *
 * @author admin
 */
@RestController
public class SysFileController
{
    private static final Logger log = LoggerFactory.getLogger(SysFileController.class);
    @Autowired
    private ISysFileService sysFileService;
    /**
     * æ–‡ä»¶ä¸Šä¼ è¯·æ±‚
     */
    @PostMapping("upload")
    public R<SysFile> upload(MultipartFile file)
    {
        try
        {
            // ä¸Šä¼ å¹¶è¿”回访问地址
            String url = sysFileService.uploadFile(file);
            SysFile sysFile = new SysFile();
            sysFile.setName(FileUtils.getName(url));
            sysFile.setUrl(url);
            return R.ok(sysFile);
        }
        catch (Exception e)
        {
            log.error("上传文件失败", e);
            return R.fail(e.getMessage());
        }
    }
}
ruoyi-modules/se-file/src/main/java/com/se/file/service/FastDfsSysFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.se.file.service;
import java.io.InputStream;
import com.alibaba.nacos.common.utils.IoUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.se.common.core.utils.file.FileTypeUtils;
/**
 * FastDFS æ–‡ä»¶å­˜å‚¨
 *
 * @author admin
 */
@Service
public class FastDfsSysFileServiceImpl implements ISysFileService
{
    /**
     * åŸŸåæˆ–本机访问地址
     */
    @Value("${fdfs.domain}")
    public String domain;
    @Autowired
    private FastFileStorageClient storageClient;
    /**
     * FastDfs文件上传接口
     *
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return è®¿é—®åœ°å€
     * @throws Exception
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception
    {
        InputStream inputStream = file.getInputStream();
        StorePath storePath = storageClient.uploadFile(inputStream, file.getSize(),
                FileTypeUtils.getExtension(file), null);
        IoUtils.closeQuietly(inputStream);
        return domain + "/" + storePath.getFullPath();
    }
}
ruoyi-modules/se-file/src/main/java/com/se/file/service/ISysFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.se.file.service;
import org.springframework.web.multipart.MultipartFile;
/**
 * æ–‡ä»¶ä¸Šä¼ æŽ¥å£
 *
 * @author admin
 */
public interface ISysFileService
{
    /**
     * æ–‡ä»¶ä¸Šä¼ æŽ¥å£
     *
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return è®¿é—®åœ°å€
     * @throws Exception
     */
    public String uploadFile(MultipartFile file) throws Exception;
}
ruoyi-modules/se-file/src/main/java/com/se/file/service/LocalSysFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.se.file.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.se.file.utils.FileUploadUtils;
/**
 * æœ¬åœ°æ–‡ä»¶å­˜å‚¨
 *
 * @author admin
 */
@Primary
@Service
public class LocalSysFileServiceImpl implements ISysFileService
{
    /**
     * èµ„源映射路径 å‰ç¼€
     */
    @Value("${file.prefix}")
    public String localFilePrefix;
    /**
     * åŸŸåæˆ–本机访问地址
     */
    @Value("${file.domain}")
    public String domain;
    /**
     * ä¸Šä¼ æ–‡ä»¶å­˜å‚¨åœ¨æœ¬åœ°çš„æ ¹è·¯å¾„
     */
    @Value("${file.path}")
    private String localFilePath;
    /**
     * æœ¬åœ°æ–‡ä»¶ä¸Šä¼ æŽ¥å£
     *
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return è®¿é—®åœ°å€
     * @throws Exception
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception
    {
        String name = FileUploadUtils.upload(localFilePath, file);
        String url = domain + localFilePrefix + name;
        return url;
    }
}
ruoyi-modules/se-file/src/main/java/com/se/file/service/MinioSysFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.se.file.service;
import java.io.InputStream;
import com.se.file.config.MinioConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.alibaba.nacos.common.utils.IoUtils;
import com.se.file.utils.FileUploadUtils;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
/**
 * Minio æ–‡ä»¶å­˜å‚¨
 *
 * @author admin
 */
@Service
public class MinioSysFileServiceImpl implements ISysFileService
{
    @Autowired
    private MinioConfig minioConfig;
    @Autowired
    private MinioClient client;
    /**
     * Minio文件上传接口
     *
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return è®¿é—®åœ°å€
     * @throws Exception
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception
    {
        String fileName = FileUploadUtils.extractFilename(file);
        InputStream inputStream = file.getInputStream();
        PutObjectArgs args = PutObjectArgs.builder()
                .bucket(minioConfig.getBucketName())
                .object(fileName)
                .stream(inputStream, file.getSize(), -1)
                .contentType(file.getContentType())
                .build();
        client.putObject(args);
        IoUtils.closeQuietly(inputStream);
        return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
    }
}
ruoyi-modules/se-file/src/main/java/com/se/file/utils/FileUploadUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,185 @@
package com.se.file.utils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Objects;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
import com.se.common.core.exception.file.FileException;
import com.se.common.core.exception.file.FileNameLengthLimitExceededException;
import com.se.common.core.exception.file.FileSizeLimitExceededException;
import com.se.common.core.exception.file.InvalidExtensionException;
import com.se.common.core.utils.DateUtils;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.file.FileTypeUtils;
import com.se.common.core.utils.file.MimeTypeUtils;
import com.se.common.core.utils.uuid.Seq;
/**
 * æ–‡ä»¶ä¸Šä¼ å·¥å…·ç±»
 *
 * @author admin
 */
public class FileUploadUtils
{
    /**
     * é»˜è®¤å¤§å° 50M
     */
    public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024L;
    /**
     * é»˜è®¤çš„æ–‡ä»¶åæœ€å¤§é•¿åº¦ 100
     */
    public static final int DEFAULT_FILE_NAME_LENGTH = 100;
    /**
     * æ ¹æ®æ–‡ä»¶è·¯å¾„上传
     *
     * @param baseDir ç›¸å¯¹åº”用的基目录
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return æ–‡ä»¶åç§°
     * @throws IOException
     */
    public static final String upload(String baseDir, MultipartFile file) throws IOException
    {
        try
        {
            return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        }
        catch (FileException fe)
        {
            throw new IOException(fe.getDefaultMessage(), fe);
        }
        catch (Exception e)
        {
            throw new IOException(e.getMessage(), e);
        }
    }
    /**
     * æ–‡ä»¶ä¸Šä¼ 
     *
     * @param baseDir ç›¸å¯¹åº”用的基目录
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @param allowedExtension ä¸Šä¼ æ–‡ä»¶ç±»åž‹
     * @return è¿”回上传成功的文件名
     * @throws FileSizeLimitExceededException å¦‚果超出最大大小
     * @throws FileNameLengthLimitExceededException æ–‡ä»¶åå¤ªé•¿
     * @throws IOException æ¯”如读写文件出错时
     * @throws InvalidExtensionException æ–‡ä»¶æ ¡éªŒå¼‚常
     */
    public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
            InvalidExtensionException
    {
        int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
        {
            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }
        assertAllowed(file, allowedExtension);
        String fileName = extractFilename(file);
        String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
        file.transferTo(Paths.get(absPath));
        return getPathFileName(fileName);
    }
    /**
     * ç¼–码文件名
     */
    public static final String extractFilename(MultipartFile file)
    {
        return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
                FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), FileTypeUtils.getExtension(file));
    }
    private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
    {
        File desc = new File(uploadDir + File.separator + fileName);
        if (!desc.exists())
        {
            if (!desc.getParentFile().exists())
            {
                desc.getParentFile().mkdirs();
            }
        }
        return desc.isAbsolute() ? desc : desc.getAbsoluteFile();
    }
    private static final String getPathFileName(String fileName) throws IOException
    {
        String pathFileName = "/" + fileName;
        return pathFileName;
    }
    /**
     * æ–‡ä»¶å¤§å°æ ¡éªŒ
     *
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @throws FileSizeLimitExceededException å¦‚果超出最大大小
     * @throws InvalidExtensionException æ–‡ä»¶æ ¡éªŒå¼‚常
     */
    public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, InvalidExtensionException
    {
        long size = file.getSize();
        if (size > DEFAULT_MAX_SIZE)
        {
            throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
        }
        String fileName = file.getOriginalFilename();
        String extension = FileTypeUtils.getExtension(file);
        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
        {
            if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
                        fileName);
            }
            else
            {
                throw new InvalidExtensionException(allowedExtension, extension, fileName);
            }
        }
    }
    /**
     * åˆ¤æ–­MIME类型是否是允许的MIME类型
     *
     * @param extension ä¸Šä¼ æ–‡ä»¶ç±»åž‹
     * @param allowedExtension å…è®¸ä¸Šä¼ æ–‡ä»¶ç±»åž‹
     * @return true/false
     */
    public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
    {
        for (String str : allowedExtension)
        {
            if (str.equalsIgnoreCase(extension))
            {
                return true;
            }
        }
        return false;
    }
}
ruoyi-modules/se-file/src/main/resources/banner.txt
ruoyi-modules/se-file/src/main/resources/bootstrap.yml
ruoyi-modules/se-file/src/main/resources/logback.xml
ruoyi-modules/se-gen/pom.xml
ruoyi-modules/se-gen/src/main/java/com/se/gen/SeGenApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.se.gen;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.se.common.security.annotation.EnableCustomConfig;
import com.se.common.security.annotation.EnableRyFeignClients;
import com.se.common.swagger.annotation.EnableCustomSwagger2;
/**
 * ä»£ç ç”Ÿæˆ
 *
 * @author admin
 */
@EnableCustomConfig
@EnableCustomSwagger2
@EnableRyFeignClients
@SpringBootApplication
public class SeGenApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(SeGenApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  ä»£ç ç”Ÿæˆæ¨¡å—启动成功   áƒš(´ڡ`ლ)゙  \n" +
                " .-------.       ____     __        \n" +
                " |  _ _   \\      \\   \\   /  /    \n" +
                " | ( ' )  |       \\  _. /  '       \n" +
                " |(_ o _) /        _( )_ .'         \n" +
                " | (_,_).' __  ___(_ o _)'          \n" +
                " |  |\\ \\  |  ||   |(_,_)'         \n" +
                " |  | \\ `'   /|   `-'  /           \n" +
                " |  |  \\    /  \\      /           \n" +
                " ''-'   `'-'    `-..-'              ");
    }
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/config/GenConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.se.gen.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * ä»£ç ç”Ÿæˆç›¸å…³é…ç½®
 *
 * @author admin
 */
@Component
@ConfigurationProperties(prefix = "gen")
public class GenConfig
{
    /** ä½œè€… */
    public static String author;
    /** ç”ŸæˆåŒ…路径 */
    public static String packageName;
    /** è‡ªåŠ¨åŽ»é™¤è¡¨å‰ç¼€ï¼Œé»˜è®¤æ˜¯false */
    public static boolean autoRemovePre;
    /** è¡¨å‰ç¼€(类名不会包含表前缀) */
    public static String tablePrefix;
    public static String getAuthor()
    {
        return author;
    }
    public void setAuthor(String author)
    {
        GenConfig.author = author;
    }
    public static String getPackageName()
    {
        return packageName;
    }
    public void setPackageName(String packageName)
    {
        GenConfig.packageName = packageName;
    }
    public static boolean getAutoRemovePre()
    {
        return autoRemovePre;
    }
    public void setAutoRemovePre(boolean autoRemovePre)
    {
        GenConfig.autoRemovePre = autoRemovePre;
    }
    public static String getTablePrefix()
    {
        return tablePrefix;
    }
    public void setTablePrefix(String tablePrefix)
    {
        GenConfig.tablePrefix = tablePrefix;
    }
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/controller/GenController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,212 @@
package com.se.gen.controller;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import com.se.gen.domain.GenTableColumn;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.text.Convert;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.gen.domain.GenTable;
import com.se.gen.service.IGenTableColumnService;
import com.se.gen.service.IGenTableService;
/**
 * ä»£ç ç”Ÿæˆ æ“ä½œå¤„理
 *
 * @author admin
 */
@RequestMapping("/gen")
@RestController
public class GenController extends BaseController
{
    @Autowired
    private IGenTableService genTableService;
    @Autowired
    private IGenTableColumnService genTableColumnService;
    /**
     * æŸ¥è¯¢ä»£ç ç”Ÿæˆåˆ—表
     */
    @RequiresPermissions("tool:gen:list")
    @GetMapping("/list")
    public TableDataInfo genList(GenTable genTable)
    {
        startPage();
        List<GenTable> list = genTableService.selectGenTableList(genTable);
        return getDataTable(list);
    }
    /**
     * ä¿®æ”¹ä»£ç ç”Ÿæˆä¸šåŠ¡
     */
    @RequiresPermissions("tool:gen:query")
    @GetMapping(value = "/{tableId}")
    public AjaxResult getInfo(@PathVariable Long tableId)
    {
        GenTable table = genTableService.selectGenTableById(tableId);
        List<GenTable> tables = genTableService.selectGenTableAll();
        List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(tableId);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("info", table);
        map.put("rows", list);
        map.put("tables", tables);
        return success(map);
    }
    /**
     * æŸ¥è¯¢æ•°æ®åº“列表
     */
    @RequiresPermissions("tool:gen:list")
    @GetMapping("/db/list")
    public TableDataInfo dataList(GenTable genTable)
    {
        startPage();
        List<GenTable> list = genTableService.selectDbTableList(genTable);
        return getDataTable(list);
    }
    /**
     * æŸ¥è¯¢æ•°æ®è¡¨å­—段列表
     */
    @GetMapping(value = "/column/{tableId}")
    public TableDataInfo columnList(Long tableId)
    {
        TableDataInfo dataInfo = new TableDataInfo();
        List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(tableId);
        dataInfo.setRows(list);
        dataInfo.setTotal(list.size());
        return dataInfo;
    }
    /**
     * å¯¼å…¥è¡¨ç»“构(保存)
     */
    @RequiresPermissions("tool:gen:import")
    @Log(title = "代码生成", businessType = BusinessType.IMPORT)
    @PostMapping("/importTable")
    public AjaxResult importTableSave(String tables)
    {
        String[] tableNames = Convert.toStrArray(tables);
        // æŸ¥è¯¢è¡¨ä¿¡æ¯
        List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames);
        genTableService.importGenTable(tableList);
        return success();
    }
    /**
     * ä¿®æ”¹ä¿å­˜ä»£ç ç”Ÿæˆä¸šåŠ¡
     */
    @RequiresPermissions("tool:gen:edit")
    @Log(title = "代码生成", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult editSave(@Validated @RequestBody GenTable genTable)
    {
        genTableService.validateEdit(genTable);
        genTableService.updateGenTable(genTable);
        return success();
    }
    /**
     * åˆ é™¤ä»£ç ç”Ÿæˆ
     */
    @RequiresPermissions("tool:gen:remove")
    @Log(title = "代码生成", businessType = BusinessType.DELETE)
    @DeleteMapping("/{tableIds}")
    public AjaxResult remove(@PathVariable Long[] tableIds)
    {
        genTableService.deleteGenTableByIds(tableIds);
        return success();
    }
    /**
     * é¢„览代码
     */
    @RequiresPermissions("tool:gen:preview")
    @GetMapping("/preview/{tableId}")
    public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException
    {
        Map<String, String> dataMap = genTableService.previewCode(tableId);
        return success(dataMap);
    }
    /**
     * ç”Ÿæˆä»£ç ï¼ˆä¸‹è½½æ–¹å¼ï¼‰
     */
    @RequiresPermissions("tool:gen:code")
    @Log(title = "代码生成", businessType = BusinessType.GENCODE)
    @GetMapping("/download/{tableName}")
    public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException
    {
        byte[] data = genTableService.downloadCode(tableName);
        genCode(response, data);
    }
    /**
     * ç”Ÿæˆä»£ç ï¼ˆè‡ªå®šä¹‰è·¯å¾„)
     */
    @RequiresPermissions("tool:gen:code")
    @Log(title = "代码生成", businessType = BusinessType.GENCODE)
    @GetMapping("/genCode/{tableName}")
    public AjaxResult genCode(@PathVariable("tableName") String tableName)
    {
        genTableService.generatorCode(tableName);
        return success();
    }
    /**
     * åŒæ­¥æ•°æ®åº“
     */
    @RequiresPermissions("tool:gen:edit")
    @Log(title = "代码生成", businessType = BusinessType.UPDATE)
    @GetMapping("/synchDb/{tableName}")
    public AjaxResult synchDb(@PathVariable("tableName") String tableName)
    {
        genTableService.synchDb(tableName);
        return success();
    }
    /**
     * æ‰¹é‡ç”Ÿæˆä»£ç 
     */
    @RequiresPermissions("tool:gen:code")
    @Log(title = "代码生成", businessType = BusinessType.GENCODE)
    @GetMapping("/batchGenCode")
    public void batchGenCode(HttpServletResponse response, String tables) throws IOException
    {
        String[] tableNames = Convert.toStrArray(tables);
        byte[] data = genTableService.downloadCode(tableNames);
        genCode(response, data);
    }
    /**
     * ç”Ÿæˆzip文件
     */
    private void genCode(HttpServletResponse response, byte[] data) throws IOException
    {
        response.reset();
        response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\"");
        response.addHeader("Content-Length", "" + data.length);
        response.setContentType("application/octet-stream; charset=UTF-8");
        IOUtils.write(data, response.getOutputStream());
    }
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/domain/GenTable.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,383 @@
package com.se.gen.domain;
import java.util.List;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import org.apache.commons.lang3.ArrayUtils;
import com.se.common.core.constant.GenConstants;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.web.domain.BaseEntity;
/**
 * ä¸šåŠ¡è¡¨ gen_table
 *
 * @author admin
 */
public class GenTable extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** ç¼–号 */
    private Long tableId;
    /** è¡¨åç§° */
    @NotBlank(message = "表名称不能为空")
    private String tableName;
    /** è¡¨æè¿° */
    @NotBlank(message = "表描述不能为空")
    private String tableComment;
    /** å…³è”父表的表名 */
    private String subTableName;
    /** æœ¬è¡¨å…³è”父表的外键名 */
    private String subTableFkName;
    /** å®žä½“类名称(首字母大写) */
    @NotBlank(message = "实体类名称不能为空")
    private String className;
    /** ä½¿ç”¨çš„æ¨¡æ¿ï¼ˆcrud单表操作 tree树表操作 sub主子表操作) */
    private String tplCategory;
    /** å‰ç«¯ç±»åž‹ï¼ˆelement-ui模版 element-plus模版) */
    private String tplWebType;
    /** ç”ŸæˆåŒ…路径 */
    @NotBlank(message = "生成包路径不能为空")
    private String packageName;
    /** ç”Ÿæˆæ¨¡å—名 */
    @NotBlank(message = "生成模块名不能为空")
    private String moduleName;
    /** ç”Ÿæˆä¸šåŠ¡å */
    @NotBlank(message = "生成业务名不能为空")
    private String businessName;
    /** ç”ŸæˆåŠŸèƒ½å */
    @NotBlank(message = "生成功能名不能为空")
    private String functionName;
    /** ç”Ÿæˆä½œè€… */
    @NotBlank(message = "作者不能为空")
    private String functionAuthor;
    /** ç”Ÿæˆä»£ç æ–¹å¼ï¼ˆ0zip压缩包 1自定义路径) */
    private String genType;
    /** ç”Ÿæˆè·¯å¾„(不填默认项目路径) */
    private String genPath;
    /** ä¸»é”®ä¿¡æ¯ */
    private GenTableColumn pkColumn;
    /** å­è¡¨ä¿¡æ¯ */
    private GenTable subTable;
    /** è¡¨åˆ—信息 */
    @Valid
    private List<GenTableColumn> columns;
    /** å…¶å®ƒç”Ÿæˆé€‰é¡¹ */
    private String options;
    /** æ ‘编码字段 */
    private String treeCode;
    /** æ ‘父编码字段 */
    private String treeParentCode;
    /** æ ‘名称字段 */
    private String treeName;
    /** ä¸Šçº§èœå•ID字段 */
    private String parentMenuId;
    /** ä¸Šçº§èœå•名称字段 */
    private String parentMenuName;
    public Long getTableId()
    {
        return tableId;
    }
    public void setTableId(Long tableId)
    {
        this.tableId = tableId;
    }
    public String getTableName()
    {
        return tableName;
    }
    public void setTableName(String tableName)
    {
        this.tableName = tableName;
    }
    public String getTableComment()
    {
        return tableComment;
    }
    public void setTableComment(String tableComment)
    {
        this.tableComment = tableComment;
    }
    public String getSubTableName()
    {
        return subTableName;
    }
    public void setSubTableName(String subTableName)
    {
        this.subTableName = subTableName;
    }
    public String getSubTableFkName()
    {
        return subTableFkName;
    }
    public void setSubTableFkName(String subTableFkName)
    {
        this.subTableFkName = subTableFkName;
    }
    public String getClassName()
    {
        return className;
    }
    public void setClassName(String className)
    {
        this.className = className;
    }
    public String getTplCategory()
    {
        return tplCategory;
    }
    public void setTplCategory(String tplCategory)
    {
        this.tplCategory = tplCategory;
    }
    public String getTplWebType()
    {
        return tplWebType;
    }
    public void setTplWebType(String tplWebType)
    {
        this.tplWebType = tplWebType;
    }
    public String getPackageName()
    {
        return packageName;
    }
    public void setPackageName(String packageName)
    {
        this.packageName = packageName;
    }
    public String getModuleName()
    {
        return moduleName;
    }
    public void setModuleName(String moduleName)
    {
        this.moduleName = moduleName;
    }
    public String getBusinessName()
    {
        return businessName;
    }
    public void setBusinessName(String businessName)
    {
        this.businessName = businessName;
    }
    public String getFunctionName()
    {
        return functionName;
    }
    public void setFunctionName(String functionName)
    {
        this.functionName = functionName;
    }
    public String getFunctionAuthor()
    {
        return functionAuthor;
    }
    public void setFunctionAuthor(String functionAuthor)
    {
        this.functionAuthor = functionAuthor;
    }
    public String getGenType()
    {
        return genType;
    }
    public void setGenType(String genType)
    {
        this.genType = genType;
    }
    public String getGenPath()
    {
        return genPath;
    }
    public void setGenPath(String genPath)
    {
        this.genPath = genPath;
    }
    public GenTableColumn getPkColumn()
    {
        return pkColumn;
    }
    public void setPkColumn(GenTableColumn pkColumn)
    {
        this.pkColumn = pkColumn;
    }
    public GenTable getSubTable()
    {
        return subTable;
    }
    public void setSubTable(GenTable subTable)
    {
        this.subTable = subTable;
    }
    public List<GenTableColumn> getColumns()
    {
        return columns;
    }
    public void setColumns(List<GenTableColumn> columns)
    {
        this.columns = columns;
    }
    public String getOptions()
    {
        return options;
    }
    public void setOptions(String options)
    {
        this.options = options;
    }
    public String getTreeCode()
    {
        return treeCode;
    }
    public void setTreeCode(String treeCode)
    {
        this.treeCode = treeCode;
    }
    public String getTreeParentCode()
    {
        return treeParentCode;
    }
    public void setTreeParentCode(String treeParentCode)
    {
        this.treeParentCode = treeParentCode;
    }
    public String getTreeName()
    {
        return treeName;
    }
    public void setTreeName(String treeName)
    {
        this.treeName = treeName;
    }
    public String getParentMenuId()
    {
        return parentMenuId;
    }
    public void setParentMenuId(String parentMenuId)
    {
        this.parentMenuId = parentMenuId;
    }
    public String getParentMenuName()
    {
        return parentMenuName;
    }
    public void setParentMenuName(String parentMenuName)
    {
        this.parentMenuName = parentMenuName;
    }
    public boolean isSub()
    {
        return isSub(this.tplCategory);
    }
    public static boolean isSub(String tplCategory)
    {
        return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory);
    }
    public boolean isTree()
    {
        return isTree(this.tplCategory);
    }
    public static boolean isTree(String tplCategory)
    {
        return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory);
    }
    public boolean isCrud()
    {
        return isCrud(this.tplCategory);
    }
    public static boolean isCrud(String tplCategory)
    {
        return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory);
    }
    public boolean isSuperColumn(String javaField)
    {
        return isSuperColumn(this.tplCategory, javaField);
    }
    public static boolean isSuperColumn(String tplCategory, String javaField)
    {
        if (isTree(tplCategory))
        {
            return StringUtils.equalsAnyIgnoreCase(javaField,
                    ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY));
        }
        return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY);
    }
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/domain/GenTableColumn.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,374 @@
package com.se.gen.domain;
import javax.validation.constraints.NotBlank;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.web.domain.BaseEntity;
/**
 * ä»£ç ç”Ÿæˆä¸šåŠ¡å­—æ®µè¡¨ gen_table_column
 *
 * @author admin
 */
public class GenTableColumn extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** ç¼–号 */
    private Long columnId;
    /** å½’属表编号 */
    private Long tableId;
    /** åˆ—名称 */
    private String columnName;
    /** åˆ—描述 */
    private String columnComment;
    /** åˆ—类型 */
    private String columnType;
    /** JAVA类型 */
    private String javaType;
    /** JAVA字段名 */
    @NotBlank(message = "Java属性不能为空")
    private String javaField;
    /** æ˜¯å¦ä¸»é”®ï¼ˆ1是) */
    private String isPk;
    /** æ˜¯å¦è‡ªå¢žï¼ˆ1是) */
    private String isIncrement;
    /** æ˜¯å¦å¿…填(1是) */
    private String isRequired;
    /** æ˜¯å¦ä¸ºæ’入字段(1是) */
    private String isInsert;
    /** æ˜¯å¦ç¼–辑字段(1是) */
    private String isEdit;
    /** æ˜¯å¦åˆ—表字段(1是) */
    private String isList;
    /** æ˜¯å¦æŸ¥è¯¢å­—段(1是) */
    private String isQuery;
    /** æŸ¥è¯¢æ–¹å¼ï¼ˆEQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) */
    private String queryType;
    /** æ˜¾ç¤ºç±»åž‹ï¼ˆinput文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) */
    private String htmlType;
    /** å­—典类型 */
    private String dictType;
    /** æŽ’序 */
    private Integer sort;
    public void setColumnId(Long columnId)
    {
        this.columnId = columnId;
    }
    public Long getColumnId()
    {
        return columnId;
    }
    public void setTableId(Long tableId)
    {
        this.tableId = tableId;
    }
    public Long getTableId()
    {
        return tableId;
    }
    public void setColumnName(String columnName)
    {
        this.columnName = columnName;
    }
    public String getColumnName()
    {
        return columnName;
    }
    public void setColumnComment(String columnComment)
    {
        this.columnComment = columnComment;
    }
    public String getColumnComment()
    {
        return columnComment;
    }
    public void setColumnType(String columnType)
    {
        this.columnType = columnType;
    }
    public String getColumnType()
    {
        return columnType;
    }
    public void setJavaType(String javaType)
    {
        this.javaType = javaType;
    }
    public String getJavaType()
    {
        return javaType;
    }
    public void setJavaField(String javaField)
    {
        this.javaField = javaField;
    }
    public String getJavaField()
    {
        return javaField;
    }
    public String getCapJavaField()
    {
        return StringUtils.capitalize(javaField);
    }
    public void setIsPk(String isPk)
    {
        this.isPk = isPk;
    }
    public String getIsPk()
    {
        return isPk;
    }
    public boolean isPk()
    {
        return isPk(this.isPk);
    }
    public boolean isPk(String isPk)
    {
        return isPk != null && StringUtils.equals("1", isPk);
    }
    public String getIsIncrement()
    {
        return isIncrement;
    }
    public void setIsIncrement(String isIncrement)
    {
        this.isIncrement = isIncrement;
    }
    public boolean isIncrement()
    {
        return isIncrement(this.isIncrement);
    }
    public boolean isIncrement(String isIncrement)
    {
        return isIncrement != null && StringUtils.equals("1", isIncrement);
    }
    public void setIsRequired(String isRequired)
    {
        this.isRequired = isRequired;
    }
    public String getIsRequired()
    {
        return isRequired;
    }
    public boolean isRequired()
    {
        return isRequired(this.isRequired);
    }
    public boolean isRequired(String isRequired)
    {
        return isRequired != null && StringUtils.equals("1", isRequired);
    }
    public void setIsInsert(String isInsert)
    {
        this.isInsert = isInsert;
    }
    public String getIsInsert()
    {
        return isInsert;
    }
    public boolean isInsert()
    {
        return isInsert(this.isInsert);
    }
    public boolean isInsert(String isInsert)
    {
        return isInsert != null && StringUtils.equals("1", isInsert);
    }
    public void setIsEdit(String isEdit)
    {
        this.isEdit = isEdit;
    }
    public String getIsEdit()
    {
        return isEdit;
    }
    public boolean isEdit()
    {
        return isInsert(this.isEdit);
    }
    public boolean isEdit(String isEdit)
    {
        return isEdit != null && StringUtils.equals("1", isEdit);
    }
    public void setIsList(String isList)
    {
        this.isList = isList;
    }
    public String getIsList()
    {
        return isList;
    }
    public boolean isList()
    {
        return isList(this.isList);
    }
    public boolean isList(String isList)
    {
        return isList != null && StringUtils.equals("1", isList);
    }
    public void setIsQuery(String isQuery)
    {
        this.isQuery = isQuery;
    }
    public String getIsQuery()
    {
        return isQuery;
    }
    public boolean isQuery()
    {
        return isQuery(this.isQuery);
    }
    public boolean isQuery(String isQuery)
    {
        return isQuery != null && StringUtils.equals("1", isQuery);
    }
    public void setQueryType(String queryType)
    {
        this.queryType = queryType;
    }
    public String getQueryType()
    {
        return queryType;
    }
    public String getHtmlType()
    {
        return htmlType;
    }
    public void setHtmlType(String htmlType)
    {
        this.htmlType = htmlType;
    }
    public void setDictType(String dictType)
    {
        this.dictType = dictType;
    }
    public String getDictType()
    {
        return dictType;
    }
    public void setSort(Integer sort)
    {
        this.sort = sort;
    }
    public Integer getSort()
    {
        return sort;
    }
    public boolean isSuperColumn()
    {
        return isSuperColumn(this.javaField);
    }
    public static boolean isSuperColumn(String javaField)
    {
        return StringUtils.equalsAnyIgnoreCase(javaField,
                // BaseEntity
                "createBy", "createTime", "updateBy", "updateTime", "remark",
                // TreeEntity
                "parentName", "parentId", "orderNum", "ancestors");
    }
    public boolean isUsableColumn()
    {
        return isUsableColumn(javaField);
    }
    public static boolean isUsableColumn(String javaField)
    {
        // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单
        return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark");
    }
    public String readConverterExp()
    {
        String remarks = StringUtils.substringBetween(this.columnComment, "(", ")");
        StringBuffer sb = new StringBuffer();
        if (StringUtils.isNotEmpty(remarks))
        {
            for (String value : remarks.split(" "))
            {
                if (StringUtils.isNotEmpty(value))
                {
                    Object startStr = value.subSequence(0, 1);
                    String endStr = value.substring(1);
                    sb.append("").append(startStr).append("=").append(endStr).append(",");
                }
            }
            return sb.deleteCharAt(sb.length() - 1).toString();
        }
        else
        {
            return this.columnComment;
        }
    }
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/mapper/GenTableColumnMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.se.gen.mapper;
import java.util.List;
import com.se.gen.domain.GenTableColumn;
/**
 * ä¸šåŠ¡å­—æ®µ æ•°æ®å±‚
 *
 * @author admin
 */
public interface GenTableColumnMapper
{
    /**
     * æ ¹æ®è¡¨åç§°æŸ¥è¯¢åˆ—信息
     *
     * @param tableName è¡¨åç§°
     * @return åˆ—信息
     */
    public List<GenTableColumn> selectDbTableColumnsByName(String tableName);
    /**
     * æŸ¥è¯¢ä¸šåŠ¡å­—æ®µåˆ—è¡¨
     *
     * @param tableId ä¸šåŠ¡å­—æ®µç¼–å·
     * @return ä¸šåŠ¡å­—æ®µé›†åˆ
     */
    public List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId);
    /**
     * æ–°å¢žä¸šåŠ¡å­—æ®µ
     *
     * @param genTableColumn ä¸šåŠ¡å­—æ®µä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertGenTableColumn(GenTableColumn genTableColumn);
    /**
     * ä¿®æ”¹ä¸šåŠ¡å­—æ®µ
     *
     * @param genTableColumn ä¸šåŠ¡å­—æ®µä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateGenTableColumn(GenTableColumn genTableColumn);
    /**
     * åˆ é™¤ä¸šåŠ¡å­—æ®µ
     *
     * @param genTableColumns åˆ—数据
     * @return ç»“æžœ
     */
    public int deleteGenTableColumns(List<GenTableColumn> genTableColumns);
    /**
     * æ‰¹é‡åˆ é™¤ä¸šåŠ¡å­—æ®µ
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    public int deleteGenTableColumnByIds(Long[] ids);
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/mapper/GenTableMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.se.gen.mapper;
import java.util.List;
import com.se.gen.domain.GenTable;
/**
 * ä¸šåŠ¡ æ•°æ®å±‚
 *
 * @author admin
 */
public interface GenTableMapper
{
    /**
     * æŸ¥è¯¢ä¸šåŠ¡åˆ—è¡¨
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     * @return ä¸šåŠ¡é›†åˆ
     */
    public List<GenTable> selectGenTableList(GenTable genTable);
    /**
     * æŸ¥è¯¢æ®åº“列表
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     * @return æ•°æ®åº“表集合
     */
    public List<GenTable> selectDbTableList(GenTable genTable);
    /**
     * æŸ¥è¯¢æ®åº“列表
     *
     * @param tableNames è¡¨åç§°ç»„
     * @return æ•°æ®åº“表集合
     */
    public List<GenTable> selectDbTableListByNames(String[] tableNames);
    /**
     * æŸ¥è¯¢æ‰€æœ‰è¡¨ä¿¡æ¯
     *
     * @return è¡¨ä¿¡æ¯é›†åˆ
     */
    public List<GenTable> selectGenTableAll();
    /**
     * æŸ¥è¯¢è¡¨ID业务信息
     *
     * @param id ä¸šåŠ¡ID
     * @return ä¸šåŠ¡ä¿¡æ¯
     */
    public GenTable selectGenTableById(Long id);
    /**
     * æŸ¥è¯¢è¡¨åç§°ä¸šåŠ¡ä¿¡æ¯
     *
     * @param tableName è¡¨åç§°
     * @return ä¸šåŠ¡ä¿¡æ¯
     */
    public GenTable selectGenTableByName(String tableName);
    /**
     * æ–°å¢žä¸šåŠ¡
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertGenTable(GenTable genTable);
    /**
     * ä¿®æ”¹ä¸šåŠ¡
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateGenTable(GenTable genTable);
    /**
     * æ‰¹é‡åˆ é™¤ä¸šåŠ¡
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    public int deleteGenTableByIds(Long[] ids);
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/service/GenTableColumnServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.se.gen.service;
import java.util.List;
import com.se.gen.domain.GenTableColumn;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.se.common.core.text.Convert;
import com.se.gen.mapper.GenTableColumnMapper;
/**
 * ä¸šåŠ¡å­—æ®µ æœåŠ¡å±‚å®žçŽ°
 *
 * @author admin
 */
@Service
public class GenTableColumnServiceImpl implements IGenTableColumnService
{
    @Autowired
    private GenTableColumnMapper genTableColumnMapper;
    /**
     * æŸ¥è¯¢ä¸šåŠ¡å­—æ®µåˆ—è¡¨
     *
     * @param tableId ä¸šåŠ¡å­—æ®µç¼–å·
     * @return ä¸šåŠ¡å­—æ®µé›†åˆ
     */
    @Override
    public List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId)
    {
        return genTableColumnMapper.selectGenTableColumnListByTableId(tableId);
    }
    /**
     * æ–°å¢žä¸šåŠ¡å­—æ®µ
     *
     * @param genTableColumn ä¸šåŠ¡å­—æ®µä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int insertGenTableColumn(GenTableColumn genTableColumn)
    {
        return genTableColumnMapper.insertGenTableColumn(genTableColumn);
    }
    /**
     * ä¿®æ”¹ä¸šåŠ¡å­—æ®µ
     *
     * @param genTableColumn ä¸šåŠ¡å­—æ®µä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int updateGenTableColumn(GenTableColumn genTableColumn)
    {
        return genTableColumnMapper.updateGenTableColumn(genTableColumn);
    }
    /**
     * åˆ é™¤ä¸šåŠ¡å­—æ®µå¯¹è±¡
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    @Override
    public int deleteGenTableColumnByIds(String ids)
    {
        return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids));
    }
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/service/GenTableServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,522 @@
package com.se.gen.service;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import com.se.gen.domain.GenTableColumn;
import com.se.gen.util.GenUtils;
import com.se.gen.util.VelocityInitializer;
import com.se.gen.util.VelocityUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.se.common.core.constant.Constants;
import com.se.common.core.constant.GenConstants;
import com.se.common.core.exception.ServiceException;
import com.se.common.core.text.CharsetKit;
import com.se.common.core.utils.StringUtils;
import com.se.common.security.utils.SecurityUtils;
import com.se.gen.domain.GenTable;
import com.se.gen.mapper.GenTableColumnMapper;
import com.se.gen.mapper.GenTableMapper;
/**
 * ä¸šåŠ¡ æœåŠ¡å±‚å®žçŽ°
 *
 * @author admin
 */
@Service
public class GenTableServiceImpl implements IGenTableService
{
    private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class);
    @Autowired
    private GenTableMapper genTableMapper;
    @Autowired
    private GenTableColumnMapper genTableColumnMapper;
    /**
     * æŸ¥è¯¢ä¸šåŠ¡ä¿¡æ¯
     *
     * @param id ä¸šåŠ¡ID
     * @return ä¸šåŠ¡ä¿¡æ¯
     */
    @Override
    public GenTable selectGenTableById(Long id)
    {
        GenTable genTable = genTableMapper.selectGenTableById(id);
        setTableFromOptions(genTable);
        return genTable;
    }
    /**
     * æŸ¥è¯¢ä¸šåŠ¡åˆ—è¡¨
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     * @return ä¸šåŠ¡é›†åˆ
     */
    @Override
    public List<GenTable> selectGenTableList(GenTable genTable)
    {
        return genTableMapper.selectGenTableList(genTable);
    }
    /**
     * æŸ¥è¯¢æ®åº“列表
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     * @return æ•°æ®åº“表集合
     */
    @Override
    public List<GenTable> selectDbTableList(GenTable genTable)
    {
        return genTableMapper.selectDbTableList(genTable);
    }
    /**
     * æŸ¥è¯¢æ®åº“列表
     *
     * @param tableNames è¡¨åç§°ç»„
     * @return æ•°æ®åº“表集合
     */
    @Override
    public List<GenTable> selectDbTableListByNames(String[] tableNames)
    {
        return genTableMapper.selectDbTableListByNames(tableNames);
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰è¡¨ä¿¡æ¯
     *
     * @return è¡¨ä¿¡æ¯é›†åˆ
     */
    @Override
    public List<GenTable> selectGenTableAll()
    {
        return genTableMapper.selectGenTableAll();
    }
    /**
     * ä¿®æ”¹ä¸šåŠ¡
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateGenTable(GenTable genTable)
    {
        String options = JSON.toJSONString(genTable.getParams());
        genTable.setOptions(options);
        int row = genTableMapper.updateGenTable(genTable);
        if (row > 0)
        {
            for (GenTableColumn cenTableColumn : genTable.getColumns())
            {
                genTableColumnMapper.updateGenTableColumn(cenTableColumn);
            }
        }
    }
    /**
     * åˆ é™¤ä¸šåŠ¡å¯¹è±¡
     *
     * @param tableIds éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteGenTableByIds(Long[] tableIds)
    {
        genTableMapper.deleteGenTableByIds(tableIds);
        genTableColumnMapper.deleteGenTableColumnByIds(tableIds);
    }
    /**
     * å¯¼å…¥è¡¨ç»“æž„
     *
     * @param tableList å¯¼å…¥è¡¨åˆ—表
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void importGenTable(List<GenTable> tableList)
    {
        String operName = SecurityUtils.getUsername();
        try
        {
            for (GenTable table : tableList)
            {
                String tableName = table.getTableName();
                GenUtils.initTable(table, operName);
                int row = genTableMapper.insertGenTable(table);
                if (row > 0)
                {
                    // ä¿å­˜åˆ—信息
                    List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
                    for (GenTableColumn column : genTableColumns)
                    {
                        GenUtils.initColumnField(column, table);
                        genTableColumnMapper.insertGenTableColumn(column);
                    }
                }
            }
        }
        catch (Exception e)
        {
            throw new ServiceException("导入失败:" + e.getMessage());
        }
    }
    /**
     * é¢„览代码
     *
     * @param tableId è¡¨ç¼–号
     * @return é¢„览数据列表
     */
    @Override
    public Map<String, String> previewCode(Long tableId)
    {
        Map<String, String> dataMap = new LinkedHashMap<>();
        // æŸ¥è¯¢è¡¨ä¿¡æ¯
        GenTable table = genTableMapper.selectGenTableById(tableId);
        // è®¾ç½®ä¸»å­è¡¨ä¿¡æ¯
        setSubTable(table);
        // è®¾ç½®ä¸»é”®åˆ—信息
        setPkColumn(table);
        VelocityInitializer.initVelocity();
        VelocityContext context = VelocityUtils.prepareContext(table);
        // èŽ·å–æ¨¡æ¿åˆ—è¡¨
        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType());
        for (String template : templates)
        {
            // æ¸²æŸ“模板
            StringWriter sw = new StringWriter();
            Template tpl = Velocity.getTemplate(template, Constants.UTF8);
            tpl.merge(context, sw);
            dataMap.put(template, sw.toString());
        }
        return dataMap;
    }
    /**
     * ç”Ÿæˆä»£ç ï¼ˆä¸‹è½½æ–¹å¼ï¼‰
     *
     * @param tableName è¡¨åç§°
     * @return æ•°æ®
     */
    @Override
    public byte[] downloadCode(String tableName)
    {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ZipOutputStream zip = new ZipOutputStream(outputStream);
        generatorCode(tableName, zip);
        IOUtils.closeQuietly(zip);
        return outputStream.toByteArray();
    }
    /**
     * ç”Ÿæˆä»£ç ï¼ˆè‡ªå®šä¹‰è·¯å¾„)
     *
     * @param tableName è¡¨åç§°
     */
    @Override
    public void generatorCode(String tableName)
    {
        // æŸ¥è¯¢è¡¨ä¿¡æ¯
        GenTable table = genTableMapper.selectGenTableByName(tableName);
        // è®¾ç½®ä¸»å­è¡¨ä¿¡æ¯
        setSubTable(table);
        // è®¾ç½®ä¸»é”®åˆ—信息
        setPkColumn(table);
        VelocityInitializer.initVelocity();
        VelocityContext context = VelocityUtils.prepareContext(table);
        // èŽ·å–æ¨¡æ¿åˆ—è¡¨
        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType());
        for (String template : templates)
        {
            if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm"))
            {
                // æ¸²æŸ“模板
                StringWriter sw = new StringWriter();
                Template tpl = Velocity.getTemplate(template, Constants.UTF8);
                tpl.merge(context, sw);
                try
                {
                    String path = getGenPath(table, template);
                    FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8);
                }
                catch (IOException e)
                {
                    throw new ServiceException("渲染模板失败,表名:" + table.getTableName());
                }
            }
        }
    }
    /**
     * åŒæ­¥æ•°æ®åº“
     *
     * @param tableName è¡¨åç§°
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void synchDb(String tableName)
    {
        GenTable table = genTableMapper.selectGenTableByName(tableName);
        List<GenTableColumn> tableColumns = table.getColumns();
        Map<String, GenTableColumn> tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity()));
        List<GenTableColumn> dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
        if (StringUtils.isEmpty(dbTableColumns))
        {
            throw new ServiceException("同步数据失败,原表结构不存在");
        }
        List<String> dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList());
        dbTableColumns.forEach(column -> {
            GenUtils.initColumnField(column, table);
            if (tableColumnMap.containsKey(column.getColumnName()))
            {
                GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName());
                column.setColumnId(prevColumn.getColumnId());
                if (column.isList())
                {
                    // å¦‚果是列表,继续保留查询方式/字典类型选项
                    column.setDictType(prevColumn.getDictType());
                    column.setQueryType(prevColumn.getQueryType());
                }
                if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk()
                        && (column.isInsert() || column.isEdit())
                        && ((column.isUsableColumn()) || (!column.isSuperColumn())))
                {
                    // å¦‚果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项
                    column.setIsRequired(prevColumn.getIsRequired());
                    column.setHtmlType(prevColumn.getHtmlType());
                }
                genTableColumnMapper.updateGenTableColumn(column);
            }
            else
            {
                genTableColumnMapper.insertGenTableColumn(column);
            }
        });
        List<GenTableColumn> delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList());
        if (StringUtils.isNotEmpty(delColumns))
        {
            genTableColumnMapper.deleteGenTableColumns(delColumns);
        }
    }
    /**
     * æ‰¹é‡ç”Ÿæˆä»£ç ï¼ˆä¸‹è½½æ–¹å¼ï¼‰
     *
     * @param tableNames è¡¨æ•°ç»„
     * @return æ•°æ®
     */
    @Override
    public byte[] downloadCode(String[] tableNames)
    {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ZipOutputStream zip = new ZipOutputStream(outputStream);
        for (String tableName : tableNames)
        {
            generatorCode(tableName, zip);
        }
        IOUtils.closeQuietly(zip);
        return outputStream.toByteArray();
    }
    /**
     * æŸ¥è¯¢è¡¨ä¿¡æ¯å¹¶ç”Ÿæˆä»£ç 
     */
    private void generatorCode(String tableName, ZipOutputStream zip)
    {
        // æŸ¥è¯¢è¡¨ä¿¡æ¯
        GenTable table = genTableMapper.selectGenTableByName(tableName);
        // è®¾ç½®ä¸»å­è¡¨ä¿¡æ¯
        setSubTable(table);
        // è®¾ç½®ä¸»é”®åˆ—信息
        setPkColumn(table);
        VelocityInitializer.initVelocity();
        VelocityContext context = VelocityUtils.prepareContext(table);
        // èŽ·å–æ¨¡æ¿åˆ—è¡¨
        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType());
        for (String template : templates)
        {
            // æ¸²æŸ“模板
            StringWriter sw = new StringWriter();
            Template tpl = Velocity.getTemplate(template, Constants.UTF8);
            tpl.merge(context, sw);
            try
            {
                // æ·»åŠ åˆ°zip
                zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table)));
                IOUtils.write(sw.toString(), zip, Constants.UTF8);
                IOUtils.closeQuietly(sw);
                zip.flush();
                zip.closeEntry();
            }
            catch (IOException e)
            {
                log.error("渲染模板失败,表名:" + table.getTableName(), e);
            }
        }
    }
    /**
     * ä¿®æ”¹ä¿å­˜å‚数校验
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     */
    @Override
    public void validateEdit(GenTable genTable)
    {
        if (GenConstants.TPL_TREE.equals(genTable.getTplCategory()))
        {
            String options = JSON.toJSONString(genTable.getParams());
            JSONObject paramsObj = JSON.parseObject(options);
            if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE)))
            {
                throw new ServiceException("树编码字段不能为空");
            }
            else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE)))
            {
                throw new ServiceException("树父编码字段不能为空");
            }
            else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME)))
            {
                throw new ServiceException("树名称字段不能为空");
            }
            else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory()))
            {
                if (StringUtils.isEmpty(genTable.getSubTableName()))
                {
                    throw new ServiceException("关联子表的表名不能为空");
                }
                else if (StringUtils.isEmpty(genTable.getSubTableFkName()))
                {
                    throw new ServiceException("子表关联的外键名不能为空");
                }
            }
        }
    }
    /**
     * è®¾ç½®ä¸»é”®åˆ—信息
     *
     * @param table ä¸šåŠ¡è¡¨ä¿¡æ¯
     */
    public void setPkColumn(GenTable table)
    {
        for (GenTableColumn column : table.getColumns())
        {
            if (column.isPk())
            {
                table.setPkColumn(column);
                break;
            }
        }
        if (StringUtils.isNull(table.getPkColumn()))
        {
            table.setPkColumn(table.getColumns().get(0));
        }
        if (GenConstants.TPL_SUB.equals(table.getTplCategory()))
        {
            for (GenTableColumn column : table.getSubTable().getColumns())
            {
                if (column.isPk())
                {
                    table.getSubTable().setPkColumn(column);
                    break;
                }
            }
            if (StringUtils.isNull(table.getSubTable().getPkColumn()))
            {
                table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0));
            }
        }
    }
    /**
     * è®¾ç½®ä¸»å­è¡¨ä¿¡æ¯
     *
     * @param table ä¸šåŠ¡è¡¨ä¿¡æ¯
     */
    public void setSubTable(GenTable table)
    {
        String subTableName = table.getSubTableName();
        if (StringUtils.isNotEmpty(subTableName))
        {
            table.setSubTable(genTableMapper.selectGenTableByName(subTableName));
        }
    }
    /**
     * è®¾ç½®ä»£ç ç”Ÿæˆå…¶ä»–选项值
     *
     * @param genTable è®¾ç½®åŽçš„生成对象
     */
    public void setTableFromOptions(GenTable genTable)
    {
        JSONObject paramsObj = JSON.parseObject(genTable.getOptions());
        if (StringUtils.isNotNull(paramsObj))
        {
            String treeCode = paramsObj.getString(GenConstants.TREE_CODE);
            String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE);
            String treeName = paramsObj.getString(GenConstants.TREE_NAME);
            String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID);
            String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME);
            genTable.setTreeCode(treeCode);
            genTable.setTreeParentCode(treeParentCode);
            genTable.setTreeName(treeName);
            genTable.setParentMenuId(parentMenuId);
            genTable.setParentMenuName(parentMenuName);
        }
    }
    /**
     * èŽ·å–ä»£ç ç”Ÿæˆåœ°å€
     *
     * @param table ä¸šåŠ¡è¡¨ä¿¡æ¯
     * @param template æ¨¡æ¿æ–‡ä»¶è·¯å¾„
     * @return ç”Ÿæˆåœ°å€
     */
    public static String getGenPath(GenTable table, String template)
    {
        String genPath = table.getGenPath();
        if (StringUtils.equals(genPath, "/"))
        {
            return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table);
        }
        return genPath + File.separator + VelocityUtils.getFileName(template, table);
    }
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/service/IGenTableColumnService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.se.gen.service;
import java.util.List;
import com.se.gen.domain.GenTableColumn;
/**
 * ä¸šåŠ¡å­—æ®µ æœåС层
 *
 * @author admin
 */
public interface IGenTableColumnService
{
    /**
     * æŸ¥è¯¢ä¸šåŠ¡å­—æ®µåˆ—è¡¨
     *
     * @param tableId ä¸šåŠ¡å­—æ®µç¼–å·
     * @return ä¸šåŠ¡å­—æ®µé›†åˆ
     */
    public List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId);
    /**
     * æ–°å¢žä¸šåŠ¡å­—æ®µ
     *
     * @param genTableColumn ä¸šåŠ¡å­—æ®µä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertGenTableColumn(GenTableColumn genTableColumn);
    /**
     * ä¿®æ”¹ä¸šåŠ¡å­—æ®µ
     *
     * @param genTableColumn ä¸šåŠ¡å­—æ®µä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateGenTableColumn(GenTableColumn genTableColumn);
    /**
     * åˆ é™¤ä¸šåŠ¡å­—æ®µä¿¡æ¯
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    public int deleteGenTableColumnByIds(String ids);
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/service/IGenTableService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
package com.se.gen.service;
import java.util.List;
import java.util.Map;
import com.se.gen.domain.GenTable;
/**
 * ä¸šåŠ¡ æœåС层
 *
 * @author admin
 */
public interface IGenTableService
{
    /**
     * æŸ¥è¯¢ä¸šåŠ¡åˆ—è¡¨
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     * @return ä¸šåŠ¡é›†åˆ
     */
    public List<GenTable> selectGenTableList(GenTable genTable);
    /**
     * æŸ¥è¯¢æ®åº“列表
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     * @return æ•°æ®åº“表集合
     */
    public List<GenTable> selectDbTableList(GenTable genTable);
    /**
     * æŸ¥è¯¢æ®åº“列表
     *
     * @param tableNames è¡¨åç§°ç»„
     * @return æ•°æ®åº“表集合
     */
    public List<GenTable> selectDbTableListByNames(String[] tableNames);
    /**
     * æŸ¥è¯¢æ‰€æœ‰è¡¨ä¿¡æ¯
     *
     * @return è¡¨ä¿¡æ¯é›†åˆ
     */
    public List<GenTable> selectGenTableAll();
    /**
     * æŸ¥è¯¢ä¸šåŠ¡ä¿¡æ¯
     *
     * @param id ä¸šåŠ¡ID
     * @return ä¸šåŠ¡ä¿¡æ¯
     */
    public GenTable selectGenTableById(Long id);
    /**
     * ä¿®æ”¹ä¸šåŠ¡
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     * @return ç»“æžœ
     */
    public void updateGenTable(GenTable genTable);
    /**
     * åˆ é™¤ä¸šåŠ¡ä¿¡æ¯
     *
     * @param tableIds éœ€è¦åˆ é™¤çš„表数据ID
     * @return ç»“æžœ
     */
    public void deleteGenTableByIds(Long[] tableIds);
    /**
     * å¯¼å…¥è¡¨ç»“æž„
     *
     * @param tableList å¯¼å…¥è¡¨åˆ—表
     */
    public void importGenTable(List<GenTable> tableList);
    /**
     * é¢„览代码
     *
     * @param tableId è¡¨ç¼–号
     * @return é¢„览数据列表
     */
    public Map<String, String> previewCode(Long tableId);
    /**
     * ç”Ÿæˆä»£ç ï¼ˆä¸‹è½½æ–¹å¼ï¼‰
     *
     * @param tableName è¡¨åç§°
     * @return æ•°æ®
     */
    public byte[] downloadCode(String tableName);
    /**
     * ç”Ÿæˆä»£ç ï¼ˆè‡ªå®šä¹‰è·¯å¾„)
     *
     * @param tableName è¡¨åç§°
     * @return æ•°æ®
     */
    public void generatorCode(String tableName);
    /**
     * åŒæ­¥æ•°æ®åº“
     *
     * @param tableName è¡¨åç§°
     */
    public void synchDb(String tableName);
    /**
     * æ‰¹é‡ç”Ÿæˆä»£ç ï¼ˆä¸‹è½½æ–¹å¼ï¼‰
     *
     * @param tableNames è¡¨æ•°ç»„
     * @return æ•°æ®
     */
    public byte[] downloadCode(String[] tableNames);
    /**
     * ä¿®æ”¹ä¿å­˜å‚数校验
     *
     * @param genTable ä¸šåŠ¡ä¿¡æ¯
     */
    public void validateEdit(GenTable genTable);
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/util/GenUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,258 @@
package com.se.gen.util;
import java.util.Arrays;
import com.se.gen.config.GenConfig;
import com.se.gen.domain.GenTableColumn;
import org.apache.commons.lang3.RegExUtils;
import com.se.common.core.constant.GenConstants;
import com.se.common.core.utils.StringUtils;
import com.se.gen.domain.GenTable;
/**
 * ä»£ç ç”Ÿæˆå™¨ å·¥å…·ç±»
 *
 * @author admin
 */
public class GenUtils
{
    /**
     * åˆå§‹åŒ–表信息
     */
    public static void initTable(GenTable genTable, String operName)
    {
        genTable.setClassName(convertClassName(genTable.getTableName()));
        genTable.setPackageName(GenConfig.getPackageName());
        genTable.setModuleName(getModuleName(GenConfig.getPackageName()));
        genTable.setBusinessName(getBusinessName(genTable.getTableName()));
        genTable.setFunctionName(replaceText(genTable.getTableComment()));
        genTable.setFunctionAuthor(GenConfig.getAuthor());
        genTable.setCreateBy(operName);
    }
    /**
     * åˆå§‹åŒ–列属性字段
     */
    public static void initColumnField(GenTableColumn column, GenTable table)
    {
        String dataType = getDbType(column.getColumnType());
        String columnName = column.getColumnName();
        column.setTableId(table.getTableId());
        column.setCreateBy(table.getCreateBy());
        // è®¾ç½®java字段名
        column.setJavaField(StringUtils.toCamelCase(columnName));
        // è®¾ç½®é»˜è®¤ç±»åž‹
        column.setJavaType(GenConstants.TYPE_STRING);
        column.setQueryType(GenConstants.QUERY_EQ);
        if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType))
        {
            // å­—符串长度超过500设置为文本域
            Integer columnLength = getColumnLength(column.getColumnType());
            String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT;
            column.setHtmlType(htmlType);
        }
        else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType))
        {
            column.setJavaType(GenConstants.TYPE_DATE);
            column.setHtmlType(GenConstants.HTML_DATETIME);
        }
        else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType))
        {
            column.setHtmlType(GenConstants.HTML_INPUT);
            // å¦‚果是浮点型 ç»Ÿä¸€ç”¨BigDecimal
            String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ",");
            if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0)
            {
                column.setJavaType(GenConstants.TYPE_BIGDECIMAL);
            }
            // å¦‚果是整形
            else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10)
            {
                column.setJavaType(GenConstants.TYPE_INTEGER);
            }
            // é•¿æ•´å½¢
            else
            {
                column.setJavaType(GenConstants.TYPE_LONG);
            }
        }
        // æ’入字段(默认所有字段都需要插入)
        column.setIsInsert(GenConstants.REQUIRE);
        // ç¼–辑字段
        if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk())
        {
            column.setIsEdit(GenConstants.REQUIRE);
        }
        // åˆ—表字段
        if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk())
        {
            column.setIsList(GenConstants.REQUIRE);
        }
        // æŸ¥è¯¢å­—段
        if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk())
        {
            column.setIsQuery(GenConstants.REQUIRE);
        }
        // æŸ¥è¯¢å­—段类型
        if (StringUtils.endsWithIgnoreCase(columnName, "name"))
        {
            column.setQueryType(GenConstants.QUERY_LIKE);
        }
        // çŠ¶æ€å­—æ®µè®¾ç½®å•é€‰æ¡†
        if (StringUtils.endsWithIgnoreCase(columnName, "status"))
        {
            column.setHtmlType(GenConstants.HTML_RADIO);
        }
        // ç±»åž‹&性别字段设置下拉框
        else if (StringUtils.endsWithIgnoreCase(columnName, "type")
                || StringUtils.endsWithIgnoreCase(columnName, "sex"))
        {
            column.setHtmlType(GenConstants.HTML_SELECT);
        }
        // å›¾ç‰‡å­—段设置图片上传控件
        else if (StringUtils.endsWithIgnoreCase(columnName, "image"))
        {
            column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD);
        }
        // æ–‡ä»¶å­—段设置文件上传控件
        else if (StringUtils.endsWithIgnoreCase(columnName, "file"))
        {
            column.setHtmlType(GenConstants.HTML_FILE_UPLOAD);
        }
        // å†…容字段设置富文本控件
        else if (StringUtils.endsWithIgnoreCase(columnName, "content"))
        {
            column.setHtmlType(GenConstants.HTML_EDITOR);
        }
    }
    /**
     * æ ¡éªŒæ•°ç»„是否包含指定值
     *
     * @param arr æ•°ç»„
     * @param targetValue å€¼
     * @return æ˜¯å¦åŒ…含
     */
    public static boolean arraysContains(String[] arr, String targetValue)
    {
        return Arrays.asList(arr).contains(targetValue);
    }
    /**
     * èŽ·å–æ¨¡å—å
     *
     * @param packageName åŒ…名
     * @return æ¨¡å—名
     */
    public static String getModuleName(String packageName)
    {
        int lastIndex = packageName.lastIndexOf(".");
        int nameLength = packageName.length();
        return StringUtils.substring(packageName, lastIndex + 1, nameLength);
    }
    /**
     * èŽ·å–ä¸šåŠ¡å
     *
     * @param tableName è¡¨å
     * @return ä¸šåŠ¡å
     */
    public static String getBusinessName(String tableName)
    {
        int lastIndex = tableName.lastIndexOf("_");
        int nameLength = tableName.length();
        return StringUtils.substring(tableName, lastIndex + 1, nameLength);
    }
    /**
     * è¡¨åè½¬æ¢æˆJava类名
     *
     * @param tableName è¡¨åç§°
     * @return ç±»å
     */
    public static String convertClassName(String tableName)
    {
        boolean autoRemovePre = GenConfig.getAutoRemovePre();
        String tablePrefix = GenConfig.getTablePrefix();
        if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix))
        {
            String[] searchList = StringUtils.split(tablePrefix, ",");
            tableName = replaceFirst(tableName, searchList);
        }
        return StringUtils.convertToCamelCase(tableName);
    }
    /**
     * æ‰¹é‡æ›¿æ¢å‰ç¼€
     *
     * @param replacementm æ›¿æ¢å€¼
     * @param searchList æ›¿æ¢åˆ—表
     * @return
     */
    public static String replaceFirst(String replacementm, String[] searchList)
    {
        String text = replacementm;
        for (String searchString : searchList)
        {
            if (replacementm.startsWith(searchString))
            {
                text = replacementm.replaceFirst(searchString, "");
                break;
            }
        }
        return text;
    }
    /**
     * å…³é”®å­—替换
     *
     * @param text éœ€è¦è¢«æ›¿æ¢çš„名字
     * @return æ›¿æ¢åŽçš„名字
     */
    public static String replaceText(String text)
    {
        return RegExUtils.replaceAll(text, "(?:表|若依)", "");
    }
    /**
     * èŽ·å–æ•°æ®åº“ç±»åž‹å­—æ®µ
     *
     * @param columnType åˆ—类型
     * @return æˆªå–后的列类型
     */
    public static String getDbType(String columnType)
    {
        if (StringUtils.indexOf(columnType, "(") > 0)
        {
            return StringUtils.substringBefore(columnType, "(");
        }
        else
        {
            return columnType;
        }
    }
    /**
     * èŽ·å–å­—æ®µé•¿åº¦
     *
     * @param columnType åˆ—类型
     * @return æˆªå–后的列类型
     */
    public static Integer getColumnLength(String columnType)
    {
        if (StringUtils.indexOf(columnType, "(") > 0)
        {
            String length = StringUtils.substringBetween(columnType, "(", ")");
            return Integer.valueOf(length);
        }
        else
        {
            return 0;
        }
    }
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/util/VelocityInitializer.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.se.gen.util;
import java.util.Properties;
import org.apache.velocity.app.Velocity;
import com.se.common.core.constant.Constants;
/**
 * VelocityEngine工厂
 *
 * @author admin
 */
public class VelocityInitializer
{
    /**
     * åˆå§‹åŒ–vm方法
     */
    public static void initVelocity()
    {
        Properties p = new Properties();
        try
        {
            // åŠ è½½classpath目录下的vm文件
            p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
            // å®šä¹‰å­—符集
            p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8);
            // åˆå§‹åŒ–Velocity引擎,指定配置Properties
            Velocity.init(p);
        }
        catch (Exception e)
        {
            throw new RuntimeException(e);
        }
    }
}
ruoyi-modules/se-gen/src/main/java/com/se/gen/util/VelocityUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,409 @@
package com.se.gen.util;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.se.gen.domain.GenTableColumn;
import org.apache.velocity.VelocityContext;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.se.common.core.constant.GenConstants;
import com.se.common.core.utils.DateUtils;
import com.se.common.core.utils.StringUtils;
import com.se.gen.domain.GenTable;
/**
 * æ¨¡æ¿å·¥å…·ç±»
 *
 * @author admin
 */
public class VelocityUtils
{
    /** é¡¹ç›®ç©ºé—´è·¯å¾„ */
    private static final String PROJECT_PATH = "main/java";
    /** mybatis空间路径 */
    private static final String MYBATIS_PATH = "main/resources/mapper";
    /** é»˜è®¤ä¸Šçº§èœå•,系统工具 */
    private static final String DEFAULT_PARENT_MENU_ID = "3";
    /**
     * è®¾ç½®æ¨¡æ¿å˜é‡ä¿¡æ¯
     *
     * @return æ¨¡æ¿åˆ—表
     */
    public static VelocityContext prepareContext(GenTable genTable)
    {
        String moduleName = genTable.getModuleName();
        String businessName = genTable.getBusinessName();
        String packageName = genTable.getPackageName();
        String tplCategory = genTable.getTplCategory();
        String functionName = genTable.getFunctionName();
        VelocityContext velocityContext = new VelocityContext();
        velocityContext.put("tplCategory", genTable.getTplCategory());
        velocityContext.put("tableName", genTable.getTableName());
        velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】");
        velocityContext.put("ClassName", genTable.getClassName());
        velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName()));
        velocityContext.put("moduleName", genTable.getModuleName());
        velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName()));
        velocityContext.put("businessName", genTable.getBusinessName());
        velocityContext.put("basePackage", getPackagePrefix(packageName));
        velocityContext.put("packageName", packageName);
        velocityContext.put("author", genTable.getFunctionAuthor());
        velocityContext.put("datetime", DateUtils.getDate());
        velocityContext.put("pkColumn", genTable.getPkColumn());
        velocityContext.put("importList", getImportList(genTable));
        velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
        velocityContext.put("columns", genTable.getColumns());
        velocityContext.put("table", genTable);
        velocityContext.put("dicts", getDicts(genTable));
        setMenuVelocityContext(velocityContext, genTable);
        if (GenConstants.TPL_TREE.equals(tplCategory))
        {
            setTreeVelocityContext(velocityContext, genTable);
        }
        if (GenConstants.TPL_SUB.equals(tplCategory))
        {
            setSubVelocityContext(velocityContext, genTable);
        }
        return velocityContext;
    }
    public static void setMenuVelocityContext(VelocityContext context, GenTable genTable)
    {
        String options = genTable.getOptions();
        JSONObject paramsObj = JSON.parseObject(options);
        String parentMenuId = getParentMenuId(paramsObj);
        context.put("parentMenuId", parentMenuId);
    }
    public static void setTreeVelocityContext(VelocityContext context, GenTable genTable)
    {
        String options = genTable.getOptions();
        JSONObject paramsObj = JSON.parseObject(options);
        String treeCode = getTreecode(paramsObj);
        String treeParentCode = getTreeParentCode(paramsObj);
        String treeName = getTreeName(paramsObj);
        context.put("treeCode", treeCode);
        context.put("treeParentCode", treeParentCode);
        context.put("treeName", treeName);
        context.put("expandColumn", getExpandColumn(genTable));
        if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE))
        {
            context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE));
        }
        if (paramsObj.containsKey(GenConstants.TREE_NAME))
        {
            context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME));
        }
    }
    public static void setSubVelocityContext(VelocityContext context, GenTable genTable)
    {
        GenTable subTable = genTable.getSubTable();
        String subTableName = genTable.getSubTableName();
        String subTableFkName = genTable.getSubTableFkName();
        String subClassName = genTable.getSubTable().getClassName();
        String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName);
        context.put("subTable", subTable);
        context.put("subTableName", subTableName);
        context.put("subTableFkName", subTableFkName);
        context.put("subTableFkClassName", subTableFkClassName);
        context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName));
        context.put("subClassName", subClassName);
        context.put("subclassName", StringUtils.uncapitalize(subClassName));
        context.put("subImportList", getImportList(genTable.getSubTable()));
    }
    /**
     * èŽ·å–æ¨¡æ¿ä¿¡æ¯
     * @param tplCategory ç”Ÿæˆçš„æ¨¡æ¿
     * @param tplWebType å‰ç«¯ç±»åž‹
     * @return æ¨¡æ¿åˆ—表
     */
    public static List<String> getTemplateList(String tplCategory, String tplWebType)
    {
        String useWebType = "vm/vue";
        if ("element-plus".equals(tplWebType))
        {
            useWebType = "vm/vue/v3";
        }
        List<String> templates = new ArrayList<String>();
        templates.add("vm/java/domain.java.vm");
        templates.add("vm/java/mapper.java.vm");
        templates.add("vm/java/service.java.vm");
        templates.add("vm/java/serviceImpl.java.vm");
        templates.add("vm/java/controller.java.vm");
        templates.add("vm/xml/mapper.xml.vm");
        templates.add("vm/sql/sql.vm");
        templates.add("vm/js/api.js.vm");
        if (GenConstants.TPL_CRUD.equals(tplCategory))
        {
            templates.add(useWebType + "/index.vue.vm");
        }
        else if (GenConstants.TPL_TREE.equals(tplCategory))
        {
            templates.add(useWebType + "/index-tree.vue.vm");
        }
        else if (GenConstants.TPL_SUB.equals(tplCategory))
        {
            templates.add(useWebType + "/index.vue.vm");
            templates.add("vm/java/sub-domain.java.vm");
        }
        return templates;
    }
    /**
     * èŽ·å–æ–‡ä»¶å
     */
    public static String getFileName(String template, GenTable genTable)
    {
        // æ–‡ä»¶åç§°
        String fileName = "";
        // åŒ…路径
        String packageName = genTable.getPackageName();
        // æ¨¡å—名
        String moduleName = genTable.getModuleName();
        // å¤§å†™ç±»å
        String className = genTable.getClassName();
        // ä¸šåŠ¡åç§°
        String businessName = genTable.getBusinessName();
        String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
        String mybatisPath = MYBATIS_PATH + "/" + moduleName;
        String vuePath = "vue";
        if (template.contains("domain.java.vm"))
        {
            fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
        }
        if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory()))
        {
            fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName());
        }
        else if (template.contains("mapper.java.vm"))
        {
            fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className);
        }
        else if (template.contains("service.java.vm"))
        {
            fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className);
        }
        else if (template.contains("serviceImpl.java.vm"))
        {
            fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className);
        }
        else if (template.contains("controller.java.vm"))
        {
            fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className);
        }
        else if (template.contains("mapper.xml.vm"))
        {
            fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className);
        }
        else if (template.contains("sql.vm"))
        {
            fileName = businessName + "Menu.sql";
        }
        else if (template.contains("api.js.vm"))
        {
            fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName);
        }
        else if (template.contains("index.vue.vm"))
        {
            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
        }
        else if (template.contains("index-tree.vue.vm"))
        {
            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
        }
        return fileName;
    }
    /**
     * èŽ·å–åŒ…å‰ç¼€
     *
     * @param packageName åŒ…名称
     * @return åŒ…前缀名称
     */
    public static String getPackagePrefix(String packageName)
    {
        int lastIndex = packageName.lastIndexOf(".");
        return StringUtils.substring(packageName, 0, lastIndex);
    }
    /**
     * æ ¹æ®åˆ—类型获取导入包
     *
     * @param genTable ä¸šåŠ¡è¡¨å¯¹è±¡
     * @return è¿”回需要导入的包列表
     */
    public static HashSet<String> getImportList(GenTable genTable)
    {
        List<GenTableColumn> columns = genTable.getColumns();
        GenTable subGenTable = genTable.getSubTable();
        HashSet<String> importList = new HashSet<String>();
        if (StringUtils.isNotNull(subGenTable))
        {
            importList.add("java.util.List");
        }
        for (GenTableColumn column : columns)
        {
            if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType()))
            {
                importList.add("java.util.Date");
                importList.add("com.fasterxml.jackson.annotation.JsonFormat");
            }
            else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType()))
            {
                importList.add("java.math.BigDecimal");
            }
        }
        return importList;
    }
    /**
     * æ ¹æ®åˆ—类型获取字典组
     *
     * @param genTable ä¸šåŠ¡è¡¨å¯¹è±¡
     * @return è¿”回字典组
     */
    public static String getDicts(GenTable genTable)
    {
        List<GenTableColumn> columns = genTable.getColumns();
        Set<String> dicts = new HashSet<String>();
        addDicts(dicts, columns);
        if (StringUtils.isNotNull(genTable.getSubTable()))
        {
            List<GenTableColumn> subColumns = genTable.getSubTable().getColumns();
            addDicts(dicts, subColumns);
        }
        return StringUtils.join(dicts, ", ");
    }
    /**
     * æ·»åŠ å­—å…¸åˆ—è¡¨
     *
     * @param dicts å­—典列表
     * @param columns åˆ—集合
     */
    public static void addDicts(Set<String> dicts, List<GenTableColumn> columns)
    {
        for (GenTableColumn column : columns)
        {
            if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny(
                    column.getHtmlType(),
                    new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX }))
            {
                dicts.add("'" + column.getDictType() + "'");
            }
        }
    }
    /**
     * èŽ·å–æƒé™å‰ç¼€
     *
     * @param moduleName æ¨¡å—名称
     * @param businessName ä¸šåŠ¡åç§°
     * @return è¿”回权限前缀
     */
    public static String getPermissionPrefix(String moduleName, String businessName)
    {
        return StringUtils.format("{}:{}", moduleName, businessName);
    }
    /**
     * èŽ·å–ä¸Šçº§èœå•ID字段
     *
     * @param paramsObj ç”Ÿæˆå…¶ä»–选项
     * @return ä¸Šçº§èœå•ID字段
     */
    public static String getParentMenuId(JSONObject paramsObj)
    {
        if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)
                && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID)))
        {
            return paramsObj.getString(GenConstants.PARENT_MENU_ID);
        }
        return DEFAULT_PARENT_MENU_ID;
    }
    /**
     * èŽ·å–æ ‘ç¼–ç 
     *
     * @param paramsObj ç”Ÿæˆå…¶ä»–选项
     * @return æ ‘编码
     */
    public static String getTreecode(JSONObject paramsObj)
    {
        if (paramsObj.containsKey(GenConstants.TREE_CODE))
        {
            return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE));
        }
        return StringUtils.EMPTY;
    }
    /**
     * èŽ·å–æ ‘çˆ¶ç¼–ç 
     *
     * @param paramsObj ç”Ÿæˆå…¶ä»–选项
     * @return æ ‘父编码
     */
    public static String getTreeParentCode(JSONObject paramsObj)
    {
        if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE))
        {
            return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE));
        }
        return StringUtils.EMPTY;
    }
    /**
     * èŽ·å–æ ‘åç§°
     *
     * @param paramsObj ç”Ÿæˆå…¶ä»–选项
     * @return æ ‘名称
     */
    public static String getTreeName(JSONObject paramsObj)
    {
        if (paramsObj.containsKey(GenConstants.TREE_NAME))
        {
            return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME));
        }
        return StringUtils.EMPTY;
    }
    /**
     * èŽ·å–éœ€è¦åœ¨å“ªä¸€åˆ—ä¸Šé¢æ˜¾ç¤ºå±•å¼€æŒ‰é’®
     *
     * @param genTable ä¸šåŠ¡è¡¨å¯¹è±¡
     * @return å±•开按钮列序号
     */
    public static int getExpandColumn(GenTable genTable)
    {
        String options = genTable.getOptions();
        JSONObject paramsObj = JSON.parseObject(options);
        String treeName = paramsObj.getString(GenConstants.TREE_NAME);
        int num = 0;
        for (GenTableColumn column : genTable.getColumns())
        {
            if (column.isList())
            {
                num++;
                String columnName = column.getColumnName();
                if (columnName.equals(treeName))
                {
                    break;
                }
            }
        }
        return num;
    }
}
ruoyi-modules/se-gen/src/main/resources/banner.txt
ruoyi-modules/se-gen/src/main/resources/bootstrap.yml
ruoyi-modules/se-gen/src/main/resources/logback.xml
ruoyi-modules/se-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.se.gen.mapper.GenTableColumnMapper">
    <resultMap type="GenTableColumn" id="GenTableColumnResult">
        <id     property="columnId"       column="column_id"      />
        <result property="tableId"        column="table_id"       />
        <result property="columnName"     column="column_name"    />
        <result property="columnComment"  column="column_comment" />
        <result property="columnType"     column="column_type"    />
        <result property="javaType"       column="java_type"      />
        <result property="javaField"      column="java_field"     />
        <result property="isPk"           column="is_pk"          />
        <result property="isIncrement"    column="is_increment"   />
        <result property="isRequired"     column="is_required"    />
        <result property="isInsert"       column="is_insert"      />
        <result property="isEdit"         column="is_edit"        />
        <result property="isList"         column="is_list"        />
        <result property="isQuery"        column="is_query"       />
        <result property="queryType"      column="query_type"     />
        <result property="htmlType"       column="html_type"      />
        <result property="dictType"       column="dict_type"      />
        <result property="sort"           column="sort"           />
        <result property="createBy"       column="create_by"      />
        <result property="createTime"     column="create_time"    />
        <result property="updateBy"       column="update_by"      />
        <result property="updateTime"     column="update_time"    />
    </resultMap>
    <sql id="selectGenTableColumnVo">
        select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column
    </sql>
    <select id="selectGenTableColumnListByTableId" parameterType="GenTableColumn" resultMap="GenTableColumnResult">
        <include refid="selectGenTableColumnVo"/>
        where table_id = #{tableId}
        order by sort
    </select>
    <select id="selectDbTableColumnsByName" parameterType="String" resultMap="GenTableColumnResult">
        select column_name, (case when (is_nullable = 'no' <![CDATA[ && ]]> column_key != 'PRI') then '1' else null end) as is_required, (case when column_key = 'PRI' then '1' else '0' end) as is_pk, ordinal_position as sort, column_comment, (case when extra = 'auto_increment' then '1' else '0' end) as is_increment, column_type
        from information_schema.columns where table_schema = (select database()) and table_name = (#{tableName})
        order by ordinal_position
    </select>
    <insert id="insertGenTableColumn" parameterType="GenTableColumn" useGeneratedKeys="true" keyProperty="columnId">
        insert into gen_table_column (
            <if test="tableId != null and tableId != ''">table_id,</if>
            <if test="columnName != null and columnName != ''">column_name,</if>
            <if test="columnComment != null and columnComment != ''">column_comment,</if>
            <if test="columnType != null and columnType != ''">column_type,</if>
            <if test="javaType != null and javaType != ''">java_type,</if>
            <if test="javaField != null  and javaField != ''">java_field,</if>
            <if test="isPk != null and isPk != ''">is_pk,</if>
            <if test="isIncrement != null and isIncrement != ''">is_increment,</if>
            <if test="isRequired != null and isRequired != ''">is_required,</if>
            <if test="isInsert != null and isInsert != ''">is_insert,</if>
            <if test="isEdit != null and isEdit != ''">is_edit,</if>
            <if test="isList != null and isList != ''">is_list,</if>
            <if test="isQuery != null and isQuery != ''">is_query,</if>
            <if test="queryType != null and queryType != ''">query_type,</if>
            <if test="htmlType != null and htmlType != ''">html_type,</if>
            <if test="dictType != null and dictType != ''">dict_type,</if>
            <if test="sort != null">sort,</if>
            <if test="createBy != null and createBy != ''">create_by,</if>
            create_time
         )values(
            <if test="tableId != null and tableId != ''">#{tableId},</if>
            <if test="columnName != null and columnName != ''">#{columnName},</if>
            <if test="columnComment != null and columnComment != ''">#{columnComment},</if>
            <if test="columnType != null and columnType != ''">#{columnType},</if>
            <if test="javaType != null and javaType != ''">#{javaType},</if>
            <if test="javaField != null and javaField != ''">#{javaField},</if>
            <if test="isPk != null and isPk != ''">#{isPk},</if>
            <if test="isIncrement != null and isIncrement != ''">#{isIncrement},</if>
            <if test="isRequired != null and isRequired != ''">#{isRequired},</if>
            <if test="isInsert != null and isInsert != ''">#{isInsert},</if>
            <if test="isEdit != null and isEdit != ''">#{isEdit},</if>
            <if test="isList != null and isList != ''">#{isList},</if>
            <if test="isQuery != null and isQuery != ''">#{isQuery},</if>
            <if test="queryType != null and queryType != ''">#{queryType},</if>
            <if test="htmlType != null and htmlType != ''">#{htmlType},</if>
            <if test="dictType != null and dictType != ''">#{dictType},</if>
            <if test="sort != null">#{sort},</if>
            <if test="createBy != null and createBy != ''">#{createBy},</if>
            sysdate()
         )
    </insert>
    <update id="updateGenTableColumn" parameterType="GenTableColumn">
        update gen_table_column
        <set>
            <if test="columnComment != null">column_comment = #{columnComment},</if>
            <if test="javaType != null">java_type = #{javaType},</if>
            <if test="javaField != null">java_field = #{javaField},</if>
            <if test="isInsert != null">is_insert = #{isInsert},</if>
            <if test="isEdit != null">is_edit = #{isEdit},</if>
            <if test="isList != null">is_list = #{isList},</if>
            <if test="isQuery != null">is_query = #{isQuery},</if>
            <if test="isRequired != null">is_required = #{isRequired},</if>
            <if test="queryType != null">query_type = #{queryType},</if>
            <if test="htmlType != null">html_type = #{htmlType},</if>
            <if test="dictType != null">dict_type = #{dictType},</if>
            <if test="sort != null">sort = #{sort},</if>
            <if test="updateBy != null">update_by = #{updateBy},</if>
            update_time = sysdate()
        </set>
        where column_id = #{columnId}
    </update>
    <delete id="deleteGenTableColumnByIds" parameterType="Long">
        delete from gen_table_column where table_id in
        <foreach collection="array" item="tableId" open="(" separator="," close=")">
            #{tableId}
        </foreach>
    </delete>
    <delete id="deleteGenTableColumns">
        delete from gen_table_column where column_id in
        <foreach collection="list" item="item" open="(" separator="," close=")">
            #{item.columnId}
        </foreach>
    </delete>
</mapper>
ruoyi-modules/se-gen/src/main/resources/mapper/generator/GenTableMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,206 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.se.gen.mapper.GenTableMapper">
    <resultMap type="GenTable" id="GenTableResult">
        <id     property="tableId"        column="table_id"          />
        <result property="tableName"      column="table_name"        />
        <result property="tableComment"   column="table_comment"     />
        <result property="subTableName"   column="sub_table_name"    />
        <result property="subTableFkName" column="sub_table_fk_name" />
        <result property="className"      column="class_name"        />
        <result property="tplCategory"    column="tpl_category"      />
        <result property="tplWebType"     column="tpl_web_type"      />
        <result property="packageName"    column="package_name"      />
        <result property="moduleName"     column="module_name"       />
        <result property="businessName"   column="business_name"     />
        <result property="functionName"   column="function_name"     />
        <result property="functionAuthor" column="function_author"   />
        <result property="genType"        column="gen_type"          />
        <result property="genPath"        column="gen_path"          />
        <result property="options"        column="options"           />
        <result property="createBy"       column="create_by"         />
        <result property="createTime"     column="create_time"       />
        <result property="updateBy"       column="update_by"         />
        <result property="updateTime"     column="update_time"       />
        <result property="remark"         column="remark"            />
        <collection  property="columns"   javaType="java.util.List"  resultMap="GenTableColumnResult" />
    </resultMap>
    <resultMap type="GenTableColumn" id="GenTableColumnResult">
        <id     property="columnId"       column="column_id"      />
        <result property="tableId"        column="table_id"       />
        <result property="columnName"     column="column_name"    />
        <result property="columnComment"  column="column_comment" />
        <result property="columnType"     column="column_type"    />
        <result property="javaType"       column="java_type"      />
        <result property="javaField"      column="java_field"     />
        <result property="isPk"           column="is_pk"          />
        <result property="isIncrement"    column="is_increment"   />
        <result property="isRequired"     column="is_required"    />
        <result property="isInsert"       column="is_insert"      />
        <result property="isEdit"         column="is_edit"        />
        <result property="isList"         column="is_list"        />
        <result property="isQuery"        column="is_query"       />
        <result property="queryType"      column="query_type"     />
        <result property="htmlType"       column="html_type"      />
        <result property="dictType"       column="dict_type"      />
        <result property="sort"           column="sort"           />
        <result property="createBy"       column="create_by"      />
        <result property="createTime"     column="create_time"    />
        <result property="updateBy"       column="update_by"      />
        <result property="updateTime"     column="update_time"    />
    </resultMap>
    <sql id="selectGenTableVo">
        select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, tpl_web_type, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table
    </sql>
    <select id="selectGenTableList" parameterType="GenTable" resultMap="GenTableResult">
        <include refid="selectGenTableVo"/>
        <where>
            <if test="tableName != null and tableName != ''">
                AND lower(table_name) like lower(concat('%', #{tableName}, '%'))
            </if>
            <if test="tableComment != null and tableComment != ''">
                AND lower(table_comment) like lower(concat('%', #{tableComment}, '%'))
            </if>
            <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼€å§‹æ—¶é—´æ£€ç´¢ -->
                AND date_format(create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
            </if>
            <if test="params.endTime != null and params.endTime != ''"><!-- ç»“束时间检索 -->
                AND date_format(create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
            </if>
        </where>
    </select>
    <select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult">
        select table_name, table_comment, create_time, update_time from information_schema.tables
        where table_schema = (select database())
        AND table_name NOT LIKE 'qrtz\_%' AND table_name NOT LIKE 'gen\_%'
        AND table_name NOT IN (select table_name from gen_table)
        <if test="tableName != null and tableName != ''">
            AND lower(table_name) like lower(concat('%', #{tableName}, '%'))
        </if>
        <if test="tableComment != null and tableComment != ''">
            AND lower(table_comment) like lower(concat('%', #{tableComment}, '%'))
        </if>
        <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼€å§‹æ—¶é—´æ£€ç´¢ -->
            AND date_format(create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
        </if>
        <if test="params.endTime != null and params.endTime != ''"><!-- ç»“束时间检索 -->
            AND date_format(create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
        </if>
        order by create_time desc
    </select>
    <select id="selectDbTableListByNames" resultMap="GenTableResult">
        select table_name, table_comment, create_time, update_time from information_schema.tables
        where table_name NOT LIKE 'qrtz\_%' and table_name NOT LIKE 'gen\_%' and table_schema = (select database())
        and table_name in
        <foreach collection="array" item="name" open="(" separator="," close=")">
             #{name}
        </foreach>
    </select>
    <select id="selectTableByName" parameterType="String" resultMap="GenTableResult">
        select table_name, table_comment, create_time, update_time from information_schema.tables
        where table_comment <![CDATA[ <> ]]> '' and table_schema = (select database())
        and table_name = #{tableName}
    </select>
    <select id="selectGenTableById" parameterType="Long" resultMap="GenTableResult">
        SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark,
               c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
        FROM gen_table t
             LEFT JOIN gen_table_column c ON t.table_id = c.table_id
        where t.table_id = #{tableId} order by c.sort
    </select>
    <select id="selectGenTableByName" parameterType="String" resultMap="GenTableResult">
        SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark,
               c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
        FROM gen_table t
             LEFT JOIN gen_table_column c ON t.table_id = c.table_id
        where t.table_name = #{tableName} order by c.sort
    </select>
    <select id="selectGenTableAll" parameterType="String" resultMap="GenTableResult">
        SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.options, t.remark,
               c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
        FROM gen_table t
             LEFT JOIN gen_table_column c ON t.table_id = c.table_id
        order by c.sort
    </select>
    <insert id="insertGenTable" parameterType="GenTable" useGeneratedKeys="true" keyProperty="tableId">
        insert into gen_table (
            <if test="tableName != null">table_name,</if>
            <if test="tableComment != null and tableComment != ''">table_comment,</if>
            <if test="className != null and className != ''">class_name,</if>
            <if test="tplCategory != null and tplCategory != ''">tpl_category,</if>
            <if test="tplWebType != null and tplWebType != ''">tpl_web_type,</if>
            <if test="packageName != null and packageName != ''">package_name,</if>
            <if test="moduleName != null and moduleName != ''">module_name,</if>
            <if test="businessName != null and businessName != ''">business_name,</if>
            <if test="functionName != null and functionName != ''">function_name,</if>
            <if test="functionAuthor != null and functionAuthor != ''">function_author,</if>
            <if test="genType != null and genType != ''">gen_type,</if>
            <if test="genPath != null and genPath != ''">gen_path,</if>
            <if test="remark != null and remark != ''">remark,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
            create_time
         )values(
            <if test="tableName != null">#{tableName},</if>
            <if test="tableComment != null and tableComment != ''">#{tableComment},</if>
            <if test="className != null and className != ''">#{className},</if>
            <if test="tplCategory != null and tplCategory != ''">#{tplCategory},</if>
            <if test="tplWebType != null and tplWebType != ''">#{tplWebType},</if>
            <if test="packageName != null and packageName != ''">#{packageName},</if>
            <if test="moduleName != null and moduleName != ''">#{moduleName},</if>
            <if test="businessName != null and businessName != ''">#{businessName},</if>
            <if test="functionName != null and functionName != ''">#{functionName},</if>
            <if test="functionAuthor != null and functionAuthor != ''">#{functionAuthor},</if>
            <if test="genType != null and genType != ''">#{genType},</if>
            <if test="genPath != null and genPath != ''">#{genPath},</if>
            <if test="remark != null and remark != ''">#{remark},</if>
             <if test="createBy != null and createBy != ''">#{createBy},</if>
            sysdate()
         )
    </insert>
    <update id="updateGenTable" parameterType="GenTable">
        update gen_table
        <set>
            <if test="tableName != null">table_name = #{tableName},</if>
            <if test="tableComment != null and tableComment != ''">table_comment = #{tableComment},</if>
            <if test="subTableName != null">sub_table_name = #{subTableName},</if>
            <if test="subTableFkName != null">sub_table_fk_name = #{subTableFkName},</if>
            <if test="className != null and className != ''">class_name = #{className},</if>
            <if test="functionAuthor != null and functionAuthor != ''">function_author = #{functionAuthor},</if>
            <if test="genType != null and genType != ''">gen_type = #{genType},</if>
            <if test="genPath != null and genPath != ''">gen_path = #{genPath},</if>
            <if test="tplCategory != null and tplCategory != ''">tpl_category = #{tplCategory},</if>
            <if test="tplWebType != null and tplWebType != ''">tpl_web_type = #{tplWebType},</if>
            <if test="packageName != null and packageName != ''">package_name = #{packageName},</if>
            <if test="moduleName != null and moduleName != ''">module_name = #{moduleName},</if>
            <if test="businessName != null and businessName != ''">business_name = #{businessName},</if>
            <if test="functionName != null and functionName != ''">function_name = #{functionName},</if>
            <if test="options != null and options != ''">options = #{options},</if>
            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
            <if test="remark != null">remark = #{remark},</if>
            update_time = sysdate()
        </set>
        where table_id = #{tableId}
    </update>
    <delete id="deleteGenTableByIds" parameterType="Long">
        delete from gen_table where table_id in
        <foreach collection="array" item="tableId" open="(" separator="," close=")">
            #{tableId}
        </foreach>
    </delete>
</mapper>
ruoyi-modules/se-gen/src/main/resources/vm/java/controller.java.vm
ruoyi-modules/se-gen/src/main/resources/vm/java/domain.java.vm
ruoyi-modules/se-gen/src/main/resources/vm/java/mapper.java.vm
ruoyi-modules/se-gen/src/main/resources/vm/java/service.java.vm
ruoyi-modules/se-gen/src/main/resources/vm/java/serviceImpl.java.vm
ruoyi-modules/se-gen/src/main/resources/vm/java/sub-domain.java.vm
ruoyi-modules/se-gen/src/main/resources/vm/js/api.js.vm
ruoyi-modules/se-gen/src/main/resources/vm/sql/sql.vm
ruoyi-modules/se-gen/src/main/resources/vm/vue/index-tree.vue.vm
ruoyi-modules/se-gen/src/main/resources/vm/vue/index.vue.vm
ruoyi-modules/se-gen/src/main/resources/vm/vue/v3/index-tree.vue.vm
ruoyi-modules/se-gen/src/main/resources/vm/vue/v3/index.vue.vm
ruoyi-modules/se-gen/src/main/resources/vm/xml/mapper.xml.vm
ruoyi-modules/se-job/pom.xml
ruoyi-modules/se-job/src/main/java/com/se/job/SeJobApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.se.job;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.se.common.security.annotation.EnableCustomConfig;
import com.se.common.security.annotation.EnableRyFeignClients;
import com.se.common.swagger.annotation.EnableCustomSwagger2;
/**
 * å®šæ—¶ä»»åŠ¡
 *
 * @author admin
 */
@EnableCustomConfig
@EnableCustomSwagger2
@EnableRyFeignClients
@SpringBootApplication
public class SeJobApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(SeJobApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  å®šæ—¶ä»»åŠ¡æ¨¡å—å¯åŠ¨æˆåŠŸ   áƒš(´ڡ`ლ)゙  \n" +
                " .-------.       ____     __        \n" +
                " |  _ _   \\      \\   \\   /  /    \n" +
                " | ( ' )  |       \\  _. /  '       \n" +
                " |(_ o _) /        _( )_ .'         \n" +
                " | (_,_).' __  ___(_ o _)'          \n" +
                " |  |\\ \\  |  ||   |(_,_)'         \n" +
                " |  | \\ `'   /|   `-'  /           \n" +
                " |  |  \\    /  \\      /           \n" +
                " ''-'   `'-'    `-..-'              ");
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/config/ScheduleConfig.java
ruoyi-modules/se-job/src/main/java/com/se/job/controller/SysJobController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,187 @@
package com.se.job.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.se.job.domain.SysJob;
import com.se.job.service.ISysJobService;
import com.se.job.util.ScheduleUtils;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.constant.Constants;
import com.se.common.core.exception.job.TaskException;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.common.security.utils.SecurityUtils;
import com.se.job.util.CronUtils;
/**
 * è°ƒåº¦ä»»åŠ¡ä¿¡æ¯æ“ä½œå¤„ç†
 *
 * @author admin
 */
@RestController
@RequestMapping("/job")
public class SysJobController extends BaseController
{
    @Autowired
    private ISysJobService jobService;
    /**
     * æŸ¥è¯¢å®šæ—¶ä»»åŠ¡åˆ—è¡¨
     */
    @RequiresPermissions("monitor:job:list")
    @GetMapping("/list")
    public TableDataInfo list(SysJob sysJob)
    {
        startPage();
        List<SysJob> list = jobService.selectJobList(sysJob);
        return getDataTable(list);
    }
    /**
     * å¯¼å‡ºå®šæ—¶ä»»åŠ¡åˆ—è¡¨
     */
    @RequiresPermissions("monitor:job:export")
    @Log(title = "定时任务", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysJob sysJob)
    {
        List<SysJob> list = jobService.selectJobList(sysJob);
        ExcelUtil<SysJob> util = new ExcelUtil<SysJob>(SysJob.class);
        util.exportExcel(response, list, "定时任务");
    }
    /**
     * èŽ·å–å®šæ—¶ä»»åŠ¡è¯¦ç»†ä¿¡æ¯
     */
    @RequiresPermissions("monitor:job:query")
    @GetMapping(value = "/{jobId}")
    public AjaxResult getInfo(@PathVariable("jobId") Long jobId)
    {
        return success(jobService.selectJobById(jobId));
    }
    /**
     * æ–°å¢žå®šæ—¶ä»»åŠ¡
     */
    @RequiresPermissions("monitor:job:add")
    @Log(title = "定时任务", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException
    {
        if (!CronUtils.isValid(job.getCronExpression()))
        {
            return error("新增任务'" + job.getJobName() + "'失败,Cron表达式不正确");
        }
        else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
        {
            return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用");
        }
        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS }))
        {
            return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用");
        }
        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
        {
            return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用");
        }
        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR))
        {
            return error("新增任务'" + job.getJobName() + "'失败,目标字符串存在违规");
        }
        else if (!ScheduleUtils.whiteList(job.getInvokeTarget()))
        {
            return error("新增任务'" + job.getJobName() + "'失败,目标字符串不在白名单内");
        }
        job.setCreateBy(SecurityUtils.getUsername());
        return toAjax(jobService.insertJob(job));
    }
    /**
     * ä¿®æ”¹å®šæ—¶ä»»åŠ¡
     */
    @RequiresPermissions("monitor:job:edit")
    @Log(title = "定时任务", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException
    {
        if (!CronUtils.isValid(job.getCronExpression()))
        {
            return error("修改任务'" + job.getJobName() + "'失败,Cron表达式不正确");
        }
        else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
        {
            return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用");
        }
        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS }))
        {
            return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用");
        }
        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
        {
            return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用");
        }
        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR))
        {
            return error("修改任务'" + job.getJobName() + "'失败,目标字符串存在违规");
        }
        else if (!ScheduleUtils.whiteList(job.getInvokeTarget()))
        {
            return error("修改任务'" + job.getJobName() + "'失败,目标字符串不在白名单内");
        }
        job.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(jobService.updateJob(job));
    }
    /**
     * å®šæ—¶ä»»åŠ¡çŠ¶æ€ä¿®æ”¹
     */
    @RequiresPermissions("monitor:job:changeStatus")
    @Log(title = "定时任务", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException
    {
        SysJob newJob = jobService.selectJobById(job.getJobId());
        newJob.setStatus(job.getStatus());
        return toAjax(jobService.changeStatus(newJob));
    }
    /**
     * å®šæ—¶ä»»åŠ¡ç«‹å³æ‰§è¡Œä¸€æ¬¡
     */
    @RequiresPermissions("monitor:job:changeStatus")
    @Log(title = "定时任务", businessType = BusinessType.UPDATE)
    @PutMapping("/run")
    public AjaxResult run(@RequestBody SysJob job) throws SchedulerException
    {
        boolean result = jobService.run(job);
        return result ? success() : error("任务不存在或已过期!");
    }
    /**
     * åˆ é™¤å®šæ—¶ä»»åŠ¡
     */
    @RequiresPermissions("monitor:job:remove")
    @Log(title = "定时任务", businessType = BusinessType.DELETE)
    @DeleteMapping("/{jobIds}")
    public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException
    {
        jobService.deleteJobByIds(jobIds);
        return success();
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/controller/SysJobLogController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
package com.se.job.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.se.job.domain.SysJobLog;
import com.se.job.service.ISysJobLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
/**
 * è°ƒåº¦æ—¥å¿—操作处理
 *
 * @author admin
 */
@RestController
@RequestMapping("/job/log")
public class SysJobLogController extends BaseController
{
    @Autowired
    private ISysJobLogService jobLogService;
    /**
     * æŸ¥è¯¢å®šæ—¶ä»»åŠ¡è°ƒåº¦æ—¥å¿—åˆ—è¡¨
     */
    @RequiresPermissions("monitor:job:list")
    @GetMapping("/list")
    public TableDataInfo list(SysJobLog sysJobLog)
    {
        startPage();
        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
        return getDataTable(list);
    }
    /**
     * å¯¼å‡ºå®šæ—¶ä»»åŠ¡è°ƒåº¦æ—¥å¿—åˆ—è¡¨
     */
    @RequiresPermissions("monitor:job:export")
    @Log(title = "任务调度日志", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysJobLog sysJobLog)
    {
        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
        ExcelUtil<SysJobLog> util = new ExcelUtil<SysJobLog>(SysJobLog.class);
        util.exportExcel(response, list, "调度日志");
    }
    /**
     * æ ¹æ®è°ƒåº¦ç¼–号获取详细信息
     */
    @RequiresPermissions("monitor:job:query")
    @GetMapping(value = "/{jobLogId}")
    public AjaxResult getInfo(@PathVariable Long jobLogId)
    {
        return success(jobLogService.selectJobLogById(jobLogId));
    }
    /**
     * åˆ é™¤å®šæ—¶ä»»åŠ¡è°ƒåº¦æ—¥å¿—
     */
    @RequiresPermissions("monitor:job:remove")
    @Log(title = "定时任务调度日志", businessType = BusinessType.DELETE)
    @DeleteMapping("/{jobLogIds}")
    public AjaxResult remove(@PathVariable Long[] jobLogIds)
    {
        return toAjax(jobLogService.deleteJobLogByIds(jobLogIds));
    }
    /**
     * æ¸…空定时任务调度日志
     */
    @RequiresPermissions("monitor:job:remove")
    @Log(title = "调度日志", businessType = BusinessType.CLEAN)
    @DeleteMapping("/clean")
    public AjaxResult clean()
    {
        jobLogService.cleanJobLog();
        return success();
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/domain/SysJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,171 @@
package com.se.job.domain;
import java.util.Date;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.se.common.core.annotation.Excel;
import com.se.common.core.annotation.Excel.ColumnType;
import com.se.common.core.constant.ScheduleConstants;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.web.domain.BaseEntity;
import com.se.job.util.CronUtils;
/**
 * å®šæ—¶ä»»åŠ¡è°ƒåº¦è¡¨ sys_job
 *
 * @author admin
 */
public class SysJob extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** ä»»åŠ¡ID */
    @Excel(name = "任务序号", cellType = ColumnType.NUMERIC)
    private Long jobId;
    /** ä»»åŠ¡åç§° */
    @Excel(name = "任务名称")
    private String jobName;
    /** ä»»åŠ¡ç»„å */
    @Excel(name = "任务组名")
    private String jobGroup;
    /** è°ƒç”¨ç›®æ ‡å­—符串 */
    @Excel(name = "调用目标字符串")
    private String invokeTarget;
    /** cron执行表达式 */
    @Excel(name = "执行表达式 ")
    private String cronExpression;
    /** cron计划策略 */
    @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行")
    private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT;
    /** æ˜¯å¦å¹¶å‘执行(0允许 1禁止) */
    @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止")
    private String concurrent;
    /** ä»»åŠ¡çŠ¶æ€ï¼ˆ0正常 1暂停) */
    @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停")
    private String status;
    public Long getJobId()
    {
        return jobId;
    }
    public void setJobId(Long jobId)
    {
        this.jobId = jobId;
    }
    @NotBlank(message = "任务名称不能为空")
    @Size(min = 0, max = 64, message = "任务名称不能超过64个字符")
    public String getJobName()
    {
        return jobName;
    }
    public void setJobName(String jobName)
    {
        this.jobName = jobName;
    }
    public String getJobGroup()
    {
        return jobGroup;
    }
    public void setJobGroup(String jobGroup)
    {
        this.jobGroup = jobGroup;
    }
    @NotBlank(message = "调用目标字符串不能为空")
    @Size(min = 0, max = 500, message = "调用目标字符串长度不能超过500个字符")
    public String getInvokeTarget()
    {
        return invokeTarget;
    }
    public void setInvokeTarget(String invokeTarget)
    {
        this.invokeTarget = invokeTarget;
    }
    @NotBlank(message = "Cron执行表达式不能为空")
    @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符")
    public String getCronExpression()
    {
        return cronExpression;
    }
    public void setCronExpression(String cronExpression)
    {
        this.cronExpression = cronExpression;
    }
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date getNextValidTime()
    {
        if (StringUtils.isNotEmpty(cronExpression))
        {
            return CronUtils.getNextExecution(cronExpression);
        }
        return null;
    }
    public String getMisfirePolicy()
    {
        return misfirePolicy;
    }
    public void setMisfirePolicy(String misfirePolicy)
    {
        this.misfirePolicy = misfirePolicy;
    }
    public String getConcurrent()
    {
        return concurrent;
    }
    public void setConcurrent(String concurrent)
    {
        this.concurrent = concurrent;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("jobId", getJobId())
            .append("jobName", getJobName())
            .append("jobGroup", getJobGroup())
            .append("cronExpression", getCronExpression())
            .append("nextValidTime", getNextValidTime())
            .append("misfirePolicy", getMisfirePolicy())
            .append("concurrent", getConcurrent())
            .append("status", getStatus())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/domain/SysJobLog.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,155 @@
package com.se.job.domain;
import java.util.Date;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.se.common.core.annotation.Excel;
import com.se.common.core.web.domain.BaseEntity;
/**
 * å®šæ—¶ä»»åŠ¡è°ƒåº¦æ—¥å¿—è¡¨ sys_job_log
 *
 * @author admin
 */
public class SysJobLog extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** ID */
    @Excel(name = "日志序号")
    private Long jobLogId;
    /** ä»»åŠ¡åç§° */
    @Excel(name = "任务名称")
    private String jobName;
    /** ä»»åŠ¡ç»„å */
    @Excel(name = "任务组名")
    private String jobGroup;
    /** è°ƒç”¨ç›®æ ‡å­—符串 */
    @Excel(name = "调用目标字符串")
    private String invokeTarget;
    /** æ—¥å¿—信息 */
    @Excel(name = "日志信息")
    private String jobMessage;
    /** æ‰§è¡ŒçŠ¶æ€ï¼ˆ0正常 1失败) */
    @Excel(name = "执行状态", readConverterExp = "0=正常,1=失败")
    private String status;
    /** å¼‚常信息 */
    @Excel(name = "异常信息")
    private String exceptionInfo;
    /** å¼€å§‹æ—¶é—´ */
    private Date startTime;
    /** åœæ­¢æ—¶é—´ */
    private Date stopTime;
    public Long getJobLogId()
    {
        return jobLogId;
    }
    public void setJobLogId(Long jobLogId)
    {
        this.jobLogId = jobLogId;
    }
    public String getJobName()
    {
        return jobName;
    }
    public void setJobName(String jobName)
    {
        this.jobName = jobName;
    }
    public String getJobGroup()
    {
        return jobGroup;
    }
    public void setJobGroup(String jobGroup)
    {
        this.jobGroup = jobGroup;
    }
    public String getInvokeTarget()
    {
        return invokeTarget;
    }
    public void setInvokeTarget(String invokeTarget)
    {
        this.invokeTarget = invokeTarget;
    }
    public String getJobMessage()
    {
        return jobMessage;
    }
    public void setJobMessage(String jobMessage)
    {
        this.jobMessage = jobMessage;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    public String getExceptionInfo()
    {
        return exceptionInfo;
    }
    public void setExceptionInfo(String exceptionInfo)
    {
        this.exceptionInfo = exceptionInfo;
    }
    public Date getStartTime()
    {
        return startTime;
    }
    public void setStartTime(Date startTime)
    {
        this.startTime = startTime;
    }
    public Date getStopTime()
    {
        return stopTime;
    }
    public void setStopTime(Date stopTime)
    {
        this.stopTime = stopTime;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("jobLogId", getJobLogId())
            .append("jobName", getJobName())
            .append("jobGroup", getJobGroup())
            .append("jobMessage", getJobMessage())
            .append("status", getStatus())
            .append("exceptionInfo", getExceptionInfo())
            .append("startTime", getStartTime())
            .append("stopTime", getStopTime())
            .toString();
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/mapper/SysJobLogMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.se.job.mapper;
import java.util.List;
import com.se.job.domain.SysJobLog;
/**
 * è°ƒåº¦ä»»åŠ¡æ—¥å¿—ä¿¡æ¯ æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysJobLogMapper
{
    /**
     * èŽ·å–quartz调度器日志的计划任务
     *
     * @param jobLog è°ƒåº¦æ—¥å¿—信息
     * @return è°ƒåº¦ä»»åŠ¡æ—¥å¿—é›†åˆ
     */
    public List<SysJobLog> selectJobLogList(SysJobLog jobLog);
    /**
     * æŸ¥è¯¢æ‰€æœ‰è°ƒåº¦ä»»åŠ¡æ—¥å¿—
     *
     * @return è°ƒåº¦ä»»åŠ¡æ—¥å¿—åˆ—è¡¨
     */
    public List<SysJobLog> selectJobLogAll();
    /**
     * é€šè¿‡è°ƒåº¦ä»»åŠ¡æ—¥å¿—ID查询调度信息
     *
     * @param jobLogId è°ƒåº¦ä»»åŠ¡æ—¥å¿—ID
     * @return è°ƒåº¦ä»»åŠ¡æ—¥å¿—å¯¹è±¡ä¿¡æ¯
     */
    public SysJobLog selectJobLogById(Long jobLogId);
    /**
     * æ–°å¢žä»»åŠ¡æ—¥å¿—
     *
     * @param jobLog è°ƒåº¦æ—¥å¿—信息
     * @return ç»“æžœ
     */
    public int insertJobLog(SysJobLog jobLog);
    /**
     * æ‰¹é‡åˆ é™¤è°ƒåº¦æ—¥å¿—信息
     *
     * @param logIds éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    public int deleteJobLogByIds(Long[] logIds);
    /**
     * åˆ é™¤ä»»åŠ¡æ—¥å¿—
     *
     * @param jobId è°ƒåº¦æ—¥å¿—ID
     * @return ç»“æžœ
     */
    public int deleteJobLogById(Long jobId);
    /**
     * æ¸…空任务日志
     */
    public void cleanJobLog();
}
ruoyi-modules/se-job/src/main/java/com/se/job/mapper/SysJobMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.se.job.mapper;
import java.util.List;
import com.se.job.domain.SysJob;
/**
 * è°ƒåº¦ä»»åŠ¡ä¿¡æ¯ æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysJobMapper
{
    /**
     * æŸ¥è¯¢è°ƒåº¦ä»»åŠ¡æ—¥å¿—é›†åˆ
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     * @return æ“ä½œæ—¥å¿—集合
     */
    public List<SysJob> selectJobList(SysJob job);
    /**
     * æŸ¥è¯¢æ‰€æœ‰è°ƒåº¦ä»»åŠ¡
     *
     * @return è°ƒåº¦ä»»åŠ¡åˆ—è¡¨
     */
    public List<SysJob> selectJobAll();
    /**
     * é€šè¿‡è°ƒåº¦ID查询调度任务信息
     *
     * @param jobId è°ƒåº¦ID
     * @return è§’色对象信息
     */
    public SysJob selectJobById(Long jobId);
    /**
     * é€šè¿‡è°ƒåº¦ID删除调度任务信息
     *
     * @param jobId è°ƒåº¦ID
     * @return ç»“æžœ
     */
    public int deleteJobById(Long jobId);
    /**
     * æ‰¹é‡åˆ é™¤è°ƒåº¦ä»»åŠ¡ä¿¡æ¯
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    public int deleteJobByIds(Long[] ids);
    /**
     * ä¿®æ”¹è°ƒåº¦ä»»åŠ¡ä¿¡æ¯
     *
     * @param job è°ƒåº¦ä»»åŠ¡ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateJob(SysJob job);
    /**
     * æ–°å¢žè°ƒåº¦ä»»åŠ¡ä¿¡æ¯
     *
     * @param job è°ƒåº¦ä»»åŠ¡ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertJob(SysJob job);
}
ruoyi-modules/se-job/src/main/java/com/se/job/service/ISysJobLogService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.se.job.service;
import java.util.List;
import com.se.job.domain.SysJobLog;
/**
 * å®šæ—¶ä»»åŠ¡è°ƒåº¦æ—¥å¿—ä¿¡æ¯ä¿¡æ¯ æœåС层
 *
 * @author admin
 */
public interface ISysJobLogService
{
    /**
     * èŽ·å–quartz调度器日志的计划任务
     *
     * @param jobLog è°ƒåº¦æ—¥å¿—信息
     * @return è°ƒåº¦ä»»åŠ¡æ—¥å¿—é›†åˆ
     */
    public List<SysJobLog> selectJobLogList(SysJobLog jobLog);
    /**
     * é€šè¿‡è°ƒåº¦ä»»åŠ¡æ—¥å¿—ID查询调度信息
     *
     * @param jobLogId è°ƒåº¦ä»»åŠ¡æ—¥å¿—ID
     * @return è°ƒåº¦ä»»åŠ¡æ—¥å¿—å¯¹è±¡ä¿¡æ¯
     */
    public SysJobLog selectJobLogById(Long jobLogId);
    /**
     * æ–°å¢žä»»åŠ¡æ—¥å¿—
     *
     * @param jobLog è°ƒåº¦æ—¥å¿—信息
     */
    public void addJobLog(SysJobLog jobLog);
    /**
     * æ‰¹é‡åˆ é™¤è°ƒåº¦æ—¥å¿—信息
     *
     * @param logIds éœ€è¦åˆ é™¤çš„æ—¥å¿—ID
     * @return ç»“æžœ
     */
    public int deleteJobLogByIds(Long[] logIds);
    /**
     * åˆ é™¤ä»»åŠ¡æ—¥å¿—
     *
     * @param jobId è°ƒåº¦æ—¥å¿—ID
     * @return ç»“æžœ
     */
    public int deleteJobLogById(Long jobId);
    /**
     * æ¸…空任务日志
     */
    public void cleanJobLog();
}
ruoyi-modules/se-job/src/main/java/com/se/job/service/ISysJobService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
package com.se.job.service;
import java.util.List;
import org.quartz.SchedulerException;
import com.se.common.core.exception.job.TaskException;
import com.se.job.domain.SysJob;
/**
 * å®šæ—¶ä»»åŠ¡è°ƒåº¦ä¿¡æ¯ä¿¡æ¯ æœåС层
 *
 * @author admin
 */
public interface ISysJobService
{
    /**
     * èŽ·å–quartz调度器的计划任务
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     * @return è°ƒåº¦ä»»åŠ¡é›†åˆ
     */
    public List<SysJob> selectJobList(SysJob job);
    /**
     * é€šè¿‡è°ƒåº¦ä»»åŠ¡ID查询调度信息
     *
     * @param jobId è°ƒåº¦ä»»åŠ¡ID
     * @return è°ƒåº¦ä»»åŠ¡å¯¹è±¡ä¿¡æ¯
     */
    public SysJob selectJobById(Long jobId);
    /**
     * æš‚停任务
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int pauseJob(SysJob job) throws SchedulerException;
    /**
     * æ¢å¤ä»»åŠ¡
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int resumeJob(SysJob job) throws SchedulerException;
    /**
     * åˆ é™¤ä»»åŠ¡åŽï¼Œæ‰€å¯¹åº”çš„trigger也将被删除
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int deleteJob(SysJob job) throws SchedulerException;
    /**
     * æ‰¹é‡åˆ é™¤è°ƒåº¦ä¿¡æ¯
     *
     * @param jobIds éœ€è¦åˆ é™¤çš„任务ID
     * @return ç»“æžœ
     */
    public void deleteJobByIds(Long[] jobIds) throws SchedulerException;
    /**
     * ä»»åŠ¡è°ƒåº¦çŠ¶æ€ä¿®æ”¹
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int changeStatus(SysJob job) throws SchedulerException;
    /**
     * ç«‹å³è¿è¡Œä»»åŠ¡
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     * @return ç»“æžœ
     */
    public boolean run(SysJob job) throws SchedulerException;
    /**
     * æ–°å¢žä»»åŠ¡
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertJob(SysJob job) throws SchedulerException, TaskException;
    /**
     * æ›´æ–°ä»»åŠ¡
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateJob(SysJob job) throws SchedulerException, TaskException;
    /**
     * æ ¡éªŒcron表达式是否有效
     *
     * @param cronExpression è¡¨è¾¾å¼
     * @return ç»“æžœ
     */
    public boolean checkCronExpressionIsValid(String cronExpression);
}
ruoyi-modules/se-job/src/main/java/com/se/job/service/SysJobLogServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.se.job.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.se.job.domain.SysJobLog;
import com.se.job.mapper.SysJobLogMapper;
/**
 * å®šæ—¶ä»»åŠ¡è°ƒåº¦æ—¥å¿—ä¿¡æ¯ æœåС层
 *
 * @author admin
 */
@Service
public class SysJobLogServiceImpl implements ISysJobLogService
{
    @Autowired
    private SysJobLogMapper jobLogMapper;
    /**
     * èŽ·å–quartz调度器日志的计划任务
     *
     * @param jobLog è°ƒåº¦æ—¥å¿—信息
     * @return è°ƒåº¦ä»»åŠ¡æ—¥å¿—é›†åˆ
     */
    @Override
    public List<SysJobLog> selectJobLogList(SysJobLog jobLog)
    {
        return jobLogMapper.selectJobLogList(jobLog);
    }
    /**
     * é€šè¿‡è°ƒåº¦ä»»åŠ¡æ—¥å¿—ID查询调度信息
     *
     * @param jobLogId è°ƒåº¦ä»»åŠ¡æ—¥å¿—ID
     * @return è°ƒåº¦ä»»åŠ¡æ—¥å¿—å¯¹è±¡ä¿¡æ¯
     */
    @Override
    public SysJobLog selectJobLogById(Long jobLogId)
    {
        return jobLogMapper.selectJobLogById(jobLogId);
    }
    /**
     * æ–°å¢žä»»åŠ¡æ—¥å¿—
     *
     * @param jobLog è°ƒåº¦æ—¥å¿—信息
     */
    @Override
    public void addJobLog(SysJobLog jobLog)
    {
        jobLogMapper.insertJobLog(jobLog);
    }
    /**
     * æ‰¹é‡åˆ é™¤è°ƒåº¦æ—¥å¿—信息
     *
     * @param logIds éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    @Override
    public int deleteJobLogByIds(Long[] logIds)
    {
        return jobLogMapper.deleteJobLogByIds(logIds);
    }
    /**
     * åˆ é™¤ä»»åŠ¡æ—¥å¿—
     *
     * @param jobId è°ƒåº¦æ—¥å¿—ID
     */
    @Override
    public int deleteJobLogById(Long jobId)
    {
        return jobLogMapper.deleteJobLogById(jobId);
    }
    /**
     * æ¸…空任务日志
     */
    @Override
    public void cleanJobLog()
    {
        jobLogMapper.cleanJobLog();
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/service/SysJobServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,260 @@
package com.se.job.service;
import java.util.List;
import javax.annotation.PostConstruct;
import org.quartz.JobDataMap;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.se.common.core.constant.ScheduleConstants;
import com.se.common.core.exception.job.TaskException;
import com.se.job.domain.SysJob;
import com.se.job.mapper.SysJobMapper;
import com.se.job.util.CronUtils;
import com.se.job.util.ScheduleUtils;
/**
 * å®šæ—¶ä»»åŠ¡è°ƒåº¦ä¿¡æ¯ æœåС层
 *
 * @author admin
 */
@Service
public class SysJobServiceImpl implements ISysJobService
{
    @Autowired
    private Scheduler scheduler;
    @Autowired
    private SysJobMapper jobMapper;
    /**
     * é¡¹ç›®å¯åŠ¨æ—¶ï¼Œåˆå§‹åŒ–å®šæ—¶å™¨ ä¸»è¦æ˜¯é˜²æ­¢æ‰‹åŠ¨ä¿®æ”¹æ•°æ®åº“å¯¼è‡´æœªåŒæ­¥åˆ°å®šæ—¶ä»»åŠ¡å¤„ç†ï¼ˆæ³¨ï¼šä¸èƒ½æ‰‹åŠ¨ä¿®æ”¹æ•°æ®åº“ID和任务组名,否则会导致脏数据)
     */
    @PostConstruct
    public void init() throws SchedulerException, TaskException
    {
        scheduler.clear();
        List<SysJob> jobList = jobMapper.selectJobAll();
        for (SysJob job : jobList)
        {
            ScheduleUtils.createScheduleJob(scheduler, job);
        }
    }
    /**
     * èŽ·å–quartz调度器的计划任务列表
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     * @return
     */
    @Override
    public List<SysJob> selectJobList(SysJob job)
    {
        return jobMapper.selectJobList(job);
    }
    /**
     * é€šè¿‡è°ƒåº¦ä»»åŠ¡ID查询调度信息
     *
     * @param jobId è°ƒåº¦ä»»åŠ¡ID
     * @return è°ƒåº¦ä»»åŠ¡å¯¹è±¡ä¿¡æ¯
     */
    @Override
    public SysJob selectJobById(Long jobId)
    {
        return jobMapper.selectJobById(jobId);
    }
    /**
     * æš‚停任务
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int pauseJob(SysJob job) throws SchedulerException
    {
        Long jobId = job.getJobId();
        String jobGroup = job.getJobGroup();
        job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
        int rows = jobMapper.updateJob(job);
        if (rows > 0)
        {
            scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
        }
        return rows;
    }
    /**
     * æ¢å¤ä»»åŠ¡
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int resumeJob(SysJob job) throws SchedulerException
    {
        Long jobId = job.getJobId();
        String jobGroup = job.getJobGroup();
        job.setStatus(ScheduleConstants.Status.NORMAL.getValue());
        int rows = jobMapper.updateJob(job);
        if (rows > 0)
        {
            scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup));
        }
        return rows;
    }
    /**
     * åˆ é™¤ä»»åŠ¡åŽï¼Œæ‰€å¯¹åº”çš„trigger也将被删除
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteJob(SysJob job) throws SchedulerException
    {
        Long jobId = job.getJobId();
        String jobGroup = job.getJobGroup();
        int rows = jobMapper.deleteJobById(jobId);
        if (rows > 0)
        {
            scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup));
        }
        return rows;
    }
    /**
     * æ‰¹é‡åˆ é™¤è°ƒåº¦ä¿¡æ¯
     *
     * @param jobIds éœ€è¦åˆ é™¤çš„任务ID
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteJobByIds(Long[] jobIds) throws SchedulerException
    {
        for (Long jobId : jobIds)
        {
            SysJob job = jobMapper.selectJobById(jobId);
            deleteJob(job);
        }
    }
    /**
     * ä»»åŠ¡è°ƒåº¦çŠ¶æ€ä¿®æ”¹
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int changeStatus(SysJob job) throws SchedulerException
    {
        int rows = 0;
        String status = job.getStatus();
        if (ScheduleConstants.Status.NORMAL.getValue().equals(status))
        {
            rows = resumeJob(job);
        }
        else if (ScheduleConstants.Status.PAUSE.getValue().equals(status))
        {
            rows = pauseJob(job);
        }
        return rows;
    }
    /**
     * ç«‹å³è¿è¡Œä»»åŠ¡
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean run(SysJob job) throws SchedulerException
    {
        boolean result = false;
        Long jobId = job.getJobId();
        String jobGroup = job.getJobGroup();
        SysJob properties = selectJobById(job.getJobId());
        // å‚æ•°
        JobDataMap dataMap = new JobDataMap();
        dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties);
        JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup);
        if (scheduler.checkExists(jobKey))
        {
            result = true;
            scheduler.triggerJob(jobKey, dataMap);
        }
        return result;
    }
    /**
     * æ–°å¢žä»»åŠ¡
     *
     * @param job è°ƒåº¦ä¿¡æ¯ è°ƒåº¦ä¿¡æ¯
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertJob(SysJob job) throws SchedulerException, TaskException
    {
        job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
        int rows = jobMapper.insertJob(job);
        if (rows > 0)
        {
            ScheduleUtils.createScheduleJob(scheduler, job);
        }
        return rows;
    }
    /**
     * æ›´æ–°ä»»åŠ¡çš„æ—¶é—´è¡¨è¾¾å¼
     *
     * @param job è°ƒåº¦ä¿¡æ¯
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateJob(SysJob job) throws SchedulerException, TaskException
    {
        SysJob properties = selectJobById(job.getJobId());
        int rows = jobMapper.updateJob(job);
        if (rows > 0)
        {
            updateSchedulerJob(job, properties.getJobGroup());
        }
        return rows;
    }
    /**
     * æ›´æ–°ä»»åŠ¡
     *
     * @param job ä»»åŠ¡å¯¹è±¡
     * @param jobGroup ä»»åŠ¡ç»„å
     */
    public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException
    {
        Long jobId = job.getJobId();
        // åˆ¤æ–­æ˜¯å¦å­˜åœ¨
        JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup);
        if (scheduler.checkExists(jobKey))
        {
            // é˜²æ­¢åˆ›å»ºæ—¶å­˜åœ¨æ•°æ®é—®é¢˜ å…ˆç§»é™¤ï¼Œç„¶åŽåœ¨æ‰§è¡Œåˆ›å»ºæ“ä½œ
            scheduler.deleteJob(jobKey);
        }
        ScheduleUtils.createScheduleJob(scheduler, job);
    }
    /**
     * æ ¡éªŒcron表达式是否有效
     *
     * @param cronExpression è¡¨è¾¾å¼
     * @return ç»“æžœ
     */
    @Override
    public boolean checkCronExpressionIsValid(String cronExpression)
    {
        return CronUtils.isValid(cronExpression);
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/task/RyTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.se.job.task;
import org.springframework.stereotype.Component;
import com.se.common.core.utils.StringUtils;
/**
 * å®šæ—¶ä»»åŠ¡è°ƒåº¦æµ‹è¯•
 *
 * @author admin
 */
@Component("ryTask")
public class RyTask
{
    public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i)
    {
        System.out.println(StringUtils.format("执行多参方法: å­—符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i));
    }
    public void ryParams(String params)
    {
        System.out.println("执行有参方法:" + params);
    }
    public void ryNoParams()
    {
        System.out.println("执行无参方法");
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/util/AbstractQuartzJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package com.se.job.util;
import java.util.Date;
import com.se.job.domain.SysJob;
import com.se.job.domain.SysJobLog;
import com.se.job.service.ISysJobLogService;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.se.common.core.constant.ScheduleConstants;
import com.se.common.core.utils.ExceptionUtil;
import com.se.common.core.utils.SpringUtils;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.bean.BeanUtils;
/**
 * æŠ½è±¡quartz调用
 *
 * @author admin
 */
public abstract class AbstractQuartzJob implements Job
{
    private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class);
    /**
     * çº¿ç¨‹æœ¬åœ°å˜é‡
     */
    private static ThreadLocal<Date> threadLocal = new ThreadLocal<>();
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException
    {
        SysJob sysJob = new SysJob();
        BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES));
        try
        {
            before(context, sysJob);
            if (sysJob != null)
            {
                doExecute(context, sysJob);
            }
            after(context, sysJob, null);
        }
        catch (Exception e)
        {
            log.error("任务执行异常  - ï¼š", e);
            after(context, sysJob, e);
        }
    }
    /**
     * æ‰§è¡Œå‰
     *
     * @param context å·¥ä½œæ‰§è¡Œä¸Šä¸‹æ–‡å¯¹è±¡
     * @param sysJob ç³»ç»Ÿè®¡åˆ’任务
     */
    protected void before(JobExecutionContext context, SysJob sysJob)
    {
        threadLocal.set(new Date());
    }
    /**
     * æ‰§è¡ŒåŽ
     *
     * @param context å·¥ä½œæ‰§è¡Œä¸Šä¸‹æ–‡å¯¹è±¡
     * @param sysJob ç³»ç»Ÿè®¡åˆ’任务
     */
    protected void after(JobExecutionContext context, SysJob sysJob, Exception e)
    {
        Date startTime = threadLocal.get();
        threadLocal.remove();
        final SysJobLog sysJobLog = new SysJobLog();
        sysJobLog.setJobName(sysJob.getJobName());
        sysJobLog.setJobGroup(sysJob.getJobGroup());
        sysJobLog.setInvokeTarget(sysJob.getInvokeTarget());
        sysJobLog.setStartTime(startTime);
        sysJobLog.setStopTime(new Date());
        long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime();
        sysJobLog.setJobMessage(sysJobLog.getJobName() + " æ€»å…±è€—时:" + runMs + "毫秒");
        if (e != null)
        {
            sysJobLog.setStatus("1");
            String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000);
            sysJobLog.setExceptionInfo(errorMsg);
        }
        else
        {
            sysJobLog.setStatus("0");
        }
        // å†™å…¥æ•°æ®åº“当中
        SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog);
    }
    /**
     * æ‰§è¡Œæ–¹æ³•,由子类重载
     *
     * @param context å·¥ä½œæ‰§è¡Œä¸Šä¸‹æ–‡å¯¹è±¡
     * @param sysJob ç³»ç»Ÿè®¡åˆ’任务
     * @throws Exception æ‰§è¡Œè¿‡ç¨‹ä¸­çš„异常
     */
    protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception;
}
ruoyi-modules/se-job/src/main/java/com/se/job/util/CronUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.se.job.util;
import java.text.ParseException;
import java.util.Date;
import org.quartz.CronExpression;
/**
 * cron表达式工具类
 *
 * @author admin
 *
 */
public class CronUtils
{
    /**
     * è¿”回一个布尔值代表一个给定的Cron表达式的有效性
     *
     * @param cronExpression Cron表达式
     * @return boolean è¡¨è¾¾å¼æ˜¯å¦æœ‰æ•ˆ
     */
    public static boolean isValid(String cronExpression)
    {
        return CronExpression.isValidExpression(cronExpression);
    }
    /**
     * è¿”回一个字符串值,表示该消息无效Cron表达式给出有效性
     *
     * @param cronExpression Cron表达式
     * @return String æ— æ•ˆæ—¶è¿”回表达式错误描述,如果有效返回null
     */
    public static String getInvalidMessage(String cronExpression)
    {
        try
        {
            new CronExpression(cronExpression);
            return null;
        }
        catch (ParseException pe)
        {
            return pe.getMessage();
        }
    }
    /**
     * è¿”回下一个执行时间根据给定的Cron表达式
     *
     * @param cronExpression Cron表达式
     * @return Date ä¸‹æ¬¡Cron表达式执行时间
     */
    public static Date getNextExecution(String cronExpression)
    {
        try
        {
            CronExpression cron = new CronExpression(cronExpression);
            return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis()));
        }
        catch (ParseException e)
        {
            throw new IllegalArgumentException(e.getMessage());
        }
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/util/JobInvokeUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,182 @@
package com.se.job.util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
import com.se.common.core.utils.SpringUtils;
import com.se.common.core.utils.StringUtils;
import com.se.job.domain.SysJob;
/**
 * ä»»åŠ¡æ‰§è¡Œå·¥å…·
 *
 * @author admin
 */
public class JobInvokeUtil
{
    /**
     * æ‰§è¡Œæ–¹æ³•
     *
     * @param sysJob ç³»ç»Ÿä»»åŠ¡
     */
    public static void invokeMethod(SysJob sysJob) throws Exception
    {
        String invokeTarget = sysJob.getInvokeTarget();
        String beanName = getBeanName(invokeTarget);
        String methodName = getMethodName(invokeTarget);
        List<Object[]> methodParams = getMethodParams(invokeTarget);
        if (!isValidClassName(beanName))
        {
            Object bean = SpringUtils.getBean(beanName);
            invokeMethod(bean, methodName, methodParams);
        }
        else
        {
            Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance();
            invokeMethod(bean, methodName, methodParams);
        }
    }
    /**
     * è°ƒç”¨ä»»åŠ¡æ–¹æ³•
     *
     * @param bean ç›®æ ‡å¯¹è±¡
     * @param methodName æ–¹æ³•名称
     * @param methodParams æ–¹æ³•参数
     */
    private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
            throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
            InvocationTargetException
    {
        if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0)
        {
            Method method = bean.getClass().getMethod(methodName, getMethodParamsType(methodParams));
            method.invoke(bean, getMethodParamsValue(methodParams));
        }
        else
        {
            Method method = bean.getClass().getMethod(methodName);
            method.invoke(bean);
        }
    }
    /**
     * æ ¡éªŒæ˜¯å¦ä¸ºä¸ºclass包名
     *
     * @param invokeTarget åç§°
     * @return true是 false否
     */
    public static boolean isValidClassName(String invokeTarget)
    {
        return StringUtils.countMatches(invokeTarget, ".") > 1;
    }
    /**
     * èŽ·å–bean名称
     *
     * @param invokeTarget ç›®æ ‡å­—符串
     * @return bean名称
     */
    public static String getBeanName(String invokeTarget)
    {
        String beanName = StringUtils.substringBefore(invokeTarget, "(");
        return StringUtils.substringBeforeLast(beanName, ".");
    }
    /**
     * èŽ·å–bean方法
     *
     * @param invokeTarget ç›®æ ‡å­—符串
     * @return method方法
     */
    public static String getMethodName(String invokeTarget)
    {
        String methodName = StringUtils.substringBefore(invokeTarget, "(");
        return StringUtils.substringAfterLast(methodName, ".");
    }
    /**
     * èŽ·å–method方法参数相关列表
     *
     * @param invokeTarget ç›®æ ‡å­—符串
     * @return method方法相关参数列表
     */
    public static List<Object[]> getMethodParams(String invokeTarget)
    {
        String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
        if (StringUtils.isEmpty(methodStr))
        {
            return null;
        }
        String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)");
        List<Object[]> classs = new LinkedList<>();
        for (int i = 0; i < methodParams.length; i++)
        {
            String str = StringUtils.trimToEmpty(methodParams[i]);
            // String字符串类型,以'或"开头
            if (StringUtils.startsWithAny(str, "'", "\""))
            {
                classs.add(new Object[] { StringUtils.substring(str, 1, str.length() - 1), String.class });
            }
            // boolean布尔类型,等于true或者false
            else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str))
            {
                classs.add(new Object[] { Boolean.valueOf(str), Boolean.class });
            }
            // long长整形,以L结尾
            else if (StringUtils.endsWith(str, "L"))
            {
                classs.add(new Object[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class });
            }
            // double浮点类型,以D结尾
            else if (StringUtils.endsWith(str, "D"))
            {
                classs.add(new Object[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class });
            }
            // å…¶ä»–类型归类为整形
            else
            {
                classs.add(new Object[] { Integer.valueOf(str), Integer.class });
            }
        }
        return classs;
    }
    /**
     * èŽ·å–å‚æ•°ç±»åž‹
     *
     * @param methodParams å‚数相关列表
     * @return å‚数类型列表
     */
    public static Class<?>[] getMethodParamsType(List<Object[]> methodParams)
    {
        Class<?>[] classs = new Class<?>[methodParams.size()];
        int index = 0;
        for (Object[] os : methodParams)
        {
            classs[index] = (Class<?>) os[1];
            index++;
        }
        return classs;
    }
    /**
     * èŽ·å–å‚æ•°å€¼
     *
     * @param methodParams å‚数相关列表
     * @return å‚数值列表
     */
    public static Object[] getMethodParamsValue(List<Object[]> methodParams)
    {
        Object[] classs = new Object[methodParams.size()];
        int index = 0;
        for (Object[] os : methodParams)
        {
            classs[index] = (Object) os[0];
            index++;
        }
        return classs;
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/util/QuartzDisallowConcurrentExecution.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.se.job.util;
import com.se.job.domain.SysJob;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
/**
 * å®šæ—¶ä»»åŠ¡å¤„ç†ï¼ˆç¦æ­¢å¹¶å‘æ‰§è¡Œï¼‰
 *
 * @author admin
 *
 */
@DisallowConcurrentExecution
public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob
{
    @Override
    protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception
    {
        JobInvokeUtil.invokeMethod(sysJob);
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/util/QuartzJobExecution.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.se.job.util;
import com.se.job.domain.SysJob;
import org.quartz.JobExecutionContext;
/**
 * å®šæ—¶ä»»åŠ¡å¤„ç†ï¼ˆå…è®¸å¹¶å‘æ‰§è¡Œï¼‰
 *
 * @author admin
 *
 */
public class QuartzJobExecution extends AbstractQuartzJob
{
    @Override
    protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception
    {
        JobInvokeUtil.invokeMethod(sysJob);
    }
}
ruoyi-modules/se-job/src/main/java/com/se/job/util/ScheduleUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,141 @@
package com.se.job.util;
import com.se.job.domain.SysJob;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import com.se.common.core.constant.Constants;
import com.se.common.core.constant.ScheduleConstants;
import com.se.common.core.exception.job.TaskException;
import com.se.common.core.exception.job.TaskException.Code;
import com.se.common.core.utils.SpringUtils;
import com.se.common.core.utils.StringUtils;
/**
 * å®šæ—¶ä»»åŠ¡å·¥å…·ç±»
 *
 * @author admin
 *
 */
public class ScheduleUtils
{
    /**
     * å¾—到quartz任务类
     *
     * @param sysJob æ‰§è¡Œè®¡åˆ’
     * @return å…·ä½“执行任务类
     */
    private static Class<? extends Job> getQuartzJobClass(SysJob sysJob)
    {
        boolean isConcurrent = "0".equals(sysJob.getConcurrent());
        return isConcurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class;
    }
    /**
     * æž„建任务触发对象
     */
    public static TriggerKey getTriggerKey(Long jobId, String jobGroup)
    {
        return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup);
    }
    /**
     * æž„建任务键对象
     */
    public static JobKey getJobKey(Long jobId, String jobGroup)
    {
        return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup);
    }
    /**
     * åˆ›å»ºå®šæ—¶ä»»åŠ¡
     */
    public static void createScheduleJob(Scheduler scheduler, SysJob job) throws SchedulerException, TaskException
    {
        Class<? extends Job> jobClass = getQuartzJobClass(job);
        // æž„建job信息
        Long jobId = job.getJobId();
        String jobGroup = job.getJobGroup();
        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build();
        // è¡¨è¾¾å¼è°ƒåº¦æž„建器
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
        cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder);
        // æŒ‰æ–°çš„cronExpression表达式构建一个新的trigger
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup))
                .withSchedule(cronScheduleBuilder).build();
        // æ”¾å…¥å‚数,运行时的方法可以获取
        jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job);
        // åˆ¤æ–­æ˜¯å¦å­˜åœ¨
        if (scheduler.checkExists(getJobKey(jobId, jobGroup)))
        {
            // é˜²æ­¢åˆ›å»ºæ—¶å­˜åœ¨æ•°æ®é—®é¢˜ å…ˆç§»é™¤ï¼Œç„¶åŽåœ¨æ‰§è¡Œåˆ›å»ºæ“ä½œ
            scheduler.deleteJob(getJobKey(jobId, jobGroup));
        }
        // åˆ¤æ–­ä»»åŠ¡æ˜¯å¦è¿‡æœŸ
        if (StringUtils.isNotNull(CronUtils.getNextExecution(job.getCronExpression())))
        {
            // æ‰§è¡Œè°ƒåº¦ä»»åŠ¡
            scheduler.scheduleJob(jobDetail, trigger);
        }
        // æš‚停任务
        if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue()))
        {
            scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
        }
    }
    /**
     * è®¾ç½®å®šæ—¶ä»»åŠ¡ç­–ç•¥
     */
    public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb)
            throws TaskException
    {
        switch (job.getMisfirePolicy())
        {
            case ScheduleConstants.MISFIRE_DEFAULT:
                return cb;
            case ScheduleConstants.MISFIRE_IGNORE_MISFIRES:
                return cb.withMisfireHandlingInstructionIgnoreMisfires();
            case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED:
                return cb.withMisfireHandlingInstructionFireAndProceed();
            case ScheduleConstants.MISFIRE_DO_NOTHING:
                return cb.withMisfireHandlingInstructionDoNothing();
            default:
                throw new TaskException("The task misfire policy '" + job.getMisfirePolicy()
                        + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR);
        }
    }
    /**
     * æ£€æŸ¥åŒ…名是否为白名单配置
     *
     * @param invokeTarget ç›®æ ‡å­—符串
     * @return ç»“æžœ
     */
    public static boolean whiteList(String invokeTarget)
    {
        String packageName = StringUtils.substringBefore(invokeTarget, "(");
        int count = StringUtils.countMatches(packageName, ".");
        if (count > 1)
        {
            return StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR);
        }
        Object obj = SpringUtils.getBean(StringUtils.split(invokeTarget, ".")[0]);
        String beanPackageName = obj.getClass().getPackage().getName();
        return StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_WHITELIST_STR)
                && !StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_ERROR_STR);
    }
}
ruoyi-modules/se-job/src/main/resources/banner.txt
ruoyi-modules/se-job/src/main/resources/bootstrap.yml
ruoyi-modules/se-job/src/main/resources/logback.xml
ruoyi-modules/se-job/src/main/resources/mapper/job/SysJobLogMapper.xml
ruoyi-modules/se-job/src/main/resources/mapper/job/SysJobMapper.xml
ruoyi-modules/se-system/pom.xml
ruoyi-modules/se-system/src/main/java/com/se/system/RuoYiSystemApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.se.system;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.se.common.security.annotation.EnableCustomConfig;
import com.se.common.security.annotation.EnableRyFeignClients;
import com.se.common.swagger.annotation.EnableCustomSwagger2;
/**
 * ç³»ç»Ÿæ¨¡å—
 *
 * @author admin
 */
@EnableCustomConfig
@EnableCustomSwagger2
@EnableRyFeignClients
@SpringBootApplication
public class RuoYiSystemApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(RuoYiSystemApplication.class, args);
        System.out.println("    ç³»ç»Ÿæ¨¡å—启动成功    ");
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysConfigController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,134 @@
package com.se.system.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.se.system.domain.SysConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.service.ISysConfigService;
/**
 * å‚数配置 ä¿¡æ¯æ“ä½œå¤„理
 *
 * @author admin
 */
@RestController
@RequestMapping("/config")
public class SysConfigController extends BaseController
{
    @Autowired
    private ISysConfigService configService;
    /**
     * èŽ·å–å‚æ•°é…ç½®åˆ—è¡¨
     */
    @RequiresPermissions("system:config:list")
    @GetMapping("/list")
    public TableDataInfo list(SysConfig config)
    {
        startPage();
        List<SysConfig> list = configService.selectConfigList(config);
        return getDataTable(list);
    }
    @Log(title = "参数管理", businessType = BusinessType.EXPORT)
    @RequiresPermissions("system:config:export")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysConfig config)
    {
        List<SysConfig> list = configService.selectConfigList(config);
        ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
        util.exportExcel(response, list, "参数数据");
    }
    /**
     * æ ¹æ®å‚数编号获取详细信息
     */
    @GetMapping(value = "/{configId}")
    public AjaxResult getInfo(@PathVariable Long configId)
    {
        return success(configService.selectConfigById(configId));
    }
    /**
     * æ ¹æ®å‚数键名查询参数值
     */
    @GetMapping(value = "/configKey/{configKey}")
    public AjaxResult getConfigKey(@PathVariable String configKey)
    {
        return success(configService.selectConfigByKey(configKey));
    }
    /**
     * æ–°å¢žå‚数配置
     */
    @RequiresPermissions("system:config:add")
    @Log(title = "参数管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysConfig config)
    {
        if (!configService.checkConfigKeyUnique(config))
        {
            return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
        }
        config.setCreateBy(SecurityUtils.getUsername());
        return toAjax(configService.insertConfig(config));
    }
    /**
     * ä¿®æ”¹å‚数配置
     */
    @RequiresPermissions("system:config:edit")
    @Log(title = "参数管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysConfig config)
    {
        if (!configService.checkConfigKeyUnique(config))
        {
            return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
        }
        config.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(configService.updateConfig(config));
    }
    /**
     * åˆ é™¤å‚数配置
     */
    @RequiresPermissions("system:config:remove")
    @Log(title = "参数管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{configIds}")
    public AjaxResult remove(@PathVariable Long[] configIds)
    {
        configService.deleteConfigByIds(configIds);
        return success();
    }
    /**
     * åˆ·æ–°å‚数缓存
     */
    @RequiresPermissions("system:config:remove")
    @Log(title = "参数管理", businessType = BusinessType.CLEAN)
    @DeleteMapping("/refreshCache")
    public AjaxResult refreshCache()
    {
        configService.resetConfigCache();
        return success();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysDeptController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,133 @@
package com.se.system.controller;
import java.util.List;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.constant.UserConstants;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.domain.SysDept;
import com.se.system.service.ISysDeptService;
/**
 * éƒ¨é—¨ä¿¡æ¯
 *
 * @author admin
 */
@RestController
@RequestMapping("/dept")
public class SysDeptController extends BaseController
{
    @Autowired
    private ISysDeptService deptService;
    /**
     * èŽ·å–éƒ¨é—¨åˆ—è¡¨
     */
    @RequiresPermissions("system:dept:list")
    @GetMapping("/list")
    public AjaxResult list(SysDept dept)
    {
        List<SysDept> depts = deptService.selectDeptList(dept);
        return success(depts);
    }
    /**
     * æŸ¥è¯¢éƒ¨é—¨åˆ—表(排除节点)
     */
    @RequiresPermissions("system:dept:list")
    @GetMapping("/list/exclude/{deptId}")
    public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
    {
        List<SysDept> depts = deptService.selectDeptList(new SysDept());
        depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
        return success(depts);
    }
    /**
     * æ ¹æ®éƒ¨é—¨ç¼–号获取详细信息
     */
    @RequiresPermissions("system:dept:query")
    @GetMapping(value = "/{deptId}")
    public AjaxResult getInfo(@PathVariable Long deptId)
    {
        deptService.checkDeptDataScope(deptId);
        return success(deptService.selectDeptById(deptId));
    }
    /**
     * æ–°å¢žéƒ¨é—¨
     */
    @RequiresPermissions("system:dept:add")
    @Log(title = "部门管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysDept dept)
    {
        if (!deptService.checkDeptNameUnique(dept))
        {
            return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
        }
        dept.setCreateBy(SecurityUtils.getUsername());
        return toAjax(deptService.insertDept(dept));
    }
    /**
     * ä¿®æ”¹éƒ¨é—¨
     */
    @RequiresPermissions("system:dept:edit")
    @Log(title = "部门管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysDept dept)
    {
        Long deptId = dept.getDeptId();
        deptService.checkDeptDataScope(deptId);
        if (!deptService.checkDeptNameUnique(dept))
        {
            return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
        }
        else if (dept.getParentId().equals(deptId))
        {
            return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
        }
        else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0)
        {
            return error("该部门包含未停用的子部门!");
        }
        dept.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(deptService.updateDept(dept));
    }
    /**
     * åˆ é™¤éƒ¨é—¨
     */
    @RequiresPermissions("system:dept:remove")
    @Log(title = "部门管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{deptId}")
    public AjaxResult remove(@PathVariable Long deptId)
    {
        if (deptService.hasChildByDeptId(deptId))
        {
            return warn("存在下级部门,不允许删除");
        }
        if (deptService.checkDeptExistUser(deptId))
        {
            return warn("部门存在用户,不允许删除");
        }
        deptService.checkDeptDataScope(deptId);
        return toAjax(deptService.deleteDeptById(deptId));
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysDictDataController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
package com.se.system.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.domain.SysDictData;
import com.se.system.service.ISysDictDataService;
import com.se.system.service.ISysDictTypeService;
/**
 * æ•°æ®å­—典信息
 *
 * @author admin
 */
@RestController
@RequestMapping("/dict/data")
public class SysDictDataController extends BaseController
{
    @Autowired
    private ISysDictDataService dictDataService;
    @Autowired
    private ISysDictTypeService dictTypeService;
    @RequiresPermissions("system:dict:list")
    @GetMapping("/list")
    public TableDataInfo list(SysDictData dictData)
    {
        startPage();
        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
        return getDataTable(list);
    }
    @Log(title = "字典数据", businessType = BusinessType.EXPORT)
    @RequiresPermissions("system:dict:export")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysDictData dictData)
    {
        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
        ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
        util.exportExcel(response, list, "字典数据");
    }
    /**
     * æŸ¥è¯¢å­—典数据详细
     */
    @RequiresPermissions("system:dict:query")
    @GetMapping(value = "/{dictCode}")
    public AjaxResult getInfo(@PathVariable Long dictCode)
    {
        return success(dictDataService.selectDictDataById(dictCode));
    }
    /**
     * æ ¹æ®å­—典类型查询字典数据信息
     */
    @GetMapping(value = "/type/{dictType}")
    public AjaxResult dictType(@PathVariable String dictType)
    {
        List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
        if (StringUtils.isNull(data))
        {
            data = new ArrayList<SysDictData>();
        }
        return success(data);
    }
    /**
     * æ–°å¢žå­—典类型
     */
    @RequiresPermissions("system:dict:add")
    @Log(title = "字典数据", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysDictData dict)
    {
        dict.setCreateBy(SecurityUtils.getUsername());
        return toAjax(dictDataService.insertDictData(dict));
    }
    /**
     * ä¿®æ”¹ä¿å­˜å­—典类型
     */
    @RequiresPermissions("system:dict:edit")
    @Log(title = "字典数据", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysDictData dict)
    {
        dict.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(dictDataService.updateDictData(dict));
    }
    /**
     * åˆ é™¤å­—典类型
     */
    @RequiresPermissions("system:dict:remove")
    @Log(title = "字典类型", businessType = BusinessType.DELETE)
    @DeleteMapping("/{dictCodes}")
    public AjaxResult remove(@PathVariable Long[] dictCodes)
    {
        dictDataService.deleteDictDataByIds(dictCodes);
        return success();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysDictTypeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
package com.se.system.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.domain.SysDictType;
import com.se.system.service.ISysDictTypeService;
/**
 * æ•°æ®å­—典信息
 *
 * @author admin
 */
@RestController
@RequestMapping("/dict/type")
public class SysDictTypeController extends BaseController
{
    @Autowired
    private ISysDictTypeService dictTypeService;
    @RequiresPermissions("system:dict:list")
    @GetMapping("/list")
    public TableDataInfo list(SysDictType dictType)
    {
        startPage();
        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
        return getDataTable(list);
    }
    @Log(title = "字典类型", businessType = BusinessType.EXPORT)
    @RequiresPermissions("system:dict:export")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysDictType dictType)
    {
        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
        ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
        util.exportExcel(response, list, "字典类型");
    }
    /**
     * æŸ¥è¯¢å­—典类型详细
     */
    @RequiresPermissions("system:dict:query")
    @GetMapping(value = "/{dictId}")
    public AjaxResult getInfo(@PathVariable Long dictId)
    {
        return success(dictTypeService.selectDictTypeById(dictId));
    }
    /**
     * æ–°å¢žå­—典类型
     */
    @RequiresPermissions("system:dict:add")
    @Log(title = "字典类型", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysDictType dict)
    {
        if (!dictTypeService.checkDictTypeUnique(dict))
        {
            return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
        }
        dict.setCreateBy(SecurityUtils.getUsername());
        return toAjax(dictTypeService.insertDictType(dict));
    }
    /**
     * ä¿®æ”¹å­—典类型
     */
    @RequiresPermissions("system:dict:edit")
    @Log(title = "字典类型", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysDictType dict)
    {
        if (!dictTypeService.checkDictTypeUnique(dict))
        {
            return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
        }
        dict.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(dictTypeService.updateDictType(dict));
    }
    /**
     * åˆ é™¤å­—典类型
     */
    @RequiresPermissions("system:dict:remove")
    @Log(title = "字典类型", businessType = BusinessType.DELETE)
    @DeleteMapping("/{dictIds}")
    public AjaxResult remove(@PathVariable Long[] dictIds)
    {
        dictTypeService.deleteDictTypeByIds(dictIds);
        return success();
    }
    /**
     * åˆ·æ–°å­—典缓存
     */
    @RequiresPermissions("system:dict:remove")
    @Log(title = "字典类型", businessType = BusinessType.CLEAN)
    @DeleteMapping("/refreshCache")
    public AjaxResult refreshCache()
    {
        dictTypeService.resetDictCache();
        return success();
    }
    /**
     * èŽ·å–å­—å…¸é€‰æ‹©æ¡†åˆ—è¡¨
     */
    @GetMapping("/optionselect")
    public AjaxResult optionselect()
    {
        List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
        return success(dictTypes);
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysLogininforController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
package com.se.system.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.constant.CacheConstants;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.redis.service.RedisService;
import com.se.common.security.annotation.InnerAuth;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.system.api.domain.SysLogininfor;
import com.se.system.service.ISysLogininforService;
/**
 * ç³»ç»Ÿè®¿é—®è®°å½•
 *
 * @author admin
 */
@RestController
@RequestMapping("/logininfor")
public class SysLogininforController extends BaseController
{
    @Autowired
    private ISysLogininforService logininforService;
    @Autowired
    private RedisService redisService;
    @RequiresPermissions("system:logininfor:list")
    @GetMapping("/list")
    public TableDataInfo list(SysLogininfor logininfor)
    {
        startPage();
        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
        return getDataTable(list);
    }
    @Log(title = "登录日志", businessType = BusinessType.EXPORT)
    @RequiresPermissions("system:logininfor:export")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysLogininfor logininfor)
    {
        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
        ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
        util.exportExcel(response, list, "登录日志");
    }
    @RequiresPermissions("system:logininfor:remove")
    @Log(title = "登录日志", businessType = BusinessType.DELETE)
    @DeleteMapping("/{infoIds}")
    public AjaxResult remove(@PathVariable Long[] infoIds)
    {
        return toAjax(logininforService.deleteLogininforByIds(infoIds));
    }
    @RequiresPermissions("system:logininfor:remove")
    @Log(title = "登录日志", businessType = BusinessType.DELETE)
    @DeleteMapping("/clean")
    public AjaxResult clean()
    {
        logininforService.cleanLogininfor();
        return success();
    }
    @RequiresPermissions("system:logininfor:unlock")
    @Log(title = "账户解锁", businessType = BusinessType.OTHER)
    @GetMapping("/unlock/{userName}")
    public AjaxResult unlock(@PathVariable("userName") String userName)
    {
        redisService.deleteObject(CacheConstants.PWD_ERR_CNT_KEY + userName);
        return success();
    }
    @InnerAuth
    @PostMapping
    public AjaxResult add(@RequestBody SysLogininfor logininfor)
    {
        return toAjax(logininforService.insertLogininfor(logininfor));
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysMenuController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,160 @@
package com.se.system.controller;
import java.util.List;
import com.se.system.domain.SysMenu;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.constant.UserConstants;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.service.ISysMenuService;
/**
 * èœå•信息
 *
 * @author admin
 */
@RestController
@RequestMapping("/menu")
public class SysMenuController extends BaseController
{
    @Autowired
    private ISysMenuService menuService;
    /**
     * èŽ·å–èœå•åˆ—è¡¨
     */
    @RequiresPermissions("system:menu:list")
    @GetMapping("/list")
    public AjaxResult list(SysMenu menu)
    {
        Long userId = SecurityUtils.getUserId();
        List<SysMenu> menus = menuService.selectMenuList(menu, userId);
        return success(menus);
    }
    /**
     * æ ¹æ®èœå•编号获取详细信息
     */
    @RequiresPermissions("system:menu:query")
    @GetMapping(value = "/{menuId}")
    public AjaxResult getInfo(@PathVariable Long menuId)
    {
        return success(menuService.selectMenuById(menuId));
    }
    /**
     * èŽ·å–èœå•ä¸‹æ‹‰æ ‘åˆ—è¡¨
     */
    @GetMapping("/treeselect")
    public AjaxResult treeselect(SysMenu menu)
    {
        Long userId = SecurityUtils.getUserId();
        List<SysMenu> menus = menuService.selectMenuList(menu, userId);
        return success(menuService.buildMenuTreeSelect(menus));
    }
    /**
     * åŠ è½½å¯¹åº”è§’è‰²èœå•åˆ—è¡¨æ ‘
     */
    @GetMapping(value = "/roleMenuTreeselect/{roleId}")
    public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
    {
        Long userId = SecurityUtils.getUserId();
        List<SysMenu> menus = menuService.selectMenuList(userId);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
        ajax.put("menus", menuService.buildMenuTreeSelect(menus));
        return ajax;
    }
    /**
     * æ–°å¢žèœå•
     */
    @RequiresPermissions("system:menu:add")
    @Log(title = "菜单管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysMenu menu)
    {
        if (!menuService.checkMenuNameUnique(menu))
        {
            return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
        }
        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
        {
            return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
        }
        menu.setCreateBy(SecurityUtils.getUsername());
        return toAjax(menuService.insertMenu(menu));
    }
    /**
     * ä¿®æ”¹èœå•
     */
    @RequiresPermissions("system:menu:edit")
    @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysMenu menu)
    {
        if (!menuService.checkMenuNameUnique(menu))
        {
            return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
        }
        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
        {
            return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
        }
        else if (menu.getMenuId().equals(menu.getParentId()))
        {
            return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
        }
        menu.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(menuService.updateMenu(menu));
    }
    /**
     * åˆ é™¤èœå•
     */
    @RequiresPermissions("system:menu:remove")
    @Log(title = "菜单管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{menuId}")
    public AjaxResult remove(@PathVariable("menuId") Long menuId)
    {
        if (menuService.hasChildByMenuId(menuId))
        {
            return warn("存在子菜单,不允许删除");
        }
        if (menuService.checkMenuExistRole(menuId))
        {
            return warn("菜单已分配,不允许删除");
        }
        return toAjax(menuService.deleteMenuById(menuId));
    }
    /**
     * èŽ·å–è·¯ç”±ä¿¡æ¯
     *
     * @return è·¯ç”±ä¿¡æ¯
     */
    @GetMapping("getRouters")
    public AjaxResult getRouters()
    {
        Long userId = SecurityUtils.getUserId();
        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
        return success(menuService.buildMenus(menus));
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysNoticeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.se.system.controller;
import java.util.List;
import com.se.system.domain.SysNotice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.service.ISysNoticeService;
/**
 * å…¬å‘Š ä¿¡æ¯æ“ä½œå¤„ç†
 *
 * @author admin
 */
@RestController
@RequestMapping("/notice")
public class SysNoticeController extends BaseController
{
    @Autowired
    private ISysNoticeService noticeService;
    /**
     * èŽ·å–é€šçŸ¥å…¬å‘Šåˆ—è¡¨
     */
    @RequiresPermissions("system:notice:list")
    @GetMapping("/list")
    public TableDataInfo list(SysNotice notice)
    {
        startPage();
        List<SysNotice> list = noticeService.selectNoticeList(notice);
        return getDataTable(list);
    }
    /**
     * æ ¹æ®é€šçŸ¥å…¬å‘Šç¼–号获取详细信息
     */
    @RequiresPermissions("system:notice:query")
    @GetMapping(value = "/{noticeId}")
    public AjaxResult getInfo(@PathVariable Long noticeId)
    {
        return success(noticeService.selectNoticeById(noticeId));
    }
    /**
     * æ–°å¢žé€šçŸ¥å…¬å‘Š
     */
    @RequiresPermissions("system:notice:add")
    @Log(title = "通知公告", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysNotice notice)
    {
        notice.setCreateBy(SecurityUtils.getUsername());
        return toAjax(noticeService.insertNotice(notice));
    }
    /**
     * ä¿®æ”¹é€šçŸ¥å…¬å‘Š
     */
    @RequiresPermissions("system:notice:edit")
    @Log(title = "通知公告", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysNotice notice)
    {
        notice.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(noticeService.updateNotice(notice));
    }
    /**
     * åˆ é™¤é€šçŸ¥å…¬å‘Š
     */
    @RequiresPermissions("system:notice:remove")
    @Log(title = "通知公告", businessType = BusinessType.DELETE)
    @DeleteMapping("/{noticeIds}")
    public AjaxResult remove(@PathVariable Long[] noticeIds)
    {
        return toAjax(noticeService.deleteNoticeByIds(noticeIds));
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysOperlogController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.se.system.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.InnerAuth;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.system.api.domain.SysOperLog;
import com.se.system.service.ISysOperLogService;
/**
 * æ“ä½œæ—¥å¿—记录
 *
 * @author admin
 */
@RestController
@RequestMapping("/operlog")
public class SysOperlogController extends BaseController
{
    @Autowired
    private ISysOperLogService operLogService;
    @RequiresPermissions("system:operlog:list")
    @GetMapping("/list")
    public TableDataInfo list(SysOperLog operLog)
    {
        startPage();
        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
        return getDataTable(list);
    }
    @Log(title = "操作日志", businessType = BusinessType.EXPORT)
    @RequiresPermissions("system:operlog:export")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysOperLog operLog)
    {
        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
        ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
        util.exportExcel(response, list, "操作日志");
    }
    @Log(title = "操作日志", businessType = BusinessType.DELETE)
    @RequiresPermissions("system:operlog:remove")
    @DeleteMapping("/{operIds}")
    public AjaxResult remove(@PathVariable Long[] operIds)
    {
        return toAjax(operLogService.deleteOperLogByIds(operIds));
    }
    @RequiresPermissions("system:operlog:remove")
    @Log(title = "操作日志", businessType = BusinessType.CLEAN)
    @DeleteMapping("/clean")
    public AjaxResult clean()
    {
        operLogService.cleanOperLog();
        return success();
    }
    @InnerAuth
    @PostMapping
    public AjaxResult add(@RequestBody SysOperLog operLog)
    {
        return toAjax(operLogService.insertOperlog(operLog));
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysPostController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
package com.se.system.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.se.system.domain.SysPost;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.service.ISysPostService;
/**
 * å²—位信息操作处理
 *
 * @author admin
 */
@RestController
@RequestMapping("/post")
public class SysPostController extends BaseController
{
    @Autowired
    private ISysPostService postService;
    /**
     * èŽ·å–å²—ä½åˆ—è¡¨
     */
    @RequiresPermissions("system:post:list")
    @GetMapping("/list")
    public TableDataInfo list(SysPost post)
    {
        startPage();
        List<SysPost> list = postService.selectPostList(post);
        return getDataTable(list);
    }
    @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
    @RequiresPermissions("system:post:export")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysPost post)
    {
        List<SysPost> list = postService.selectPostList(post);
        ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
        util.exportExcel(response, list, "岗位数据");
    }
    /**
     * æ ¹æ®å²—位编号获取详细信息
     */
    @RequiresPermissions("system:post:query")
    @GetMapping(value = "/{postId}")
    public AjaxResult getInfo(@PathVariable Long postId)
    {
        return success(postService.selectPostById(postId));
    }
    /**
     * æ–°å¢žå²—位
     */
    @RequiresPermissions("system:post:add")
    @Log(title = "岗位管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysPost post)
    {
        if (!postService.checkPostNameUnique(post))
        {
            return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
        }
        else if (!postService.checkPostCodeUnique(post))
        {
            return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
        }
        post.setCreateBy(SecurityUtils.getUsername());
        return toAjax(postService.insertPost(post));
    }
    /**
     * ä¿®æ”¹å²—位
     */
    @RequiresPermissions("system:post:edit")
    @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysPost post)
    {
        if (!postService.checkPostNameUnique(post))
        {
            return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
        }
        else if (!postService.checkPostCodeUnique(post))
        {
            return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
        }
        post.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(postService.updatePost(post));
    }
    /**
     * åˆ é™¤å²—位
     */
    @RequiresPermissions("system:post:remove")
    @Log(title = "岗位管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{postIds}")
    public AjaxResult remove(@PathVariable Long[] postIds)
    {
        return toAjax(postService.deletePostByIds(postIds));
    }
    /**
     * èŽ·å–å²—ä½é€‰æ‹©æ¡†åˆ—è¡¨
     */
    @GetMapping("/optionselect")
    public AjaxResult optionselect()
    {
        List<SysPost> posts = postService.selectPostAll();
        return success(posts);
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysProfileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,154 @@
package com.se.system.controller;
import java.util.Arrays;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.se.common.core.domain.R;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.file.FileTypeUtils;
import com.se.common.core.utils.file.MimeTypeUtils;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.service.TokenService;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.RemoteFileService;
import com.se.system.api.domain.SysFile;
import com.se.system.api.domain.SysUser;
import com.se.system.api.model.LoginUser;
import com.se.system.service.ISysUserService;
/**
 * ä¸ªäººä¿¡æ¯ ä¸šåŠ¡å¤„ç†
 *
 * @author admin
 */
@RestController
@RequestMapping("/user/profile")
public class SysProfileController extends BaseController
{
    @Autowired
    private ISysUserService userService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private RemoteFileService remoteFileService;
    /**
     * ä¸ªäººä¿¡æ¯
     */
    @GetMapping
    public AjaxResult profile()
    {
        String username = SecurityUtils.getUsername();
        SysUser user = userService.selectUserByUserName(username);
        AjaxResult ajax = AjaxResult.success(user);
        ajax.put("roleGroup", userService.selectUserRoleGroup(username));
        ajax.put("postGroup", userService.selectUserPostGroup(username));
        return ajax;
    }
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult updateProfile(@RequestBody SysUser user)
    {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        SysUser currentUser = loginUser.getSysUser();
        currentUser.setNickName(user.getNickName());
        currentUser.setEmail(user.getEmail());
        currentUser.setPhonenumber(user.getPhonenumber());
        currentUser.setSex(user.getSex());
        if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
        {
            return error("修改用户'" + loginUser.getUsername() + "'失败,手机号码已存在");
        }
        if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
        {
            return error("修改用户'" + loginUser.getUsername() + "'失败,邮箱账号已存在");
        }
        if (userService.updateUserProfile(currentUser))
        {
            // æ›´æ–°ç¼“存用户信息
            tokenService.setLoginUser(loginUser);
            return success();
        }
        return error("修改个人信息异常,请联系管理员");
    }
    /**
     * é‡ç½®å¯†ç 
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PutMapping("/updatePwd")
    public AjaxResult updatePwd(String oldPassword, String newPassword)
    {
        String username = SecurityUtils.getUsername();
        SysUser user = userService.selectUserByUserName(username);
        String password = user.getPassword();
        if (!SecurityUtils.matchesPassword(oldPassword, password))
        {
            return error("修改密码失败,旧密码错误");
        }
        if (SecurityUtils.matchesPassword(newPassword, password))
        {
            return error("新密码不能与旧密码相同");
        }
        newPassword = SecurityUtils.encryptPassword(newPassword);
        if (userService.resetUserPwd(username, newPassword) > 0)
        {
            // æ›´æ–°ç¼“存用户密码
            LoginUser loginUser = SecurityUtils.getLoginUser();
            loginUser.getSysUser().setPassword(newPassword);
            tokenService.setLoginUser(loginUser);
            return success();
        }
        return error("修改密码异常,请联系管理员");
    }
    /**
     * å¤´åƒä¸Šä¼ 
     */
    @Log(title = "用户头像", businessType = BusinessType.UPDATE)
    @PostMapping("/avatar")
    public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file)
    {
        if (!file.isEmpty())
        {
            LoginUser loginUser = SecurityUtils.getLoginUser();
            String extension = FileTypeUtils.getExtension(file);
            if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION))
            {
                return error("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式");
            }
            R<SysFile> fileResult = remoteFileService.upload(file);
            if (StringUtils.isNull(fileResult) || StringUtils.isNull(fileResult.getData()))
            {
                return error("文件服务异常,请联系管理员");
            }
            String url = fileResult.getData().getUrl();
            if (userService.updateUserAvatar(loginUser.getUsername(), url))
            {
                AjaxResult ajax = AjaxResult.success();
                ajax.put("imgUrl", url);
                // æ›´æ–°ç¼“存用户头像
                loginUser.getSysUser().setAvatar(url);
                tokenService.setLoginUser(loginUser);
                return ajax;
            }
        }
        return error("上传图片异常,请联系管理员");
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysRoleController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,240 @@
package com.se.system.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.se.system.domain.SysUserRole;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.domain.SysDept;
import com.se.system.api.domain.SysRole;
import com.se.system.api.domain.SysUser;
import com.se.system.service.ISysDeptService;
import com.se.system.service.ISysRoleService;
import com.se.system.service.ISysUserService;
/**
 * è§’色信息
 *
 * @author admin
 */
@RestController
@RequestMapping("/role")
public class SysRoleController extends BaseController
{
    @Autowired
    private ISysRoleService roleService;
    @Autowired
    private ISysUserService userService;
    @Autowired
    private ISysDeptService deptService;
    @RequiresPermissions("system:role:list")
    @GetMapping("/list")
    public TableDataInfo list(SysRole role)
    {
        startPage();
        List<SysRole> list = roleService.selectRoleList(role);
        return getDataTable(list);
    }
    @Log(title = "角色管理", businessType = BusinessType.EXPORT)
    @RequiresPermissions("system:role:export")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysRole role)
    {
        List<SysRole> list = roleService.selectRoleList(role);
        ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
        util.exportExcel(response, list, "角色数据");
    }
    /**
     * æ ¹æ®è§’色编号获取详细信息
     */
    @RequiresPermissions("system:role:query")
    @GetMapping(value = "/{roleId}")
    public AjaxResult getInfo(@PathVariable Long roleId)
    {
        roleService.checkRoleDataScope(roleId);
        return success(roleService.selectRoleById(roleId));
    }
    /**
     * æ–°å¢žè§’色
     */
    @RequiresPermissions("system:role:add")
    @Log(title = "角色管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysRole role)
    {
        if (!roleService.checkRoleNameUnique(role))
        {
            return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
        }
        else if (!roleService.checkRoleKeyUnique(role))
        {
            return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
        }
        role.setCreateBy(SecurityUtils.getUsername());
        return toAjax(roleService.insertRole(role));
    }
    /**
     * ä¿®æ”¹ä¿å­˜è§’色
     */
    @RequiresPermissions("system:role:edit")
    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysRole role)
    {
        roleService.checkRoleAllowed(role);
        roleService.checkRoleDataScope(role.getRoleId());
        if (!roleService.checkRoleNameUnique(role))
        {
            return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
        }
        else if (!roleService.checkRoleKeyUnique(role))
        {
            return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
        }
        role.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(roleService.updateRole(role));
    }
    /**
     * ä¿®æ”¹ä¿å­˜æ•°æ®æƒé™
     */
    @RequiresPermissions("system:role:edit")
    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
    @PutMapping("/dataScope")
    public AjaxResult dataScope(@RequestBody SysRole role)
    {
        roleService.checkRoleAllowed(role);
        roleService.checkRoleDataScope(role.getRoleId());
        return toAjax(roleService.authDataScope(role));
    }
    /**
     * çŠ¶æ€ä¿®æ”¹
     */
    @RequiresPermissions("system:role:edit")
    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysRole role)
    {
        roleService.checkRoleAllowed(role);
        roleService.checkRoleDataScope(role.getRoleId());
        role.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(roleService.updateRoleStatus(role));
    }
    /**
     * åˆ é™¤è§’色
     */
    @RequiresPermissions("system:role:remove")
    @Log(title = "角色管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{roleIds}")
    public AjaxResult remove(@PathVariable Long[] roleIds)
    {
        return toAjax(roleService.deleteRoleByIds(roleIds));
    }
    /**
     * èŽ·å–è§’è‰²é€‰æ‹©æ¡†åˆ—è¡¨
     */
    @RequiresPermissions("system:role:query")
    @GetMapping("/optionselect")
    public AjaxResult optionselect()
    {
        return success(roleService.selectRoleAll());
    }
    /**
     * æŸ¥è¯¢å·²åˆ†é…ç”¨æˆ·è§’色列表
     */
    @RequiresPermissions("system:role:list")
    @GetMapping("/authUser/allocatedList")
    public TableDataInfo allocatedList(SysUser user)
    {
        startPage();
        List<SysUser> list = userService.selectAllocatedList(user);
        return getDataTable(list);
    }
    /**
     * æŸ¥è¯¢æœªåˆ†é…ç”¨æˆ·è§’色列表
     */
    @RequiresPermissions("system:role:list")
    @GetMapping("/authUser/unallocatedList")
    public TableDataInfo unallocatedList(SysUser user)
    {
        startPage();
        List<SysUser> list = userService.selectUnallocatedList(user);
        return getDataTable(list);
    }
    /**
     * å–消授权用户
     */
    @RequiresPermissions("system:role:edit")
    @Log(title = "角色管理", businessType = BusinessType.GRANT)
    @PutMapping("/authUser/cancel")
    public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
    {
        return toAjax(roleService.deleteAuthUser(userRole));
    }
    /**
     * æ‰¹é‡å–消授权用户
     */
    @RequiresPermissions("system:role:edit")
    @Log(title = "角色管理", businessType = BusinessType.GRANT)
    @PutMapping("/authUser/cancelAll")
    public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
    {
        return toAjax(roleService.deleteAuthUsers(roleId, userIds));
    }
    /**
     * æ‰¹é‡é€‰æ‹©ç”¨æˆ·æŽˆæƒ
     */
    @RequiresPermissions("system:role:edit")
    @Log(title = "角色管理", businessType = BusinessType.GRANT)
    @PutMapping("/authUser/selectAll")
    public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
    {
        roleService.checkRoleDataScope(roleId);
        return toAjax(roleService.insertAuthUsers(roleId, userIds));
    }
    /**
     * èŽ·å–å¯¹åº”è§’è‰²éƒ¨é—¨æ ‘åˆ—è¡¨
     */
    @RequiresPermissions("system:role:query")
    @GetMapping(value = "/deptTree/{roleId}")
    public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
    {
        AjaxResult ajax = AjaxResult.success();
        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
        ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
        return ajax;
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysUserController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,341 @@
package com.se.system.controller;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.se.common.core.domain.R;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.InnerAuth;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.domain.SysDept;
import com.se.system.api.domain.SysRole;
import com.se.system.api.domain.SysUser;
import com.se.system.api.model.LoginUser;
import com.se.system.service.ISysConfigService;
import com.se.system.service.ISysDeptService;
import com.se.system.service.ISysPermissionService;
import com.se.system.service.ISysPostService;
import com.se.system.service.ISysRoleService;
import com.se.system.service.ISysUserService;
/**
 * ç”¨æˆ·ä¿¡æ¯
 *
 * @author admin
 */
@RestController
@RequestMapping("/user")
public class SysUserController extends BaseController
{
    @Autowired
    private ISysUserService userService;
    @Autowired
    private ISysRoleService roleService;
    @Autowired
    private ISysDeptService deptService;
    @Autowired
    private ISysPostService postService;
    @Autowired
    private ISysPermissionService permissionService;
    @Autowired
    private ISysConfigService configService;
    /**
     * èŽ·å–ç”¨æˆ·åˆ—è¡¨
     */
    @RequiresPermissions("system:user:list")
    @GetMapping("/list")
    public TableDataInfo list(SysUser user)
    {
        startPage();
        List<SysUser> list = userService.selectUserList(user);
        return getDataTable(list);
    }
    @Log(title = "用户管理", businessType = BusinessType.EXPORT)
    @RequiresPermissions("system:user:export")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysUser user)
    {
        List<SysUser> list = userService.selectUserList(user);
        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
        util.exportExcel(response, list, "用户数据");
    }
    @Log(title = "用户管理", businessType = BusinessType.IMPORT)
    @RequiresPermissions("system:user:import")
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
    {
        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
        List<SysUser> userList = util.importExcel(file.getInputStream());
        String operName = SecurityUtils.getUsername();
        String message = userService.importUser(userList, updateSupport, operName);
        return success(message);
    }
    @PostMapping("/importTemplate")
    public void importTemplate(HttpServletResponse response) throws IOException
    {
        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
        util.importTemplateExcel(response, "用户数据");
    }
    /**
     * èŽ·å–å½“å‰ç”¨æˆ·ä¿¡æ¯
     */
    @InnerAuth
    @GetMapping("/info/{username}")
    public R<LoginUser> info(@PathVariable("username") String username)
    {
        SysUser sysUser = userService.selectUserByUserName(username);
        if (StringUtils.isNull(sysUser))
        {
            return R.fail("用户名或密码错误");
        }
        // è§’色集合
        Set<String> roles = permissionService.getRolePermission(sysUser);
        // æƒé™é›†åˆ
        Set<String> permissions = permissionService.getMenuPermission(sysUser);
        LoginUser sysUserVo = new LoginUser();
        sysUserVo.setSysUser(sysUser);
        sysUserVo.setRoles(roles);
        sysUserVo.setPermissions(permissions);
        return R.ok(sysUserVo);
    }
    /**
     * æ³¨å†Œç”¨æˆ·ä¿¡æ¯
     */
    @InnerAuth
    @PostMapping("/register")
    public R<Boolean> register(@RequestBody SysUser sysUser)
    {
        String username = sysUser.getUserName();
        if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
        {
            return R.fail("当前系统没有开启注册功能!");
        }
        if (!userService.checkUserNameUnique(sysUser))
        {
            return R.fail("保存用户'" + username + "'失败,注册账号已存在");
        }
        return R.ok(userService.registerUser(sysUser));
    }
    /**
     *记录用户登录IP地址和登录时间
     */
    @InnerAuth
    @PutMapping("/recordlogin")
    public R<Boolean> recordlogin(@RequestBody SysUser sysUser)
    {
        return R.ok(userService.updateUserProfile(sysUser));
    }
    /**
     * èŽ·å–ç”¨æˆ·ä¿¡æ¯
     *
     * @return ç”¨æˆ·ä¿¡æ¯
     */
    @GetMapping("getInfo")
    public AjaxResult getInfo()
    {
        SysUser user = userService.selectUserById(SecurityUtils.getUserId());
        // è§’色集合
        Set<String> roles = permissionService.getRolePermission(user);
        // æƒé™é›†åˆ
        Set<String> permissions = permissionService.getMenuPermission(user);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        return ajax;
    }
    /**
     * æ ¹æ®ç”¨æˆ·ç¼–号获取详细信息
     */
    @RequiresPermissions("system:user:query")
    @GetMapping(value = { "/", "/{userId}" })
    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
    {
        userService.checkUserDataScope(userId);
        AjaxResult ajax = AjaxResult.success();
        List<SysRole> roles = roleService.selectRoleAll();
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        ajax.put("posts", postService.selectPostAll());
        if (StringUtils.isNotNull(userId))
        {
            SysUser sysUser = userService.selectUserById(userId);
            ajax.put(AjaxResult.DATA_TAG, sysUser);
            ajax.put("postIds", postService.selectPostListByUserId(userId));
            ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
        }
        return ajax;
    }
    /**
     * æ–°å¢žç”¨æˆ·
     */
    @RequiresPermissions("system:user:add")
    @Log(title = "用户管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysUser user)
    {
        deptService.checkDeptDataScope(user.getDeptId());
        roleService.checkRoleDataScope(user.getRoleIds());
        if (!userService.checkUserNameUnique(user))
        {
            return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
        }
        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
        {
            return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
        }
        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
        {
            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
        }
        user.setCreateBy(SecurityUtils.getUsername());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        return toAjax(userService.insertUser(user));
    }
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @RequiresPermissions("system:user:edit")
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysUser user)
    {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        deptService.checkDeptDataScope(user.getDeptId());
        roleService.checkRoleDataScope(user.getRoleIds());
        if (!userService.checkUserNameUnique(user))
        {
            return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
        }
        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
        {
            return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
        }
        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
        {
            return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
        }
        user.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(userService.updateUser(user));
    }
    /**
     * åˆ é™¤ç”¨æˆ·
     */
    @RequiresPermissions("system:user:remove")
    @Log(title = "用户管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{userIds}")
    public AjaxResult remove(@PathVariable Long[] userIds)
    {
        if (ArrayUtils.contains(userIds, SecurityUtils.getUserId()))
        {
            return error("当前用户不能删除");
        }
        return toAjax(userService.deleteUserByIds(userIds));
    }
    /**
     * é‡ç½®å¯†ç 
     */
    @RequiresPermissions("system:user:edit")
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/resetPwd")
    public AjaxResult resetPwd(@RequestBody SysUser user)
    {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        user.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(userService.resetPwd(user));
    }
    /**
     * çŠ¶æ€ä¿®æ”¹
     */
    @RequiresPermissions("system:user:edit")
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysUser user)
    {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        user.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(userService.updateUserStatus(user));
    }
    /**
     * æ ¹æ®ç”¨æˆ·ç¼–号获取授权角色
     */
    @RequiresPermissions("system:user:query")
    @GetMapping("/authRole/{userId}")
    public AjaxResult authRole(@PathVariable("userId") Long userId)
    {
        AjaxResult ajax = AjaxResult.success();
        SysUser user = userService.selectUserById(userId);
        List<SysRole> roles = roleService.selectRolesByUserId(userId);
        ajax.put("user", user);
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        return ajax;
    }
    /**
     * ç”¨æˆ·æŽˆæƒè§’色
     */
    @RequiresPermissions("system:user:edit")
    @Log(title = "用户管理", businessType = BusinessType.GRANT)
    @PutMapping("/authRole")
    public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
    {
        userService.checkUserDataScope(userId);
        roleService.checkRoleDataScope(roleIds);
        userService.insertUserAuth(userId, roleIds);
        return success();
    }
    /**
     * èŽ·å–éƒ¨é—¨æ ‘åˆ—è¡¨
     */
    @RequiresPermissions("system:user:list")
    @GetMapping("/deptTree")
    public AjaxResult deptTree(SysDept dept)
    {
        return success(deptService.selectDeptTreeList(dept));
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/controller/SysUserOnlineController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.se.system.controller;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import com.se.system.domain.SysUserOnline;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.constant.CacheConstants;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.web.page.TableDataInfo;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.redis.service.RedisService;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.system.api.model.LoginUser;
import com.se.system.service.ISysUserOnlineService;
/**
 * åœ¨çº¿ç”¨æˆ·ç›‘控
 *
 * @author admin
 */
@RestController
@RequestMapping("/online")
public class SysUserOnlineController extends BaseController
{
    @Autowired
    private ISysUserOnlineService userOnlineService;
    @Autowired
    private RedisService redisService;
    @RequiresPermissions("monitor:online:list")
    @GetMapping("/list")
    public TableDataInfo list(String ipaddr, String userName)
    {
        Collection<String> keys = redisService.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
        List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
        for (String key : keys)
        {
            LoginUser user = redisService.getCacheObject(key);
            if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
            {
                userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
            }
            else if (StringUtils.isNotEmpty(ipaddr))
            {
                userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
            }
            else if (StringUtils.isNotEmpty(userName))
            {
                userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
            }
            else
            {
                userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
            }
        }
        Collections.reverse(userOnlineList);
        userOnlineList.removeAll(Collections.singleton(null));
        return getDataTable(userOnlineList);
    }
    /**
     * å¼ºé€€ç”¨æˆ·
     */
    @RequiresPermissions("monitor:online:forceLogout")
    @Log(title = "在线用户", businessType = BusinessType.FORCE)
    @DeleteMapping("/{tokenId}")
    public AjaxResult forceLogout(@PathVariable String tokenId)
    {
        redisService.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
        return success();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
package com.se.system.domain;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.se.common.core.annotation.Excel;
import com.se.common.core.annotation.Excel.ColumnType;
import com.se.common.core.web.domain.BaseEntity;
/**
 * å‚数配置表 sys_config
 *
 * @author admin
 */
public class SysConfig extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** å‚数主键 */
    @Excel(name = "参数主键", cellType = ColumnType.NUMERIC)
    private Long configId;
    /** å‚数名称 */
    @Excel(name = "参数名称")
    private String configName;
    /** å‚数键名 */
    @Excel(name = "参数键名")
    private String configKey;
    /** å‚数键值 */
    @Excel(name = "参数键值")
    private String configValue;
    /** ç³»ç»Ÿå†…置(Y是 N否) */
    @Excel(name = "系统内置", readConverterExp = "Y=是,N=否")
    private String configType;
    public Long getConfigId()
    {
        return configId;
    }
    public void setConfigId(Long configId)
    {
        this.configId = configId;
    }
    @NotBlank(message = "参数名称不能为空")
    @Size(min = 0, max = 100, message = "参数名称不能超过100个字符")
    public String getConfigName()
    {
        return configName;
    }
    public void setConfigName(String configName)
    {
        this.configName = configName;
    }
    @NotBlank(message = "参数键名长度不能为空")
    @Size(min = 0, max = 100, message = "参数键名长度不能超过100个字符")
    public String getConfigKey()
    {
        return configKey;
    }
    public void setConfigKey(String configKey)
    {
        this.configKey = configKey;
    }
    @NotBlank(message = "参数键值不能为空")
    @Size(min = 0, max = 500, message = "参数键值长度不能超过500个字符")
    public String getConfigValue()
    {
        return configValue;
    }
    public void setConfigValue(String configValue)
    {
        this.configValue = configValue;
    }
    public String getConfigType()
    {
        return configType;
    }
    public void setConfigType(String configType)
    {
        this.configType = configType;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("configId", getConfigId())
            .append("configName", getConfigName())
            .append("configKey", getConfigKey())
            .append("configValue", getConfigValue())
            .append("configType", getConfigType())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysMenu.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,274 @@
package com.se.system.domain;
import java.util.ArrayList;
import java.util.List;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.se.common.core.web.domain.BaseEntity;
/**
 * èœå•权限表 sys_menu
 *
 * @author admin
 */
public class SysMenu extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** èœå•ID */
    private Long menuId;
    /** èœå•名称 */
    private String menuName;
    /** çˆ¶èœå•名称 */
    private String parentName;
    /** çˆ¶èœå•ID */
    private Long parentId;
    /** æ˜¾ç¤ºé¡ºåº */
    private Integer orderNum;
    /** è·¯ç”±åœ°å€ */
    private String path;
    /** ç»„件路径 */
    private String component;
    /** è·¯ç”±å‚æ•° */
    private String query;
    /** è·¯ç”±åç§°ï¼Œé»˜è®¤å’Œè·¯ç”±åœ°å€ç›¸åŒçš„驼峰格式(注意:因为vue3版本的router会删除名称相同路由,为避免名字的冲突,特殊情况可以自定义) */
    private String routeName;
    /** æ˜¯å¦ä¸ºå¤–链(0是 1否) */
    private String isFrame;
    /** æ˜¯å¦ç¼“存(0缓存 1不缓存) */
    private String isCache;
    /** ç±»åž‹ï¼ˆM目录 C菜单 F按钮) */
    private String menuType;
    /** æ˜¾ç¤ºçŠ¶æ€ï¼ˆ0显示 1隐藏) */
    private String visible;
    /** èœå•状态(0正常 1停用) */
    private String status;
    /** æƒé™å­—符串 */
    private String perms;
    /** èœå•图标 */
    private String icon;
    /** å­èœå• */
    private List<SysMenu> children = new ArrayList<SysMenu>();
    public Long getMenuId()
    {
        return menuId;
    }
    public void setMenuId(Long menuId)
    {
        this.menuId = menuId;
    }
    @NotBlank(message = "菜单名称不能为空")
    @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
    public String getMenuName()
    {
        return menuName;
    }
    public void setMenuName(String menuName)
    {
        this.menuName = menuName;
    }
    public String getParentName()
    {
        return parentName;
    }
    public void setParentName(String parentName)
    {
        this.parentName = parentName;
    }
    public Long getParentId()
    {
        return parentId;
    }
    public void setParentId(Long parentId)
    {
        this.parentId = parentId;
    }
    @NotNull(message = "显示顺序不能为空")
    public Integer getOrderNum()
    {
        return orderNum;
    }
    public void setOrderNum(Integer orderNum)
    {
        this.orderNum = orderNum;
    }
    @Size(min = 0, max = 200, message = "路由地址不能超过200个字符")
    public String getPath()
    {
        return path;
    }
    public void setPath(String path)
    {
        this.path = path;
    }
    @Size(min = 0, max = 200, message = "组件路径不能超过255个字符")
    public String getComponent()
    {
        return component;
    }
    public void setComponent(String component)
    {
        this.component = component;
    }
    public String getQuery()
    {
        return query;
    }
    public void setQuery(String query)
    {
        this.query = query;
    }
    public String getRouteName()
    {
        return routeName;
    }
    public void setRouteName(String routeName)
    {
        this.routeName = routeName;
    }
    public String getIsFrame()
    {
        return isFrame;
    }
    public void setIsFrame(String isFrame)
    {
        this.isFrame = isFrame;
    }
    public String getIsCache()
    {
        return isCache;
    }
    public void setIsCache(String isCache)
    {
        this.isCache = isCache;
    }
    @NotBlank(message = "菜单类型不能为空")
    public String getMenuType()
    {
        return menuType;
    }
    public void setMenuType(String menuType)
    {
        this.menuType = menuType;
    }
    public String getVisible()
    {
        return visible;
    }
    public void setVisible(String visible)
    {
        this.visible = visible;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符")
    public String getPerms()
    {
        return perms;
    }
    public void setPerms(String perms)
    {
        this.perms = perms;
    }
    public String getIcon()
    {
        return icon;
    }
    public void setIcon(String icon)
    {
        this.icon = icon;
    }
    public List<SysMenu> getChildren()
    {
        return children;
    }
    public void setChildren(List<SysMenu> children)
    {
        this.children = children;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("menuId", getMenuId())
            .append("menuName", getMenuName())
            .append("parentId", getParentId())
            .append("orderNum", getOrderNum())
            .append("path", getPath())
            .append("component", getComponent())
            .append("query", getQuery())
            .append("routeName", getRouteName())
            .append("isFrame", getIsFrame())
            .append("IsCache", getIsCache())
            .append("menuType", getMenuType())
            .append("visible", getVisible())
            .append("status ", getStatus())
            .append("perms", getPerms())
            .append("icon", getIcon())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysNotice.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
package com.se.system.domain;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.se.common.core.web.domain.BaseEntity;
import com.se.common.core.xss.Xss;
/**
 * é€šçŸ¥å…¬å‘Šè¡¨ sys_notice
 *
 * @author admin
 */
public class SysNotice extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** å…¬å‘ŠID */
    private Long noticeId;
    /** å…¬å‘Šæ ‡é¢˜ */
    private String noticeTitle;
    /** å…¬å‘Šç±»åž‹ï¼ˆ1通知 2公告) */
    private String noticeType;
    /** å…¬å‘Šå†…容 */
    private String noticeContent;
    /** å…¬å‘ŠçŠ¶æ€ï¼ˆ0正常 1关闭) */
    private String status;
    public Long getNoticeId()
    {
        return noticeId;
    }
    public void setNoticeId(Long noticeId)
    {
        this.noticeId = noticeId;
    }
    public void setNoticeTitle(String noticeTitle)
    {
        this.noticeTitle = noticeTitle;
    }
    @Xss(message = "公告标题不能包含脚本字符")
    @NotBlank(message = "公告标题不能为空")
    @Size(min = 0, max = 50, message = "公告标题不能超过50个字符")
    public String getNoticeTitle()
    {
        return noticeTitle;
    }
    public void setNoticeType(String noticeType)
    {
        this.noticeType = noticeType;
    }
    public String getNoticeType()
    {
        return noticeType;
    }
    public void setNoticeContent(String noticeContent)
    {
        this.noticeContent = noticeContent;
    }
    public String getNoticeContent()
    {
        return noticeContent;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    public String getStatus()
    {
        return status;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("noticeId", getNoticeId())
            .append("noticeTitle", getNoticeTitle())
            .append("noticeType", getNoticeType())
            .append("noticeContent", getNoticeContent())
            .append("status", getStatus())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysPost.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
package com.se.system.domain;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.se.common.core.annotation.Excel;
import com.se.common.core.annotation.Excel.ColumnType;
import com.se.common.core.web.domain.BaseEntity;
/**
 * å²—位表 sys_post
 *
 * @author admin
 */
public class SysPost extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** å²—位序号 */
    @Excel(name = "岗位序号", cellType = ColumnType.NUMERIC)
    private Long postId;
    /** å²—位编码 */
    @Excel(name = "岗位编码")
    private String postCode;
    /** å²—位名称 */
    @Excel(name = "岗位名称")
    private String postName;
    /** å²—位排序 */
    @Excel(name = "岗位排序")
    private Integer postSort;
    /** çŠ¶æ€ï¼ˆ0正常 1停用) */
    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
    private String status;
    /** ç”¨æˆ·æ˜¯å¦å­˜åœ¨æ­¤å²—位标识 é»˜è®¤ä¸å­˜åœ¨ */
    private boolean flag = false;
    public Long getPostId()
    {
        return postId;
    }
    public void setPostId(Long postId)
    {
        this.postId = postId;
    }
    @NotBlank(message = "岗位编码不能为空")
    @Size(min = 0, max = 64, message = "岗位编码长度不能超过64个字符")
    public String getPostCode()
    {
        return postCode;
    }
    public void setPostCode(String postCode)
    {
        this.postCode = postCode;
    }
    @NotBlank(message = "岗位名称不能为空")
    @Size(min = 0, max = 50, message = "岗位名称长度不能超过50个字符")
    public String getPostName()
    {
        return postName;
    }
    public void setPostName(String postName)
    {
        this.postName = postName;
    }
    @NotNull(message = "显示顺序不能为空")
    public Integer getPostSort()
    {
        return postSort;
    }
    public void setPostSort(Integer postSort)
    {
        this.postSort = postSort;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    public boolean isFlag()
    {
        return flag;
    }
    public void setFlag(boolean flag)
    {
        this.flag = flag;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("postId", getPostId())
            .append("postCode", getPostCode())
            .append("postName", getPostName())
            .append("postSort", getPostSort())
            .append("status", getStatus())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysRoleDept.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.se.system.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
 * è§’色和部门关联 sys_role_dept
 *
 * @author admin
 */
public class SysRoleDept
{
    /** è§’色ID */
    private Long roleId;
    /** éƒ¨é—¨ID */
    private Long deptId;
    public Long getRoleId()
    {
        return roleId;
    }
    public void setRoleId(Long roleId)
    {
        this.roleId = roleId;
    }
    public Long getDeptId()
    {
        return deptId;
    }
    public void setDeptId(Long deptId)
    {
        this.deptId = deptId;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("roleId", getRoleId())
            .append("deptId", getDeptId())
            .toString();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysRoleMenu.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.se.system.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
 * è§’色和菜单关联 sys_role_menu
 *
 * @author admin
 */
public class SysRoleMenu
{
    /** è§’色ID */
    private Long roleId;
    /** èœå•ID */
    private Long menuId;
    public Long getRoleId()
    {
        return roleId;
    }
    public void setRoleId(Long roleId)
    {
        this.roleId = roleId;
    }
    public Long getMenuId()
    {
        return menuId;
    }
    public void setMenuId(Long menuId)
    {
        this.menuId = menuId;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("roleId", getRoleId())
            .append("menuId", getMenuId())
            .toString();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysUserOnline.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.se.system.domain;
/**
 * å½“前在线会话
 *
 * @author admin
 */
public class SysUserOnline
{
    /** ä¼šè¯ç¼–号 */
    private String tokenId;
    /** ç”¨æˆ·åç§° */
    private String userName;
    /** ç™»å½•IP地址 */
    private String ipaddr;
    /** ç™»å½•地址 */
    private String loginLocation;
    /** æµè§ˆå™¨ç±»åž‹ */
    private String browser;
    /** æ“ä½œç³»ç»Ÿ */
    private String os;
    /** ç™»å½•æ—¶é—´ */
    private Long loginTime;
    public String getTokenId()
    {
        return tokenId;
    }
    public void setTokenId(String tokenId)
    {
        this.tokenId = tokenId;
    }
    public String getUserName()
    {
        return userName;
    }
    public void setUserName(String userName)
    {
        this.userName = userName;
    }
    public String getIpaddr()
    {
        return ipaddr;
    }
    public void setIpaddr(String ipaddr)
    {
        this.ipaddr = ipaddr;
    }
    public String getLoginLocation()
    {
        return loginLocation;
    }
    public void setLoginLocation(String loginLocation)
    {
        this.loginLocation = loginLocation;
    }
    public String getBrowser()
    {
        return browser;
    }
    public void setBrowser(String browser)
    {
        this.browser = browser;
    }
    public String getOs()
    {
        return os;
    }
    public void setOs(String os)
    {
        this.os = os;
    }
    public Long getLoginTime()
    {
        return loginTime;
    }
    public void setLoginTime(Long loginTime)
    {
        this.loginTime = loginTime;
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysUserPost.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.se.system.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
 * ç”¨æˆ·å’Œå²—位关联 sys_user_post
 *
 * @author admin
 */
public class SysUserPost
{
    /** ç”¨æˆ·ID */
    private Long userId;
    /** å²—位ID */
    private Long postId;
    public Long getUserId()
    {
        return userId;
    }
    public void setUserId(Long userId)
    {
        this.userId = userId;
    }
    public Long getPostId()
    {
        return postId;
    }
    public void setPostId(Long postId)
    {
        this.postId = postId;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("userId", getUserId())
            .append("postId", getPostId())
            .toString();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/SysUserRole.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.se.system.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
 * ç”¨æˆ·å’Œè§’色关联 sys_user_role
 *
 * @author admin
 */
public class SysUserRole
{
    /** ç”¨æˆ·ID */
    private Long userId;
    /** è§’色ID */
    private Long roleId;
    public Long getUserId()
    {
        return userId;
    }
    public void setUserId(Long userId)
    {
        this.userId = userId;
    }
    public Long getRoleId()
    {
        return roleId;
    }
    public void setRoleId(Long roleId)
    {
        this.roleId = roleId;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("userId", getUserId())
            .append("roleId", getRoleId())
            .toString();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/vo/MetaVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
package com.se.system.domain.vo;
import com.se.common.core.utils.StringUtils;
/**
 * è·¯ç”±æ˜¾ç¤ºä¿¡æ¯
 *
 * @author admin
 */
public class MetaVo
{
    /**
     * è®¾ç½®è¯¥è·¯ç”±åœ¨ä¾§è¾¹æ å’Œé¢åŒ…屑中展示的名字
     */
    private String title;
    /**
     * è®¾ç½®è¯¥è·¯ç”±çš„图标,对应路径src/assets/icons/svg
     */
    private String icon;
    /**
     * è®¾ç½®ä¸ºtrue,则不会被 <keep-alive>缓存
     */
    private boolean noCache;
    /**
     * å†…链地址(http(s)://开头)
     */
    private String link;
    public MetaVo()
    {
    }
    public MetaVo(String title, String icon)
    {
        this.title = title;
        this.icon = icon;
    }
    public MetaVo(String title, String icon, boolean noCache)
    {
        this.title = title;
        this.icon = icon;
        this.noCache = noCache;
    }
    public MetaVo(String title, String icon, String link)
    {
        this.title = title;
        this.icon = icon;
        this.link = link;
    }
    public MetaVo(String title, String icon, boolean noCache, String link)
    {
        this.title = title;
        this.icon = icon;
        this.noCache = noCache;
        if (StringUtils.ishttp(link))
        {
            this.link = link;
        }
    }
    public boolean isNoCache()
    {
        return noCache;
    }
    public void setNoCache(boolean noCache)
    {
        this.noCache = noCache;
    }
    public String getTitle()
    {
        return title;
    }
    public void setTitle(String title)
    {
        this.title = title;
    }
    public String getIcon()
    {
        return icon;
    }
    public void setIcon(String icon)
    {
        this.icon = icon;
    }
    public String getLink()
    {
        return link;
    }
    public void setLink(String link)
    {
        this.link = link;
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/vo/RouterVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
package com.se.system.domain.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.util.List;
/**
 * è·¯ç”±é…ç½®ä¿¡æ¯
 *
 * @author admin
 */
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class RouterVo
{
    /**
     * è·¯ç”±åå­—
     */
    private String name;
    /**
     * è·¯ç”±åœ°å€
     */
    private String path;
    /**
     * æ˜¯å¦éšè—è·¯ç”±ï¼Œå½“设置 true çš„æ—¶å€™è¯¥è·¯ç”±ä¸ä¼šå†ä¾§è¾¹æ å‡ºçް
     */
    private boolean hidden;
    /**
     * é‡å®šå‘地址,当设置 noRedirect çš„æ—¶å€™è¯¥è·¯ç”±åœ¨é¢åŒ…屑导航中不可被点击
     */
    private String redirect;
    /**
     * ç»„件地址
     */
    private String component;
    /**
     * è·¯ç”±å‚数:如 {"id": 1, "name": "ry"}
     */
    private String query;
    /**
     * å½“你一个路由下面的 children å£°æ˜Žçš„路由大于1个时,自动会变成嵌套的模式--如组件页面
     */
    private Boolean alwaysShow;
    /**
     * å…¶ä»–元素
     */
    private MetaVo meta;
    /**
     * å­è·¯ç”±
     */
    private List<RouterVo> children;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getPath()
    {
        return path;
    }
    public void setPath(String path)
    {
        this.path = path;
    }
    public boolean getHidden()
    {
        return hidden;
    }
    public void setHidden(boolean hidden)
    {
        this.hidden = hidden;
    }
    public String getRedirect()
    {
        return redirect;
    }
    public void setRedirect(String redirect)
    {
        this.redirect = redirect;
    }
    public String getComponent()
    {
        return component;
    }
    public void setComponent(String component)
    {
        this.component = component;
    }
    public String getQuery()
    {
        return query;
    }
    public void setQuery(String query)
    {
        this.query = query;
    }
    public Boolean getAlwaysShow()
    {
        return alwaysShow;
    }
    public void setAlwaysShow(Boolean alwaysShow)
    {
        this.alwaysShow = alwaysShow;
    }
    public MetaVo getMeta()
    {
        return meta;
    }
    public void setMeta(MetaVo meta)
    {
        this.meta = meta;
    }
    public List<RouterVo> getChildren()
    {
        return children;
    }
    public void setChildren(List<RouterVo> children)
    {
        this.children = children;
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/domain/vo/TreeSelect.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package com.se.system.domain.vo;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.se.system.api.domain.SysDept;
import com.se.system.domain.SysMenu;
/**
 * Treeselect树结构实体类
 *
 * @author admin
 */
public class TreeSelect implements Serializable
{
    private static final long serialVersionUID = 1L;
    /** èŠ‚ç‚¹ID */
    private Long id;
    /** èŠ‚ç‚¹åç§° */
    private String label;
    /** å­èŠ‚ç‚¹ */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private List<TreeSelect> children;
    public TreeSelect()
    {
    }
    public TreeSelect(SysDept dept)
    {
        this.id = dept.getDeptId();
        this.label = dept.getDeptName();
        this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
    }
    public TreeSelect(SysMenu menu)
    {
        this.id = menu.getMenuId();
        this.label = menu.getMenuName();
        this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
    }
    public Long getId()
    {
        return id;
    }
    public void setId(Long id)
    {
        this.id = id;
    }
    public String getLabel()
    {
        return label;
    }
    public void setLabel(String label)
    {
        this.label = label;
    }
    public List<TreeSelect> getChildren()
    {
        return children;
    }
    public void setChildren(List<TreeSelect> children)
    {
        this.children = children;
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysConfigMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.domain.SysConfig;
/**
 * å‚数配置 æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysConfigMapper
{
    /**
     * æŸ¥è¯¢å‚数配置信息
     *
     * @param config å‚数配置信息
     * @return å‚数配置信息
     */
    public SysConfig selectConfig(SysConfig config);
    /**
     * é€šè¿‡ID查询配置
     *
     * @param configId å‚æ•°ID
     * @return å‚数配置信息
     */
    public SysConfig selectConfigById(Long configId);
    /**
     * æŸ¥è¯¢å‚数配置列表
     *
     * @param config å‚数配置信息
     * @return å‚数配置集合
     */
    public List<SysConfig> selectConfigList(SysConfig config);
    /**
     * æ ¹æ®é”®åæŸ¥è¯¢å‚数配置信息
     *
     * @param configKey å‚数键名
     * @return å‚数配置信息
     */
    public SysConfig checkConfigKeyUnique(String configKey);
    /**
     * æ–°å¢žå‚数配置
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
    public int insertConfig(SysConfig config);
    /**
     * ä¿®æ”¹å‚数配置
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
    public int updateConfig(SysConfig config);
    /**
     * åˆ é™¤å‚数配置
     *
     * @param configId å‚æ•°ID
     * @return ç»“æžœ
     */
    public int deleteConfigById(Long configId);
    /**
     * æ‰¹é‡åˆ é™¤å‚数信息
     *
     * @param configIds éœ€è¦åˆ é™¤çš„参数ID
     * @return ç»“æžœ
     */
    public int deleteConfigByIds(Long[] configIds);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysDeptMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,118 @@
package com.se.system.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.se.system.api.domain.SysDept;
/**
 * éƒ¨é—¨ç®¡ç† æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysDeptMapper
{
    /**
     * æŸ¥è¯¢éƒ¨é—¨ç®¡ç†æ•°æ®
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return éƒ¨é—¨ä¿¡æ¯é›†åˆ
     */
    public List<SysDept> selectDeptList(SysDept dept);
    /**
     * æ ¹æ®è§’色ID查询部门树信息
     *
     * @param roleId è§’色ID
     * @param deptCheckStrictly éƒ¨é—¨æ ‘选择项是否关联显示
     * @return é€‰ä¸­éƒ¨é—¨åˆ—表
     */
    public List<Long> selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly);
    /**
     * æ ¹æ®éƒ¨é—¨ID查询信息
     *
     * @param deptId éƒ¨é—¨ID
     * @return éƒ¨é—¨ä¿¡æ¯
     */
    public SysDept selectDeptById(Long deptId);
    /**
     * æ ¹æ®ID查询所有子部门
     *
     * @param deptId éƒ¨é—¨ID
     * @return éƒ¨é—¨åˆ—表
     */
    public List<SysDept> selectChildrenDeptById(Long deptId);
    /**
     * æ ¹æ®ID查询所有子部门(正常状态)
     *
     * @param deptId éƒ¨é—¨ID
     * @return å­éƒ¨é—¨æ•°
     */
    public int selectNormalChildrenDeptById(Long deptId);
    /**
     * æ˜¯å¦å­˜åœ¨å­èŠ‚ç‚¹
     *
     * @param deptId éƒ¨é—¨ID
     * @return ç»“æžœ
     */
    public int hasChildByDeptId(Long deptId);
    /**
     * æŸ¥è¯¢éƒ¨é—¨æ˜¯å¦å­˜åœ¨ç”¨æˆ·
     *
     * @param deptId éƒ¨é—¨ID
     * @return ç»“æžœ
     */
    public int checkDeptExistUser(Long deptId);
    /**
     * æ ¡éªŒéƒ¨é—¨åç§°æ˜¯å¦å”¯ä¸€
     *
     * @param deptName éƒ¨é—¨åç§°
     * @param parentId çˆ¶éƒ¨é—¨ID
     * @return ç»“æžœ
     */
    public SysDept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") Long parentId);
    /**
     * æ–°å¢žéƒ¨é—¨ä¿¡æ¯
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertDept(SysDept dept);
    /**
     * ä¿®æ”¹éƒ¨é—¨ä¿¡æ¯
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateDept(SysDept dept);
    /**
     * ä¿®æ”¹æ‰€åœ¨éƒ¨é—¨æ­£å¸¸çŠ¶æ€
     *
     * @param deptIds éƒ¨é—¨ID组
     */
    public void updateDeptStatusNormal(Long[] deptIds);
    /**
     * ä¿®æ”¹å­å…ƒç´ å…³ç³»
     *
     * @param depts å­å…ƒç´ 
     * @return ç»“æžœ
     */
    public int updateDeptChildren(@Param("depts") List<SysDept> depts);
    /**
     * åˆ é™¤éƒ¨é—¨ç®¡ç†ä¿¡æ¯
     *
     * @param deptId éƒ¨é—¨ID
     * @return ç»“æžœ
     */
    public int deleteDeptById(Long deptId);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysDictDataMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,95 @@
package com.se.system.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.se.system.api.domain.SysDictData;
/**
 * å­—典表 æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysDictDataMapper
{
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å­—典数据
     *
     * @param dictData å­—典数据信息
     * @return å­—典数据集合信息
     */
    public List<SysDictData> selectDictDataList(SysDictData dictData);
    /**
     * æ ¹æ®å­—典类型查询字典数据
     *
     * @param dictType å­—典类型
     * @return å­—典数据集合信息
     */
    public List<SysDictData> selectDictDataByType(String dictType);
    /**
     * æ ¹æ®å­—典类型和字典键值查询字典数据信息
     *
     * @param dictType å­—典类型
     * @param dictValue å­—典键值
     * @return å­—典标签
     */
    public String selectDictLabel(@Param("dictType") String dictType, @Param("dictValue") String dictValue);
    /**
     * æ ¹æ®å­—典数据ID查询信息
     *
     * @param dictCode å­—典数据ID
     * @return å­—典数据
     */
    public SysDictData selectDictDataById(Long dictCode);
    /**
     * æŸ¥è¯¢å­—典数据
     *
     * @param dictType å­—典类型
     * @return å­—典数据
     */
    public int countDictDataByType(String dictType);
    /**
     * é€šè¿‡å­—å…¸ID删除字典数据信息
     *
     * @param dictCode å­—典数据ID
     * @return ç»“æžœ
     */
    public int deleteDictDataById(Long dictCode);
    /**
     * æ‰¹é‡åˆ é™¤å­—典数据信息
     *
     * @param dictCodes éœ€è¦åˆ é™¤çš„字典数据ID
     * @return ç»“æžœ
     */
    public int deleteDictDataByIds(Long[] dictCodes);
    /**
     * æ–°å¢žå­—典数据信息
     *
     * @param dictData å­—典数据信息
     * @return ç»“æžœ
     */
    public int insertDictData(SysDictData dictData);
    /**
     * ä¿®æ”¹å­—典数据信息
     *
     * @param dictData å­—典数据信息
     * @return ç»“æžœ
     */
    public int updateDictData(SysDictData dictData);
    /**
     * åŒæ­¥ä¿®æ”¹å­—典类型
     *
     * @param oldDictType æ—§å­—典类型
     * @param newDictType æ–°æ—§å­—典类型
     * @return ç»“æžœ
     */
    public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysDictTypeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.api.domain.SysDictType;
/**
 * å­—典表 æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysDictTypeMapper
{
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å­—典类型
     *
     * @param dictType å­—典类型信息
     * @return å­—典类型集合信息
     */
    public List<SysDictType> selectDictTypeList(SysDictType dictType);
    /**
     * æ ¹æ®æ‰€æœ‰å­—典类型
     *
     * @return å­—典类型集合信息
     */
    public List<SysDictType> selectDictTypeAll();
    /**
     * æ ¹æ®å­—典类型ID查询信息
     *
     * @param dictId å­—典类型ID
     * @return å­—典类型
     */
    public SysDictType selectDictTypeById(Long dictId);
    /**
     * æ ¹æ®å­—典类型查询信息
     *
     * @param dictType å­—典类型
     * @return å­—典类型
     */
    public SysDictType selectDictTypeByType(String dictType);
    /**
     * é€šè¿‡å­—å…¸ID删除字典信息
     *
     * @param dictId å­—å…¸ID
     * @return ç»“æžœ
     */
    public int deleteDictTypeById(Long dictId);
    /**
     * æ‰¹é‡åˆ é™¤å­—典类型信息
     *
     * @param dictIds éœ€è¦åˆ é™¤çš„å­—å…¸ID
     * @return ç»“æžœ
     */
    public int deleteDictTypeByIds(Long[] dictIds);
    /**
     * æ–°å¢žå­—典类型信息
     *
     * @param dictType å­—典类型信息
     * @return ç»“æžœ
     */
    public int insertDictType(SysDictType dictType);
    /**
     * ä¿®æ”¹å­—典类型信息
     *
     * @param dictType å­—典类型信息
     * @return ç»“æžœ
     */
    public int updateDictType(SysDictType dictType);
    /**
     * æ ¡éªŒå­—典类型称是否唯一
     *
     * @param dictType å­—典类型
     * @return ç»“æžœ
     */
    public SysDictType checkDictTypeUnique(String dictType);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysLogininforMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.api.domain.SysLogininfor;
/**
 * ç³»ç»Ÿè®¿é—®æ—¥å¿—情况信息 æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysLogininforMapper
{
    /**
     * æ–°å¢žç³»ç»Ÿç™»å½•日志
     *
     * @param logininfor è®¿é—®æ—¥å¿—对象
     */
    public int insertLogininfor(SysLogininfor logininfor);
    /**
     * æŸ¥è¯¢ç³»ç»Ÿç™»å½•日志集合
     *
     * @param logininfor è®¿é—®æ—¥å¿—对象
     * @return ç™»å½•记录集合
     */
    public List<SysLogininfor> selectLogininforList(SysLogininfor logininfor);
    /**
     * æ‰¹é‡åˆ é™¤ç³»ç»Ÿç™»å½•日志
     *
     * @param infoIds éœ€è¦åˆ é™¤çš„登录日志ID
     * @return ç»“æžœ
     */
    public int deleteLogininforByIds(Long[] infoIds);
    /**
     * æ¸…空系统登录日志
     *
     * @return ç»“æžœ
     */
    public int cleanLogininfor();
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysMenuMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.domain.SysMenu;
import org.apache.ibatis.annotations.Param;
/**
 * èœå•表 æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysMenuMapper
{
    /**
     * æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     * @param menu èœå•信息
     * @return èœå•列表
     */
    public List<SysMenu> selectMenuList(SysMenu menu);
    /**
     * æ ¹æ®ç”¨æˆ·æ‰€æœ‰æƒé™
     *
     * @return æƒé™åˆ—表
     */
    public List<String> selectMenuPerms();
    /**
     * æ ¹æ®ç”¨æˆ·æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     * @param menu èœå•信息
     * @return èœå•列表
     */
    public List<SysMenu> selectMenuListByUserId(SysMenu menu);
    /**
     * æ ¹æ®è§’色ID查询权限
     *
     * @param roleId è§’色ID
     * @return æƒé™åˆ—表
     */
    public List<String> selectMenuPermsByRoleId(Long roleId);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询权限
     *
     * @param userId ç”¨æˆ·ID
     * @return æƒé™åˆ—表
     */
    public List<String> selectMenuPermsByUserId(Long userId);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询菜单
     *
     * @return èœå•列表
     */
    public List<SysMenu> selectMenuTreeAll();
    /**
     * æ ¹æ®ç”¨æˆ·ID查询菜单
     *
     * @param userId ç”¨æˆ·ID
     * @return èœå•列表
     */
    public List<SysMenu> selectMenuTreeByUserId(Long userId);
    /**
     * æ ¹æ®è§’色ID查询菜单树信息
     *
     * @param roleId è§’色ID
     * @param menuCheckStrictly èœå•树选择项是否关联显示
     * @return é€‰ä¸­èœå•列表
     */
    public List<Long> selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly);
    /**
     * æ ¹æ®èœå•ID查询信息
     *
     * @param menuId èœå•ID
     * @return èœå•信息
     */
    public SysMenu selectMenuById(Long menuId);
    /**
     * æ˜¯å¦å­˜åœ¨èœå•子节点
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
    public int hasChildByMenuId(Long menuId);
    /**
     * æ–°å¢žèœå•信息
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public int insertMenu(SysMenu menu);
    /**
     * ä¿®æ”¹èœå•信息
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public int updateMenu(SysMenu menu);
    /**
     * åˆ é™¤èœå•管理信息
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
    public int deleteMenuById(Long menuId);
    /**
     * æ ¡éªŒèœå•名称是否唯一
     *
     * @param menuName èœå•名称
     * @param parentId çˆ¶èœå•ID
     * @return ç»“æžœ
     */
    public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysNoticeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.domain.SysNotice;
/**
 * é€šçŸ¥å…¬å‘Šè¡¨ æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysNoticeMapper
{
    /**
     * æŸ¥è¯¢å…¬å‘Šä¿¡æ¯
     *
     * @param noticeId å…¬å‘ŠID
     * @return å…¬å‘Šä¿¡æ¯
     */
    public SysNotice selectNoticeById(Long noticeId);
    /**
     * æŸ¥è¯¢å…¬å‘Šåˆ—表
     *
     * @param notice å…¬å‘Šä¿¡æ¯
     * @return å…¬å‘Šé›†åˆ
     */
    public List<SysNotice> selectNoticeList(SysNotice notice);
    /**
     * æ–°å¢žå…¬å‘Š
     *
     * @param notice å…¬å‘Šä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertNotice(SysNotice notice);
    /**
     * ä¿®æ”¹å…¬å‘Š
     *
     * @param notice å…¬å‘Šä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateNotice(SysNotice notice);
    /**
     * æ‰¹é‡åˆ é™¤å…¬å‘Š
     *
     * @param noticeId å…¬å‘ŠID
     * @return ç»“æžœ
     */
    public int deleteNoticeById(Long noticeId);
    /**
     * æ‰¹é‡åˆ é™¤å…¬å‘Šä¿¡æ¯
     *
     * @param noticeIds éœ€è¦åˆ é™¤çš„公告ID
     * @return ç»“æžœ
     */
    public int deleteNoticeByIds(Long[] noticeIds);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysOperLogMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.api.domain.SysOperLog;
/**
 * æ“ä½œæ—¥å¿— æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysOperLogMapper
{
    /**
     * æ–°å¢žæ“ä½œæ—¥å¿—
     *
     * @param operLog æ“ä½œæ—¥å¿—对象
     */
    public int insertOperlog(SysOperLog operLog);
    /**
     * æŸ¥è¯¢ç³»ç»Ÿæ“ä½œæ—¥å¿—集合
     *
     * @param operLog æ“ä½œæ—¥å¿—对象
     * @return æ“ä½œæ—¥å¿—集合
     */
    public List<SysOperLog> selectOperLogList(SysOperLog operLog);
    /**
     * æ‰¹é‡åˆ é™¤ç³»ç»Ÿæ“ä½œæ—¥å¿—
     *
     * @param operIds éœ€è¦åˆ é™¤çš„æ“ä½œæ—¥å¿—ID
     * @return ç»“æžœ
     */
    public int deleteOperLogByIds(Long[] operIds);
    /**
     * æŸ¥è¯¢æ“ä½œæ—¥å¿—详细
     *
     * @param operId æ“ä½œID
     * @return æ“ä½œæ—¥å¿—对象
     */
    public SysOperLog selectOperLogById(Long operId);
    /**
     * æ¸…空操作日志
     */
    public void cleanOperLog();
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysPostMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.domain.SysPost;
/**
 * å²—位信息 æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysPostMapper
{
    /**
     * æŸ¥è¯¢å²—位数据集合
     *
     * @param post å²—位信息
     * @return å²—位数据集合
     */
    public List<SysPost> selectPostList(SysPost post);
    /**
     * æŸ¥è¯¢æ‰€æœ‰å²—位
     *
     * @return å²—位列表
     */
    public List<SysPost> selectPostAll();
    /**
     * é€šè¿‡å²—位ID查询岗位信息
     *
     * @param postId å²—位ID
     * @return è§’色对象信息
     */
    public SysPost selectPostById(Long postId);
    /**
     * æ ¹æ®ç”¨æˆ·ID获取岗位选择框列表
     *
     * @param userId ç”¨æˆ·ID
     * @return é€‰ä¸­å²—位ID列表
     */
    public List<Long> selectPostListByUserId(Long userId);
    /**
     * æŸ¥è¯¢ç”¨æˆ·æ‰€å±žå²—位组
     *
     * @param userName ç”¨æˆ·å
     * @return ç»“æžœ
     */
    public List<SysPost> selectPostsByUserName(String userName);
    /**
     * åˆ é™¤å²—位信息
     *
     * @param postId å²—位ID
     * @return ç»“æžœ
     */
    public int deletePostById(Long postId);
    /**
     * æ‰¹é‡åˆ é™¤å²—位信息
     *
     * @param postIds éœ€è¦åˆ é™¤çš„岗位ID
     * @return ç»“æžœ
     */
    public int deletePostByIds(Long[] postIds);
    /**
     * ä¿®æ”¹å²—位信息
     *
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    public int updatePost(SysPost post);
    /**
     * æ–°å¢žå²—位信息
     *
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    public int insertPost(SysPost post);
    /**
     * æ ¡éªŒå²—位名称
     *
     * @param postName å²—位名称
     * @return ç»“æžœ
     */
    public SysPost checkPostNameUnique(String postName);
    /**
     * æ ¡éªŒå²—位编码
     *
     * @param postCode å²—位编码
     * @return ç»“æžœ
     */
    public SysPost checkPostCodeUnique(String postCode);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysRoleDeptMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.domain.SysRoleDept;
/**
 * è§’色与部门关联表 æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysRoleDeptMapper
{
    /**
     * é€šè¿‡è§’色ID删除角色和部门关联
     *
     * @param roleId è§’色ID
     * @return ç»“æžœ
     */
    public int deleteRoleDeptByRoleId(Long roleId);
    /**
     * æ‰¹é‡åˆ é™¤è§’色部门关联信息
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    public int deleteRoleDept(Long[] ids);
    /**
     * æŸ¥è¯¢éƒ¨é—¨ä½¿ç”¨æ•°é‡
     *
     * @param deptId éƒ¨é—¨ID
     * @return ç»“æžœ
     */
    public int selectCountRoleDeptByDeptId(Long deptId);
    /**
     * æ‰¹é‡æ–°å¢žè§’色部门信息
     *
     * @param roleDeptList è§’色部门列表
     * @return ç»“æžœ
     */
    public int batchRoleDept(List<SysRoleDept> roleDeptList);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysRoleMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.api.domain.SysRole;
/**
 * è§’色表 æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysRoleMapper
{
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢è§’色数据
     *
     * @param role è§’色信息
     * @return è§’色数据集合信息
     */
    public List<SysRole> selectRoleList(SysRole role);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询角色
     *
     * @param userId ç”¨æˆ·ID
     * @return è§’色列表
     */
    public List<SysRole> selectRolePermissionByUserId(Long userId);
    /**
     * æŸ¥è¯¢æ‰€æœ‰è§’色
     *
     * @return è§’色列表
     */
    public List<SysRole> selectRoleAll();
    /**
     * æ ¹æ®ç”¨æˆ·ID获取角色选择框列表
     *
     * @param userId ç”¨æˆ·ID
     * @return é€‰ä¸­è§’色ID列表
     */
    public List<Long> selectRoleListByUserId(Long userId);
    /**
     * é€šè¿‡è§’色ID查询角色
     *
     * @param roleId è§’色ID
     * @return è§’色对象信息
     */
    public SysRole selectRoleById(Long roleId);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询角色
     *
     * @param userName ç”¨æˆ·å
     * @return è§’色列表
     */
    public List<SysRole> selectRolesByUserName(String userName);
    /**
     * æ ¡éªŒè§’色名称是否唯一
     *
     * @param roleName è§’色名称
     * @return è§’色信息
     */
    public SysRole checkRoleNameUnique(String roleName);
    /**
     * æ ¡éªŒè§’色权限是否唯一
     *
     * @param roleKey è§’色权限
     * @return è§’色信息
     */
    public SysRole checkRoleKeyUnique(String roleKey);
    /**
     * ä¿®æ”¹è§’色信息
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    public int updateRole(SysRole role);
    /**
     * æ–°å¢žè§’色信息
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    public int insertRole(SysRole role);
    /**
     * é€šè¿‡è§’色ID删除角色
     *
     * @param roleId è§’色ID
     * @return ç»“æžœ
     */
    public int deleteRoleById(Long roleId);
    /**
     * æ‰¹é‡åˆ é™¤è§’色信息
     *
     * @param roleIds éœ€è¦åˆ é™¤çš„角色ID
     * @return ç»“æžœ
     */
    public int deleteRoleByIds(Long[] roleIds);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysRoleMenuMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.domain.SysRoleMenu;
/**
 * è§’色与菜单关联表 æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysRoleMenuMapper
{
    /**
     * æŸ¥è¯¢èœå•使用数量
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
    public int checkMenuExistRole(Long menuId);
    /**
     * é€šè¿‡è§’色ID删除角色和菜单关联
     *
     * @param roleId è§’色ID
     * @return ç»“æžœ
     */
    public int deleteRoleMenuByRoleId(Long roleId);
    /**
     * æ‰¹é‡åˆ é™¤è§’色菜单关联信息
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    public int deleteRoleMenu(Long[] ids);
    /**
     * æ‰¹é‡æ–°å¢žè§’色菜单信息
     *
     * @param roleMenuList è§’色菜单列表
     * @return ç»“æžœ
     */
    public int batchRoleMenu(List<SysRoleMenu> roleMenuList);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysUserMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,127 @@
package com.se.system.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.se.system.api.domain.SysUser;
/**
 * ç”¨æˆ·è¡¨ æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysUserMapper
{
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢ç”¨æˆ·åˆ—表
     *
     * @param sysUser ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    public List<SysUser> selectUserList(SysUser sysUser);
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å·²é…ç”¨æˆ·è§’色列表
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    public List<SysUser> selectAllocatedList(SysUser user);
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢æœªåˆ†é…ç”¨æˆ·è§’色列表
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    public List<SysUser> selectUnallocatedList(SysUser user);
    /**
     * é€šè¿‡ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·
     *
     * @param userName ç”¨æˆ·å
     * @return ç”¨æˆ·å¯¹è±¡ä¿¡æ¯
     */
    public SysUser selectUserByUserName(String userName);
    /**
     * é€šè¿‡ç”¨æˆ·ID查询用户
     *
     * @param userId ç”¨æˆ·ID
     * @return ç”¨æˆ·å¯¹è±¡ä¿¡æ¯
     */
    public SysUser selectUserById(Long userId);
    /**
     * æ–°å¢žç”¨æˆ·ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertUser(SysUser user);
    /**
     * ä¿®æ”¹ç”¨æˆ·ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateUser(SysUser user);
    /**
     * ä¿®æ”¹ç”¨æˆ·å¤´åƒ
     *
     * @param userName ç”¨æˆ·å
     * @param avatar å¤´åƒåœ°å€
     * @return ç»“æžœ
     */
    public int updateUserAvatar(@Param("userName") String userName, @Param("avatar") String avatar);
    /**
     * é‡ç½®ç”¨æˆ·å¯†ç 
     *
     * @param userName ç”¨æˆ·å
     * @param password å¯†ç 
     * @return ç»“æžœ
     */
    public int resetUserPwd(@Param("userName") String userName, @Param("password") String password);
    /**
     * é€šè¿‡ç”¨æˆ·ID删除用户
     *
     * @param userId ç”¨æˆ·ID
     * @return ç»“æžœ
     */
    public int deleteUserById(Long userId);
    /**
     * æ‰¹é‡åˆ é™¤ç”¨æˆ·ä¿¡æ¯
     *
     * @param userIds éœ€è¦åˆ é™¤çš„用户ID
     * @return ç»“æžœ
     */
    public int deleteUserByIds(Long[] userIds);
    /**
     * æ ¡éªŒç”¨æˆ·åç§°æ˜¯å¦å”¯ä¸€
     *
     * @param userName ç”¨æˆ·åç§°
     * @return ç»“æžœ
     */
    public SysUser checkUserNameUnique(String userName);
    /**
     * æ ¡éªŒæ‰‹æœºå·ç æ˜¯å¦å”¯ä¸€
     *
     * @param phonenumber æ‰‹æœºå·ç 
     * @return ç»“æžœ
     */
    public SysUser checkPhoneUnique(String phonenumber);
    /**
     * æ ¡éªŒemail是否唯一
     *
     * @param email ç”¨æˆ·é‚®ç®±
     * @return ç»“æžœ
     */
    public SysUser checkEmailUnique(String email);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysUserPostMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.domain.SysUserPost;
/**
 * ç”¨æˆ·ä¸Žå²—位关联表 æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysUserPostMapper
{
    /**
     * é€šè¿‡ç”¨æˆ·ID删除用户和岗位关联
     *
     * @param userId ç”¨æˆ·ID
     * @return ç»“æžœ
     */
    public int deleteUserPostByUserId(Long userId);
    /**
     * é€šè¿‡å²—位ID查询岗位使用数量
     *
     * @param postId å²—位ID
     * @return ç»“æžœ
     */
    public int countUserPostById(Long postId);
    /**
     * æ‰¹é‡åˆ é™¤ç”¨æˆ·å’Œå²—位关联
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    public int deleteUserPost(Long[] ids);
    /**
     * æ‰¹é‡æ–°å¢žç”¨æˆ·å²—位信息
     *
     * @param userPostList ç”¨æˆ·å²—位列表
     * @return ç»“æžœ
     */
    public int batchUserPost(List<SysUserPost> userPostList);
}
ruoyi-modules/se-system/src/main/java/com/se/system/mapper/SysUserRoleMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.domain.SysUserRole;
import org.apache.ibatis.annotations.Param;
/**
 * ç”¨æˆ·ä¸Žè§’色关联表 æ•°æ®å±‚
 *
 * @author admin
 */
public interface SysUserRoleMapper
{
    /**
     * é€šè¿‡ç”¨æˆ·ID删除用户和角色关联
     *
     * @param userId ç”¨æˆ·ID
     * @return ç»“æžœ
     */
    public int deleteUserRoleByUserId(Long userId);
    /**
     * æ‰¹é‡åˆ é™¤ç”¨æˆ·å’Œè§’色关联
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ID
     * @return ç»“æžœ
     */
    public int deleteUserRole(Long[] ids);
    /**
     * é€šè¿‡è§’色ID查询角色使用数量
     *
     * @param roleId è§’色ID
     * @return ç»“æžœ
     */
    public int countUserRoleByRoleId(Long roleId);
    /**
     * æ‰¹é‡æ–°å¢žç”¨æˆ·è§’色信息
     *
     * @param userRoleList ç”¨æˆ·è§’色列表
     * @return ç»“æžœ
     */
    public int batchUserRole(List<SysUserRole> userRoleList);
    /**
     * åˆ é™¤ç”¨æˆ·å’Œè§’色关联信息
     *
     * @param userRole ç”¨æˆ·å’Œè§’色关联信息
     * @return ç»“æžœ
     */
    public int deleteUserRoleInfo(SysUserRole userRole);
    /**
     * æ‰¹é‡å–消授权用户角色
     *
     * @param roleId è§’色ID
     * @param userIds éœ€è¦åˆ é™¤çš„用户数据ID
     * @return ç»“æžœ
     */
    public int deleteUserRoleInfos(@Param("roleId") Long roleId, @Param("userIds") Long[] userIds);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysConfigService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.se.system.service;
import java.util.List;
import com.se.system.domain.SysConfig;
/**
 * å‚数配置 æœåС层
 *
 * @author admin
 */
public interface ISysConfigService
{
    /**
     * æŸ¥è¯¢å‚数配置信息
     *
     * @param configId å‚数配置ID
     * @return å‚数配置信息
     */
    public SysConfig selectConfigById(Long configId);
    /**
     * æ ¹æ®é”®åæŸ¥è¯¢å‚数配置信息
     *
     * @param configKey å‚数键名
     * @return å‚数键值
     */
    public String selectConfigByKey(String configKey);
    /**
     * æŸ¥è¯¢å‚数配置列表
     *
     * @param config å‚数配置信息
     * @return å‚数配置集合
     */
    public List<SysConfig> selectConfigList(SysConfig config);
    /**
     * æ–°å¢žå‚数配置
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
    public int insertConfig(SysConfig config);
    /**
     * ä¿®æ”¹å‚数配置
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
    public int updateConfig(SysConfig config);
    /**
     * æ‰¹é‡åˆ é™¤å‚数信息
     *
     * @param configIds éœ€è¦åˆ é™¤çš„参数ID
     */
    public void deleteConfigByIds(Long[] configIds);
    /**
     * åŠ è½½å‚æ•°ç¼“å­˜æ•°æ®
     */
    public void loadingConfigCache();
    /**
     * æ¸…空参数缓存数据
     */
    public void clearConfigCache();
    /**
     * é‡ç½®å‚数缓存数据
     */
    public void resetConfigCache();
    /**
     * æ ¡éªŒå‚数键名是否唯一
     *
     * @param config å‚数信息
     * @return ç»“æžœ
     */
    public boolean checkConfigKeyUnique(SysConfig config);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysDeptService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
package com.se.system.service;
import java.util.List;
import com.se.system.api.domain.SysDept;
import com.se.system.domain.vo.TreeSelect;
/**
 * éƒ¨é—¨ç®¡ç† æœåС层
 *
 * @author admin
 */
public interface ISysDeptService
{
    /**
     * æŸ¥è¯¢éƒ¨é—¨ç®¡ç†æ•°æ®
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return éƒ¨é—¨ä¿¡æ¯é›†åˆ
     */
    public List<SysDept> selectDeptList(SysDept dept);
    /**
     * æŸ¥è¯¢éƒ¨é—¨æ ‘结构信息
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return éƒ¨é—¨æ ‘信息集合
     */
    public List<TreeSelect> selectDeptTreeList(SysDept dept);
    /**
     * æž„建前端所需要树结构
     *
     * @param depts éƒ¨é—¨åˆ—表
     * @return æ ‘结构列表
     */
    public List<SysDept> buildDeptTree(List<SysDept> depts);
    /**
     * æž„建前端所需要下拉树结构
     *
     * @param depts éƒ¨é—¨åˆ—表
     * @return ä¸‹æ‹‰æ ‘结构列表
     */
    public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts);
    /**
     * æ ¹æ®è§’色ID查询部门树信息
     *
     * @param roleId è§’色ID
     * @return é€‰ä¸­éƒ¨é—¨åˆ—表
     */
    public List<Long> selectDeptListByRoleId(Long roleId);
    /**
     * æ ¹æ®éƒ¨é—¨ID查询信息
     *
     * @param deptId éƒ¨é—¨ID
     * @return éƒ¨é—¨ä¿¡æ¯
     */
    public SysDept selectDeptById(Long deptId);
    /**
     * æ ¹æ®ID查询所有子部门(正常状态)
     *
     * @param deptId éƒ¨é—¨ID
     * @return å­éƒ¨é—¨æ•°
     */
    public int selectNormalChildrenDeptById(Long deptId);
    /**
     * æ˜¯å¦å­˜åœ¨éƒ¨é—¨å­èŠ‚ç‚¹
     *
     * @param deptId éƒ¨é—¨ID
     * @return ç»“æžœ
     */
    public boolean hasChildByDeptId(Long deptId);
    /**
     * æŸ¥è¯¢éƒ¨é—¨æ˜¯å¦å­˜åœ¨ç”¨æˆ·
     *
     * @param deptId éƒ¨é—¨ID
     * @return ç»“æžœ true å­˜åœ¨ false ä¸å­˜åœ¨
     */
    public boolean checkDeptExistUser(Long deptId);
    /**
     * æ ¡éªŒéƒ¨é—¨åç§°æ˜¯å¦å”¯ä¸€
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return ç»“æžœ
     */
    public boolean checkDeptNameUnique(SysDept dept);
    /**
     * æ ¡éªŒéƒ¨é—¨æ˜¯å¦æœ‰æ•°æ®æƒé™
     *
     * @param deptId éƒ¨é—¨id
     */
    public void checkDeptDataScope(Long deptId);
    /**
     * æ–°å¢žä¿å­˜éƒ¨é—¨ä¿¡æ¯
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertDept(SysDept dept);
    /**
     * ä¿®æ”¹ä¿å­˜éƒ¨é—¨ä¿¡æ¯
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateDept(SysDept dept);
    /**
     * åˆ é™¤éƒ¨é—¨ç®¡ç†ä¿¡æ¯
     *
     * @param deptId éƒ¨é—¨ID
     * @return ç»“æžœ
     */
    public int deleteDeptById(Long deptId);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysDictDataService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.se.system.service;
import java.util.List;
import com.se.system.api.domain.SysDictData;
/**
 * å­—å…¸ ä¸šåС层
 *
 * @author admin
 */
public interface ISysDictDataService
{
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å­—典数据
     *
     * @param dictData å­—典数据信息
     * @return å­—典数据集合信息
     */
    public List<SysDictData> selectDictDataList(SysDictData dictData);
    /**
     * æ ¹æ®å­—典类型和字典键值查询字典数据信息
     *
     * @param dictType å­—典类型
     * @param dictValue å­—典键值
     * @return å­—典标签
     */
    public String selectDictLabel(String dictType, String dictValue);
    /**
     * æ ¹æ®å­—典数据ID查询信息
     *
     * @param dictCode å­—典数据ID
     * @return å­—典数据
     */
    public SysDictData selectDictDataById(Long dictCode);
    /**
     * æ‰¹é‡åˆ é™¤å­—典数据信息
     *
     * @param dictCodes éœ€è¦åˆ é™¤çš„字典数据ID
     */
    public void deleteDictDataByIds(Long[] dictCodes);
    /**
     * æ–°å¢žä¿å­˜å­—典数据信息
     *
     * @param dictData å­—典数据信息
     * @return ç»“æžœ
     */
    public int insertDictData(SysDictData dictData);
    /**
     * ä¿®æ”¹ä¿å­˜å­—典数据信息
     *
     * @param dictData å­—典数据信息
     * @return ç»“æžœ
     */
    public int updateDictData(SysDictData dictData);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysDictTypeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
package com.se.system.service;
import java.util.List;
import com.se.system.api.domain.SysDictData;
import com.se.system.api.domain.SysDictType;
/**
 * å­—å…¸ ä¸šåС层
 *
 * @author admin
 */
public interface ISysDictTypeService
{
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å­—典类型
     *
     * @param dictType å­—典类型信息
     * @return å­—典类型集合信息
     */
    public List<SysDictType> selectDictTypeList(SysDictType dictType);
    /**
     * æ ¹æ®æ‰€æœ‰å­—典类型
     *
     * @return å­—典类型集合信息
     */
    public List<SysDictType> selectDictTypeAll();
    /**
     * æ ¹æ®å­—典类型查询字典数据
     *
     * @param dictType å­—典类型
     * @return å­—典数据集合信息
     */
    public List<SysDictData> selectDictDataByType(String dictType);
    /**
     * æ ¹æ®å­—典类型ID查询信息
     *
     * @param dictId å­—典类型ID
     * @return å­—典类型
     */
    public SysDictType selectDictTypeById(Long dictId);
    /**
     * æ ¹æ®å­—典类型查询信息
     *
     * @param dictType å­—典类型
     * @return å­—典类型
     */
    public SysDictType selectDictTypeByType(String dictType);
    /**
     * æ‰¹é‡åˆ é™¤å­—典信息
     *
     * @param dictIds éœ€è¦åˆ é™¤çš„å­—å…¸ID
     */
    public void deleteDictTypeByIds(Long[] dictIds);
    /**
     * åŠ è½½å­—å…¸ç¼“å­˜æ•°æ®
     */
    public void loadingDictCache();
    /**
     * æ¸…空字典缓存数据
     */
    public void clearDictCache();
    /**
     * é‡ç½®å­—典缓存数据
     */
    public void resetDictCache();
    /**
     * æ–°å¢žä¿å­˜å­—典类型信息
     *
     * @param dictType å­—典类型信息
     * @return ç»“æžœ
     */
    public int insertDictType(SysDictType dictType);
    /**
     * ä¿®æ”¹ä¿å­˜å­—典类型信息
     *
     * @param dictType å­—典类型信息
     * @return ç»“æžœ
     */
    public int updateDictType(SysDictType dictType);
    /**
     * æ ¡éªŒå­—典类型称是否唯一
     *
     * @param dictType å­—典类型
     * @return ç»“æžœ
     */
    public boolean checkDictTypeUnique(SysDictType dictType);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysLogininforService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.se.system.service;
import java.util.List;
import com.se.system.api.domain.SysLogininfor;
/**
 * ç³»ç»Ÿè®¿é—®æ—¥å¿—情况信息 æœåС层
 *
 * @author admin
 */
public interface ISysLogininforService
{
    /**
     * æ–°å¢žç³»ç»Ÿç™»å½•日志
     *
     * @param logininfor è®¿é—®æ—¥å¿—对象
     */
    public int insertLogininfor(SysLogininfor logininfor);
    /**
     * æŸ¥è¯¢ç³»ç»Ÿç™»å½•日志集合
     *
     * @param logininfor è®¿é—®æ—¥å¿—对象
     * @return ç™»å½•记录集合
     */
    public List<SysLogininfor> selectLogininforList(SysLogininfor logininfor);
    /**
     * æ‰¹é‡åˆ é™¤ç³»ç»Ÿç™»å½•日志
     *
     * @param infoIds éœ€è¦åˆ é™¤çš„登录日志ID
     * @return ç»“æžœ
     */
    public int deleteLogininforByIds(Long[] infoIds);
    /**
     * æ¸…空系统登录日志
     */
    public void cleanLogininfor();
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysMenuService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,144 @@
package com.se.system.service;
import java.util.List;
import java.util.Set;
import com.se.system.domain.SysMenu;
import com.se.system.domain.vo.RouterVo;
import com.se.system.domain.vo.TreeSelect;
/**
 * èœå• ä¸šåС层
 *
 * @author admin
 */
public interface ISysMenuService
{
    /**
     * æ ¹æ®ç”¨æˆ·æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     * @param userId ç”¨æˆ·ID
     * @return èœå•列表
     */
    public List<SysMenu> selectMenuList(Long userId);
    /**
     * æ ¹æ®ç”¨æˆ·æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     * @param menu èœå•信息
     * @param userId ç”¨æˆ·ID
     * @return èœå•列表
     */
    public List<SysMenu> selectMenuList(SysMenu menu, Long userId);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询权限
     *
     * @param userId ç”¨æˆ·ID
     * @return æƒé™åˆ—表
     */
    public Set<String> selectMenuPermsByUserId(Long userId);
    /**
     * æ ¹æ®è§’色ID查询权限
     *
     * @param roleId è§’色ID
     * @return æƒé™åˆ—表
     */
    public Set<String> selectMenuPermsByRoleId(Long roleId);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询菜单树信息
     *
     * @param userId ç”¨æˆ·ID
     * @return èœå•列表
     */
    public List<SysMenu> selectMenuTreeByUserId(Long userId);
    /**
     * æ ¹æ®è§’色ID查询菜单树信息
     *
     * @param roleId è§’色ID
     * @return é€‰ä¸­èœå•列表
     */
    public List<Long> selectMenuListByRoleId(Long roleId);
    /**
     * æž„建前端路由所需要的菜单
     *
     * @param menus èœå•列表
     * @return è·¯ç”±åˆ—表
     */
    public List<RouterVo> buildMenus(List<SysMenu> menus);
    /**
     * æž„建前端所需要树结构
     *
     * @param menus èœå•列表
     * @return æ ‘结构列表
     */
    public List<SysMenu> buildMenuTree(List<SysMenu> menus);
    /**
     * æž„建前端所需要下拉树结构
     *
     * @param menus èœå•列表
     * @return ä¸‹æ‹‰æ ‘结构列表
     */
    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus);
    /**
     * æ ¹æ®èœå•ID查询信息
     *
     * @param menuId èœå•ID
     * @return èœå•信息
     */
    public SysMenu selectMenuById(Long menuId);
    /**
     * æ˜¯å¦å­˜åœ¨èœå•子节点
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ true å­˜åœ¨ false ä¸å­˜åœ¨
     */
    public boolean hasChildByMenuId(Long menuId);
    /**
     * æŸ¥è¯¢èœå•是否存在角色
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ true å­˜åœ¨ false ä¸å­˜åœ¨
     */
    public boolean checkMenuExistRole(Long menuId);
    /**
     * æ–°å¢žä¿å­˜èœå•信息
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public int insertMenu(SysMenu menu);
    /**
     * ä¿®æ”¹ä¿å­˜èœå•信息
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public int updateMenu(SysMenu menu);
    /**
     * åˆ é™¤èœå•管理信息
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
    public int deleteMenuById(Long menuId);
    /**
     * æ ¡éªŒèœå•名称是否唯一
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public boolean checkMenuNameUnique(SysMenu menu);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysNoticeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.se.system.service;
import java.util.List;
import com.se.system.domain.SysNotice;
/**
 * å…¬å‘Š æœåŠ¡å±‚
 *
 * @author admin
 */
public interface ISysNoticeService
{
    /**
     * æŸ¥è¯¢å…¬å‘Šä¿¡æ¯
     *
     * @param noticeId å…¬å‘ŠID
     * @return å…¬å‘Šä¿¡æ¯
     */
    public SysNotice selectNoticeById(Long noticeId);
    /**
     * æŸ¥è¯¢å…¬å‘Šåˆ—表
     *
     * @param notice å…¬å‘Šä¿¡æ¯
     * @return å…¬å‘Šé›†åˆ
     */
    public List<SysNotice> selectNoticeList(SysNotice notice);
    /**
     * æ–°å¢žå…¬å‘Š
     *
     * @param notice å…¬å‘Šä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertNotice(SysNotice notice);
    /**
     * ä¿®æ”¹å…¬å‘Š
     *
     * @param notice å…¬å‘Šä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateNotice(SysNotice notice);
    /**
     * åˆ é™¤å…¬å‘Šä¿¡æ¯
     *
     * @param noticeId å…¬å‘ŠID
     * @return ç»“æžœ
     */
    public int deleteNoticeById(Long noticeId);
    /**
     * æ‰¹é‡åˆ é™¤å…¬å‘Šä¿¡æ¯
     *
     * @param noticeIds éœ€è¦åˆ é™¤çš„公告ID
     * @return ç»“æžœ
     */
    public int deleteNoticeByIds(Long[] noticeIds);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysOperLogService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.se.system.service;
import java.util.List;
import com.se.system.api.domain.SysOperLog;
/**
 * æ“ä½œæ—¥å¿— æœåС层
 *
 * @author admin
 */
public interface ISysOperLogService
{
    /**
     * æ–°å¢žæ“ä½œæ—¥å¿—
     *
     * @param operLog æ“ä½œæ—¥å¿—对象
     * @return ç»“æžœ
     */
    public int insertOperlog(SysOperLog operLog);
    /**
     * æŸ¥è¯¢ç³»ç»Ÿæ“ä½œæ—¥å¿—集合
     *
     * @param operLog æ“ä½œæ—¥å¿—对象
     * @return æ“ä½œæ—¥å¿—集合
     */
    public List<SysOperLog> selectOperLogList(SysOperLog operLog);
    /**
     * æ‰¹é‡åˆ é™¤ç³»ç»Ÿæ“ä½œæ—¥å¿—
     *
     * @param operIds éœ€è¦åˆ é™¤çš„æ“ä½œæ—¥å¿—ID
     * @return ç»“æžœ
     */
    public int deleteOperLogByIds(Long[] operIds);
    /**
     * æŸ¥è¯¢æ“ä½œæ—¥å¿—详细
     *
     * @param operId æ“ä½œID
     * @return æ“ä½œæ—¥å¿—对象
     */
    public SysOperLog selectOperLogById(Long operId);
    /**
     * æ¸…空操作日志
     */
    public void cleanOperLog();
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysPermissionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.se.system.service;
import java.util.Set;
import com.se.system.api.domain.SysUser;
/**
 * æƒé™ä¿¡æ¯ æœåС层
 *
 * @author admin
 */
public interface ISysPermissionService
{
    /**
     * èŽ·å–è§’è‰²æ•°æ®æƒé™
     *
     * @param userId ç”¨æˆ·Id
     * @return è§’色权限信息
     */
    public Set<String> getRolePermission(SysUser user);
    /**
     * èŽ·å–èœå•æ•°æ®æƒé™
     *
     * @param userId ç”¨æˆ·Id
     * @return èœå•权限信息
     */
    public Set<String> getMenuPermission(SysUser user);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysPostService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
package com.se.system.service;
import java.util.List;
import com.se.system.domain.SysPost;
/**
 * å²—位信息 æœåС层
 *
 * @author admin
 */
public interface ISysPostService
{
    /**
     * æŸ¥è¯¢å²—位信息集合
     *
     * @param post å²—位信息
     * @return å²—位列表
     */
    public List<SysPost> selectPostList(SysPost post);
    /**
     * æŸ¥è¯¢æ‰€æœ‰å²—位
     *
     * @return å²—位列表
     */
    public List<SysPost> selectPostAll();
    /**
     * é€šè¿‡å²—位ID查询岗位信息
     *
     * @param postId å²—位ID
     * @return è§’色对象信息
     */
    public SysPost selectPostById(Long postId);
    /**
     * æ ¹æ®ç”¨æˆ·ID获取岗位选择框列表
     *
     * @param userId ç”¨æˆ·ID
     * @return é€‰ä¸­å²—位ID列表
     */
    public List<Long> selectPostListByUserId(Long userId);
    /**
     * æ ¡éªŒå²—位名称
     *
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    public boolean checkPostNameUnique(SysPost post);
    /**
     * æ ¡éªŒå²—位编码
     *
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    public boolean checkPostCodeUnique(SysPost post);
    /**
     * é€šè¿‡å²—位ID查询岗位使用数量
     *
     * @param postId å²—位ID
     * @return ç»“æžœ
     */
    public int countUserPostById(Long postId);
    /**
     * åˆ é™¤å²—位信息
     *
     * @param postId å²—位ID
     * @return ç»“æžœ
     */
    public int deletePostById(Long postId);
    /**
     * æ‰¹é‡åˆ é™¤å²—位信息
     *
     * @param postIds éœ€è¦åˆ é™¤çš„岗位ID
     * @return ç»“æžœ
     */
    public int deletePostByIds(Long[] postIds);
    /**
     * æ–°å¢žä¿å­˜å²—位信息
     *
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    public int insertPost(SysPost post);
    /**
     * ä¿®æ”¹ä¿å­˜å²—位信息
     *
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    public int updatePost(SysPost post);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysRoleService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,173 @@
package com.se.system.service;
import java.util.List;
import java.util.Set;
import com.se.system.api.domain.SysRole;
import com.se.system.domain.SysUserRole;
/**
 * è§’色业务层
 *
 * @author admin
 */
public interface ISysRoleService
{
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢è§’色数据
     *
     * @param role è§’色信息
     * @return è§’色数据集合信息
     */
    public List<SysRole> selectRoleList(SysRole role);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询角色列表
     *
     * @param userId ç”¨æˆ·ID
     * @return è§’色列表
     */
    public List<SysRole> selectRolesByUserId(Long userId);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询角色权限
     *
     * @param userId ç”¨æˆ·ID
     * @return æƒé™åˆ—表
     */
    public Set<String> selectRolePermissionByUserId(Long userId);
    /**
     * æŸ¥è¯¢æ‰€æœ‰è§’色
     *
     * @return è§’色列表
     */
    public List<SysRole> selectRoleAll();
    /**
     * æ ¹æ®ç”¨æˆ·ID获取角色选择框列表
     *
     * @param userId ç”¨æˆ·ID
     * @return é€‰ä¸­è§’色ID列表
     */
    public List<Long> selectRoleListByUserId(Long userId);
    /**
     * é€šè¿‡è§’色ID查询角色
     *
     * @param roleId è§’色ID
     * @return è§’色对象信息
     */
    public SysRole selectRoleById(Long roleId);
    /**
     * æ ¡éªŒè§’色名称是否唯一
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    public boolean checkRoleNameUnique(SysRole role);
    /**
     * æ ¡éªŒè§’色权限是否唯一
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    public boolean checkRoleKeyUnique(SysRole role);
    /**
     * æ ¡éªŒè§’色是否允许操作
     *
     * @param role è§’色信息
     */
    public void checkRoleAllowed(SysRole role);
    /**
     * æ ¡éªŒè§’色是否有数据权限
     *
     * @param roleIds è§’色id
     */
    public void checkRoleDataScope(Long... roleIds);
    /**
     * é€šè¿‡è§’色ID查询角色使用数量
     *
     * @param roleId è§’色ID
     * @return ç»“æžœ
     */
    public int countUserRoleByRoleId(Long roleId);
    /**
     * æ–°å¢žä¿å­˜è§’色信息
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    public int insertRole(SysRole role);
    /**
     * ä¿®æ”¹ä¿å­˜è§’色信息
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    public int updateRole(SysRole role);
    /**
     * ä¿®æ”¹è§’色状态
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    public int updateRoleStatus(SysRole role);
    /**
     * ä¿®æ”¹æ•°æ®æƒé™ä¿¡æ¯
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    public int authDataScope(SysRole role);
    /**
     * é€šè¿‡è§’色ID删除角色
     *
     * @param roleId è§’色ID
     * @return ç»“æžœ
     */
    public int deleteRoleById(Long roleId);
    /**
     * æ‰¹é‡åˆ é™¤è§’色信息
     *
     * @param roleIds éœ€è¦åˆ é™¤çš„角色ID
     * @return ç»“æžœ
     */
    public int deleteRoleByIds(Long[] roleIds);
    /**
     * å–消授权用户角色
     *
     * @param userRole ç”¨æˆ·å’Œè§’色关联信息
     * @return ç»“æžœ
     */
    public int deleteAuthUser(SysUserRole userRole);
    /**
     * æ‰¹é‡å–消授权用户角色
     *
     * @param roleId è§’色ID
     * @param userIds éœ€è¦å–消授权的用户数据ID
     * @return ç»“æžœ
     */
    public int deleteAuthUsers(Long roleId, Long[] userIds);
    /**
     * æ‰¹é‡é€‰æ‹©æŽˆæƒç”¨æˆ·è§’色
     *
     * @param roleId è§’色ID
     * @param userIds éœ€è¦åˆ é™¤çš„用户数据ID
     * @return ç»“æžœ
     */
    public int insertAuthUsers(Long roleId, Long[] userIds);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysUserOnlineService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.se.system.service;
import com.se.system.api.model.LoginUser;
import com.se.system.domain.SysUserOnline;
/**
 * åœ¨çº¿ç”¨æˆ· æœåС层
 *
 * @author admin
 */
public interface ISysUserOnlineService
{
    /**
     * é€šè¿‡ç™»å½•地址查询信息
     *
     * @param ipaddr ç™»å½•地址
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return åœ¨çº¿ç”¨æˆ·ä¿¡æ¯
     */
    public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user);
    /**
     * é€šè¿‡ç”¨æˆ·åç§°æŸ¥è¯¢ä¿¡æ¯
     *
     * @param userName ç”¨æˆ·åç§°
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return åœ¨çº¿ç”¨æˆ·ä¿¡æ¯
     */
    public SysUserOnline selectOnlineByUserName(String userName, LoginUser user);
    /**
     * é€šè¿‡ç™»å½•地址/用户名称查询信息
     *
     * @param ipaddr ç™»å½•地址
     * @param userName ç”¨æˆ·åç§°
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return åœ¨çº¿ç”¨æˆ·ä¿¡æ¯
     */
    public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user);
    /**
     * è®¾ç½®åœ¨çº¿ç”¨æˆ·ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return åœ¨çº¿ç”¨æˆ·
     */
    public SysUserOnline loginUserToUserOnline(LoginUser user);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/ISysUserService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,206 @@
package com.se.system.service;
import java.util.List;
import com.se.system.api.domain.SysUser;
/**
 * ç”¨æˆ· ä¸šåС层
 *
 * @author admin
 */
public interface ISysUserService
{
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢ç”¨æˆ·åˆ—表
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    public List<SysUser> selectUserList(SysUser user);
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å·²åˆ†é…ç”¨æˆ·è§’色列表
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    public List<SysUser> selectAllocatedList(SysUser user);
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢æœªåˆ†é…ç”¨æˆ·è§’色列表
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    public List<SysUser> selectUnallocatedList(SysUser user);
    /**
     * é€šè¿‡ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·
     *
     * @param userName ç”¨æˆ·å
     * @return ç”¨æˆ·å¯¹è±¡ä¿¡æ¯
     */
    public SysUser selectUserByUserName(String userName);
    /**
     * é€šè¿‡ç”¨æˆ·ID查询用户
     *
     * @param userId ç”¨æˆ·ID
     * @return ç”¨æˆ·å¯¹è±¡ä¿¡æ¯
     */
    public SysUser selectUserById(Long userId);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询用户所属角色组
     *
     * @param userName ç”¨æˆ·å
     * @return ç»“æžœ
     */
    public String selectUserRoleGroup(String userName);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询用户所属岗位组
     *
     * @param userName ç”¨æˆ·å
     * @return ç»“æžœ
     */
    public String selectUserPostGroup(String userName);
    /**
     * æ ¡éªŒç”¨æˆ·åç§°æ˜¯å¦å”¯ä¸€
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    public boolean checkUserNameUnique(SysUser user);
    /**
     * æ ¡éªŒæ‰‹æœºå·ç æ˜¯å¦å”¯ä¸€
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    public boolean checkPhoneUnique(SysUser user);
    /**
     * æ ¡éªŒemail是否唯一
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    public boolean checkEmailUnique(SysUser user);
    /**
     * æ ¡éªŒç”¨æˆ·æ˜¯å¦å…è®¸æ“ä½œ
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     */
    public void checkUserAllowed(SysUser user);
    /**
     * æ ¡éªŒç”¨æˆ·æ˜¯å¦æœ‰æ•°æ®æƒé™
     *
     * @param userId ç”¨æˆ·id
     */
    public void checkUserDataScope(Long userId);
    /**
     * æ–°å¢žç”¨æˆ·ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int insertUser(SysUser user);
    /**
     * æ³¨å†Œç”¨æˆ·ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    public boolean registerUser(SysUser user);
    /**
     * ä¿®æ”¹ç”¨æˆ·ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateUser(SysUser user);
    /**
     * ç”¨æˆ·æŽˆæƒè§’色
     *
     * @param userId ç”¨æˆ·ID
     * @param roleIds è§’色组
     */
    public void insertUserAuth(Long userId, Long[] roleIds);
    /**
     * ä¿®æ”¹ç”¨æˆ·çŠ¶æ€
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int updateUserStatus(SysUser user);
    /**
     * ä¿®æ”¹ç”¨æˆ·åŸºæœ¬ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    public boolean updateUserProfile(SysUser user);
    /**
     * ä¿®æ”¹ç”¨æˆ·å¤´åƒ
     *
     * @param userName ç”¨æˆ·å
     * @param avatar å¤´åƒåœ°å€
     * @return ç»“æžœ
     */
    public boolean updateUserAvatar(String userName, String avatar);
    /**
     * é‡ç½®ç”¨æˆ·å¯†ç 
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    public int resetPwd(SysUser user);
    /**
     * é‡ç½®ç”¨æˆ·å¯†ç 
     *
     * @param userName ç”¨æˆ·å
     * @param password å¯†ç 
     * @return ç»“æžœ
     */
    public int resetUserPwd(String userName, String password);
    /**
     * é€šè¿‡ç”¨æˆ·ID删除用户
     *
     * @param userId ç”¨æˆ·ID
     * @return ç»“æžœ
     */
    public int deleteUserById(Long userId);
    /**
     * æ‰¹é‡åˆ é™¤ç”¨æˆ·ä¿¡æ¯
     *
     * @param userIds éœ€è¦åˆ é™¤çš„用户ID
     * @return ç»“æžœ
     */
    public int deleteUserByIds(Long[] userIds);
    /**
     * å¯¼å…¥ç”¨æˆ·æ•°æ®
     *
     * @param userList ç”¨æˆ·æ•°æ®åˆ—表
     * @param isUpdateSupport æ˜¯å¦æ›´æ–°æ”¯æŒï¼Œå¦‚果已存在,则进行更新数据
     * @param operName æ“ä½œç”¨æˆ·
     * @return ç»“æžœ
     */
    public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysConfigServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,214 @@
package com.se.system.service.impl;
import java.util.Collection;
import java.util.List;
import javax.annotation.PostConstruct;
import com.se.system.domain.SysConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.se.common.core.constant.CacheConstants;
import com.se.common.core.constant.UserConstants;
import com.se.common.core.exception.ServiceException;
import com.se.common.core.text.Convert;
import com.se.common.core.utils.StringUtils;
import com.se.common.redis.service.RedisService;
import com.se.system.mapper.SysConfigMapper;
import com.se.system.service.ISysConfigService;
/**
 * å‚数配置 æœåŠ¡å±‚å®žçŽ°
 *
 * @author admin
 */
@Service
public class SysConfigServiceImpl implements ISysConfigService
{
    @Autowired
    private SysConfigMapper configMapper;
    @Autowired
    private RedisService redisService;
    /**
     * é¡¹ç›®å¯åŠ¨æ—¶ï¼Œåˆå§‹åŒ–å‚æ•°åˆ°ç¼“å­˜
     */
    @PostConstruct
    public void init()
    {
        loadingConfigCache();
    }
    /**
     * æŸ¥è¯¢å‚数配置信息
     *
     * @param configId å‚数配置ID
     * @return å‚数配置信息
     */
    @Override
    public SysConfig selectConfigById(Long configId)
    {
        SysConfig config = new SysConfig();
        config.setConfigId(configId);
        return configMapper.selectConfig(config);
    }
    /**
     * æ ¹æ®é”®åæŸ¥è¯¢å‚数配置信息
     *
     * @param configKey å‚æ•°key
     * @return å‚数键值
     */
    @Override
    public String selectConfigByKey(String configKey)
    {
        String configValue = Convert.toStr(redisService.getCacheObject(getCacheKey(configKey)));
        if (StringUtils.isNotEmpty(configValue))
        {
            return configValue;
        }
        SysConfig config = new SysConfig();
        config.setConfigKey(configKey);
        SysConfig retConfig = configMapper.selectConfig(config);
        if (StringUtils.isNotNull(retConfig))
        {
            redisService.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
            return retConfig.getConfigValue();
        }
        return StringUtils.EMPTY;
    }
    /**
     * æŸ¥è¯¢å‚数配置列表
     *
     * @param config å‚数配置信息
     * @return å‚数配置集合
     */
    @Override
    public List<SysConfig> selectConfigList(SysConfig config)
    {
        return configMapper.selectConfigList(config);
    }
    /**
     * æ–°å¢žå‚数配置
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
    @Override
    public int insertConfig(SysConfig config)
    {
        int row = configMapper.insertConfig(config);
        if (row > 0)
        {
            redisService.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
        }
        return row;
    }
    /**
     * ä¿®æ”¹å‚数配置
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
    @Override
    public int updateConfig(SysConfig config)
    {
        SysConfig temp = configMapper.selectConfigById(config.getConfigId());
        if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey()))
        {
            redisService.deleteObject(getCacheKey(temp.getConfigKey()));
        }
        int row = configMapper.updateConfig(config);
        if (row > 0)
        {
            redisService.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
        }
        return row;
    }
    /**
     * æ‰¹é‡åˆ é™¤å‚数信息
     *
     * @param configIds éœ€è¦åˆ é™¤çš„参数ID
     */
    @Override
    public void deleteConfigByIds(Long[] configIds)
    {
        for (Long configId : configIds)
        {
            SysConfig config = selectConfigById(configId);
            if (StringUtils.equals(UserConstants.YES, config.getConfigType()))
            {
                throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey()));
            }
            configMapper.deleteConfigById(configId);
            redisService.deleteObject(getCacheKey(config.getConfigKey()));
        }
    }
    /**
     * åŠ è½½å‚æ•°ç¼“å­˜æ•°æ®
     */
    @Override
    public void loadingConfigCache()
    {
        List<SysConfig> configsList = configMapper.selectConfigList(new SysConfig());
        for (SysConfig config : configsList)
        {
            redisService.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
        }
    }
    /**
     * æ¸…空参数缓存数据
     */
    @Override
    public void clearConfigCache()
    {
        Collection<String> keys = redisService.keys(CacheConstants.SYS_CONFIG_KEY + "*");
        redisService.deleteObject(keys);
    }
    /**
     * é‡ç½®å‚数缓存数据
     */
    @Override
    public void resetConfigCache()
    {
        clearConfigCache();
        loadingConfigCache();
    }
    /**
     * æ ¡éªŒå‚数键名是否唯一
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
    @Override
    public boolean checkConfigKeyUnique(SysConfig config)
    {
        Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId();
        SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey());
        if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
    /**
     * è®¾ç½®cache key
     *
     * @param configKey å‚æ•°é”®
     * @return ç¼“存键key
     */
    private String getCacheKey(String configKey)
    {
        return CacheConstants.SYS_CONFIG_KEY + configKey;
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysDeptServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,338 @@
package com.se.system.service.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.se.common.core.constant.UserConstants;
import com.se.common.core.exception.ServiceException;
import com.se.common.core.text.Convert;
import com.se.common.core.utils.SpringUtils;
import com.se.common.core.utils.StringUtils;
import com.se.common.datascope.annotation.DataScope;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.domain.SysDept;
import com.se.system.api.domain.SysRole;
import com.se.system.api.domain.SysUser;
import com.se.system.domain.vo.TreeSelect;
import com.se.system.mapper.SysDeptMapper;
import com.se.system.mapper.SysRoleMapper;
import com.se.system.service.ISysDeptService;
/**
 * éƒ¨é—¨ç®¡ç† æœåŠ¡å®žçŽ°
 *
 * @author admin
 */
@Service
public class SysDeptServiceImpl implements ISysDeptService
{
    @Autowired
    private SysDeptMapper deptMapper;
    @Autowired
    private SysRoleMapper roleMapper;
    /**
     * æŸ¥è¯¢éƒ¨é—¨ç®¡ç†æ•°æ®
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return éƒ¨é—¨ä¿¡æ¯é›†åˆ
     */
    @Override
    @DataScope(deptAlias = "d")
    public List<SysDept> selectDeptList(SysDept dept)
    {
        return deptMapper.selectDeptList(dept);
    }
    /**
     * æŸ¥è¯¢éƒ¨é—¨æ ‘结构信息
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return éƒ¨é—¨æ ‘信息集合
     */
    @Override
    public List<TreeSelect> selectDeptTreeList(SysDept dept)
    {
        List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
        return buildDeptTreeSelect(depts);
    }
    /**
     * æž„建前端所需要树结构
     *
     * @param depts éƒ¨é—¨åˆ—表
     * @return æ ‘结构列表
     */
    @Override
    public List<SysDept> buildDeptTree(List<SysDept> depts)
    {
        List<SysDept> returnList = new ArrayList<SysDept>();
        List<Long> tempList = depts.stream().map(SysDept::getDeptId).collect(Collectors.toList());
        for (SysDept dept : depts)
        {
            // å¦‚果是顶级节点, éåŽ†è¯¥çˆ¶èŠ‚ç‚¹çš„æ‰€æœ‰å­èŠ‚ç‚¹
            if (!tempList.contains(dept.getParentId()))
            {
                recursionFn(depts, dept);
                returnList.add(dept);
            }
        }
        if (returnList.isEmpty())
        {
            returnList = depts;
        }
        return returnList;
    }
    /**
     * æž„建前端所需要下拉树结构
     *
     * @param depts éƒ¨é—¨åˆ—表
     * @return ä¸‹æ‹‰æ ‘结构列表
     */
    @Override
    public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts)
    {
        List<SysDept> deptTrees = buildDeptTree(depts);
        return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
    }
    /**
     * æ ¹æ®è§’色ID查询部门树信息
     *
     * @param roleId è§’色ID
     * @return é€‰ä¸­éƒ¨é—¨åˆ—表
     */
    @Override
    public List<Long> selectDeptListByRoleId(Long roleId)
    {
        SysRole role = roleMapper.selectRoleById(roleId);
        return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly());
    }
    /**
     * æ ¹æ®éƒ¨é—¨ID查询信息
     *
     * @param deptId éƒ¨é—¨ID
     * @return éƒ¨é—¨ä¿¡æ¯
     */
    @Override
    public SysDept selectDeptById(Long deptId)
    {
        return deptMapper.selectDeptById(deptId);
    }
    /**
     * æ ¹æ®ID查询所有子部门(正常状态)
     *
     * @param deptId éƒ¨é—¨ID
     * @return å­éƒ¨é—¨æ•°
     */
    @Override
    public int selectNormalChildrenDeptById(Long deptId)
    {
        return deptMapper.selectNormalChildrenDeptById(deptId);
    }
    /**
     * æ˜¯å¦å­˜åœ¨å­èŠ‚ç‚¹
     *
     * @param deptId éƒ¨é—¨ID
     * @return ç»“æžœ
     */
    @Override
    public boolean hasChildByDeptId(Long deptId)
    {
        int result = deptMapper.hasChildByDeptId(deptId);
        return result > 0;
    }
    /**
     * æŸ¥è¯¢éƒ¨é—¨æ˜¯å¦å­˜åœ¨ç”¨æˆ·
     *
     * @param deptId éƒ¨é—¨ID
     * @return ç»“æžœ true å­˜åœ¨ false ä¸å­˜åœ¨
     */
    @Override
    public boolean checkDeptExistUser(Long deptId)
    {
        int result = deptMapper.checkDeptExistUser(deptId);
        return result > 0;
    }
    /**
     * æ ¡éªŒéƒ¨é—¨åç§°æ˜¯å¦å”¯ä¸€
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public boolean checkDeptNameUnique(SysDept dept)
    {
        Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
        SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId());
        if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
    /**
     * æ ¡éªŒéƒ¨é—¨æ˜¯å¦æœ‰æ•°æ®æƒé™
     *
     * @param deptId éƒ¨é—¨id
     */
    @Override
    public void checkDeptDataScope(Long deptId)
    {
        if (!SysUser.isAdmin(SecurityUtils.getUserId()) && StringUtils.isNotNull(deptId))
        {
            SysDept dept = new SysDept();
            dept.setDeptId(deptId);
            List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
            if (StringUtils.isEmpty(depts))
            {
                throw new ServiceException("没有权限访问部门数据!");
            }
        }
    }
    /**
     * æ–°å¢žä¿å­˜éƒ¨é—¨ä¿¡æ¯
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int insertDept(SysDept dept)
    {
        SysDept info = deptMapper.selectDeptById(dept.getParentId());
        // å¦‚果父节点不为正常状态,则不允许新增子节点
        if (!UserConstants.DEPT_NORMAL.equals(info.getStatus()))
        {
            throw new ServiceException("部门停用,不允许新增");
        }
        dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
        return deptMapper.insertDept(dept);
    }
    /**
     * ä¿®æ”¹ä¿å­˜éƒ¨é—¨ä¿¡æ¯
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int updateDept(SysDept dept)
    {
        SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId());
        SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId());
        if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept))
        {
            String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
            String oldAncestors = oldDept.getAncestors();
            dept.setAncestors(newAncestors);
            updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors);
        }
        int result = deptMapper.updateDept(dept);
        if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors())
                && !StringUtils.equals("0", dept.getAncestors()))
        {
            // å¦‚果该部门是启用状态,则启用该部门的所有上级部门
            updateParentDeptStatusNormal(dept);
        }
        return result;
    }
    /**
     * ä¿®æ”¹è¯¥éƒ¨é—¨çš„父级部门状态
     *
     * @param dept å½“前部门
     */
    private void updateParentDeptStatusNormal(SysDept dept)
    {
        String ancestors = dept.getAncestors();
        Long[] deptIds = Convert.toLongArray(ancestors);
        deptMapper.updateDeptStatusNormal(deptIds);
    }
    /**
     * ä¿®æ”¹å­å…ƒç´ å…³ç³»
     *
     * @param deptId è¢«ä¿®æ”¹çš„部门ID
     * @param newAncestors æ–°çš„父ID集合
     * @param oldAncestors æ—§çš„父ID集合
     */
    public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors)
    {
        List<SysDept> children = deptMapper.selectChildrenDeptById(deptId);
        for (SysDept child : children)
        {
            child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
        }
        if (children.size() > 0)
        {
            deptMapper.updateDeptChildren(children);
        }
    }
    /**
     * åˆ é™¤éƒ¨é—¨ç®¡ç†ä¿¡æ¯
     *
     * @param deptId éƒ¨é—¨ID
     * @return ç»“æžœ
     */
    @Override
    public int deleteDeptById(Long deptId)
    {
        return deptMapper.deleteDeptById(deptId);
    }
    /**
     * é€’归列表
     */
    private void recursionFn(List<SysDept> list, SysDept t)
    {
        // å¾—到子节点列表
        List<SysDept> childList = getChildList(list, t);
        t.setChildren(childList);
        for (SysDept tChild : childList)
        {
            if (hasChild(list, tChild))
            {
                recursionFn(list, tChild);
            }
        }
    }
    /**
     * å¾—到子节点列表
     */
    private List<SysDept> getChildList(List<SysDept> list, SysDept t)
    {
        List<SysDept> tlist = new ArrayList<SysDept>();
        Iterator<SysDept> it = list.iterator();
        while (it.hasNext())
        {
            SysDept n = (SysDept) it.next();
            if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue())
            {
                tlist.add(n);
            }
        }
        return tlist;
    }
    /**
     * åˆ¤æ–­æ˜¯å¦æœ‰å­èŠ‚ç‚¹
     */
    private boolean hasChild(List<SysDept> list, SysDept t)
    {
        return getChildList(list, t).size() > 0 ? true : false;
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysDictDataServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
package com.se.system.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.se.common.security.utils.DictUtils;
import com.se.system.api.domain.SysDictData;
import com.se.system.mapper.SysDictDataMapper;
import com.se.system.service.ISysDictDataService;
/**
 * å­—å…¸ ä¸šåŠ¡å±‚å¤„ç†
 *
 * @author admin
 */
@Service
public class SysDictDataServiceImpl implements ISysDictDataService
{
    @Autowired
    private SysDictDataMapper dictDataMapper;
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å­—典数据
     *
     * @param dictData å­—典数据信息
     * @return å­—典数据集合信息
     */
    @Override
    public List<SysDictData> selectDictDataList(SysDictData dictData)
    {
        return dictDataMapper.selectDictDataList(dictData);
    }
    /**
     * æ ¹æ®å­—典类型和字典键值查询字典数据信息
     *
     * @param dictType å­—典类型
     * @param dictValue å­—典键值
     * @return å­—典标签
     */
    @Override
    public String selectDictLabel(String dictType, String dictValue)
    {
        return dictDataMapper.selectDictLabel(dictType, dictValue);
    }
    /**
     * æ ¹æ®å­—典数据ID查询信息
     *
     * @param dictCode å­—典数据ID
     * @return å­—典数据
     */
    @Override
    public SysDictData selectDictDataById(Long dictCode)
    {
        return dictDataMapper.selectDictDataById(dictCode);
    }
    /**
     * æ‰¹é‡åˆ é™¤å­—典数据信息
     *
     * @param dictCodes éœ€è¦åˆ é™¤çš„字典数据ID
     */
    @Override
    public void deleteDictDataByIds(Long[] dictCodes)
    {
        for (Long dictCode : dictCodes)
        {
            SysDictData data = selectDictDataById(dictCode);
            dictDataMapper.deleteDictDataById(dictCode);
            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
            DictUtils.setDictCache(data.getDictType(), dictDatas);
        }
    }
    /**
     * æ–°å¢žä¿å­˜å­—典数据信息
     *
     * @param data å­—典数据信息
     * @return ç»“æžœ
     */
    @Override
    public int insertDictData(SysDictData data)
    {
        int row = dictDataMapper.insertDictData(data);
        if (row > 0)
        {
            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
            DictUtils.setDictCache(data.getDictType(), dictDatas);
        }
        return row;
    }
    /**
     * ä¿®æ”¹ä¿å­˜å­—典数据信息
     *
     * @param data å­—典数据信息
     * @return ç»“æžœ
     */
    @Override
    public int updateDictData(SysDictData data)
    {
        int row = dictDataMapper.updateDictData(data);
        if (row > 0)
        {
            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
            DictUtils.setDictCache(data.getDictType(), dictDatas);
        }
        return row;
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysDictTypeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,223 @@
package com.se.system.service.impl;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.se.common.core.constant.UserConstants;
import com.se.common.core.exception.ServiceException;
import com.se.common.core.utils.StringUtils;
import com.se.common.security.utils.DictUtils;
import com.se.system.api.domain.SysDictData;
import com.se.system.api.domain.SysDictType;
import com.se.system.mapper.SysDictDataMapper;
import com.se.system.mapper.SysDictTypeMapper;
import com.se.system.service.ISysDictTypeService;
/**
 * å­—å…¸ ä¸šåŠ¡å±‚å¤„ç†
 *
 * @author admin
 */
@Service
public class SysDictTypeServiceImpl implements ISysDictTypeService
{
    @Autowired
    private SysDictTypeMapper dictTypeMapper;
    @Autowired
    private SysDictDataMapper dictDataMapper;
    /**
     * é¡¹ç›®å¯åŠ¨æ—¶ï¼Œåˆå§‹åŒ–å­—å…¸åˆ°ç¼“å­˜
     */
    @PostConstruct
    public void init()
    {
        loadingDictCache();
    }
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å­—典类型
     *
     * @param dictType å­—典类型信息
     * @return å­—典类型集合信息
     */
    @Override
    public List<SysDictType> selectDictTypeList(SysDictType dictType)
    {
        return dictTypeMapper.selectDictTypeList(dictType);
    }
    /**
     * æ ¹æ®æ‰€æœ‰å­—典类型
     *
     * @return å­—典类型集合信息
     */
    @Override
    public List<SysDictType> selectDictTypeAll()
    {
        return dictTypeMapper.selectDictTypeAll();
    }
    /**
     * æ ¹æ®å­—典类型查询字典数据
     *
     * @param dictType å­—典类型
     * @return å­—典数据集合信息
     */
    @Override
    public List<SysDictData> selectDictDataByType(String dictType)
    {
        List<SysDictData> dictDatas = DictUtils.getDictCache(dictType);
        if (StringUtils.isNotEmpty(dictDatas))
        {
            return dictDatas;
        }
        dictDatas = dictDataMapper.selectDictDataByType(dictType);
        if (StringUtils.isNotEmpty(dictDatas))
        {
            DictUtils.setDictCache(dictType, dictDatas);
            return dictDatas;
        }
        return null;
    }
    /**
     * æ ¹æ®å­—典类型ID查询信息
     *
     * @param dictId å­—典类型ID
     * @return å­—典类型
     */
    @Override
    public SysDictType selectDictTypeById(Long dictId)
    {
        return dictTypeMapper.selectDictTypeById(dictId);
    }
    /**
     * æ ¹æ®å­—典类型查询信息
     *
     * @param dictType å­—典类型
     * @return å­—典类型
     */
    @Override
    public SysDictType selectDictTypeByType(String dictType)
    {
        return dictTypeMapper.selectDictTypeByType(dictType);
    }
    /**
     * æ‰¹é‡åˆ é™¤å­—典类型信息
     *
     * @param dictIds éœ€è¦åˆ é™¤çš„å­—å…¸ID
     */
    @Override
    public void deleteDictTypeByIds(Long[] dictIds)
    {
        for (Long dictId : dictIds)
        {
            SysDictType dictType = selectDictTypeById(dictId);
            if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0)
            {
                throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName()));
            }
            dictTypeMapper.deleteDictTypeById(dictId);
            DictUtils.removeDictCache(dictType.getDictType());
        }
    }
    /**
     * åŠ è½½å­—å…¸ç¼“å­˜æ•°æ®
     */
    @Override
    public void loadingDictCache()
    {
        SysDictData dictData = new SysDictData();
        dictData.setStatus("0");
        Map<String, List<SysDictData>> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType));
        for (Map.Entry<String, List<SysDictData>> entry : dictDataMap.entrySet())
        {
            DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList()));
        }
    }
    /**
     * æ¸…空字典缓存数据
     */
    @Override
    public void clearDictCache()
    {
        DictUtils.clearDictCache();
    }
    /**
     * é‡ç½®å­—典缓存数据
     */
    @Override
    public void resetDictCache()
    {
        clearDictCache();
        loadingDictCache();
    }
    /**
     * æ–°å¢žä¿å­˜å­—典类型信息
     *
     * @param dict å­—典类型信息
     * @return ç»“æžœ
     */
    @Override
    public int insertDictType(SysDictType dict)
    {
        int row = dictTypeMapper.insertDictType(dict);
        if (row > 0)
        {
            DictUtils.setDictCache(dict.getDictType(), null);
        }
        return row;
    }
    /**
     * ä¿®æ”¹ä¿å­˜å­—典类型信息
     *
     * @param dict å­—典类型信息
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateDictType(SysDictType dict)
    {
        SysDictType oldDict = dictTypeMapper.selectDictTypeById(dict.getDictId());
        dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType());
        int row = dictTypeMapper.updateDictType(dict);
        if (row > 0)
        {
            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dict.getDictType());
            DictUtils.setDictCache(dict.getDictType(), dictDatas);
        }
        return row;
    }
    /**
     * æ ¡éªŒå­—典类型称是否唯一
     *
     * @param dict å­—典类型
     * @return ç»“æžœ
     */
    @Override
    public boolean checkDictTypeUnique(SysDictType dict)
    {
        Long dictId = StringUtils.isNull(dict.getDictId()) ? -1L : dict.getDictId();
        SysDictType dictType = dictTypeMapper.checkDictTypeUnique(dict.getDictType());
        if (StringUtils.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysLogininforServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.se.system.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.se.system.api.domain.SysLogininfor;
import com.se.system.mapper.SysLogininforMapper;
import com.se.system.service.ISysLogininforService;
/**
 * ç³»ç»Ÿè®¿é—®æ—¥å¿—情况信息 æœåŠ¡å±‚å¤„ç†
 *
 * @author admin
 */
@Service
public class SysLogininforServiceImpl implements ISysLogininforService
{
    @Autowired
    private SysLogininforMapper logininforMapper;
    /**
     * æ–°å¢žç³»ç»Ÿç™»å½•日志
     *
     * @param logininfor è®¿é—®æ—¥å¿—对象
     */
    @Override
    public int insertLogininfor(SysLogininfor logininfor)
    {
        return logininforMapper.insertLogininfor(logininfor);
    }
    /**
     * æŸ¥è¯¢ç³»ç»Ÿç™»å½•日志集合
     *
     * @param logininfor è®¿é—®æ—¥å¿—对象
     * @return ç™»å½•记录集合
     */
    @Override
    public List<SysLogininfor> selectLogininforList(SysLogininfor logininfor)
    {
        return logininforMapper.selectLogininforList(logininfor);
    }
    /**
     * æ‰¹é‡åˆ é™¤ç³»ç»Ÿç™»å½•日志
     *
     * @param infoIds éœ€è¦åˆ é™¤çš„登录日志ID
     * @return ç»“æžœ
     */
    @Override
    public int deleteLogininforByIds(Long[] infoIds)
    {
        return logininforMapper.deleteLogininforByIds(infoIds);
    }
    /**
     * æ¸…空系统登录日志
     */
    @Override
    public void cleanLogininfor()
    {
        logininforMapper.cleanLogininfor();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysMenuServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,544 @@
package com.se.system.service.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import com.se.system.domain.SysMenu;
import com.se.system.domain.vo.MetaVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.se.common.core.constant.Constants;
import com.se.common.core.constant.UserConstants;
import com.se.common.core.utils.StringUtils;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.domain.SysRole;
import com.se.system.api.domain.SysUser;
import com.se.system.domain.vo.RouterVo;
import com.se.system.domain.vo.TreeSelect;
import com.se.system.mapper.SysMenuMapper;
import com.se.system.mapper.SysRoleMapper;
import com.se.system.mapper.SysRoleMenuMapper;
import com.se.system.service.ISysMenuService;
/**
 * èœå• ä¸šåŠ¡å±‚å¤„ç†
 *
 * @author admin
 */
@Service
public class SysMenuServiceImpl implements ISysMenuService
{
    public static final String PREMISSION_STRING = "perms[\"{0}\"]";
    @Autowired
    private SysMenuMapper menuMapper;
    @Autowired
    private SysRoleMapper roleMapper;
    @Autowired
    private SysRoleMenuMapper roleMenuMapper;
    /**
     * æ ¹æ®ç”¨æˆ·æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     * @param userId ç”¨æˆ·ID
     * @return èœå•列表
     */
    @Override
    public List<SysMenu> selectMenuList(Long userId)
    {
        return selectMenuList(new SysMenu(), userId);
    }
    /**
     * æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     * @param menu èœå•信息
     * @return èœå•列表
     */
    @Override
    public List<SysMenu> selectMenuList(SysMenu menu, Long userId)
    {
        List<SysMenu> menuList = null;
        // ç®¡ç†å‘˜æ˜¾ç¤ºæ‰€æœ‰èœå•信息
        if (SysUser.isAdmin(userId))
        {
            menuList = menuMapper.selectMenuList(menu);
        }
        else
        {
            menu.getParams().put("userId", userId);
            menuList = menuMapper.selectMenuListByUserId(menu);
        }
        return menuList;
    }
    /**
     * æ ¹æ®ç”¨æˆ·ID查询权限
     *
     * @param userId ç”¨æˆ·ID
     * @return æƒé™åˆ—表
     */
    @Override
    public Set<String> selectMenuPermsByUserId(Long userId)
    {
        List<String> perms = menuMapper.selectMenuPermsByUserId(userId);
        Set<String> permsSet = new HashSet<>();
        for (String perm : perms)
        {
            if (StringUtils.isNotEmpty(perm))
            {
                permsSet.addAll(Arrays.asList(perm.trim().split(",")));
            }
        }
        return permsSet;
    }
    /**
     * æ ¹æ®è§’色ID查询权限
     *
     * @param roleId è§’色ID
     * @return æƒé™åˆ—表
     */
    @Override
    public Set<String> selectMenuPermsByRoleId(Long roleId)
    {
        List<String> perms = menuMapper.selectMenuPermsByRoleId(roleId);
        Set<String> permsSet = new HashSet<>();
        for (String perm : perms)
        {
            if (StringUtils.isNotEmpty(perm))
            {
                permsSet.addAll(Arrays.asList(perm.trim().split(",")));
            }
        }
        return permsSet;
    }
    /**
     * æ ¹æ®ç”¨æˆ·ID查询菜单
     *
     * @param userId ç”¨æˆ·åç§°
     * @return èœå•列表
     */
    @Override
    public List<SysMenu> selectMenuTreeByUserId(Long userId)
    {
        List<SysMenu> menus = null;
        if (SecurityUtils.isAdmin(userId))
        {
            menus = menuMapper.selectMenuTreeAll();
        }
        else
        {
            menus = menuMapper.selectMenuTreeByUserId(userId);
        }
        return getChildPerms(menus, 0);
    }
    /**
     * æ ¹æ®è§’色ID查询菜单树信息
     *
     * @param roleId è§’色ID
     * @return é€‰ä¸­èœå•列表
     */
    @Override
    public List<Long> selectMenuListByRoleId(Long roleId)
    {
        SysRole role = roleMapper.selectRoleById(roleId);
        return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly());
    }
    /**
     * æž„建前端路由所需要的菜单
     *
     * @param menus èœå•列表
     * @return è·¯ç”±åˆ—表
     */
    @Override
    public List<RouterVo> buildMenus(List<SysMenu> menus)
    {
        List<RouterVo> routers = new LinkedList<RouterVo>();
        for (SysMenu menu : menus)
        {
            RouterVo router = new RouterVo();
            router.setHidden("1".equals(menu.getVisible()));
            router.setName(getRouteName(menu));
            router.setPath(getRouterPath(menu));
            router.setComponent(getComponent(menu));
            router.setQuery(menu.getQuery());
            router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()));
            List<SysMenu> cMenus = menu.getChildren();
            if (StringUtils.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType()))
            {
                router.setAlwaysShow(true);
                router.setRedirect("noRedirect");
                router.setChildren(buildMenus(cMenus));
            }
            else if (isMenuFrame(menu))
            {
                router.setMeta(null);
                List<RouterVo> childrenList = new ArrayList<RouterVo>();
                RouterVo children = new RouterVo();
                children.setPath(menu.getPath());
                children.setComponent(menu.getComponent());
                children.setName(getRouteName(menu.getRouteName(), menu.getPath()));
                children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()));
                children.setQuery(menu.getQuery());
                childrenList.add(children);
                router.setChildren(childrenList);
            }
            else if (menu.getParentId().intValue() == 0 && isInnerLink(menu))
            {
                router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
                router.setPath("/");
                List<RouterVo> childrenList = new ArrayList<RouterVo>();
                RouterVo children = new RouterVo();
                String routerPath = innerLinkReplaceEach(menu.getPath());
                children.setPath(routerPath);
                children.setComponent(UserConstants.INNER_LINK);
                children.setName(getRouteName(menu.getRouteName(), routerPath));
                children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath()));
                childrenList.add(children);
                router.setChildren(childrenList);
            }
            routers.add(router);
        }
        return routers;
    }
    /**
     * æž„建前端所需要树结构
     *
     * @param menus èœå•列表
     * @return æ ‘结构列表
     */
    @Override
    public List<SysMenu> buildMenuTree(List<SysMenu> menus)
    {
        List<SysMenu> returnList = new ArrayList<SysMenu>();
        List<Long> tempList = menus.stream().map(SysMenu::getMenuId).collect(Collectors.toList());
        for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext();)
        {
            SysMenu menu = (SysMenu) iterator.next();
            // å¦‚果是顶级节点, éåŽ†è¯¥çˆ¶èŠ‚ç‚¹çš„æ‰€æœ‰å­èŠ‚ç‚¹
            if (!tempList.contains(menu.getParentId()))
            {
                recursionFn(menus, menu);
                returnList.add(menu);
            }
        }
        if (returnList.isEmpty())
        {
            returnList = menus;
        }
        return returnList;
    }
    /**
     * æž„建前端所需要下拉树结构
     *
     * @param menus èœå•列表
     * @return ä¸‹æ‹‰æ ‘结构列表
     */
    @Override
    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus)
    {
        List<SysMenu> menuTrees = buildMenuTree(menus);
        return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
    }
    /**
     * æ ¹æ®èœå•ID查询信息
     *
     * @param menuId èœå•ID
     * @return èœå•信息
     */
    @Override
    public SysMenu selectMenuById(Long menuId)
    {
        return menuMapper.selectMenuById(menuId);
    }
    /**
     * æ˜¯å¦å­˜åœ¨èœå•子节点
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
    @Override
    public boolean hasChildByMenuId(Long menuId)
    {
        int result = menuMapper.hasChildByMenuId(menuId);
        return result > 0;
    }
    /**
     * æŸ¥è¯¢èœå•使用数量
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
    @Override
    public boolean checkMenuExistRole(Long menuId)
    {
        int result = roleMenuMapper.checkMenuExistRole(menuId);
        return result > 0;
    }
    /**
     * æ–°å¢žä¿å­˜èœå•信息
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    @Override
    public int insertMenu(SysMenu menu)
    {
        return menuMapper.insertMenu(menu);
    }
    /**
     * ä¿®æ”¹ä¿å­˜èœå•信息
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    @Override
    public int updateMenu(SysMenu menu)
    {
        return menuMapper.updateMenu(menu);
    }
    /**
     * åˆ é™¤èœå•管理信息
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
    @Override
    public int deleteMenuById(Long menuId)
    {
        return menuMapper.deleteMenuById(menuId);
    }
    /**
     * æ ¡éªŒèœå•名称是否唯一
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    @Override
    public boolean checkMenuNameUnique(SysMenu menu)
    {
        Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId();
        SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId());
        if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
    /**
     * èŽ·å–è·¯ç”±åç§°
     *
     * @param menu èœå•信息
     * @return è·¯ç”±åç§°
     */
    public String getRouteName(SysMenu menu)
    {
        // éžå¤–链并且是一级目录(类型为目录)
        if (isMenuFrame(menu))
        {
            return StringUtils.EMPTY;
        }
        return getRouteName(menu.getRouteName(), menu.getPath());
    }
    /**
     * èŽ·å–è·¯ç”±åç§°ï¼Œå¦‚æ²¡æœ‰é…ç½®è·¯ç”±åç§°åˆ™å–è·¯ç”±åœ°å€
     *
     * @param routerName è·¯ç”±åç§°
     * @param path è·¯ç”±åœ°å€
     * @return è·¯ç”±åç§°ï¼ˆé©¼å³°æ ¼å¼ï¼‰
     */
    public String getRouteName(String name, String path)
    {
        String routerName = StringUtils.isNotEmpty(name) ? name : path;
        return StringUtils.capitalize(routerName);
    }
    /**
     * èŽ·å–è·¯ç”±åœ°å€
     *
     * @param menu èœå•信息
     * @return è·¯ç”±åœ°å€
     */
    public String getRouterPath(SysMenu menu)
    {
        String routerPath = menu.getPath();
        // å†…链打开外网方式
        if (menu.getParentId().intValue() != 0 && isInnerLink(menu))
        {
            routerPath = innerLinkReplaceEach(routerPath);
        }
        // éžå¤–链并且是一级目录(类型为目录)
        if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType())
                && UserConstants.NO_FRAME.equals(menu.getIsFrame()))
        {
            routerPath = "/" + menu.getPath();
        }
        // éžå¤–链并且是一级目录(类型为菜单)
        else if (isMenuFrame(menu))
        {
            routerPath = "/";
        }
        return routerPath;
    }
    /**
     * èŽ·å–ç»„ä»¶ä¿¡æ¯
     *
     * @param menu èœå•信息
     * @return ç»„件信息
     */
    public String getComponent(SysMenu menu)
    {
        String component = UserConstants.LAYOUT;
        if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu))
        {
            component = menu.getComponent();
        }
        else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu))
        {
            component = UserConstants.INNER_LINK;
        }
        else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu))
        {
            component = UserConstants.PARENT_VIEW;
        }
        return component;
    }
    /**
     * æ˜¯å¦ä¸ºèœå•内部跳转
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public boolean isMenuFrame(SysMenu menu)
    {
        return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType())
                && menu.getIsFrame().equals(UserConstants.NO_FRAME);
    }
    /**
     * æ˜¯å¦ä¸ºå†…链组件
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public boolean isInnerLink(SysMenu menu)
    {
        return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath());
    }
    /**
     * æ˜¯å¦ä¸ºparent_view组件
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public boolean isParentView(SysMenu menu)
    {
        return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType());
    }
    /**
     * æ ¹æ®çˆ¶èŠ‚ç‚¹çš„ID获取所有子节点
     *
     * @param list åˆ†ç±»è¡¨
     * @param parentId ä¼ å…¥çš„父节点ID
     * @return String
     */
    public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId)
    {
        List<SysMenu> returnList = new ArrayList<SysMenu>();
        for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext();)
        {
            SysMenu t = (SysMenu) iterator.next();
            // ä¸€ã€æ ¹æ®ä¼ å…¥çš„æŸä¸ªçˆ¶èŠ‚ç‚¹ID,遍历该父节点的所有子节点
            if (t.getParentId() == parentId)
            {
                recursionFn(list, t);
                returnList.add(t);
            }
        }
        return returnList;
    }
    /**
     * é€’归列表
     *
     * @param list åˆ†ç±»è¡¨
     * @param t å­èŠ‚ç‚¹
     */
    private void recursionFn(List<SysMenu> list, SysMenu t)
    {
        // å¾—到子节点列表
        List<SysMenu> childList = getChildList(list, t);
        t.setChildren(childList);
        for (SysMenu tChild : childList)
        {
            if (hasChild(list, tChild))
            {
                recursionFn(list, tChild);
            }
        }
    }
    /**
     * å¾—到子节点列表
     */
    private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t)
    {
        List<SysMenu> tlist = new ArrayList<SysMenu>();
        Iterator<SysMenu> it = list.iterator();
        while (it.hasNext())
        {
            SysMenu n = (SysMenu) it.next();
            if (n.getParentId().longValue() == t.getMenuId().longValue())
            {
                tlist.add(n);
            }
        }
        return tlist;
    }
    /**
     * åˆ¤æ–­æ˜¯å¦æœ‰å­èŠ‚ç‚¹
     */
    private boolean hasChild(List<SysMenu> list, SysMenu t)
    {
        return getChildList(list, t).size() > 0;
    }
    /**
     * å†…链域名特殊字符替换
     *
     * @return æ›¿æ¢åŽçš„内链域名
     */
    public String innerLinkReplaceEach(String path)
    {
        return StringUtils.replaceEach(path, new String[] { Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":" },
                new String[] { "", "", "", "/", "/" });
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysNoticeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.se.system.service.impl;
import java.util.List;
import com.se.system.domain.SysNotice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.se.system.mapper.SysNoticeMapper;
import com.se.system.service.ISysNoticeService;
/**
 * å…¬å‘Š æœåŠ¡å±‚å®žçŽ°
 *
 * @author admin
 */
@Service
public class SysNoticeServiceImpl implements ISysNoticeService
{
    @Autowired
    private SysNoticeMapper noticeMapper;
    /**
     * æŸ¥è¯¢å…¬å‘Šä¿¡æ¯
     *
     * @param noticeId å…¬å‘ŠID
     * @return å…¬å‘Šä¿¡æ¯
     */
    @Override
    public SysNotice selectNoticeById(Long noticeId)
    {
        return noticeMapper.selectNoticeById(noticeId);
    }
    /**
     * æŸ¥è¯¢å…¬å‘Šåˆ—表
     *
     * @param notice å…¬å‘Šä¿¡æ¯
     * @return å…¬å‘Šé›†åˆ
     */
    @Override
    public List<SysNotice> selectNoticeList(SysNotice notice)
    {
        return noticeMapper.selectNoticeList(notice);
    }
    /**
     * æ–°å¢žå…¬å‘Š
     *
     * @param notice å…¬å‘Šä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int insertNotice(SysNotice notice)
    {
        return noticeMapper.insertNotice(notice);
    }
    /**
     * ä¿®æ”¹å…¬å‘Š
     *
     * @param notice å…¬å‘Šä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int updateNotice(SysNotice notice)
    {
        return noticeMapper.updateNotice(notice);
    }
    /**
     * åˆ é™¤å…¬å‘Šå¯¹è±¡
     *
     * @param noticeId å…¬å‘ŠID
     * @return ç»“æžœ
     */
    @Override
    public int deleteNoticeById(Long noticeId)
    {
        return noticeMapper.deleteNoticeById(noticeId);
    }
    /**
     * æ‰¹é‡åˆ é™¤å…¬å‘Šä¿¡æ¯
     *
     * @param noticeIds éœ€è¦åˆ é™¤çš„公告ID
     * @return ç»“æžœ
     */
    @Override
    public int deleteNoticeByIds(Long[] noticeIds)
    {
        return noticeMapper.deleteNoticeByIds(noticeIds);
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysOperLogServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package com.se.system.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.se.system.api.domain.SysOperLog;
import com.se.system.mapper.SysOperLogMapper;
import com.se.system.service.ISysOperLogService;
/**
 * æ“ä½œæ—¥å¿— æœåŠ¡å±‚å¤„ç†
 *
 * @author admin
 */
@Service
public class SysOperLogServiceImpl implements ISysOperLogService
{
    @Autowired
    private SysOperLogMapper operLogMapper;
    /**
     * æ–°å¢žæ“ä½œæ—¥å¿—
     *
     * @param operLog æ“ä½œæ—¥å¿—对象
     * @return ç»“æžœ
     */
    @Override
    public int insertOperlog(SysOperLog operLog)
    {
        return operLogMapper.insertOperlog(operLog);
    }
    /**
     * æŸ¥è¯¢ç³»ç»Ÿæ“ä½œæ—¥å¿—集合
     *
     * @param operLog æ“ä½œæ—¥å¿—对象
     * @return æ“ä½œæ—¥å¿—集合
     */
    @Override
    public List<SysOperLog> selectOperLogList(SysOperLog operLog)
    {
        return operLogMapper.selectOperLogList(operLog);
    }
    /**
     * æ‰¹é‡åˆ é™¤ç³»ç»Ÿæ“ä½œæ—¥å¿—
     *
     * @param operIds éœ€è¦åˆ é™¤çš„æ“ä½œæ—¥å¿—ID
     * @return ç»“æžœ
     */
    @Override
    public int deleteOperLogByIds(Long[] operIds)
    {
        return operLogMapper.deleteOperLogByIds(operIds);
    }
    /**
     * æŸ¥è¯¢æ“ä½œæ—¥å¿—详细
     *
     * @param operId æ“ä½œID
     * @return æ“ä½œæ—¥å¿—对象
     */
    @Override
    public SysOperLog selectOperLogById(Long operId)
    {
        return operLogMapper.selectOperLogById(operId);
    }
    /**
     * æ¸…空操作日志
     */
    @Override
    public void cleanOperLog()
    {
        operLogMapper.cleanOperLog();
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysPermissionServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.se.system.service.impl;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import com.se.system.api.domain.SysRole;
import com.se.system.api.domain.SysUser;
import com.se.system.service.ISysMenuService;
import com.se.system.service.ISysPermissionService;
import com.se.system.service.ISysRoleService;
/**
 * ç”¨æˆ·æƒé™å¤„理
 *
 * @author admin
 */
@Service
public class SysPermissionServiceImpl implements ISysPermissionService
{
    @Autowired
    private ISysRoleService roleService;
    @Autowired
    private ISysMenuService menuService;
    /**
     * èŽ·å–è§’è‰²æ•°æ®æƒé™
     *
     * @param userId ç”¨æˆ·Id
     * @return è§’色权限信息
     */
    @Override
    public Set<String> getRolePermission(SysUser user)
    {
        Set<String> roles = new HashSet<String>();
        // ç®¡ç†å‘˜æ‹¥æœ‰æ‰€æœ‰æƒé™
        if (user.isAdmin())
        {
            roles.add("admin");
        }
        else
        {
            roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId()));
        }
        return roles;
    }
    /**
     * èŽ·å–èœå•æ•°æ®æƒé™
     *
     * @param userId ç”¨æˆ·Id
     * @return èœå•权限信息
     */
    @Override
    public Set<String> getMenuPermission(SysUser user)
    {
        Set<String> perms = new HashSet<String>();
        // ç®¡ç†å‘˜æ‹¥æœ‰æ‰€æœ‰æƒé™
        if (user.isAdmin())
        {
            perms.add("*:*:*");
        }
        else
        {
            List<SysRole> roles = user.getRoles();
            if (!CollectionUtils.isEmpty(roles))
            {
                // å¤šè§’色设置permissions属性,以便数据权限匹配权限
                for (SysRole role : roles)
                {
                    Set<String> rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId());
                    role.setPermissions(rolePerms);
                    perms.addAll(rolePerms);
                }
            }
            else
            {
                perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId()));
            }
        }
        return perms;
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysPostServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,179 @@
package com.se.system.service.impl;
import java.util.List;
import com.se.system.domain.SysPost;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.se.common.core.constant.UserConstants;
import com.se.common.core.exception.ServiceException;
import com.se.common.core.utils.StringUtils;
import com.se.system.mapper.SysPostMapper;
import com.se.system.mapper.SysUserPostMapper;
import com.se.system.service.ISysPostService;
/**
 * å²—位信息 æœåŠ¡å±‚å¤„ç†
 *
 * @author admin
 */
@Service
public class SysPostServiceImpl implements ISysPostService
{
    @Autowired
    private SysPostMapper postMapper;
    @Autowired
    private SysUserPostMapper userPostMapper;
    /**
     * æŸ¥è¯¢å²—位信息集合
     *
     * @param post å²—位信息
     * @return å²—位信息集合
     */
    @Override
    public List<SysPost> selectPostList(SysPost post)
    {
        return postMapper.selectPostList(post);
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰å²—位
     *
     * @return å²—位列表
     */
    @Override
    public List<SysPost> selectPostAll()
    {
        return postMapper.selectPostAll();
    }
    /**
     * é€šè¿‡å²—位ID查询岗位信息
     *
     * @param postId å²—位ID
     * @return è§’色对象信息
     */
    @Override
    public SysPost selectPostById(Long postId)
    {
        return postMapper.selectPostById(postId);
    }
    /**
     * æ ¹æ®ç”¨æˆ·ID获取岗位选择框列表
     *
     * @param userId ç”¨æˆ·ID
     * @return é€‰ä¸­å²—位ID列表
     */
    @Override
    public List<Long> selectPostListByUserId(Long userId)
    {
        return postMapper.selectPostListByUserId(userId);
    }
    /**
     * æ ¡éªŒå²—位名称是否唯一
     *
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    @Override
    public boolean checkPostNameUnique(SysPost post)
    {
        Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId();
        SysPost info = postMapper.checkPostNameUnique(post.getPostName());
        if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
    /**
     * æ ¡éªŒå²—位编码是否唯一
     *
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    @Override
    public boolean checkPostCodeUnique(SysPost post)
    {
        Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId();
        SysPost info = postMapper.checkPostCodeUnique(post.getPostCode());
        if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
    /**
     * é€šè¿‡å²—位ID查询岗位使用数量
     *
     * @param postId å²—位ID
     * @return ç»“æžœ
     */
    @Override
    public int countUserPostById(Long postId)
    {
        return userPostMapper.countUserPostById(postId);
    }
    /**
     * åˆ é™¤å²—位信息
     *
     * @param postId å²—位ID
     * @return ç»“æžœ
     */
    @Override
    public int deletePostById(Long postId)
    {
        return postMapper.deletePostById(postId);
    }
    /**
     * æ‰¹é‡åˆ é™¤å²—位信息
     *
     * @param postIds éœ€è¦åˆ é™¤çš„岗位ID
     * @return ç»“æžœ
     */
    @Override
    public int deletePostByIds(Long[] postIds)
    {
        for (Long postId : postIds)
        {
            SysPost post = selectPostById(postId);
            if (countUserPostById(postId) > 0)
            {
                throw new ServiceException(String.format("%1$s已分配,不能删除", post.getPostName()));
            }
        }
        return postMapper.deletePostByIds(postIds);
    }
    /**
     * æ–°å¢žä¿å­˜å²—位信息
     *
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    @Override
    public int insertPost(SysPost post)
    {
        return postMapper.insertPost(post);
    }
    /**
     * ä¿®æ”¹ä¿å­˜å²—位信息
     *
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    @Override
    public int updatePost(SysPost post)
    {
        return postMapper.updatePost(post);
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysRoleServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,428 @@
package com.se.system.service.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.se.system.domain.SysRoleDept;
import com.se.system.domain.SysRoleMenu;
import com.se.system.domain.SysUserRole;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.se.common.core.constant.UserConstants;
import com.se.common.core.exception.ServiceException;
import com.se.common.core.utils.SpringUtils;
import com.se.common.core.utils.StringUtils;
import com.se.common.datascope.annotation.DataScope;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.domain.SysRole;
import com.se.system.api.domain.SysUser;
import com.se.system.mapper.SysRoleDeptMapper;
import com.se.system.mapper.SysRoleMapper;
import com.se.system.mapper.SysRoleMenuMapper;
import com.se.system.mapper.SysUserRoleMapper;
import com.se.system.service.ISysRoleService;
/**
 * è§’色 ä¸šåŠ¡å±‚å¤„ç†
 *
 * @author admin
 */
@Service
public class SysRoleServiceImpl implements ISysRoleService
{
    @Autowired
    private SysRoleMapper roleMapper;
    @Autowired
    private SysRoleMenuMapper roleMenuMapper;
    @Autowired
    private SysUserRoleMapper userRoleMapper;
    @Autowired
    private SysRoleDeptMapper roleDeptMapper;
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢è§’色数据
     *
     * @param role è§’色信息
     * @return è§’色数据集合信息
     */
    @Override
    @DataScope(deptAlias = "d")
    public List<SysRole> selectRoleList(SysRole role)
    {
        return roleMapper.selectRoleList(role);
    }
    /**
     * æ ¹æ®ç”¨æˆ·ID查询角色
     *
     * @param userId ç”¨æˆ·ID
     * @return è§’色列表
     */
    @Override
    public List<SysRole> selectRolesByUserId(Long userId)
    {
        List<SysRole> userRoles = roleMapper.selectRolePermissionByUserId(userId);
        List<SysRole> roles = selectRoleAll();
        for (SysRole role : roles)
        {
            for (SysRole userRole : userRoles)
            {
                if (role.getRoleId().longValue() == userRole.getRoleId().longValue())
                {
                    role.setFlag(true);
                    break;
                }
            }
        }
        return roles;
    }
    /**
     * æ ¹æ®ç”¨æˆ·ID查询权限
     *
     * @param userId ç”¨æˆ·ID
     * @return æƒé™åˆ—表
     */
    @Override
    public Set<String> selectRolePermissionByUserId(Long userId)
    {
        List<SysRole> perms = roleMapper.selectRolePermissionByUserId(userId);
        Set<String> permsSet = new HashSet<>();
        for (SysRole perm : perms)
        {
            if (StringUtils.isNotNull(perm))
            {
                permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(",")));
            }
        }
        return permsSet;
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰è§’色
     *
     * @return è§’色列表
     */
    @Override
    public List<SysRole> selectRoleAll()
    {
        return SpringUtils.getAopProxy(this).selectRoleList(new SysRole());
    }
    /**
     * æ ¹æ®ç”¨æˆ·ID获取角色选择框列表
     *
     * @param userId ç”¨æˆ·ID
     * @return é€‰ä¸­è§’色ID列表
     */
    @Override
    public List<Long> selectRoleListByUserId(Long userId)
    {
        return roleMapper.selectRoleListByUserId(userId);
    }
    /**
     * é€šè¿‡è§’色ID查询角色
     *
     * @param roleId è§’色ID
     * @return è§’色对象信息
     */
    @Override
    public SysRole selectRoleById(Long roleId)
    {
        return roleMapper.selectRoleById(roleId);
    }
    /**
     * æ ¡éªŒè§’色名称是否唯一
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    @Override
    public boolean checkRoleNameUnique(SysRole role)
    {
        Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
        SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName());
        if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
    /**
     * æ ¡éªŒè§’色权限是否唯一
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    @Override
    public boolean checkRoleKeyUnique(SysRole role)
    {
        Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
        SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey());
        if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
    /**
     * æ ¡éªŒè§’色是否允许操作
     *
     * @param role è§’色信息
     */
    @Override
    public void checkRoleAllowed(SysRole role)
    {
        if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin())
        {
            throw new ServiceException("不允许操作超级管理员角色");
        }
    }
    /**
     * æ ¡éªŒè§’色是否有数据权限
     *
     * @param roleIds è§’色id
     */
    @Override
    public void checkRoleDataScope(Long... roleIds)
    {
        if (!SysUser.isAdmin(SecurityUtils.getUserId()))
        {
            for (Long roleId : roleIds)
            {
                SysRole role = new SysRole();
                role.setRoleId(roleId);
                List<SysRole> roles = SpringUtils.getAopProxy(this).selectRoleList(role);
                if (StringUtils.isEmpty(roles))
                {
                    throw new ServiceException("没有权限访问角色数据!");
                }
            }
        }
    }
    /**
     * é€šè¿‡è§’色ID查询角色使用数量
     *
     * @param roleId è§’色ID
     * @return ç»“æžœ
     */
    @Override
    public int countUserRoleByRoleId(Long roleId)
    {
        return userRoleMapper.countUserRoleByRoleId(roleId);
    }
    /**
     * æ–°å¢žä¿å­˜è§’色信息
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertRole(SysRole role)
    {
        // æ–°å¢žè§’色信息
        roleMapper.insertRole(role);
        return insertRoleMenu(role);
    }
    /**
     * ä¿®æ”¹ä¿å­˜è§’色信息
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateRole(SysRole role)
    {
        // ä¿®æ”¹è§’色信息
        roleMapper.updateRole(role);
        // åˆ é™¤è§’色与菜单关联
        roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId());
        return insertRoleMenu(role);
    }
    /**
     * ä¿®æ”¹è§’色状态
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    @Override
    public int updateRoleStatus(SysRole role)
    {
        return roleMapper.updateRole(role);
    }
    /**
     * ä¿®æ”¹æ•°æ®æƒé™ä¿¡æ¯
     *
     * @param role è§’色信息
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int authDataScope(SysRole role)
    {
        // ä¿®æ”¹è§’色信息
        roleMapper.updateRole(role);
        // åˆ é™¤è§’色与部门关联
        roleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId());
        // æ–°å¢žè§’色和部门信息(数据权限)
        return insertRoleDept(role);
    }
    /**
     * æ–°å¢žè§’色菜单信息
     *
     * @param role è§’色对象
     */
    public int insertRoleMenu(SysRole role)
    {
        int rows = 1;
        // æ–°å¢žç”¨æˆ·ä¸Žè§’色管理
        List<SysRoleMenu> list = new ArrayList<SysRoleMenu>();
        for (Long menuId : role.getMenuIds())
        {
            SysRoleMenu rm = new SysRoleMenu();
            rm.setRoleId(role.getRoleId());
            rm.setMenuId(menuId);
            list.add(rm);
        }
        if (list.size() > 0)
        {
            rows = roleMenuMapper.batchRoleMenu(list);
        }
        return rows;
    }
    /**
     * æ–°å¢žè§’色部门信息(数据权限)
     *
     * @param role è§’色对象
     */
    public int insertRoleDept(SysRole role)
    {
        int rows = 1;
        // æ–°å¢žè§’色与部门(数据权限)管理
        List<SysRoleDept> list = new ArrayList<SysRoleDept>();
        for (Long deptId : role.getDeptIds())
        {
            SysRoleDept rd = new SysRoleDept();
            rd.setRoleId(role.getRoleId());
            rd.setDeptId(deptId);
            list.add(rd);
        }
        if (list.size() > 0)
        {
            rows = roleDeptMapper.batchRoleDept(list);
        }
        return rows;
    }
    /**
     * é€šè¿‡è§’色ID删除角色
     *
     * @param roleId è§’色ID
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteRoleById(Long roleId)
    {
        // åˆ é™¤è§’色与菜单关联
        roleMenuMapper.deleteRoleMenuByRoleId(roleId);
        // åˆ é™¤è§’色与部门关联
        roleDeptMapper.deleteRoleDeptByRoleId(roleId);
        return roleMapper.deleteRoleById(roleId);
    }
    /**
     * æ‰¹é‡åˆ é™¤è§’色信息
     *
     * @param roleIds éœ€è¦åˆ é™¤çš„角色ID
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteRoleByIds(Long[] roleIds)
    {
        for (Long roleId : roleIds)
        {
            checkRoleAllowed(new SysRole(roleId));
            checkRoleDataScope(roleId);
            SysRole role = selectRoleById(roleId);
            if (countUserRoleByRoleId(roleId) > 0)
            {
                throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName()));
            }
        }
        // åˆ é™¤è§’色与菜单关联
        roleMenuMapper.deleteRoleMenu(roleIds);
        // åˆ é™¤è§’色与部门关联
        roleDeptMapper.deleteRoleDept(roleIds);
        return roleMapper.deleteRoleByIds(roleIds);
    }
    /**
     * å–消授权用户角色
     *
     * @param userRole ç”¨æˆ·å’Œè§’色关联信息
     * @return ç»“æžœ
     */
    @Override
    public int deleteAuthUser(SysUserRole userRole)
    {
        return userRoleMapper.deleteUserRoleInfo(userRole);
    }
    /**
     * æ‰¹é‡å–消授权用户角色
     *
     * @param roleId è§’色ID
     * @param userIds éœ€è¦å–消授权的用户数据ID
     * @return ç»“æžœ
     */
    @Override
    public int deleteAuthUsers(Long roleId, Long[] userIds)
    {
        return userRoleMapper.deleteUserRoleInfos(roleId, userIds);
    }
    /**
     * æ‰¹é‡é€‰æ‹©æŽˆæƒç”¨æˆ·è§’色
     *
     * @param roleId è§’色ID
     * @param userIds éœ€è¦æŽˆæƒçš„用户数据ID
     * @return ç»“æžœ
     */
    @Override
    public int insertAuthUsers(Long roleId, Long[] userIds)
    {
        // æ–°å¢žç”¨æˆ·ä¸Žè§’色管理
        List<SysUserRole> list = new ArrayList<SysUserRole>();
        for (Long userId : userIds)
        {
            SysUserRole ur = new SysUserRole();
            ur.setUserId(userId);
            ur.setRoleId(roleId);
            list.add(ur);
        }
        return userRoleMapper.batchUserRole(list);
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysUserOnlineServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.se.system.service.impl;
import com.se.system.domain.SysUserOnline;
import org.springframework.stereotype.Service;
import com.se.common.core.utils.StringUtils;
import com.se.system.api.model.LoginUser;
import com.se.system.service.ISysUserOnlineService;
/**
 * åœ¨çº¿ç”¨æˆ· æœåŠ¡å±‚å¤„ç†
 *
 * @author admin
 */
@Service
public class SysUserOnlineServiceImpl implements ISysUserOnlineService
{
    /**
     * é€šè¿‡ç™»å½•地址查询信息
     *
     * @param ipaddr ç™»å½•地址
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return åœ¨çº¿ç”¨æˆ·ä¿¡æ¯
     */
    @Override
    public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user)
    {
        if (StringUtils.equals(ipaddr, user.getIpaddr()))
        {
            return loginUserToUserOnline(user);
        }
        return null;
    }
    /**
     * é€šè¿‡ç”¨æˆ·åç§°æŸ¥è¯¢ä¿¡æ¯
     *
     * @param userName ç”¨æˆ·åç§°
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return åœ¨çº¿ç”¨æˆ·ä¿¡æ¯
     */
    @Override
    public SysUserOnline selectOnlineByUserName(String userName, LoginUser user)
    {
        if (StringUtils.equals(userName, user.getUsername()))
        {
            return loginUserToUserOnline(user);
        }
        return null;
    }
    /**
     * é€šè¿‡ç™»å½•地址/用户名称查询信息
     *
     * @param ipaddr ç™»å½•地址
     * @param userName ç”¨æˆ·åç§°
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return åœ¨çº¿ç”¨æˆ·ä¿¡æ¯
     */
    @Override
    public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user)
    {
        if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername()))
        {
            return loginUserToUserOnline(user);
        }
        return null;
    }
    /**
     * è®¾ç½®åœ¨çº¿ç”¨æˆ·ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return åœ¨çº¿ç”¨æˆ·
     */
    @Override
    public SysUserOnline loginUserToUserOnline(LoginUser user)
    {
        if (StringUtils.isNull(user))
        {
            return null;
        }
        SysUserOnline sysUserOnline = new SysUserOnline();
        sysUserOnline.setTokenId(user.getToken());
        sysUserOnline.setUserName(user.getUsername());
        sysUserOnline.setIpaddr(user.getIpaddr());
        sysUserOnline.setLoginTime(user.getLoginTime());
        return sysUserOnline;
    }
}
ruoyi-modules/se-system/src/main/java/com/se/system/service/impl/SysUserServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,552 @@
package com.se.system.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.validation.Validator;
import com.se.system.domain.SysPost;
import com.se.system.domain.SysUserPost;
import com.se.system.domain.SysUserRole;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import com.se.common.core.constant.UserConstants;
import com.se.common.core.exception.ServiceException;
import com.se.common.core.utils.SpringUtils;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.bean.BeanValidators;
import com.se.common.datascope.annotation.DataScope;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.domain.SysRole;
import com.se.system.api.domain.SysUser;
import com.se.system.mapper.SysPostMapper;
import com.se.system.mapper.SysRoleMapper;
import com.se.system.mapper.SysUserMapper;
import com.se.system.mapper.SysUserPostMapper;
import com.se.system.mapper.SysUserRoleMapper;
import com.se.system.service.ISysConfigService;
import com.se.system.service.ISysDeptService;
import com.se.system.service.ISysUserService;
/**
 * ç”¨æˆ· ä¸šåŠ¡å±‚å¤„ç†
 *
 * @author admin
 */
@Service
public class SysUserServiceImpl implements ISysUserService
{
    private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
    @Autowired
    private SysUserMapper userMapper;
    @Autowired
    private SysRoleMapper roleMapper;
    @Autowired
    private SysPostMapper postMapper;
    @Autowired
    private SysUserRoleMapper userRoleMapper;
    @Autowired
    private SysUserPostMapper userPostMapper;
    @Autowired
    private ISysConfigService configService;
    @Autowired
    private ISysDeptService deptService;
    @Autowired
    protected Validator validator;
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢ç”¨æˆ·åˆ—表
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    @Override
    @DataScope(deptAlias = "d", userAlias = "u")
    public List<SysUser> selectUserList(SysUser user)
    {
        return userMapper.selectUserList(user);
    }
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å·²åˆ†é…ç”¨æˆ·è§’色列表
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    @Override
    @DataScope(deptAlias = "d", userAlias = "u")
    public List<SysUser> selectAllocatedList(SysUser user)
    {
        return userMapper.selectAllocatedList(user);
    }
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢æœªåˆ†é…ç”¨æˆ·è§’色列表
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    @Override
    @DataScope(deptAlias = "d", userAlias = "u")
    public List<SysUser> selectUnallocatedList(SysUser user)
    {
        return userMapper.selectUnallocatedList(user);
    }
    /**
     * é€šè¿‡ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·
     *
     * @param userName ç”¨æˆ·å
     * @return ç”¨æˆ·å¯¹è±¡ä¿¡æ¯
     */
    @Override
    public SysUser selectUserByUserName(String userName)
    {
        return userMapper.selectUserByUserName(userName);
    }
    /**
     * é€šè¿‡ç”¨æˆ·ID查询用户
     *
     * @param userId ç”¨æˆ·ID
     * @return ç”¨æˆ·å¯¹è±¡ä¿¡æ¯
     */
    @Override
    public SysUser selectUserById(Long userId)
    {
        return userMapper.selectUserById(userId);
    }
    /**
     * æŸ¥è¯¢ç”¨æˆ·æ‰€å±žè§’色组
     *
     * @param userName ç”¨æˆ·å
     * @return ç»“æžœ
     */
    @Override
    public String selectUserRoleGroup(String userName)
    {
        List<SysRole> list = roleMapper.selectRolesByUserName(userName);
        if (CollectionUtils.isEmpty(list))
        {
            return StringUtils.EMPTY;
        }
        return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(","));
    }
    /**
     * æŸ¥è¯¢ç”¨æˆ·æ‰€å±žå²—位组
     *
     * @param userName ç”¨æˆ·å
     * @return ç»“æžœ
     */
    @Override
    public String selectUserPostGroup(String userName)
    {
        List<SysPost> list = postMapper.selectPostsByUserName(userName);
        if (CollectionUtils.isEmpty(list))
        {
            return StringUtils.EMPTY;
        }
        return list.stream().map(SysPost::getPostName).collect(Collectors.joining(","));
    }
    /**
     * æ ¡éªŒç”¨æˆ·åç§°æ˜¯å¦å”¯ä¸€
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public boolean checkUserNameUnique(SysUser user)
    {
        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
        SysUser info = userMapper.checkUserNameUnique(user.getUserName());
        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
    /**
     * æ ¡éªŒæ‰‹æœºå·ç æ˜¯å¦å”¯ä¸€
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return
     */
    @Override
    public boolean checkPhoneUnique(SysUser user)
    {
        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
        SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
    /**
     * æ ¡éªŒemail是否唯一
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return
     */
    @Override
    public boolean checkEmailUnique(SysUser user)
    {
        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
        SysUser info = userMapper.checkEmailUnique(user.getEmail());
        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }
    /**
     * æ ¡éªŒç”¨æˆ·æ˜¯å¦å…è®¸æ“ä½œ
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     */
    @Override
    public void checkUserAllowed(SysUser user)
    {
        if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin())
        {
            throw new ServiceException("不允许操作超级管理员用户");
        }
    }
    /**
     * æ ¡éªŒç”¨æˆ·æ˜¯å¦æœ‰æ•°æ®æƒé™
     *
     * @param userId ç”¨æˆ·id
     */
    @Override
    public void checkUserDataScope(Long userId)
    {
        if (!SysUser.isAdmin(SecurityUtils.getUserId()))
        {
            SysUser user = new SysUser();
            user.setUserId(userId);
            List<SysUser> users = SpringUtils.getAopProxy(this).selectUserList(user);
            if (StringUtils.isEmpty(users))
            {
                throw new ServiceException("没有权限访问用户数据!");
            }
        }
    }
    /**
     * æ–°å¢žä¿å­˜ç”¨æˆ·ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertUser(SysUser user)
    {
        // æ–°å¢žç”¨æˆ·ä¿¡æ¯
        int rows = userMapper.insertUser(user);
        // æ–°å¢žç”¨æˆ·å²—位关联
        insertUserPost(user);
        // æ–°å¢žç”¨æˆ·ä¸Žè§’色管理
        insertUserRole(user);
        return rows;
    }
    /**
     * æ³¨å†Œç”¨æˆ·ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public boolean registerUser(SysUser user)
    {
        return userMapper.insertUser(user) > 0;
    }
    /**
     * ä¿®æ”¹ä¿å­˜ç”¨æˆ·ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateUser(SysUser user)
    {
        Long userId = user.getUserId();
        // åˆ é™¤ç”¨æˆ·ä¸Žè§’色关联
        userRoleMapper.deleteUserRoleByUserId(userId);
        // æ–°å¢žç”¨æˆ·ä¸Žè§’色管理
        insertUserRole(user);
        // åˆ é™¤ç”¨æˆ·ä¸Žå²—位关联
        userPostMapper.deleteUserPostByUserId(userId);
        // æ–°å¢žç”¨æˆ·ä¸Žå²—位管理
        insertUserPost(user);
        return userMapper.updateUser(user);
    }
    /**
     * ç”¨æˆ·æŽˆæƒè§’色
     *
     * @param userId ç”¨æˆ·ID
     * @param roleIds è§’色组
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void insertUserAuth(Long userId, Long[] roleIds)
    {
        userRoleMapper.deleteUserRoleByUserId(userId);
        insertUserRole(userId, roleIds);
    }
    /**
     * ä¿®æ”¹ç”¨æˆ·çŠ¶æ€
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int updateUserStatus(SysUser user)
    {
        return userMapper.updateUser(user);
    }
    /**
     * ä¿®æ”¹ç”¨æˆ·åŸºæœ¬ä¿¡æ¯
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public boolean updateUserProfile(SysUser user)
    {
        return userMapper.updateUser(user) > 0;
    }
    /**
     * ä¿®æ”¹ç”¨æˆ·å¤´åƒ
     *
     * @param userName ç”¨æˆ·å
     * @param avatar å¤´åƒåœ°å€
     * @return ç»“æžœ
     */
    @Override
    public boolean updateUserAvatar(String userName, String avatar)
    {
        return userMapper.updateUserAvatar(userName, avatar) > 0;
    }
    /**
     * é‡ç½®ç”¨æˆ·å¯†ç 
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int resetPwd(SysUser user)
    {
        return userMapper.updateUser(user);
    }
    /**
     * é‡ç½®ç”¨æˆ·å¯†ç 
     *
     * @param userName ç”¨æˆ·å
     * @param password å¯†ç 
     * @return ç»“æžœ
     */
    @Override
    public int resetUserPwd(String userName, String password)
    {
        return userMapper.resetUserPwd(userName, password);
    }
    /**
     * æ–°å¢žç”¨æˆ·è§’色信息
     *
     * @param user ç”¨æˆ·å¯¹è±¡
     */
    public void insertUserRole(SysUser user)
    {
        this.insertUserRole(user.getUserId(), user.getRoleIds());
    }
    /**
     * æ–°å¢žç”¨æˆ·å²—位信息
     *
     * @param user ç”¨æˆ·å¯¹è±¡
     */
    public void insertUserPost(SysUser user)
    {
        Long[] posts = user.getPostIds();
        if (StringUtils.isNotEmpty(posts))
        {
            // æ–°å¢žç”¨æˆ·ä¸Žå²—位管理
            List<SysUserPost> list = new ArrayList<SysUserPost>();
            for (Long postId : posts)
            {
                SysUserPost up = new SysUserPost();
                up.setUserId(user.getUserId());
                up.setPostId(postId);
                list.add(up);
            }
            userPostMapper.batchUserPost(list);
        }
    }
    /**
     * æ–°å¢žç”¨æˆ·è§’色信息
     *
     * @param userId ç”¨æˆ·ID
     * @param roleIds è§’色组
     */
    public void insertUserRole(Long userId, Long[] roleIds)
    {
        if (StringUtils.isNotEmpty(roleIds))
        {
            // æ–°å¢žç”¨æˆ·ä¸Žè§’色管理
            List<SysUserRole> list = new ArrayList<SysUserRole>();
            for (Long roleId : roleIds)
            {
                SysUserRole ur = new SysUserRole();
                ur.setUserId(userId);
                ur.setRoleId(roleId);
                list.add(ur);
            }
            userRoleMapper.batchUserRole(list);
        }
    }
    /**
     * é€šè¿‡ç”¨æˆ·ID删除用户
     *
     * @param userId ç”¨æˆ·ID
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteUserById(Long userId)
    {
        // åˆ é™¤ç”¨æˆ·ä¸Žè§’色关联
        userRoleMapper.deleteUserRoleByUserId(userId);
        // åˆ é™¤ç”¨æˆ·ä¸Žå²—位表
        userPostMapper.deleteUserPostByUserId(userId);
        return userMapper.deleteUserById(userId);
    }
    /**
     * æ‰¹é‡åˆ é™¤ç”¨æˆ·ä¿¡æ¯
     *
     * @param userIds éœ€è¦åˆ é™¤çš„用户ID
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteUserByIds(Long[] userIds)
    {
        for (Long userId : userIds)
        {
            checkUserAllowed(new SysUser(userId));
            checkUserDataScope(userId);
        }
        // åˆ é™¤ç”¨æˆ·ä¸Žè§’色关联
        userRoleMapper.deleteUserRole(userIds);
        // åˆ é™¤ç”¨æˆ·ä¸Žå²—位关联
        userPostMapper.deleteUserPost(userIds);
        return userMapper.deleteUserByIds(userIds);
    }
    /**
     * å¯¼å…¥ç”¨æˆ·æ•°æ®
     *
     * @param userList ç”¨æˆ·æ•°æ®åˆ—表
     * @param isUpdateSupport æ˜¯å¦æ›´æ–°æ”¯æŒï¼Œå¦‚果已存在,则进行更新数据
     * @param operName æ“ä½œç”¨æˆ·
     * @return ç»“æžœ
     */
    @Override
    public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName)
    {
        if (StringUtils.isNull(userList) || userList.size() == 0)
        {
            throw new ServiceException("导入用户数据不能为空!");
        }
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        for (SysUser user : userList)
        {
            try
            {
                // éªŒè¯æ˜¯å¦å­˜åœ¨è¿™ä¸ªç”¨æˆ·
                SysUser u = userMapper.selectUserByUserName(user.getUserName());
                if (StringUtils.isNull(u))
                {
                    BeanValidators.validateWithException(validator, user);
                    deptService.checkDeptDataScope(user.getDeptId());
                    String password = configService.selectConfigByKey("sys.user.initPassword");
                    user.setPassword(SecurityUtils.encryptPassword(password));
                    user.setCreateBy(operName);
                    userMapper.insertUser(user);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " å¯¼å…¥æˆåŠŸ");
                }
                else if (isUpdateSupport)
                {
                    BeanValidators.validateWithException(validator, user);
                    checkUserAllowed(u);
                    checkUserDataScope(u.getUserId());
                    deptService.checkDeptDataScope(user.getDeptId());
                    user.setUserId(u.getUserId());
                    user.setUpdateBy(operName);
                    userMapper.updateUser(user);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " æ›´æ–°æˆåŠŸ");
                }
                else
                {
                    failureNum++;
                    failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " å·²å­˜åœ¨");
                }
            }
            catch (Exception e)
            {
                failureNum++;
                String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " å¯¼å…¥å¤±è´¥ï¼š";
                failureMsg.append(msg + e.getMessage());
                log.error(msg, e);
            }
        }
        if (failureNum > 0)
        {
            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " æ¡æ•°æ®æ ¼å¼ä¸æ­£ç¡®ï¼Œé”™è¯¯å¦‚下:");
            throw new ServiceException(failureMsg.toString());
        }
        else
        {
            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " æ¡ï¼Œæ•°æ®å¦‚下:");
        }
        return successMsg.toString();
    }
}
ruoyi-modules/se-system/src/main/resources/banner.txt
ruoyi-modules/se-system/src/main/resources/bootstrap.yml
ruoyi-modules/se-system/src/main/resources/logback.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysConfigMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysDeptMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysDictDataMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysDictTypeMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysLogininforMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysMenuMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysNoticeMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysOperLogMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysPostMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysRoleMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysUserMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysUserPostMapper.xml
ruoyi-modules/se-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
se-api/ruoyi-api-system/pom.xml
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteLogService.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysFile.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLogininfor.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteLogFallbackFactory.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUser.java
ÎļþÒÑɾ³ý
se-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ÎļþÒÑɾ³ý
se-auth/pom.xml
se-auth/src/main/java/com/se/auth/SeAuthApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.se.auth;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import com.se.common.security.annotation.EnableRyFeignClients;
/**
 * è®¤è¯æŽˆæƒä¸­å¿ƒ
 *
 * @author admin
 */
@EnableRyFeignClients
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
public class SeAuthApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(SeAuthApplication.class, args);
        System.out.println("    æŽˆæƒä¸­å¿ƒå¯åŠ¨æˆåŠŸ    ");
    }
}
se-auth/src/main/java/com/se/auth/controller/TokenController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.se.auth.controller;
import javax.servlet.http.HttpServletRequest;
import com.se.auth.form.LoginBody;
import com.se.auth.form.RegisterBody;
import com.se.auth.service.SysLoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.core.domain.R;
import com.se.common.core.utils.JwtUtils;
import com.se.common.core.utils.StringUtils;
import com.se.common.security.auth.AuthUtil;
import com.se.common.security.service.TokenService;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.model.LoginUser;
/**
 * token æŽ§åˆ¶
 *
 * @author admin
 */
@RestController
public class TokenController
{
    @Autowired
    private TokenService tokenService;
    @Autowired
    private SysLoginService sysLoginService;
    @PostMapping("login")
    public R<?> login(@RequestBody LoginBody form)
    {
        // ç”¨æˆ·ç™»å½•
        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
        // èŽ·å–ç™»å½•token
        return R.ok(tokenService.createToken(userInfo));
    }
    @DeleteMapping("logout")
    public R<?> logout(HttpServletRequest request)
    {
        String token = SecurityUtils.getToken(request);
        if (StringUtils.isNotEmpty(token))
        {
            String username = JwtUtils.getUserName(token);
            // åˆ é™¤ç”¨æˆ·ç¼“存记录
            AuthUtil.logoutByToken(token);
            // è®°å½•用户退出日志
            sysLoginService.logout(username);
        }
        return R.ok();
    }
    @PostMapping("refresh")
    public R<?> refresh(HttpServletRequest request)
    {
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser))
        {
            // åˆ·æ–°ä»¤ç‰Œæœ‰æ•ˆæœŸ
            tokenService.refreshToken(loginUser);
            return R.ok();
        }
        return R.ok();
    }
    @PostMapping("register")
    public R<?> register(@RequestBody RegisterBody registerBody)
    {
        // ç”¨æˆ·æ³¨å†Œ
        sysLoginService.register(registerBody.getUsername(), registerBody.getPassword());
        return R.ok();
    }
}
se-auth/src/main/java/com/se/auth/form/LoginBody.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.se.auth.form;
/**
 * ç”¨æˆ·ç™»å½•对象
 *
 * @author admin
 */
public class LoginBody
{
    /**
     * ç”¨æˆ·å
     */
    private String username;
    /**
     * ç”¨æˆ·å¯†ç 
     */
    private String password;
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
}
se-auth/src/main/java/com/se/auth/form/RegisterBody.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.se.auth.form;
/**
 * ç”¨æˆ·æ³¨å†Œå¯¹è±¡
 *
 * @author admin
 */
public class RegisterBody extends LoginBody
{
}
se-auth/src/main/java/com/se/auth/service/SysLoginService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
package com.se.auth.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.se.common.core.constant.CacheConstants;
import com.se.common.core.constant.Constants;
import com.se.common.core.constant.SecurityConstants;
import com.se.common.core.constant.UserConstants;
import com.se.common.core.domain.R;
import com.se.common.core.enums.UserStatus;
import com.se.common.core.exception.ServiceException;
import com.se.common.core.text.Convert;
import com.se.common.core.utils.DateUtils;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.ip.IpUtils;
import com.se.common.redis.service.RedisService;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.RemoteUserService;
import com.se.system.api.domain.SysUser;
import com.se.system.api.model.LoginUser;
/**
 * ç™»å½•校验方法
 *
 * @author admin
 */
@Component
public class SysLoginService
{
    @Autowired
    private RemoteUserService remoteUserService;
    @Autowired
    private SysPasswordService passwordService;
    @Autowired
    private SysRecordLogService recordLogService;
    @Autowired
    private RedisService redisService;
    /**
     * ç™»å½•
     */
    public LoginUser login(String username, String password)
    {
        // ç”¨æˆ·åæˆ–密码为空 é”™è¯¯
        if (StringUtils.isAnyBlank(username, password))
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户/密码必须填写");
            throw new ServiceException("用户/密码必须填写");
        }
        // å¯†ç å¦‚果不在指定范围内 é”™è¯¯
        if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户密码不在指定范围");
            throw new ServiceException("用户密码不在指定范围");
        }
        // ç”¨æˆ·åä¸åœ¨æŒ‡å®šèŒƒå›´å†… é”™è¯¯
        if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                || username.length() > UserConstants.USERNAME_MAX_LENGTH)
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户名不在指定范围");
            throw new ServiceException("用户名不在指定范围");
        }
        // IP黑名单校验
        String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST));
        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr()))
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "很遗憾,访问IP已被列入系统黑名单");
            throw new ServiceException("很遗憾,访问IP已被列入系统黑名单");
        }
        // æŸ¥è¯¢ç”¨æˆ·ä¿¡æ¯
        R<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
        if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData()))
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在");
            throw new ServiceException("登录用户:" + username + " ä¸å­˜åœ¨");
        }
        if (R.FAIL == userResult.getCode())
        {
            throw new ServiceException(userResult.getMsg());
        }
        LoginUser userInfo = userResult.getData();
        SysUser user = userResult.getData().getSysUser();
        if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
            throw new ServiceException("对不起,您的账号:" + username + " å·²è¢«åˆ é™¤");
        }
        if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
        {
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
            throw new ServiceException("对不起,您的账号:" + username + " å·²åœç”¨");
        }
        passwordService.validate(user, password);
        recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功");
        recordLoginInfo(user.getUserId());
        return userInfo;
    }
    /**
     * è®°å½•登录信息
     *
     * @param userId ç”¨æˆ·ID
     */
    public void recordLoginInfo(Long userId)
    {
        SysUser sysUser = new SysUser();
        sysUser.setUserId(userId);
        // æ›´æ–°ç”¨æˆ·ç™»å½•IP
        sysUser.setLoginIp(IpUtils.getIpAddr());
        // æ›´æ–°ç”¨æˆ·ç™»å½•æ—¶é—´
        sysUser.setLoginDate(DateUtils.getNowDate());
        remoteUserService.recordUserLogin(sysUser, SecurityConstants.INNER);
    }
    public void logout(String loginName)
    {
        recordLogService.recordLogininfor(loginName, Constants.LOGOUT, "退出成功");
    }
    /**
     * æ³¨å†Œ
     */
    public void register(String username, String password)
    {
        // ç”¨æˆ·åæˆ–密码为空 é”™è¯¯
        if (StringUtils.isAnyBlank(username, password))
        {
            throw new ServiceException("用户/密码必须填写");
        }
        if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                || username.length() > UserConstants.USERNAME_MAX_LENGTH)
        {
            throw new ServiceException("账户长度必须在2到20个字符之间");
        }
        if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
        {
            throw new ServiceException("密码长度必须在5到20个字符之间");
        }
        // æ³¨å†Œç”¨æˆ·ä¿¡æ¯
        SysUser sysUser = new SysUser();
        sysUser.setUserName(username);
        sysUser.setNickName(username);
        sysUser.setPassword(SecurityUtils.encryptPassword(password));
        R<?> registerResult = remoteUserService.registerUserInfo(sysUser, SecurityConstants.INNER);
        if (R.FAIL == registerResult.getCode())
        {
            throw new ServiceException(registerResult.getMsg());
        }
        recordLogService.recordLogininfor(username, Constants.REGISTER, "注册成功");
    }
}
se-auth/src/main/java/com/se/auth/service/SysPasswordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.se.auth.service;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.se.common.core.constant.CacheConstants;
import com.se.common.core.constant.Constants;
import com.se.common.core.exception.ServiceException;
import com.se.common.redis.service.RedisService;
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.domain.SysUser;
/**
 * ç™»å½•密码方法
 *
 * @author admin
 */
@Component
public class SysPasswordService
{
    @Autowired
    private RedisService redisService;
    private int maxRetryCount = CacheConstants.PASSWORD_MAX_RETRY_COUNT;
    private Long lockTime = CacheConstants.PASSWORD_LOCK_TIME;
    @Autowired
    private SysRecordLogService recordLogService;
    /**
     * ç™»å½•账户密码错误次数缓存键名
     *
     * @param username ç”¨æˆ·å
     * @return ç¼“存键key
     */
    private String getCacheKey(String username)
    {
        return CacheConstants.PWD_ERR_CNT_KEY + username;
    }
    public void validate(SysUser user, String password)
    {
        String username = user.getUserName();
        Integer retryCount = redisService.getCacheObject(getCacheKey(username));
        if (retryCount == null)
        {
            retryCount = 0;
        }
        if (retryCount >= Integer.valueOf(maxRetryCount).intValue())
        {
            String errMsg = String.format("密码输入错误%s次,帐户锁定%s分钟", maxRetryCount, lockTime);
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL,errMsg);
            throw new ServiceException(errMsg);
        }
        if (!matches(user, password))
        {
            retryCount = retryCount + 1;
            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, String.format("密码输入错误%s次", retryCount));
            redisService.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES);
            throw new ServiceException("用户不存在/密码错误");
        }
        else
        {
            clearLoginRecordCache(username);
        }
    }
    public boolean matches(SysUser user, String rawPassword)
    {
        return SecurityUtils.matchesPassword(rawPassword, user.getPassword());
    }
    public void clearLoginRecordCache(String loginName)
    {
        if (redisService.hasKey(getCacheKey(loginName)))
        {
            redisService.deleteObject(getCacheKey(loginName));
        }
    }
}
se-auth/src/main/java/com/se/auth/service/SysRecordLogService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.se.auth.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.se.common.core.constant.Constants;
import com.se.common.core.constant.SecurityConstants;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.ip.IpUtils;
import com.se.system.api.RemoteLogService;
import com.se.system.api.domain.SysLogininfor;
/**
 * è®°å½•日志方法
 *
 * @author admin
 */
@Component
public class SysRecordLogService
{
    @Autowired
    private RemoteLogService remoteLogService;
    /**
     * è®°å½•登录信息
     *
     * @param username ç”¨æˆ·å
     * @param status çŠ¶æ€
     * @param message æ¶ˆæ¯å†…容
     * @return
     */
    public void recordLogininfor(String username, String status, String message)
    {
        SysLogininfor logininfor = new SysLogininfor();
        logininfor.setUserName(username);
        logininfor.setIpaddr(IpUtils.getIpAddr());
        logininfor.setMsg(message);
        // æ—¥å¿—状态
        if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER))
        {
            logininfor.setStatus(Constants.LOGIN_SUCCESS_STATUS);
        }
        else if (Constants.LOGIN_FAIL.equals(status))
        {
            logininfor.setStatus(Constants.LOGIN_FAIL_STATUS);
        }
        remoteLogService.saveLogininfor(logininfor, SecurityConstants.INNER);
    }
}
se-auth/src/main/resources/banner.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
Spring Boot Version: ${spring-boot.version}
Spring Application Name: ${spring.application.name}
SeAuthApplication,已经启动
se-auth/src/main/resources/bootstrap.yml
se-auth/src/main/resources/logback.xml
se-common/ruoyi-common-core/pom.xml
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excels.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/UserConstants.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/R.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/UserStatus.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/CaptchaException.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/CheckedException.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/GlobalException.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/ServiceException.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotPermissionException.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotRoleException.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileNameLengthLimitExceededException.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileSizeLimitExceededException.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/InvalidExtensionException.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/CaptchaExpireException.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/Convert.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/StrFormatter.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ExceptionUtil.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/PageUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ServletUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/SpringUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileTypeUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/EscapeUtil.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelHandlerAdapter.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/IdUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/Seq.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/UUID.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/controller/BaseController.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/AjaxResult.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseEntity.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/TreeEntity.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/PageDomain.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableDataInfo.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableSupport.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ÎļþÒÑɾ³ý
se-common/ruoyi-common-datascope/pom.xml
ÎļþÒÑɾ³ý
se-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/annotation/DataScope.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-datascope/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ÎļþÒÑɾ³ý
se-common/ruoyi-common-datasource/src/main/java/com/ruoyi/common/datasource/annotation/Slave.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-log/pom.xml
ÎļþÒÑɾ³ý
se-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/filter/PropertyPreExcludeFilter.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ÎļþÒÑɾ³ý
se-common/ruoyi-common-redis/pom.xml
ÎļþÒÑɾ³ý
se-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/FastJson2JsonRedisSerializer.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/pom.xml
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/EnableCustomConfig.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/EnableRyFeignClients.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/Logical.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresLogin.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresPermissions.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresRoles.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/aspect/PreAuthorizeAspect.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/ApplicationConfig.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/WebMvcConfig.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignAutoConfiguration.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignRequestInterceptor.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ÎļþÒÑɾ³ý
se-common/ruoyi-common-sensitive/pom.xml
ÎļþÒÑɾ³ý
se-common/ruoyi-common-sensitive/src/main/java/com/ruoyi/common/sensitive/annotation/Sensitive.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-swagger/pom.xml
ÎļþÒÑɾ³ý
se-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerAutoConfiguration.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerProperties.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerWebConfiguration.java
ÎļþÒÑɾ³ý
se-common/ruoyi-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ÎļþÒÑɾ³ý
se-gateway/pom.xml
se-gateway/src/main/java/com/se/gateway/SeGatewayApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.se.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
/**
 * ç½‘关启动程序
 *
 * @author admin
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
public class SeGatewayApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(SeGatewayApplication.class, args);
        System.out.println("    ç½‘关启动成功    ");
    }
}
se-gateway/src/main/java/com/se/gateway/config/CaptchaConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.se.gateway.config;
import java.util.Properties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import static com.google.code.kaptcha.Constants.*;
/**
 * éªŒè¯ç é…ç½®
 *
 * @author admin
 */
@Configuration
public class CaptchaConfig
{
    @Bean(name = "captchaProducer")
    public DefaultKaptcha getKaptchaBean()
    {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // æ˜¯å¦æœ‰è¾¹æ¡† é»˜è®¤ä¸ºtrue æˆ‘们可以自己设置yes,no
        properties.setProperty(KAPTCHA_BORDER, "yes");
        // éªŒè¯ç æ–‡æœ¬å­—符颜色 é»˜è®¤ä¸ºColor.BLACK
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
        // éªŒè¯ç å›¾ç‰‡å®½åº¦ é»˜è®¤ä¸º200
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
        // éªŒè¯ç å›¾ç‰‡é«˜åº¦ é»˜è®¤ä¸º50
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
        // éªŒè¯ç æ–‡æœ¬å­—符大小 é»˜è®¤ä¸º40
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
        // KAPTCHA_SESSION_KEY
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
        // éªŒè¯ç æ–‡æœ¬å­—符长度 é»˜è®¤ä¸º5
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
        // éªŒè¯ç æ–‡æœ¬å­—体样式 é»˜è®¤ä¸ºnew Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
        // å›¾ç‰‡æ ·å¼ æ°´çº¹com.google.code.kaptcha.impl.WaterRipple é±¼çœ¼com.google.code.kaptcha.impl.FishEyeGimpy é˜´å½±com.google.code.kaptcha.impl.ShadowGimpy
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
    @Bean(name = "captchaProducerMath")
    public DefaultKaptcha getKaptchaBeanMath()
    {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // æ˜¯å¦æœ‰è¾¹æ¡† é»˜è®¤ä¸ºtrue æˆ‘们可以自己设置yes,no
        properties.setProperty(KAPTCHA_BORDER, "yes");
        // è¾¹æ¡†é¢œè‰² é»˜è®¤ä¸ºColor.BLACK
        properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");
        // éªŒè¯ç æ–‡æœ¬å­—符颜色 é»˜è®¤ä¸ºColor.BLACK
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
        // éªŒè¯ç å›¾ç‰‡å®½åº¦ é»˜è®¤ä¸º200
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
        // éªŒè¯ç å›¾ç‰‡é«˜åº¦ é»˜è®¤ä¸º50
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
        // éªŒè¯ç æ–‡æœ¬å­—符大小 é»˜è®¤ä¸º40
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");
        // KAPTCHA_SESSION_KEY
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
        // éªŒè¯ç æ–‡æœ¬ç”Ÿæˆå™¨
        properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "KaptchaTextCreator");
        // éªŒè¯ç æ–‡æœ¬å­—符间距 é»˜è®¤ä¸º2
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
        // éªŒè¯ç æ–‡æœ¬å­—符长度 é»˜è®¤ä¸º5
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
        // éªŒè¯ç æ–‡æœ¬å­—体样式 é»˜è®¤ä¸ºnew Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
        // éªŒè¯ç å™ªç‚¹é¢œè‰² é»˜è®¤ä¸ºColor.BLACK
        properties.setProperty(KAPTCHA_NOISE_COLOR, "white");
        // å¹²æ‰°å®žçŽ°ç±»
        properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
        // å›¾ç‰‡æ ·å¼ æ°´çº¹com.google.code.kaptcha.impl.WaterRipple é±¼çœ¼com.google.code.kaptcha.impl.FishEyeGimpy é˜´å½±com.google.code.kaptcha.impl.ShadowGimpy
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}
se-gateway/src/main/java/com/se/gateway/config/GatewayConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.se.gateway.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import com.se.gateway.handler.SentinelFallbackHandler;
/**
 * ç½‘关限流配置
 *
 * @author admin
 */
@Configuration
public class GatewayConfig
{
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelFallbackHandler sentinelGatewayExceptionHandler()
    {
        return new SentinelFallbackHandler();
    }
}
se-gateway/src/main/java/com/se/gateway/config/KaptchaTextCreator.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
package com.se.gateway.config;
import java.util.Random;
import com.google.code.kaptcha.text.impl.DefaultTextCreator;
/**
 * éªŒè¯ç æ–‡æœ¬ç”Ÿæˆå™¨
 *
 * @author admin
 */
public class KaptchaTextCreator extends DefaultTextCreator
{
    private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(",");
    @Override
    public String getText()
    {
        Integer result = 0;
        Random random = new Random();
        int x = random.nextInt(10);
        int y = random.nextInt(10);
        StringBuilder suChinese = new StringBuilder();
        int randomoperands = random.nextInt(3);
        if (randomoperands == 0)
        {
            result = x * y;
            suChinese.append(CNUMBERS[x]);
            suChinese.append("*");
            suChinese.append(CNUMBERS[y]);
        }
        else if (randomoperands == 1)
        {
            if ((x != 0) && y % x == 0)
            {
                result = y / x;
                suChinese.append(CNUMBERS[y]);
                suChinese.append("/");
                suChinese.append(CNUMBERS[x]);
            }
            else
            {
                result = x + y;
                suChinese.append(CNUMBERS[x]);
                suChinese.append("+");
                suChinese.append(CNUMBERS[y]);
            }
        }
        else if (randomoperands == 2)
        {
            if (x >= y)
            {
                result = x - y;
                suChinese.append(CNUMBERS[x]);
                suChinese.append("-");
                suChinese.append(CNUMBERS[y]);
            }
            else
            {
                result = y - x;
                suChinese.append(CNUMBERS[y]);
                suChinese.append("-");
                suChinese.append(CNUMBERS[x]);
            }
        }
        else
        {
            result = x + y;
            suChinese.append(CNUMBERS[x]);
            suChinese.append("+");
            suChinese.append(CNUMBERS[y]);
        }
        suChinese.append("=?@" + result);
        return suChinese.toString();
    }
}
se-gateway/src/main/java/com/se/gateway/config/RouterFunctionConfiguration.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.se.gateway.config;
import com.se.gateway.handler.ValidateCodeHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
/**
 * è·¯ç”±é…ç½®ä¿¡æ¯
 *
 * @author admin
 */
@Configuration
public class RouterFunctionConfiguration
{
    @Autowired
    private ValidateCodeHandler validateCodeHandler;
    @SuppressWarnings("rawtypes")
    @Bean
    public RouterFunction routerFunction()
    {
        return RouterFunctions.route(
                RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                validateCodeHandler);
    }
}
se-gateway/src/main/java/com/se/gateway/config/SwaggerProvider.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.se.gateway.config;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.support.NameUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.config.ResourceHandlerRegistry;
import org.springframework.web.reactive.config.WebFluxConfigurer;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
/**
 * èšåˆç³»ç»ŸæŽ¥å£
 *
 * @author admin
 */
@Component
public class SwaggerProvider implements SwaggerResourcesProvider, WebFluxConfigurer
{
    /**
     * Swagger2默认的url后缀
     */
    public static final String SWAGGER2URL = "/v2/api-docs";
    /**
     * ç½‘关路由
     */
    @Lazy
    @Autowired
    private RouteLocator routeLocator;
    @Autowired
    private GatewayProperties gatewayProperties;
    /**
     * èšåˆå…¶ä»–服务接口
     *
     * @return
     */
    @Override
    public List<SwaggerResource> get()
    {
        List<SwaggerResource> resourceList = new ArrayList<>();
        List<String> routes = new ArrayList<>();
        // èŽ·å–ç½‘å…³ä¸­é…ç½®çš„route
        routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
        gatewayProperties.getRoutes().stream()
                .filter(routeDefinition -> routes
                        .contains(routeDefinition.getId()))
                .forEach(routeDefinition -> routeDefinition.getPredicates().stream()
                        .filter(predicateDefinition -> "Path".equalsIgnoreCase(predicateDefinition.getName()))
                        .filter(predicateDefinition -> !"ruoyi-auth".equalsIgnoreCase(routeDefinition.getId()))
                        .forEach(predicateDefinition -> resourceList
                                .add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs()
                                        .get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", SWAGGER2URL)))));
        return resourceList;
    }
    private SwaggerResource swaggerResource(String name, String location)
    {
        SwaggerResource swaggerResource = new SwaggerResource();
        swaggerResource.setName(name);
        swaggerResource.setLocation(location);
        swaggerResource.setSwaggerVersion("2.0");
        return swaggerResource;
    }
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry)
    {
        /** swagger-ui åœ°å€ */
        registry.addResourceHandler("/swagger-ui/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
    }
}
se-gateway/src/main/java/com/se/gateway/config/properties/CaptchaProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.se.gateway.config.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
/**
 * éªŒè¯ç é…ç½®
 *
 * @author admin
 */
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "security.captcha")
public class CaptchaProperties
{
    /**
     * éªŒè¯ç å¼€å…³
     */
    private Boolean enabled;
    /**
     * éªŒè¯ç ç±»åž‹ï¼ˆmath æ•°ç»„计算 char å­—符)
     */
    private String type;
    public Boolean getEnabled()
    {
        return enabled;
    }
    public void setEnabled(Boolean enabled)
    {
        this.enabled = enabled;
    }
    public String getType()
    {
        return type;
    }
    public void setType(String type)
    {
        this.type = type;
    }
}
se-gateway/src/main/java/com/se/gateway/config/properties/IgnoreWhiteProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.se.gateway.config.properties;
import java.util.ArrayList;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
/**
 * æ”¾è¡Œç™½åå•配置
 *
 * @author admin
 */
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "security.ignore")
public class IgnoreWhiteProperties
{
    /**
     * æ”¾è¡Œç™½åå•配置,网关不校验此处的白名单
     */
    private List<String> whites = new ArrayList<>();
    public List<String> getWhites()
    {
        return whites;
    }
    public void setWhites(List<String> whites)
    {
        this.whites = whites;
    }
}
se-gateway/src/main/java/com/se/gateway/config/properties/XssProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.se.gateway.config.properties;
import java.util.ArrayList;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
/**
 * XSS跨站脚本配置
 *
 * @author admin
 */
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "security.xss")
public class XssProperties
{
    /**
     * Xss开关
     */
    private Boolean enabled;
    /**
     * æŽ’除路径
     */
    private List<String> excludeUrls = new ArrayList<>();
    public Boolean getEnabled()
    {
        return enabled;
    }
    public void setEnabled(Boolean enabled)
    {
        this.enabled = enabled;
    }
    public List<String> getExcludeUrls()
    {
        return excludeUrls;
    }
    public void setExcludeUrls(List<String> excludeUrls)
    {
        this.excludeUrls = excludeUrls;
    }
}
se-gateway/src/main/java/com/se/gateway/filter/AuthFilter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
package com.se.gateway.filter;
import com.se.gateway.config.properties.IgnoreWhiteProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import com.se.common.core.constant.CacheConstants;
import com.se.common.core.constant.HttpStatus;
import com.se.common.core.constant.SecurityConstants;
import com.se.common.core.constant.TokenConstants;
import com.se.common.core.utils.JwtUtils;
import com.se.common.core.utils.ServletUtils;
import com.se.common.core.utils.StringUtils;
import com.se.common.redis.service.RedisService;
import io.jsonwebtoken.Claims;
import reactor.core.publisher.Mono;
/**
 * ç½‘关鉴权
 *
 * @author admin
 */
@Component
public class AuthFilter implements GlobalFilter, Ordered
{
    private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
    // æŽ’除过滤的 uri åœ°å€ï¼Œnacos自行添加
    @Autowired
    private IgnoreWhiteProperties ignoreWhite;
    @Autowired
    private RedisService redisService;
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
    {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpRequest.Builder mutate = request.mutate();
        String url = request.getURI().getPath();
        // è·³è¿‡ä¸éœ€è¦éªŒè¯çš„路径
        if (StringUtils.matches(url, ignoreWhite.getWhites()))
        {
            return chain.filter(exchange);
        }
        String token = getToken(request);
        if (StringUtils.isEmpty(token))
        {
            return unauthorizedResponse(exchange, "令牌不能为空");
        }
        Claims claims = JwtUtils.parseToken(token);
        if (claims == null)
        {
            return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
        }
        String userkey = JwtUtils.getUserKey(claims);
        boolean islogin = redisService.hasKey(getTokenKey(userkey));
        if (!islogin)
        {
            return unauthorizedResponse(exchange, "登录状态已过期");
        }
        String userid = JwtUtils.getUserId(claims);
        String username = JwtUtils.getUserName(claims);
        if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username))
        {
            return unauthorizedResponse(exchange, "令牌验证失败");
        }
        // è®¾ç½®ç”¨æˆ·ä¿¡æ¯åˆ°è¯·æ±‚
        addHeader(mutate, SecurityConstants.USER_KEY, userkey);
        addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
        addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
        // å†…部请求来源参数清除
        removeHeader(mutate, SecurityConstants.FROM_SOURCE);
        return chain.filter(exchange.mutate().request(mutate.build()).build());
    }
    private void addHeader(ServerHttpRequest.Builder mutate, String name, Object value)
    {
        if (value == null)
        {
            return;
        }
        String valueStr = value.toString();
        String valueEncode = ServletUtils.urlEncode(valueStr);
        mutate.header(name, valueEncode);
    }
    private void removeHeader(ServerHttpRequest.Builder mutate, String name)
    {
        mutate.headers(httpHeaders -> httpHeaders.remove(name)).build();
    }
    private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg)
    {
        log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath());
        return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED);
    }
    /**
     * èŽ·å–ç¼“å­˜key
     */
    private String getTokenKey(String token)
    {
        return CacheConstants.LOGIN_TOKEN_KEY + token;
    }
    /**
     * èŽ·å–è¯·æ±‚token
     */
    private String getToken(ServerHttpRequest request)
    {
        String token = request.getHeaders().getFirst(TokenConstants.AUTHENTICATION);
        // å¦‚果前端设置了令牌前缀,则裁剪掉前缀
        if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX))
        {
            token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
        }
        return token;
    }
    @Override
    public int getOrder()
    {
        return -200;
    }
}
se-gateway/src/main/java/com/se/gateway/filter/BlackListUrlFilter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.se.gateway.filter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import com.se.common.core.utils.ServletUtils;
/**
 * é»‘名单过滤器
 *
 * @author admin
 */
@Component
public class BlackListUrlFilter extends AbstractGatewayFilterFactory<BlackListUrlFilter.Config>
{
    @Override
    public GatewayFilter apply(Config config)
    {
        return (exchange, chain) -> {
            String url = exchange.getRequest().getURI().getPath();
            if (config.matchBlacklist(url))
            {
                return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求地址不允许访问");
            }
            return chain.filter(exchange);
        };
    }
    public BlackListUrlFilter()
    {
        super(Config.class);
    }
    public static class Config
    {
        private List<String> blacklistUrl;
        private List<Pattern> blacklistUrlPattern = new ArrayList<>();
        public boolean matchBlacklist(String url)
        {
            return !blacklistUrlPattern.isEmpty() && blacklistUrlPattern.stream().anyMatch(p -> p.matcher(url).find());
        }
        public List<String> getBlacklistUrl()
        {
            return blacklistUrl;
        }
        public void setBlacklistUrl(List<String> blacklistUrl)
        {
            this.blacklistUrl = blacklistUrl;
            this.blacklistUrlPattern.clear();
            this.blacklistUrl.forEach(url -> {
                this.blacklistUrlPattern.add(Pattern.compile(url.replaceAll("\\*\\*", "(.*?)"), Pattern.CASE_INSENSITIVE));
            });
        }
    }
}
se-gateway/src/main/java/com/se/gateway/filter/CacheRequestFilter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.se.gateway.filter;
import java.util.Collections;
import java.util.List;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
 * èŽ·å–body请求数据(解决流不能重复读取问题)
 *
 * @author admin
 */
@Component
public class CacheRequestFilter extends AbstractGatewayFilterFactory<CacheRequestFilter.Config>
{
    public CacheRequestFilter()
    {
        super(Config.class);
    }
    @Override
    public String name()
    {
        return "CacheRequestFilter";
    }
    @Override
    public GatewayFilter apply(Config config)
    {
        CacheRequestGatewayFilter cacheRequestGatewayFilter = new CacheRequestGatewayFilter();
        Integer order = config.getOrder();
        if (order == null)
        {
            return cacheRequestGatewayFilter;
        }
        return new OrderedGatewayFilter(cacheRequestGatewayFilter, order);
    }
    public static class CacheRequestGatewayFilter implements GatewayFilter
    {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
        {
            // GET DELETE ä¸è¿‡æ»¤
            HttpMethod method = exchange.getRequest().getMethod();
            if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE)
            {
                return chain.filter(exchange);
            }
            return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (serverHttpRequest) -> {
                if (serverHttpRequest == exchange.getRequest())
                {
                    return chain.filter(exchange);
                }
                return chain.filter(exchange.mutate().request(serverHttpRequest).build());
            });
        }
    }
    @Override
    public List<String> shortcutFieldOrder()
    {
        return Collections.singletonList("order");
    }
    static class Config
    {
        private Integer order;
        public Integer getOrder()
        {
            return order;
        }
        public void setOrder(Integer order)
        {
            this.order = order;
        }
    }
}
se-gateway/src/main/java/com/se/gateway/filter/ValidateCodeFilter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package com.se.gateway.filter;
import java.nio.CharBuffer;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.atomic.AtomicReference;
import com.se.gateway.service.ValidateCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.se.common.core.utils.ServletUtils;
import com.se.common.core.utils.StringUtils;
import com.se.gateway.config.properties.CaptchaProperties;
import reactor.core.publisher.Flux;
/**
 * éªŒè¯ç è¿‡æ»¤å™¨
 *
 * @author admin
 */
@Component
public class ValidateCodeFilter extends AbstractGatewayFilterFactory<Object>
{
    private final static String[] VALIDATE_URL = new String[] { "/auth/login", "/auth/register" };
    @Autowired
    private ValidateCodeService validateCodeService;
    @Autowired
    private CaptchaProperties captchaProperties;
    private static final String CODE = "code";
    private static final String UUID = "uuid";
    @Override
    public GatewayFilter apply(Object config)
    {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            // éžç™»å½•/注册请求或验证码关闭,不处理
            if (!StringUtils.equalsAnyIgnoreCase(request.getURI().getPath(), VALIDATE_URL) || !captchaProperties.getEnabled())
            {
                return chain.filter(exchange);
            }
            try
            {
                String rspStr = resolveBodyFromRequest(request);
                JSONObject obj = JSON.parseObject(rspStr);
                validateCodeService.checkCaptcha(obj.getString(CODE), obj.getString(UUID));
            }
            catch (Exception e)
            {
                return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage());
            }
            return chain.filter(exchange);
        };
    }
    private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest)
    {
        // èŽ·å–è¯·æ±‚ä½“
        Flux<DataBuffer> body = serverHttpRequest.getBody();
        AtomicReference<String> bodyRef = new AtomicReference<>();
        body.subscribe(buffer -> {
            CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer());
            DataBufferUtils.release(buffer);
            bodyRef.set(charBuffer.toString());
        });
        return bodyRef.get();
    }
}
se-gateway/src/main/java/com/se/gateway/filter/XssFilter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
package com.se.gateway.filter;
import java.nio.charset.StandardCharsets;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.core.io.buffer.NettyDataBufferFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.html.EscapeUtil;
import com.se.gateway.config.properties.XssProperties;
import io.netty.buffer.ByteBufAllocator;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
/**
 * è·¨ç«™è„šæœ¬è¿‡æ»¤å™¨
 *
 * @author admin
 */
@Component
@ConditionalOnProperty(value = "security.xss.enabled", havingValue = "true")
public class XssFilter implements GlobalFilter, Ordered
{
    // è·¨ç«™è„šæœ¬çš„ xss é…ç½®ï¼Œnacos自行添加
    @Autowired
    private XssProperties xss;
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
    {
        ServerHttpRequest request = exchange.getRequest();
        // xss开关未开启 æˆ– é€šè¿‡nacos关闭,不过滤
        if (!xss.getEnabled())
        {
            return chain.filter(exchange);
        }
        // GET DELETE ä¸è¿‡æ»¤
        HttpMethod method = request.getMethod();
        if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE)
        {
            return chain.filter(exchange);
        }
        // éžjson类型,不过滤
        if (!isJsonRequest(exchange))
        {
            return chain.filter(exchange);
        }
        // excludeUrls ä¸è¿‡æ»¤
        String url = request.getURI().getPath();
        if (StringUtils.matches(url, xss.getExcludeUrls()))
        {
            return chain.filter(exchange);
        }
        ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange);
        return chain.filter(exchange.mutate().request(httpRequestDecorator).build());
    }
    private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange)
    {
        ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest())
        {
            @Override
            public Flux<DataBuffer> getBody()
            {
                Flux<DataBuffer> body = super.getBody();
                return body.buffer().map(dataBuffers -> {
                    DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
                    DataBuffer join = dataBufferFactory.join(dataBuffers);
                    byte[] content = new byte[join.readableByteCount()];
                    join.read(content);
                    DataBufferUtils.release(join);
                    String bodyStr = new String(content, StandardCharsets.UTF_8);
                    // é˜²xss攻击过滤
                    bodyStr = EscapeUtil.clean(bodyStr);
                    // è½¬æˆå­—节
                    byte[] bytes = bodyStr.getBytes(StandardCharsets.UTF_8);
                    NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
                    DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);
                    buffer.write(bytes);
                    return buffer;
                });
            }
            @Override
            public HttpHeaders getHeaders()
            {
                HttpHeaders httpHeaders = new HttpHeaders();
                httpHeaders.putAll(super.getHeaders());
                // ç”±äºŽä¿®æ”¹äº†è¯·æ±‚体的body,导致content-length长度不确定,因此需要删除原先的content-length
                httpHeaders.remove(HttpHeaders.CONTENT_LENGTH);
                httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
                return httpHeaders;
            }
        };
        return serverHttpRequestDecorator;
    }
    /**
     * æ˜¯å¦æ˜¯Json请求
     *
     * @param exchange HTTP请求
     */
    public boolean isJsonRequest(ServerWebExchange exchange)
    {
        String header = exchange.getRequest().getHeaders().getFirst(HttpHeaders.CONTENT_TYPE);
        return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE);
    }
    @Override
    public int getOrder()
    {
        return -100;
    }
}
se-gateway/src/main/java/com/se/gateway/handler/GatewayExceptionHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.se.gateway.handler;
import org.springframework.cloud.gateway.support.NotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.server.ServerWebExchange;
import com.se.common.core.utils.ServletUtils;
import reactor.core.publisher.Mono;
/**
 * ç½‘关统一异常处理
 *
 * @author admin
 */
@Order(-1)
@Configuration
public class GatewayExceptionHandler implements ErrorWebExceptionHandler
{
    private static final Logger log = LoggerFactory.getLogger(GatewayExceptionHandler.class);
    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex)
    {
        ServerHttpResponse response = exchange.getResponse();
        if (exchange.getResponse().isCommitted())
        {
            return Mono.error(ex);
        }
        String msg;
        if (ex instanceof NotFoundException)
        {
            msg = "服务未找到";
        }
        else if (ex instanceof ResponseStatusException)
        {
            ResponseStatusException responseStatusException = (ResponseStatusException) ex;
            msg = responseStatusException.getMessage();
        }
        else
        {
            msg = "内部服务器错误";
        }
        log.error("[网关异常处理]请求路径:{},异常信息:{}", exchange.getRequest().getPath(), ex.getMessage());
        return ServletUtils.webFluxResponseWriter(response, msg);
    }
}
se-gateway/src/main/java/com/se/gateway/handler/SentinelFallbackHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.se.gateway.handler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.se.common.core.utils.ServletUtils;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebExceptionHandler;
import reactor.core.publisher.Mono;
/**
 * è‡ªå®šä¹‰é™æµå¼‚常处理
 *
 * @author admin
 */
public class SentinelFallbackHandler implements WebExceptionHandler
{
    private Mono<Void> writeResponse(ServerResponse response, ServerWebExchange exchange)
    {
        return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求超过最大数,请稍候再试");
    }
    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex)
    {
        if (exchange.getResponse().isCommitted())
        {
            return Mono.error(ex);
        }
        if (!BlockException.isBlockException(ex))
        {
            return Mono.error(ex);
        }
        return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange));
    }
    private Mono<ServerResponse> handleBlockedRequest(ServerWebExchange exchange, Throwable throwable)
    {
        return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable);
    }
}
se-gateway/src/main/java/com/se/gateway/handler/SwaggerHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.se.gateway.handler;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import springfox.documentation.swagger.web.SecurityConfiguration;
import springfox.documentation.swagger.web.SecurityConfigurationBuilder;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import springfox.documentation.swagger.web.UiConfiguration;
import springfox.documentation.swagger.web.UiConfigurationBuilder;
@RestController
@RequestMapping("/swagger-resources")
public class SwaggerHandler
{
    @Autowired(required = false)
    private SecurityConfiguration securityConfiguration;
    @Autowired(required = false)
    private UiConfiguration uiConfiguration;
    private final SwaggerResourcesProvider swaggerResources;
    @Autowired
    public SwaggerHandler(SwaggerResourcesProvider swaggerResources)
    {
        this.swaggerResources = swaggerResources;
    }
    @GetMapping("/configuration/security")
    public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration()
    {
        return Mono.just(new ResponseEntity<>(
                Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()),
                HttpStatus.OK));
    }
    @GetMapping("/configuration/ui")
    public Mono<ResponseEntity<UiConfiguration>> uiConfiguration()
    {
        return Mono.just(new ResponseEntity<>(
                Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
    }
    @SuppressWarnings("rawtypes")
    @GetMapping("")
    public Mono<ResponseEntity> swaggerResources()
    {
        return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
    }
}
se-gateway/src/main/java/com/se/gateway/handler/ValidateCodeHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.se.gateway.handler;
import java.io.IOException;
import com.se.gateway.service.ValidateCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import com.se.common.core.exception.CaptchaException;
import com.se.common.core.web.domain.AjaxResult;
import reactor.core.publisher.Mono;
/**
 * éªŒè¯ç èŽ·å–
 *
 * @author admin
 */
@Component
public class ValidateCodeHandler implements HandlerFunction<ServerResponse>
{
    @Autowired
    private ValidateCodeService validateCodeService;
    @Override
    public Mono<ServerResponse> handle(ServerRequest serverRequest)
    {
        AjaxResult ajax;
        try
        {
            ajax = validateCodeService.createCaptcha();
        }
        catch (CaptchaException | IOException e)
        {
            return Mono.error(e);
        }
        return ServerResponse.status(HttpStatus.OK).body(BodyInserters.fromValue(ajax));
    }
}
se-gateway/src/main/java/com/se/gateway/service/ValidateCodeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.se.gateway.service;
import java.io.IOException;
import com.se.common.core.exception.CaptchaException;
import com.se.common.core.web.domain.AjaxResult;
/**
 * éªŒè¯ç å¤„理
 *
 * @author admin
 */
public interface ValidateCodeService
{
    /**
     * ç”ŸæˆéªŒè¯ç 
     */
    public AjaxResult createCaptcha() throws IOException, CaptchaException;
    /**
     * æ ¡éªŒéªŒè¯ç 
     */
    public void checkCaptcha(String key, String value) throws CaptchaException;
}
se-gateway/src/main/java/com/se/gateway/service/impl/ValidateCodeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
package com.se.gateway.service.impl;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import com.se.gateway.config.properties.CaptchaProperties;
import com.se.gateway.service.ValidateCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.FastByteArrayOutputStream;
import com.google.code.kaptcha.Producer;
import com.se.common.core.constant.CacheConstants;
import com.se.common.core.constant.Constants;
import com.se.common.core.exception.CaptchaException;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.sign.Base64;
import com.se.common.core.utils.uuid.IdUtils;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.redis.service.RedisService;
/**
 * éªŒè¯ç å®žçŽ°å¤„ç†
 *
 * @author admin
 */
@Service
public class ValidateCodeServiceImpl implements ValidateCodeService
{
    @Resource(name = "captchaProducer")
    private Producer captchaProducer;
    @Resource(name = "captchaProducerMath")
    private Producer captchaProducerMath;
    @Autowired
    private RedisService redisService;
    @Autowired
    private CaptchaProperties captchaProperties;
    /**
     * ç”ŸæˆéªŒè¯ç 
     */
    @Override
    public AjaxResult createCaptcha() throws IOException, CaptchaException
    {
        AjaxResult ajax = AjaxResult.success();
        boolean captchaEnabled = captchaProperties.getEnabled();
        ajax.put("captchaEnabled", captchaEnabled);
        if (!captchaEnabled)
        {
            return ajax;
        }
        // ä¿å­˜éªŒè¯ç ä¿¡æ¯
        String uuid = IdUtils.simpleUUID();
        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
        String capStr = null, code = null;
        BufferedImage image = null;
        String captchaType = captchaProperties.getType();
        // ç”ŸæˆéªŒè¯ç 
        if ("math".equals(captchaType))
        {
            String capText = captchaProducerMath.createText();
            capStr = capText.substring(0, capText.lastIndexOf("@"));
            code = capText.substring(capText.lastIndexOf("@") + 1);
            image = captchaProducerMath.createImage(capStr);
        }
        else if ("char".equals(captchaType))
        {
            capStr = code = captchaProducer.createText();
            image = captchaProducer.createImage(capStr);
        }
        redisService.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
        // è½¬æ¢æµä¿¡æ¯å†™å‡º
        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
        try
        {
            ImageIO.write(image, "jpg", os);
        }
        catch (IOException e)
        {
            return AjaxResult.error(e.getMessage());
        }
        ajax.put("uuid", uuid);
        ajax.put("img", Base64.encode(os.toByteArray()));
        return ajax;
    }
    /**
     * æ ¡éªŒéªŒè¯ç 
     */
    @Override
    public void checkCaptcha(String code, String uuid) throws CaptchaException
    {
        if (StringUtils.isEmpty(code))
        {
            throw new CaptchaException("验证码不能为空");
        }
        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
        String captcha = redisService.getCacheObject(verifyKey);
        if (captcha == null)
        {
            throw new CaptchaException("验证码已失效");
        }
        redisService.deleteObject(verifyKey);
        if (!code.equalsIgnoreCase(captcha))
        {
            throw new CaptchaException("验证码错误");
        }
    }
}
se-gateway/src/main/resources/banner.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
Spring Boot Version: ${spring-boot.version}
Spring Application Name: ${spring.application.name}
SeGatewayApplication,已经启动
se-gateway/src/main/resources/bootstrap.yml
se-gateway/src/main/resources/logback.xml
se-visual/ruoyi-monitor/src/main/java/com/ruoyi/modules/monitor/RuoYiMonitorApplication.java
ÎļþÒÑɾ³ý
se-visual/ruoyi-monitor/src/main/java/com/ruoyi/modules/monitor/config/WebSecurityConfigurer.java
ÎļþÒÑɾ³ý
se-visual/ruoyi-monitor/src/main/resources/banner.txt
ÎļþÒÑɾ³ý
se-visual/se-monitor/pom.xml
se-visual/se-monitor/src/main/java/com/se/modules/monitor/SeMonitorApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.se.modules.monitor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import de.codecentric.boot.admin.server.config.EnableAdminServer;
/**
 * ç›‘控中心
 *
 * @author admin
 */
@EnableAdminServer
@SpringBootApplication
public class SeMonitorApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(SeMonitorApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  ç›‘控中心启动成功   áƒš(´ڡ`ლ)゙  \n" +
                " .-------.       ____     __        \n" +
                " |  _ _   \\      \\   \\   /  /    \n" +
                " | ( ' )  |       \\  _. /  '       \n" +
                " |(_ o _) /        _( )_ .'         \n" +
                " | (_,_).' __  ___(_ o _)'          \n" +
                " |  |\\ \\  |  ||   |(_,_)'         \n" +
                " |  | \\ `'   /|   `-'  /           \n" +
                " |  |  \\    /  \\      /           \n" +
                " ''-'   `'-'    `-..-'              ");
    }
}
se-visual/se-monitor/src/main/java/com/se/modules/monitor/config/WebSecurityConfigurer.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.se.modules.monitor.config;
import de.codecentric.boot.admin.server.config.AdminServerProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
/**
 * ç›‘控权限配置
 *
 * @author admin
 */
@EnableWebSecurity
public class WebSecurityConfigurer
{
    private final String adminContextPath;
    public WebSecurityConfigurer(AdminServerProperties adminServerProperties)
    {
        this.adminContextPath = adminServerProperties.getContextPath();
    }
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception
    {
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(adminContextPath + "/");
        return httpSecurity
                .headers().frameOptions().disable()
                .and().authorizeRequests()
                .antMatchers(adminContextPath + "/assets/**"
                        , adminContextPath + "/login"
                        , adminContextPath + "/actuator/**"
                        , adminContextPath + "/instances/**"
                ).permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage(adminContextPath + "/login")
                .successHandler(successHandler).and()
                .logout().logoutUrl(adminContextPath + "/logout")
                .and()
                .httpBasic().and()
                .csrf()
                .disable()
                .build();
    }
}
se-visual/se-monitor/src/main/resources/banner.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
Spring Boot Version: ${spring-boot.version}
Spring Application Name: ${spring.application.name}
SeMonitorApplication,已经启动
se-visual/se-monitor/src/main/resources/bootstrap.yml
se-visual/se-monitor/src/main/resources/logback.xml