From 56763163804f759cb78f7ea9976e2e4b8df548a2 Mon Sep 17 00:00:00 2001 From: KonBAI <1527468660@qq.com> Date: Tue, 18 Jan 2022 13:16:15 +0000 Subject: [PATCH] =?UTF-8?q?!6=20=E5=90=8C=E6=AD=A5develop=E5=88=86?= =?UTF-8?q?=E6=94=AF=20*=20sync=20--=20=E5=90=8C=E6=AD=A5develop=E5=88=86?= =?UTF-8?q?=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/FUNDING.yml | 1 + pom.xml | 80 +- .../controller/common/CaptchaController.java | 2 +- .../controller/monitor/CacheController.java | 4 +- .../monitor/SysLogininforController.java | 10 +- .../monitor/SysOperlogController.java | 10 +- .../monitor/SysUserOnlineController.java | 67 +- .../system/SysConfigController.java | 16 +- .../controller/system/SysDeptController.java | 14 +- .../system/SysDictDataController.java | 14 +- .../system/SysDictTypeController.java | 16 +- .../controller/system/SysLoginController.java | 22 +- .../controller/system/SysMenuController.java | 12 +- .../system/SysNoticeController.java | 18 +- .../system/SysOssConfigController.java | 14 +- .../controller/system/SysOssController.java | 16 +- .../controller/system/SysPostController.java | 14 +- .../system/SysProfileController.java | 24 +- .../controller/system/SysRoleController.java | 37 +- .../controller/system/SysUserController.java | 31 +- .../workflow/FlowCategoryController.java | 117 +++ .../workflow}/FlowDefinitionController.java | 10 +- .../workflow}/FlowInstanceController.java | 8 +- .../workflow}/FlowTaskController.java | 10 +- .../workflow}/SysFormController.java | 27 +- .../src/main/resources/application-dev.yml | 12 +- .../src/main/resources/application.yml | 54 +- ruoyi-admin/src/main/resources/logback.xml | 62 +- ruoyi-common/pom.xml | 16 +- .../ruoyi/common/annotation/DataScope.java | 32 - .../ruoyi/common/annotation/DataSource.java | 25 - .../ruoyi/common/annotation/Sensitive.java | 23 + .../common/captcha/UnsignedMathGenerator.java | 118 +-- .../com/ruoyi/common/constant/Constants.java | 39 +- .../common/convert/ExcelBigNumberConvert.java | 48 +- .../common/convert/ExcelDictConvert.java | 80 +- .../core/controller/BaseController.java | 10 +- .../ruoyi/common/core/domain/BaseEntity.java | 74 +- .../ruoyi/common/core/domain/PageQuery.java | 2 +- .../java/com/ruoyi/common/core/domain/R.java | 32 +- .../ruoyi/common/core/domain/TreeEntity.java | 36 +- .../common/core/domain/dto/UserOnlineDTO.java | 62 ++ .../common/core/domain/entity/SysDept.java | 108 +-- .../core/domain/entity/SysDictData.java | 140 ++-- .../core/domain/entity/SysDictType.java | 70 +- .../common/core/domain/entity/SysMenu.java | 148 ++-- .../common/core/domain/entity/SysRole.java | 186 ++--- .../common/core/domain/entity/SysUser.java | 252 +++--- .../common/core/domain/model/LoginUser.java | 67 +- .../common/core/mapper/BaseMapperPlus.java | 229 ++++++ .../core/mybatisplus/core/BaseMapperPlus.java | 102 --- .../core/mybatisplus/core/IServicePlus.java | 155 ---- .../mybatisplus/core/ServicePlusImpl.java | 226 ------ .../core/mybatisplus/methods/InsertAll.java | 101 --- .../com/ruoyi/common/core/page/PagePlus.java | 158 ---- .../ruoyi/common/core/page/TableDataInfo.java | 62 +- .../common/core/service/SensitiveService.java | 18 + .../common/core/service/TokenService.java | 69 -- .../ruoyi/common/enums/DataSourceType.java | 27 - .../com/ruoyi/common/enums/DeviceType.java | 27 + .../ruoyi/common/enums/SensitiveStrategy.java | 49 ++ .../java/com/ruoyi/common/enums/UserType.java | 27 + .../jackson/SensitiveJsonSerializer.java | 45 ++ .../common/properties/TokenProperties.java | 31 - .../com/ruoyi/common/utils/DictUtils.java | 1 + .../com/ruoyi/common/utils/LoginUtils.java | 114 +++ .../com/ruoyi/common/utils/PageUtils.java | 193 ----- .../com/ruoyi/common/utils/SecurityUtils.java | 69 +- .../com/ruoyi/common/utils/StringUtils.java | 609 +++++++------- .../ruoyi/common/utils/ValidatorUtils.java | 4 +- .../ruoyi/common/utils/redis/QueueUtils.java | 222 +++++ .../common/utils/{ => redis}/RedisUtils.java | 12 +- .../demo/controller/RedisCacheController.java | 2 +- .../controller/RedisPubSubController.java | 2 +- .../demo/controller/TestBatchController.java | 23 +- .../demo/controller/TestDemoController.java | 26 +- .../demo/controller/TestI18nController.java | 26 +- .../controller/TestSensitiveController.java | 81 ++ .../demo/controller/TestTreeController.java | 16 +- .../queue/BoundedQueueController.java | 83 ++ .../queue/DelayedQueueController.java | 79 ++ .../demo/controller/queue/PriorityDemo.java | 19 + .../queue/PriorityDemoComparator.java | 16 + .../queue/PriorityQueueController.java | 85 ++ .../java/com/ruoyi/demo/domain/TestDemo.java | 10 +- .../java/com/ruoyi/demo/domain/TestTree.java | 2 +- .../com/ruoyi/demo/domain/bo/TestDemoBo.java | 24 +- .../com/ruoyi/demo/domain/bo/TestTreeBo.java | 16 +- .../com/ruoyi/demo/domain/vo/TestDemoVo.java | 67 +- .../com/ruoyi/demo/domain/vo/TestTreeVo.java | 41 +- .../com/ruoyi/demo/mapper/TestDemoMapper.java | 7 +- .../com/ruoyi/demo/mapper/TestTreeMapper.java | 5 +- .../ruoyi/demo/service/ITestDemoService.java | 94 ++- .../ruoyi/demo/service/ITestTreeService.java | 66 +- .../service/impl/TestDemoServiceImpl.java | 134 +-- .../service/impl/TestTreeServiceImpl.java | 103 +-- ruoyi-extend/ruoyi-monitor-admin/pom.xml | 5 + .../admin/MonitorAdminApplication.java | 8 +- .../monitor/admin/config/SecurityConfig.java | 48 +- .../admin/notifier/CustomNotifier.java | 40 + ruoyi-extend/ruoyi-xxl-job-admin/pom.xml | 219 +++-- .../xxl/job/admin/XxlJobAdminApplication.java | 6 +- .../job/admin/controller/IndexController.java | 105 +-- .../admin/controller/JobCodeController.java | 119 +-- .../admin/controller/JobGroupController.java | 297 +++---- .../admin/controller/JobInfoController.java | 256 +++--- .../admin/controller/JobLogController.java | 325 ++++---- .../job/admin/controller/UserController.java | 38 +- .../annotation/PermissionLimit.java | 25 +- .../interceptor/CookieInterceptor.java | 34 +- .../interceptor/PermissionInterceptor.java | 60 +- .../resolver/WebExceptionResolver.java | 74 +- .../xxl/job/admin/core/model/XxlJobInfo.java | 346 ++++---- .../xxl/job/admin/core/model/XxlJobLog.java | 229 +++--- .../job/admin/core/model/XxlJobLogGlue.java | 101 +-- .../xxl/job/admin/core/model/XxlJobUser.java | 102 +-- .../admin/core/thread/JobCompleteHelper.java | 245 +++--- .../core/thread/JobFailMonitorHelper.java | 134 +-- .../admin/core/thread/JobRegistryHelper.java | 314 ++++---- .../core/thread/JobTriggerPoolHelper.java | 66 +- .../xxl/job/admin/core/util/CookieUtil.java | 164 ++-- .../xxl/job/admin/core/util/JacksonUtil.java | 93 +-- .../com/xxl/job/admin/dao/XxlJobInfoDao.java | 52 +- .../com/xxl/job/admin/dao/XxlJobLogDao.java | 73 +- .../xxl/job/admin/dao/XxlJobLogGlueDao.java | 15 +- .../xxl/job/admin/dao/XxlJobLogReportDao.java | 11 +- .../com/xxl/job/admin/dao/XxlJobUserDao.java | 24 +- .../xxl/job/admin/service/XxlJobService.java | 125 +-- .../admin/service/impl/XxlJobServiceImpl.java | 705 ++++++++-------- .../mybatis-mapper/XxlJobGroupMapper.xml | 158 ++-- .../mybatis-mapper/XxlJobInfoMapper.xml | 416 +++++----- .../mybatis-mapper/XxlJobLogGlueMapper.xml | 136 ++-- .../mybatis-mapper/XxlJobLogMapper.xml | 504 ++++++------ .../mybatis-mapper/XxlJobLogReportMapper.xml | 102 +-- .../mybatis-mapper/XxlJobRegistryMapper.xml | 84 +- .../mybatis-mapper/XxlJobUserMapper.xml | 150 ++-- .../main/resources/static/js/user.index.1.js | 358 ++++----- ruoyi-flowable/pom.xml | 4 - .../framework/aspectj/DataScopeAspect.java | 142 ---- .../framework/aspectj/DataSourceAspect.java | 65 -- .../ruoyi/framework/aspectj/LogAspect.java | 10 +- .../framework/aspectj/RateLimiterAspect.java | 2 +- .../framework/aspectj/RepeatSubmitAspect.java | 15 +- .../ruoyi/framework/config/AsyncConfig.java | 55 -- .../ruoyi/framework/config/DruidConfig.java | 19 +- .../ruoyi/framework/config/I18nConfig.java | 44 +- .../ruoyi/framework/config/JacksonConfig.java | 36 +- .../framework/config/MybatisPlusConfig.java | 126 ++- .../framework/config/ResourcesConfig.java | 8 +- .../ruoyi/framework/config/SaTokenConfig.java | 61 ++ .../framework/config/SecurityConfig.java | 137 ---- .../ruoyi/framework/config/SwaggerConfig.java | 133 +-- .../config/properties/CaptchaProperties.java | 24 +- .../config/properties/RedissonProperties.java | 336 ++++---- .../config/properties/SecurityProperties.java | 13 +- .../config/properties/SwaggerProperties.java | 76 +- .../CreateAndUpdateMetaObjectHandler.java | 110 +-- .../handler/PlusDataPermissionHandler.java | 4 +- .../jackson/BigNumberSerializer.java | 42 +- .../listener/UserActionListener.java | 121 +++ .../framework/manager/ShutdownManager.java | 36 +- .../framework/satoken/dao/PlusSaTokenDao.java | 178 ++++ .../satoken/service/SaInterfaceImpl.java | 38 + .../filter/JwtAuthenticationTokenFilter.java | 43 - .../handle/AuthenticationEntryPointImpl.java | 33 - .../handle/LogoutSuccessHandlerImpl.java | 55 -- .../web/exception/GlobalExceptionHandler.java | 28 +- .../web/service/PermissionService.java | 156 ---- .../generator/controller/GenController.java | 26 +- .../mapper/GenTableColumnMapper.java | 4 +- .../generator/mapper/GenTableMapper.java | 4 +- .../service/GenTableColumnServiceImpl.java | 9 +- .../service/GenTableServiceImpl.java | 27 +- .../service/IGenTableColumnService.java | 3 +- .../generator/service/IGenTableService.java | 3 +- .../mapper/generator/GenTableColumnMapper.xml | 16 +- .../mapper/generator/GenTableMapper.xml | 264 +++--- .../main/resources/vm/java/controller.java.vm | 14 +- .../src/main/resources/vm/java/mapper.java.vm | 5 +- .../main/resources/vm/java/service.java.vm | 65 +- .../resources/vm/java/serviceImpl.java.vm | 19 +- .../src/main/resources/vm/java/vo.java.vm | 10 +- .../main/resources/vm/vue/index-tree.vue.vm | 10 +- .../src/main/resources/vm/vue/index.vue.vm | 12 +- .../resources/vm/vue/v3/index-tree.vue.vm | 32 +- .../src/main/resources/vm/vue/v3/index.vue.vm | 41 +- .../com/ruoyi/oss/constant/OssConstant.java | 40 +- .../com/ruoyi/oss/entity/UploadResult.java | 16 +- .../java/com/ruoyi/oss/enumd/OssEnumd.java | 68 +- .../java/com/ruoyi/oss/enumd/PolicyType.java | 32 +- .../com/ruoyi/oss/exception/OssException.java | 8 +- .../com/ruoyi/oss/factory/OssFactory.java | 70 +- .../ruoyi/oss/properties/OssProperties.java | 56 +- .../com/ruoyi/oss/service/IOssStrategy.java | 86 +- .../abstractd/AbstractOssStrategy.java | 60 +- .../oss/service/impl/AliyunOssStrategy.java | 154 ++-- .../oss/service/impl/MinioOssStrategy.java | 296 +++---- .../oss/service/impl/QcloudOssStrategy.java | 170 ++-- .../oss/service/impl/QiniuOssStrategy.java | 178 ++-- ruoyi-system/pom.xml | 6 + .../com/ruoyi/system/domain/SysConfig.java | 2 +- .../com/ruoyi/system/domain/SysOperLog.java | 6 +- .../java/com/ruoyi/system/domain/SysOss.java | 50 +- .../java/com/ruoyi/system/domain/SysPost.java | 4 +- .../com/ruoyi/system/domain/SysRoleDept.java | 3 + .../com/ruoyi/system/domain/SysRoleMenu.java | 3 + .../com/ruoyi/system/domain/SysUserPost.java | 3 + .../com/ruoyi/system/domain/SysUserRole.java | 3 + .../listener/SysUserImportListener.java | 3 +- .../ruoyi/system/mapper/SysConfigMapper.java | 4 +- .../ruoyi/system/mapper/SysDeptMapper.java | 4 +- .../system/mapper/SysDictDataMapper.java | 4 +- .../system/mapper/SysDictTypeMapper.java | 4 +- .../ruoyi/system/mapper/SysFormMapper.java | 4 +- .../system/mapper/SysLogininforMapper.java | 4 +- .../ruoyi/system/mapper/SysMenuMapper.java | 4 +- .../ruoyi/system/mapper/SysNoticeMapper.java | 4 +- .../ruoyi/system/mapper/SysOperLogMapper.java | 4 +- .../system/mapper/SysOssConfigMapper.java | 5 +- .../com/ruoyi/system/mapper/SysOssMapper.java | 5 +- .../ruoyi/system/mapper/SysPostMapper.java | 4 +- .../system/mapper/SysRoleDeptMapper.java | 4 +- .../ruoyi/system/mapper/SysRoleMapper.java | 4 +- .../system/mapper/SysRoleMenuMapper.java | 4 +- .../ruoyi/system/mapper/SysUserMapper.java | 4 +- .../system/mapper/SysUserPostMapper.java | 4 +- .../system/mapper/SysUserRoleMapper.java | 4 +- .../system/service/ISysConfigService.java | 6 +- .../ruoyi/system/service/ISysDeptService.java | 3 +- .../system/service/ISysDictDataService.java | 3 +- .../system/service/ISysDictTypeService.java | 3 +- .../system/service/ISysLogininforService.java | 3 +- .../ruoyi/system/service/ISysMenuService.java | 3 +- .../system/service/ISysNoticeService.java | 3 +- .../system/service/ISysOperLogService.java | 3 +- .../system/service/ISysOssConfigService.java | 4 +- .../ruoyi/system/service/ISysOssService.java | 6 +- .../ruoyi/system/service/ISysPostService.java | 3 +- .../ruoyi/system/service/ISysRoleService.java | 3 +- .../system/service/ISysUserOnlineService.java | 47 -- .../ruoyi/system/service/ISysUserService.java | 3 +- .../ruoyi/system/service/SysLoginService.java | 103 ++- .../system/service/SysPermissionService.java | 10 +- .../system/service/SysRegisterService.java | 20 +- .../service/impl/SysConfigServiceImpl.java | 16 +- .../service/impl/SysDataScopeServiceImpl.java | 9 +- .../service/impl/SysDeptServiceImpl.java | 42 +- .../service/impl/SysDictDataServiceImpl.java | 19 +- .../service/impl/SysDictTypeServiceImpl.java | 28 +- .../impl/SysLogininforServiceImpl.java | 15 +- .../service/impl/SysMenuServiceImpl.java | 35 +- .../service/impl/SysNoticeServiceImpl.java | 13 +- .../service/impl/SysOperLogServiceImpl.java | 17 +- .../service/impl/SysOssConfigServiceImpl.java | 26 +- .../service/impl/SysOssServiceImpl.java | 20 +- .../service/impl/SysPostServiceImpl.java | 26 +- .../service/impl/SysRoleServiceImpl.java | 38 +- .../service/impl/SysSensitiveServiceImpl.java | 27 + .../impl/SysUserOnlineServiceImpl.java | 94 --- .../service/impl/SysUserServiceImpl.java | 41 +- .../system/service/impl/TokenServiceImpl.java | 202 ----- .../service/impl/UserDetailsServiceImpl.java | 59 -- .../ruoyi/workflow/domain/FlowCategory.java | 46 ++ .../workflow/domain/bo/FlowCategoryBo.java | 55 ++ .../workflow}/domain/dto/FlowCommentDto.java | 2 +- .../domain/dto/FlowFromFieldDTO.java | 2 +- .../workflow}/domain/dto/FlowNextDto.java | 2 +- .../workflow}/domain/dto/FlowProcDefDto.java | 2 +- .../workflow}/domain/dto/FlowSaveXmlVo.java | 2 +- .../workflow}/domain/dto/FlowTaskDto.java | 2 +- .../workflow}/domain/dto/FlowViewerDto.java | 2 +- .../workflow/domain/vo/FlowCategoryVo.java | 53 ++ .../ruoyi/workflow}/domain/vo/FlowTaskVo.java | 2 +- .../workflow}/domain/vo/FlowViewerVo.java | 2 +- .../workflow/mapper/FlowCategoryMapper.java | 15 + .../service/IFlowCategoryService.java | 55 ++ .../service/IFlowDefinitionService.java | 4 +- .../service/IFlowInstanceService.java | 4 +- .../workflow}/service/IFlowTaskService.java | 4 +- .../service/ISysDeployFormService.java | 2 +- .../workflow}/service/ISysFormService.java | 5 +- .../service/ISysTaskFormService.java | 2 +- .../service/impl/FlowCategoryServiceImpl.java | 94 +++ .../impl/FlowDefinitionServiceImpl.java | 14 +- .../service/impl/FlowInstanceServiceImpl.java | 10 +- .../service/impl/FlowTaskServiceImpl.java | 32 +- .../impl/SysDeployFormServiceImpl.java | 4 +- .../service/impl/SysFormServiceImpl.java | 10 +- .../service/impl/SysTaskFormServiceImpl.java | 4 +- .../mapper/flowable/FlowCategoryMapper.xml | 19 + .../resources/mapper/system/SysDeptMapper.xml | 10 +- .../resources/mapper/system/SysFormMapper.xml | 8 +- .../resources/mapper/system/SysMenuMapper.xml | 10 +- .../resources/mapper/system/SysRoleMapper.xml | 8 - .../resources/mapper/system/SysUserMapper.xml | 22 +- ruoyi-ui/.env.development | 2 +- ruoyi-ui/.env.production | 2 +- ruoyi-ui/.env.staging | 2 +- ruoyi-ui/package.json | 6 +- ruoyi-ui/public/index.html | 14 +- ruoyi-ui/src/api/system/user.js | 4 +- ruoyi-ui/src/api/workflow/category.js | 44 + ruoyi-ui/src/api/workflow/definition.js | 22 +- ruoyi-ui/src/api/workflow/finished.js | 9 +- ruoyi-ui/src/api/workflow/form.js | 14 +- ruoyi-ui/src/api/workflow/process.js | 13 +- ruoyi-ui/src/api/workflow/todo.js | 17 +- ruoyi-ui/src/assets/styles/ruoyi.scss | 240 +++--- ruoyi-ui/src/components/Crontab/hour.vue | 4 +- .../src/components/ImagePreview/index.vue | 121 +-- ruoyi-ui/src/components/TopNav/index.vue | 2 +- .../src/layout/components/Sidebar/Logo.vue | 2 +- .../descriptor/activitiDescriptor.json | 5 + .../plugins/descriptor/camundaDescriptor.json | 5 + .../descriptor/flowableDescriptor.json | 5 + .../package/penal/base/ElementBaseInfo.vue | 15 +- .../penal/task/task-components/TagSelect.vue | 73 ++ .../penal/task/task-components/UserTask.vue | 242 +++++- ruoyi-ui/src/utils/request.js | 43 +- ruoyi-ui/src/utils/ruoyi.js | 325 ++++---- .../views/components/icons/element-icons.js | 3 + ruoyi-ui/src/views/components/icons/index.vue | 87 ++ .../src/views/components/icons/svg-icons.js | 10 + ruoyi-ui/src/views/index.vue | 2 +- ruoyi-ui/src/views/login.vue | 4 +- .../src/views/monitor/logininfor/index.vue | 4 +- ruoyi-ui/src/views/system/dept/index.vue | 6 + ruoyi-ui/src/views/system/user/index.vue | 2 +- ruoyi-ui/src/views/tool/gen/editTable.vue | 1 + ruoyi-ui/src/views/tool/gen/index.vue | 3 +- .../src/views/workflow/category/index.vue | 296 +++++++ .../views/workflow/definition/designer.vue | 2 +- script/bin/ry.bat | 80 +- script/bin/ry.sh | 46 +- script/docker/deploy.sh | 84 +- script/docker/nginx/nginx.conf | 42 +- .../sql/{ry_20220105.sql => ry_20210908.sql} | 46 +- script/sql/ry_20220115.sql | 760 ++++++++++++++++++ 338 files changed, 10957 insertions(+), 9551 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowCategoryController.java rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller => ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow}/FlowDefinitionController.java (95%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller => ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow}/FlowInstanceController.java (91%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller => ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow}/FlowTaskController.java (96%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller => ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow}/SysFormController.java (78%) delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/BaseMapperPlus.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/service/SensitiveService.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/service/TokenService.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/properties/TokenProperties.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java delete mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java rename ruoyi-common/src/main/java/com/ruoyi/common/utils/{ => redis}/RedisUtils.java (97%) create mode 100644 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java create mode 100644 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java create mode 100644 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java create mode 100644 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java create mode 100644 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java create mode 100644 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java create mode 100644 ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/notifier/CustomNotifier.java delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java delete mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysSensitiveServiceImpl.java delete mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java delete mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java delete mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserDetailsServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/FlowCategory.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/bo/FlowCategoryBo.java rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/domain/dto/FlowCommentDto.java (90%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/domain/dto/FlowFromFieldDTO.java (83%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/domain/dto/FlowNextDto.java (91%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/domain/dto/FlowProcDefDto.java (96%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/domain/dto/FlowSaveXmlVo.java (90%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/domain/dto/FlowTaskDto.java (98%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/domain/dto/FlowViewerDto.java (85%) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/FlowCategoryVo.java rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/domain/vo/FlowTaskVo.java (96%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/domain/vo/FlowViewerVo.java (93%) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/mapper/FlowCategoryMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/IFlowCategoryService.java rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/IFlowDefinitionService.java (94%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/IFlowInstanceService.java (93%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/IFlowTaskService.java (97%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/ISysDeployFormService.java (97%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/ISysFormService.java (88%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/ISysTaskFormService.java (97%) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/FlowCategoryServiceImpl.java rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/impl/FlowDefinitionServiceImpl.java (95%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/impl/FlowInstanceServiceImpl.java (93%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/impl/FlowTaskServiceImpl.java (97%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/impl/SysDeployFormServiceImpl.java (96%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/impl/SysFormServiceImpl.java (89%) rename {ruoyi-flowable/src/main/java/com/ruoyi/flowable => ruoyi-system/src/main/java/com/ruoyi/workflow}/service/impl/SysTaskFormServiceImpl.java (95%) create mode 100644 ruoyi-system/src/main/resources/mapper/flowable/FlowCategoryMapper.xml create mode 100644 ruoyi-ui/src/api/workflow/category.js create mode 100644 ruoyi-ui/src/plugins/package/penal/task/task-components/TagSelect.vue create mode 100644 ruoyi-ui/src/views/components/icons/element-icons.js create mode 100644 ruoyi-ui/src/views/components/icons/index.vue create mode 100644 ruoyi-ui/src/views/components/icons/svg-icons.js create mode 100644 ruoyi-ui/src/views/workflow/category/index.vue rename script/sql/{ry_20220105.sql => ry_20210908.sql} (94%) create mode 100644 script/sql/ry_20220115.sql diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..fbcab775 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: http://doc.ruoyi.vip/ruoyi-vue/other/donate.html diff --git a/pom.xml b/pom.xml index 6c1888f3..7e4cb011 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 3.5.0 RuoYi-Flowable-Plus - https://gitee.com/JavaLionLi/RuoYi-Vue-Plus + https://gitee.com/KonBAI-Q/ruoyi-flowable-plus RuoYi-Flowable-Plus后台管理系统 @@ -26,11 +26,12 @@ 2.2.11 3.3.0 2.3 - 3.4.3.4 + 1.28.0 + 3.5.0 3.9.1 5.7.18 4.9.2 - 2.5.5 + 2.6.0 3.16.7 2.2.1 3.5.0 @@ -68,6 +69,15 @@ import + + + cn.hutool + hutool-bom + ${hutool.version} + pom + import + + com.alibaba @@ -129,6 +139,19 @@ ${velocity.version} + + + cn.dev33 + sa-token-spring-boot-starter + ${satoken.version} + + + + cn.dev33 + sa-token-jwt + ${satoken.version} + + com.sun.xml.bind @@ -160,36 +183,6 @@ ${p6spy.version} - - cn.hutool - hutool-core - ${hutool.version} - - - - cn.hutool - hutool-http - ${hutool.version} - - - - cn.hutool - hutool-captcha - ${hutool.version} - - - - cn.hutool - hutool-extra - ${hutool.version} - - - - cn.hutool - hutool-jwt - ${hutool.version} - - com.squareup.okhttp3 okhttp @@ -319,15 +312,15 @@ ruoyi-admin - ruoyi-framework - ruoyi-system - ruoyi-job - ruoyi-generator ruoyi-common ruoyi-demo ruoyi-extend - ruoyi-oss ruoyi-flowable + ruoyi-framework + ruoyi-generator + ruoyi-job + ruoyi-oss + ruoyi-system pom @@ -346,8 +339,17 @@ - src/main/resources + + false + + + src/main/resources + + + application* + bootstrap* + true diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java index 87cfcc78..532134e4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java @@ -7,7 +7,7 @@ import cn.hutool.core.util.IdUtil; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.CaptchaType; -import com.ruoyi.common.utils.RedisUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.reflect.ReflectUtils; import com.ruoyi.common.utils.spring.SpringUtils; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java index aeb7503e..06b49589 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.monitor; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.StringUtils; import io.swagger.annotations.Api; @@ -9,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.RedisServerCommands; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -30,7 +30,7 @@ public class CacheController { private final RedisTemplate redisTemplate; @ApiOperation("获取缓存监控详细信息") - @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @SaCheckPermission("monitor:cache:list") @GetMapping() public R> getInfo() throws Exception { Properties info = (Properties) redisTemplate.execute((RedisCallback) RedisServerCommands::info); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java index 1e753881..fea1cf45 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.monitor; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.R; @@ -13,7 +14,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,7 +35,7 @@ public class SysLogininforController extends BaseController { private final ISysLogininforService logininforService; @ApiOperation("查询系统访问记录列表") - @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") + @SaCheckPermission("monitor:logininfor:list") @GetMapping("/list") public TableDataInfo list(SysLogininfor logininfor, PageQuery pageQuery) { return logininforService.selectPageLogininforList(logininfor, pageQuery); @@ -43,7 +43,7 @@ public class SysLogininforController extends BaseController { @ApiOperation("导出系统访问记录列表") @Log(title = "登录日志", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") + @SaCheckPermission("monitor:logininfor:export") @PostMapping("/export") public void export(SysLogininfor logininfor, HttpServletResponse response) { List list = logininforService.selectLogininforList(logininfor); @@ -51,7 +51,7 @@ public class SysLogininforController extends BaseController { } @ApiOperation("删除系统访问记录") - @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @SaCheckPermission("monitor:logininfor:remove") @Log(title = "登录日志", businessType = BusinessType.DELETE) @DeleteMapping("/{infoIds}") public R remove(@PathVariable Long[] infoIds) { @@ -59,7 +59,7 @@ public class SysLogininforController extends BaseController { } @ApiOperation("清空系统访问记录") - @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @SaCheckPermission("monitor:logininfor:remove") @Log(title = "登录日志", businessType = BusinessType.CLEAN) @DeleteMapping("/clean") public R clean() { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java index 119ec143..666c5024 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.monitor; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.R; @@ -13,7 +14,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,7 +35,7 @@ public class SysOperlogController extends BaseController { private final ISysOperLogService operLogService; @ApiOperation("查询操作日志记录列表") - @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") + @SaCheckPermission("monitor:operlog:list") @GetMapping("/list") public TableDataInfo list(SysOperLog operLog, PageQuery pageQuery) { return operLogService.selectPageOperLogList(operLog, pageQuery); @@ -43,7 +43,7 @@ public class SysOperlogController extends BaseController { @ApiOperation("导出操作日志记录列表") @Log(title = "操作日志", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") + @SaCheckPermission("monitor:operlog:export") @PostMapping("/export") public void export(SysOperLog operLog, HttpServletResponse response) { List list = operLogService.selectOperLogList(operLog); @@ -52,7 +52,7 @@ public class SysOperlogController extends BaseController { @ApiOperation("删除操作日志记录") @Log(title = "操作日志", businessType = BusinessType.DELETE) - @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @SaCheckPermission("monitor:operlog:remove") @DeleteMapping("/{operIds}") public R remove(@PathVariable Long[] operIds) { return toAjax(operLogService.deleteOperLogByIds(operIds)); @@ -60,7 +60,7 @@ public class SysOperlogController extends BaseController { @ApiOperation("清空操作日志记录") @Log(title = "操作日志", businessType = BusinessType.CLEAN) - @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @SaCheckPermission("monitor:operlog:remove") @DeleteMapping("/clean") public R clean() { operLogService.cleanOperLog(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java index 867bd06a..022e1d03 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java @@ -1,27 +1,29 @@ package com.ruoyi.web.controller.monitor; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.R; -import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.domain.dto.UserOnlineDTO; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.system.domain.SysUserOnline; -import com.ruoyi.system.service.ISysUserOnlineService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; /** * 在线用户监控 @@ -34,34 +36,38 @@ import java.util.List; @RequestMapping("/monitor/online") public class SysUserOnlineController extends BaseController { - private final ISysUserOnlineService userOnlineService; - @ApiOperation("在线用户列表") - @PreAuthorize("@ss.hasPermi('monitor:online:list')") + @SaCheckPermission("monitor:online:list") @GetMapping("/list") public TableDataInfo list(String ipaddr, String userName) { - Collection keys = RedisUtils.keys(Constants.LOGIN_TOKEN_KEY + "*"); - List userOnlineList = new ArrayList(); + // 获取所有未过期的 token + List keys = StpUtil.searchTokenValue("", -1, 0); + List userOnlineDTOList = new ArrayList<>(); for (String key : keys) { - LoginUser user = RedisUtils.getCacheObject(key); - if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { - if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { - userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); - } - } else if (StringUtils.isNotEmpty(ipaddr)) { - if (StringUtils.equals(ipaddr, user.getIpaddr())) { - userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); - } - } else if (StringUtils.isNotEmpty(userName)) { - if (StringUtils.equals(userName, user.getUsername())) { - userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); - } - } else { - userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); + String token = key.replace(Constants.LOGIN_TOKEN_KEY, ""); + // 如果已经过期则踢下线 + if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < 0) { + continue; } + userOnlineDTOList.add(RedisUtils.getCacheObject(Constants.ONLINE_TOKEN_KEY + token)); } - Collections.reverse(userOnlineList); - userOnlineList.removeAll(Collections.singleton(null)); + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = userOnlineDTOList.stream().filter(userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) && + StringUtils.equals(userName, userOnline.getUserName()) + ).collect(Collectors.toList()); + } else if (StringUtils.isNotEmpty(ipaddr)) { + userOnlineDTOList = userOnlineDTOList.stream().filter(userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr())) + .collect(Collectors.toList()); + } else if (StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = userOnlineDTOList.stream().filter(userOnline -> + StringUtils.equals(userName, userOnline.getUserName()) + ).collect(Collectors.toList()); + } + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); return TableDataInfo.build(userOnlineList); } @@ -69,11 +75,14 @@ public class SysUserOnlineController extends BaseController { * 强退用户 */ @ApiOperation("强退用户") - @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") + @SaCheckPermission("monitor:online:forceLogout") @Log(title = "在线用户", businessType = BusinessType.FORCE) @DeleteMapping("/{tokenId}") public R forceLogout(@PathVariable String tokenId) { - RedisUtils.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId); + try { + StpUtil.kickoutByTokenValue(tokenId); + } catch (NotLoginException e) { + } return R.success(); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java index 0077efd7..9a666374 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -15,7 +16,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,7 +40,7 @@ public class SysConfigController extends BaseController { * 获取参数配置列表 */ @ApiOperation("获取参数配置列表") - @PreAuthorize("@ss.hasPermi('system:config:list')") + @SaCheckPermission("system:config:list") @GetMapping("/list") public TableDataInfo list(SysConfig config, PageQuery pageQuery) { return configService.selectPageConfigList(config, pageQuery); @@ -48,7 +48,7 @@ public class SysConfigController extends BaseController { @ApiOperation("导出参数配置列表") @Log(title = "参数管理", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:config:export')") + @SaCheckPermission("system:config:export") @PostMapping("/export") public void export(SysConfig config, HttpServletResponse response) { List list = configService.selectConfigList(config); @@ -59,7 +59,7 @@ public class SysConfigController extends BaseController { * 根据参数编号获取详细信息 */ @ApiOperation("根据参数编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:config:query')") + @SaCheckPermission("system:config:query") @GetMapping(value = "/{configId}") public R getInfo(@ApiParam("参数ID") @PathVariable Long configId) { return R.success(configService.selectConfigById(configId)); @@ -78,7 +78,7 @@ public class SysConfigController extends BaseController { * 新增参数配置 */ @ApiOperation("新增参数配置") - @PreAuthorize("@ss.hasPermi('system:config:add')") + @SaCheckPermission("system:config:add") @Log(title = "参数管理", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody SysConfig config) { @@ -92,7 +92,7 @@ public class SysConfigController extends BaseController { * 修改参数配置 */ @ApiOperation("修改参数配置") - @PreAuthorize("@ss.hasPermi('system:config:edit')") + @SaCheckPermission("system:config:edit") @Log(title = "参数管理", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody SysConfig config) { @@ -106,7 +106,7 @@ public class SysConfigController extends BaseController { * 删除参数配置 */ @ApiOperation("删除参数配置") - @PreAuthorize("@ss.hasPermi('system:config:remove')") + @SaCheckPermission("system:config:remove") @Log(title = "参数管理", businessType = BusinessType.DELETE) @DeleteMapping("/{configIds}") public R remove(@ApiParam("参数ID串") @PathVariable Long[] configIds) { @@ -118,7 +118,7 @@ public class SysConfigController extends BaseController { * 刷新参数缓存 */ @ApiOperation("刷新参数缓存") - @PreAuthorize("@ss.hasPermi('system:config:remove')") + @SaCheckPermission("system:config:remove") @Log(title = "参数管理", businessType = BusinessType.CLEAN) @DeleteMapping("/refreshCache") public R refreshCache() { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index 8920121e..c92f2116 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.util.ArrayUtil; import com.ruoyi.common.annotation.Log; @@ -15,7 +16,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -41,7 +41,7 @@ public class SysDeptController extends BaseController { * 获取部门列表 */ @ApiOperation("获取部门列表") - @PreAuthorize("@ss.hasPermi('system:dept:list')") + @SaCheckPermission("system:dept:list") @GetMapping("/list") public R> list(SysDept dept) { List depts = deptService.selectDeptList(dept); @@ -52,7 +52,7 @@ public class SysDeptController extends BaseController { * 查询部门列表(排除节点) */ @ApiOperation("查询部门列表(排除节点)") - @PreAuthorize("@ss.hasPermi('system:dept:list')") + @SaCheckPermission("system:dept:list") @GetMapping("/list/exclude/{deptId}") public R> excludeChild(@ApiParam("部门ID") @PathVariable(value = "deptId", required = false) Long deptId) { List depts = deptService.selectDeptList(new SysDept()); @@ -65,7 +65,7 @@ public class SysDeptController extends BaseController { * 根据部门编号获取详细信息 */ @ApiOperation("根据部门编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:dept:query')") + @SaCheckPermission("system:dept:query") @GetMapping(value = "/{deptId}") public R getInfo(@ApiParam("部门ID") @PathVariable Long deptId) { deptService.checkDeptDataScope(deptId); @@ -99,7 +99,7 @@ public class SysDeptController extends BaseController { * 新增部门 */ @ApiOperation("新增部门") - @PreAuthorize("@ss.hasPermi('system:dept:add')") + @SaCheckPermission("system:dept:add") @Log(title = "部门管理", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody SysDept dept) { @@ -113,7 +113,7 @@ public class SysDeptController extends BaseController { * 修改部门 */ @ApiOperation("修改部门") - @PreAuthorize("@ss.hasPermi('system:dept:edit')") + @SaCheckPermission("system:dept:edit") @Log(title = "部门管理", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody SysDept dept) { @@ -132,7 +132,7 @@ public class SysDeptController extends BaseController { * 删除部门 */ @ApiOperation("删除部门") - @PreAuthorize("@ss.hasPermi('system:dept:remove')") + @SaCheckPermission("system:dept:remove") @Log(title = "部门管理", businessType = BusinessType.DELETE) @DeleteMapping("/{deptId}") public R remove(@ApiParam("部门ID串") @PathVariable Long deptId) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java index 4214934f..6ed39fe7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.R; @@ -16,7 +17,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,7 +40,7 @@ public class SysDictDataController extends BaseController { private final ISysDictTypeService dictTypeService; @ApiOperation("查询字典数据列表") - @PreAuthorize("@ss.hasPermi('system:dict:list')") + @SaCheckPermission("system:dict:list") @GetMapping("/list") public TableDataInfo list(SysDictData dictData, PageQuery pageQuery) { return dictDataService.selectPageDictDataList(dictData, pageQuery); @@ -48,7 +48,7 @@ public class SysDictDataController extends BaseController { @ApiOperation("导出字典数据列表") @Log(title = "字典数据", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:dict:export')") + @SaCheckPermission("system:dict:export") @PostMapping("/export") public void export(SysDictData dictData, HttpServletResponse response) { List list = dictDataService.selectDictDataList(dictData); @@ -59,7 +59,7 @@ public class SysDictDataController extends BaseController { * 查询字典数据详细 */ @ApiOperation("查询字典数据详细") - @PreAuthorize("@ss.hasPermi('system:dict:query')") + @SaCheckPermission("system:dict:query") @GetMapping(value = "/{dictCode}") public R getInfo(@ApiParam("字典code") @PathVariable Long dictCode) { return R.success(dictDataService.selectDictDataById(dictCode)); @@ -82,7 +82,7 @@ public class SysDictDataController extends BaseController { * 新增字典类型 */ @ApiOperation("新增字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:add')") + @SaCheckPermission("system:dict:add") @Log(title = "字典数据", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody SysDictData dict) { @@ -93,7 +93,7 @@ public class SysDictDataController extends BaseController { * 修改保存字典类型 */ @ApiOperation("修改保存字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @SaCheckPermission("system:dict:edit") @Log(title = "字典数据", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody SysDictData dict) { @@ -104,7 +104,7 @@ public class SysDictDataController extends BaseController { * 删除字典类型 */ @ApiOperation("删除字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @SaCheckPermission("system:dict:remove") @Log(title = "字典类型", businessType = BusinessType.DELETE) @DeleteMapping("/{dictCodes}") public R remove(@ApiParam("字典code串") @PathVariable Long[] dictCodes) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java index 62b02a5e..9183d773 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -15,7 +16,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -37,7 +37,7 @@ public class SysDictTypeController extends BaseController { private final ISysDictTypeService dictTypeService; @ApiOperation("查询字典类型列表") - @PreAuthorize("@ss.hasPermi('system:dict:list')") + @SaCheckPermission("system:dict:list") @GetMapping("/list") public TableDataInfo list(SysDictType dictType, PageQuery pageQuery) { return dictTypeService.selectPageDictTypeList(dictType, pageQuery); @@ -45,7 +45,7 @@ public class SysDictTypeController extends BaseController { @ApiOperation("导出字典类型列表") @Log(title = "字典类型", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:dict:export')") + @SaCheckPermission("system:dict:export") @PostMapping("/export") public void export(SysDictType dictType, HttpServletResponse response) { List list = dictTypeService.selectDictTypeList(dictType); @@ -56,7 +56,7 @@ public class SysDictTypeController extends BaseController { * 查询字典类型详细 */ @ApiOperation("查询字典类型详细") - @PreAuthorize("@ss.hasPermi('system:dict:query')") + @SaCheckPermission("system:dict:query") @GetMapping(value = "/{dictId}") public R getInfo(@ApiParam("字典ID") @PathVariable Long dictId) { return R.success(dictTypeService.selectDictTypeById(dictId)); @@ -66,7 +66,7 @@ public class SysDictTypeController extends BaseController { * 新增字典类型 */ @ApiOperation("新增字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:add')") + @SaCheckPermission("system:dict:add") @Log(title = "字典类型", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody SysDictType dict) { @@ -80,7 +80,7 @@ public class SysDictTypeController extends BaseController { * 修改字典类型 */ @ApiOperation("修改字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @SaCheckPermission("system:dict:edit") @Log(title = "字典类型", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody SysDictType dict) { @@ -94,7 +94,7 @@ public class SysDictTypeController extends BaseController { * 删除字典类型 */ @ApiOperation("删除字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @SaCheckPermission("system:dict:remove") @Log(title = "字典类型", businessType = BusinessType.DELETE) @DeleteMapping("/{dictIds}") public R remove(@ApiParam("字典ID串") @PathVariable Long[] dictIds) { @@ -106,7 +106,7 @@ public class SysDictTypeController extends BaseController { * 刷新字典缓存 */ @ApiOperation("刷新字典缓存") - @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @SaCheckPermission("system:dict:remove") @Log(title = "字典类型", businessType = BusinessType.CLEAN) @DeleteMapping("/refreshCache") public R refreshCache() { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index c17f7ea8..8327ff80 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -1,14 +1,17 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginBody; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.core.service.UserService; +import com.ruoyi.common.utils.LoginUtils; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.vo.RouterVo; import com.ruoyi.system.service.ISysMenuService; -import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.SysLoginService; import com.ruoyi.system.service.SysPermissionService; import io.swagger.annotations.Api; @@ -39,7 +42,6 @@ public class SysLoginController { private final SysLoginService loginService; private final ISysMenuService menuService; - private final ISysUserService userService; private final SysPermissionService permissionService; /** @@ -59,6 +61,16 @@ public class SysLoginController { return R.success(ajax); } + @ApiOperation("登出方法") + @PostMapping("/logout") + public R logout(){ + try { + StpUtil.logout(); + } catch (NotLoginException e) { + } + return R.success("退出成功"); + } + /** * 获取用户信息 * @@ -67,7 +79,7 @@ public class SysLoginController { @ApiOperation("获取用户信息") @GetMapping("getInfo") public R> getInfo() { - SysUser user = userService.selectUserById(SecurityUtils.getUserId()); + SysUser user = SpringUtils.getBean(UserService.class).selectUserById(LoginUtils.getUserId()); // 角色集合 Set roles = permissionService.getRolePermission(user); // 权限集合 @@ -87,7 +99,7 @@ public class SysLoginController { @ApiOperation("获取路由信息") @GetMapping("getRouters") public R> getRouters() { - Long userId = SecurityUtils.getUserId(); + Long userId = LoginUtils.getUserId(); List menus = menuService.selectMenuTreeByUserId(userId); return R.success(menuService.buildMenus(menus)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java index ec2dc4c2..52544ec6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.lang.tree.Tree; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; @@ -14,7 +15,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,7 +40,7 @@ public class SysMenuController extends BaseController { * 获取菜单列表 */ @ApiOperation("获取菜单列表") - @PreAuthorize("@ss.hasPermi('system:menu:list')") + @SaCheckPermission("system:menu:list") @GetMapping("/list") public R> list(SysMenu menu) { List menus = menuService.selectMenuList(menu, getUserId()); @@ -51,7 +51,7 @@ public class SysMenuController extends BaseController { * 根据菜单编号获取详细信息 */ @ApiOperation("根据菜单编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:menu:query')") + @SaCheckPermission("system:menu:query") @GetMapping(value = "/{menuId}") public R getInfo(@ApiParam("菜单ID") @PathVariable Long menuId) { return R.success(menuService.selectMenuById(menuId)); @@ -84,7 +84,7 @@ public class SysMenuController extends BaseController { * 新增菜单 */ @ApiOperation("新增菜单") - @PreAuthorize("@ss.hasPermi('system:menu:add')") + @SaCheckPermission("system:menu:add") @Log(title = "菜单管理", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody SysMenu menu) { @@ -100,7 +100,7 @@ public class SysMenuController extends BaseController { * 修改菜单 */ @ApiOperation("修改菜单") - @PreAuthorize("@ss.hasPermi('system:menu:edit')") + @SaCheckPermission("system:menu:edit") @Log(title = "菜单管理", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody SysMenu menu) { @@ -118,7 +118,7 @@ public class SysMenuController extends BaseController { * 删除菜单 */ @ApiOperation("删除菜单") - @PreAuthorize("@ss.hasPermi('system:menu:remove')") + @SaCheckPermission("system:menu:remove") @Log(title = "菜单管理", businessType = BusinessType.DELETE) @DeleteMapping("/{menuId}") public R remove(@ApiParam("菜单ID") @PathVariable("menuId") Long menuId) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java index c90c29cc..74a19b85 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.R; @@ -8,14 +9,13 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.system.domain.SysNotice; import com.ruoyi.system.service.ISysNoticeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; /** * 公告 信息操作处理 @@ -35,7 +35,7 @@ public class SysNoticeController extends BaseController { * 获取通知公告列表 */ @ApiOperation("获取通知公告列表") - @PreAuthorize("@ss.hasPermi('system:notice:list')") + @SaCheckPermission("system:notice:list") @GetMapping("/list") public TableDataInfo list(SysNotice notice, PageQuery pageQuery) { return noticeService.selectPageNoticeList(notice, pageQuery); @@ -45,7 +45,7 @@ public class SysNoticeController extends BaseController { * 根据通知公告编号获取详细信息 */ @ApiOperation("根据通知公告编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:notice:query')") + @SaCheckPermission("system:notice:query") @GetMapping(value = "/{noticeId}") public R getInfo(@ApiParam("公告ID") @PathVariable Long noticeId) { return R.success(noticeService.selectNoticeById(noticeId)); @@ -55,7 +55,7 @@ public class SysNoticeController extends BaseController { * 新增通知公告 */ @ApiOperation("新增通知公告") - @PreAuthorize("@ss.hasPermi('system:notice:add')") + @SaCheckPermission("system:notice:add") @Log(title = "通知公告", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody SysNotice notice) { @@ -66,7 +66,7 @@ public class SysNoticeController extends BaseController { * 修改通知公告 */ @ApiOperation("修改通知公告") - @PreAuthorize("@ss.hasPermi('system:notice:edit')") + @SaCheckPermission("system:notice:edit") @Log(title = "通知公告", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody SysNotice notice) { @@ -77,7 +77,7 @@ public class SysNoticeController extends BaseController { * 删除通知公告 */ @ApiOperation("删除通知公告") - @PreAuthorize("@ss.hasPermi('system:notice:remove')") + @SaCheckPermission("system:notice:remove") @Log(title = "通知公告", businessType = BusinessType.DELETE) @DeleteMapping("/{noticeIds}") public R remove(@ApiParam("公告ID串") @PathVariable Long[] noticeIds) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java index fcb1b779..288b317f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; @@ -18,7 +19,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -46,7 +46,7 @@ public class SysOssConfigController extends BaseController { * 查询对象存储配置列表 */ @ApiOperation("查询对象存储配置列表") - @PreAuthorize("@ss.hasPermi('system:oss:list')") + @SaCheckPermission("system:oss:list") @GetMapping("/list") public TableDataInfo list(@Validated(QueryGroup.class) SysOssConfigBo bo, PageQuery pageQuery) { return iSysOssConfigService.queryPageList(bo, pageQuery); @@ -56,7 +56,7 @@ public class SysOssConfigController extends BaseController { * 获取对象存储配置详细信息 */ @ApiOperation("获取对象存储配置详细信息") - @PreAuthorize("@ss.hasPermi('system:oss:query')") + @SaCheckPermission("system:oss:query") @GetMapping("/{ossConfigId}") public R getInfo(@ApiParam("OSS配置ID") @NotNull(message = "主键不能为空") @@ -68,7 +68,7 @@ public class SysOssConfigController extends BaseController { * 新增对象存储配置 */ @ApiOperation("新增对象存储配置") - @PreAuthorize("@ss.hasPermi('system:oss:add')") + @SaCheckPermission("system:oss:add") @Log(title = "对象存储配置", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() @@ -80,7 +80,7 @@ public class SysOssConfigController extends BaseController { * 修改对象存储配置 */ @ApiOperation("修改对象存储配置") - @PreAuthorize("@ss.hasPermi('system:oss:edit')") + @SaCheckPermission("system:oss:edit") @Log(title = "对象存储配置", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() @@ -92,7 +92,7 @@ public class SysOssConfigController extends BaseController { * 删除对象存储配置 */ @ApiOperation("删除对象存储配置") - @PreAuthorize("@ss.hasPermi('system:oss:remove')") + @SaCheckPermission("system:oss:remove") @Log(title = "对象存储配置", businessType = BusinessType.DELETE) @DeleteMapping("/{ossConfigIds}") public R remove(@ApiParam("OSS配置ID串") @@ -105,7 +105,7 @@ public class SysOssConfigController extends BaseController { * 状态修改 */ @ApiOperation("状态修改") - @PreAuthorize("@ss.hasPermi('system:oss:edit')") + @SaCheckPermission("system:oss:edit") @Log(title = "对象存储状态修改", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") public R changeStatus(@RequestBody SysOssConfigBo bo) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java index 76b4ce8b..0e1211a1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java @@ -1,11 +1,11 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpException; import cn.hutool.http.HttpUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; @@ -28,7 +28,6 @@ import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -60,7 +59,7 @@ public class SysOssController extends BaseController { * 查询OSS对象存储列表 */ @ApiOperation("查询OSS对象存储列表") - @PreAuthorize("@ss.hasPermi('system:oss:list')") + @SaCheckPermission("system:oss:list") @GetMapping("/list") public TableDataInfo list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) { return iSysOssService.queryPageList(bo, pageQuery); @@ -73,7 +72,7 @@ public class SysOssController extends BaseController { @ApiImplicitParams({ @ApiImplicitParam(name = "file", value = "文件", dataTypeClass = File.class, required = true), }) - @PreAuthorize("@ss.hasPermi('system:oss:upload')") + @SaCheckPermission("system:oss:upload") @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping("/upload") @@ -89,7 +88,7 @@ public class SysOssController extends BaseController { } @ApiOperation("下载OSS对象存储") - @PreAuthorize("@ss.hasPermi('system:oss:download')") + @SaCheckPermission("system:oss:download") @GetMapping("/download/{ossId}") public void download(@ApiParam("OSS对象ID") @PathVariable Long ossId, HttpServletResponse response) throws IOException { SysOss sysOss = iSysOssService.getById(ossId); @@ -116,7 +115,7 @@ public class SysOssController extends BaseController { * 删除OSS对象存储 */ @ApiOperation("删除OSS对象存储") - @PreAuthorize("@ss.hasPermi('system:oss:remove')") + @SaCheckPermission("system:oss:remove") @Log(title = "OSS对象存储", businessType = BusinessType.DELETE) @DeleteMapping("/{ossIds}") public R remove(@ApiParam("OSS对象ID串") @@ -129,13 +128,12 @@ public class SysOssController extends BaseController { * 变更图片列表预览状态 */ @ApiOperation("变更图片列表预览状态") - @PreAuthorize("@ss.hasPermi('system:oss:edit')") + @SaCheckPermission("system:oss:edit") @Log(title = "OSS对象存储", businessType = BusinessType.UPDATE) @PutMapping("/changePreviewListResource") public R changePreviewListResource(@RequestBody String body) { Map map = JsonUtils.parseMap(body); - SysConfig config = iSysConfigService.getOne(new LambdaQueryWrapper() - .eq(SysConfig::getConfigKey, OssConstant.PEREVIEW_LIST_RESOURCE_KEY)); + SysConfig config = iSysConfigService.getOne(new SysConfig().setConfigKey(OssConstant.PEREVIEW_LIST_RESOURCE_KEY)); config.setConfigValue(map.get("previewListResource").toString()); return toAjax(iSysConfigService.updateConfig(config)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java index 930188aa..97f3a56a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -15,7 +16,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,7 +40,7 @@ public class SysPostController extends BaseController { * 获取岗位列表 */ @ApiOperation("获取岗位列表") - @PreAuthorize("@ss.hasPermi('system:post:list')") + @SaCheckPermission("system:post:list") @GetMapping("/list") public TableDataInfo list(SysPost post, PageQuery pageQuery) { return postService.selectPagePostList(post, pageQuery); @@ -48,7 +48,7 @@ public class SysPostController extends BaseController { @ApiOperation("导出岗位列表") @Log(title = "岗位管理", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:post:export')") + @SaCheckPermission("system:post:export") @PostMapping("/export") public void export(SysPost post, HttpServletResponse response) { List list = postService.selectPostList(post); @@ -59,7 +59,7 @@ public class SysPostController extends BaseController { * 根据岗位编号获取详细信息 */ @ApiOperation("根据岗位编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:post:query')") + @SaCheckPermission("system:post:query") @GetMapping(value = "/{postId}") public R getInfo(@ApiParam("岗位ID") @PathVariable Long postId) { return R.success(postService.selectPostById(postId)); @@ -69,7 +69,7 @@ public class SysPostController extends BaseController { * 新增岗位 */ @ApiOperation("新增岗位") - @PreAuthorize("@ss.hasPermi('system:post:add')") + @SaCheckPermission("system:post:add") @Log(title = "岗位管理", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody SysPost post) { @@ -85,7 +85,7 @@ public class SysPostController extends BaseController { * 修改岗位 */ @ApiOperation("修改岗位") - @PreAuthorize("@ss.hasPermi('system:post:edit')") + @SaCheckPermission("system:post:edit") @Log(title = "岗位管理", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody SysPost post) { @@ -101,7 +101,7 @@ public class SysPostController extends BaseController { * 删除岗位 */ @ApiOperation("删除岗位") - @PreAuthorize("@ss.hasPermi('system:post:remove')") + @SaCheckPermission("system:post:remove") @Log(title = "岗位管理", businessType = BusinessType.DELETE) @DeleteMapping("/{postIds}") public R remove(@ApiParam("岗位ID串") @PathVariable Long[] postIds) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java index 90f2031c..ad865ca7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -5,11 +5,12 @@ import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.TokenService; +import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.service.ISysOssService; import com.ruoyi.system.service.ISysUserService; @@ -40,7 +41,6 @@ import java.util.Map; public class SysProfileController extends BaseController { private final ISysUserService userService; - private final TokenService tokenService; private final ISysOssService iSysOssService; /** @@ -49,12 +49,11 @@ public class SysProfileController extends BaseController { @ApiOperation("个人信息") @GetMapping public R> profile() { - LoginUser loginUser = getLoginUser(); - SysUser user = userService.selectUserById(loginUser.getUserId()); + SysUser user = userService.selectUserById(getUserId()); Map ajax = new HashMap<>(); ajax.put("user", user); - ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); - ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); + ajax.put("roleGroup", userService.selectUserRoleGroup(user.getUserName())); + ajax.put("postGroup", userService.selectUserPostGroup(user.getUserName())); return R.success(ajax); } @@ -73,9 +72,7 @@ public class SysProfileController extends BaseController { && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { return R.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } - LoginUser loginUser = getLoginUser(); - SysUser sysUser = userService.selectUserById(loginUser.getUserId()); - user.setUserId(sysUser.getUserId()); + user.setUserId(getUserId()); user.setUserName(null); user.setPassword(null); if (userService.updateUserProfile(user) > 0) { @@ -95,7 +92,7 @@ public class SysProfileController extends BaseController { @Log(title = "个人信息", businessType = BusinessType.UPDATE) @PutMapping("/updatePwd") public R updatePwd(String oldPassword, String newPassword) { - SysUser user = userService.selectUserById(SecurityUtils.getUserId()); + SysUser user = SpringUtils.getBean(UserService.class).selectUserById(LoginUtils.getUserId()); String userName = user.getUserName(); String password = user.getPassword(); if (!SecurityUtils.matchesPassword(oldPassword, password)) { @@ -120,12 +117,11 @@ public class SysProfileController extends BaseController { @Log(title = "用户头像", businessType = BusinessType.UPDATE) @PostMapping("/avatar") public R> avatar(@RequestPart("avatarfile") MultipartFile file) { - Map ajax = new HashMap<>(); + Map ajax = new HashMap<>(); if (!file.isEmpty()) { - LoginUser loginUser = getLoginUser(); SysOss oss = iSysOssService.upload(file); String avatar = oss.getUrl(); - if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) { + if (userService.updateUserAvatar(getUsername(), avatar)) { ajax.put("imgUrl", avatar); return R.success(ajax); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java index b765eeb2..1a92d18a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -9,8 +10,8 @@ import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.core.service.TokenService; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysUserRole; @@ -20,7 +21,6 @@ import com.ruoyi.system.service.SysPermissionService; import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,12 +40,11 @@ import java.util.List; public class SysRoleController extends BaseController { private final ISysRoleService roleService; - private final TokenService tokenService; private final ISysUserService userService; private final SysPermissionService permissionService; @ApiOperation("查询角色信息列表") - @PreAuthorize("@ss.hasPermi('system:role:list')") + @SaCheckPermission("system:role:list") @GetMapping("/list") public TableDataInfo list(SysRole role, PageQuery pageQuery) { return roleService.selectPageRoleList(role, pageQuery); @@ -53,7 +52,7 @@ public class SysRoleController extends BaseController { @ApiOperation("导出角色信息列表") @Log(title = "角色管理", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:role:export')") + @SaCheckPermission("system:role:export") @PostMapping("/export") public void export(SysRole role, HttpServletResponse response) { List list = roleService.selectRoleList(role); @@ -64,7 +63,7 @@ public class SysRoleController extends BaseController { * 根据角色编号获取详细信息 */ @ApiOperation("根据角色编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:role:query')") + @SaCheckPermission("system:role:query") @GetMapping(value = "/{roleId}") public R getInfo(@ApiParam("角色ID") @PathVariable Long roleId) { roleService.checkRoleDataScope(roleId); @@ -75,7 +74,7 @@ public class SysRoleController extends BaseController { * 新增角色 */ @ApiOperation("新增角色") - @PreAuthorize("@ss.hasPermi('system:role:add')") + @SaCheckPermission("system:role:add") @Log(title = "角色管理", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody SysRole role) { @@ -92,7 +91,7 @@ public class SysRoleController extends BaseController { * 修改保存角色 */ @ApiOperation("修改保存角色") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody SysRole role) { @@ -108,8 +107,8 @@ public class SysRoleController extends BaseController { LoginUser loginUser = getLoginUser(); SysUser sysUser = userService.selectUserById(loginUser.getUserId()); if (StringUtils.isNotNull(sysUser) && !sysUser.isAdmin()) { - loginUser.setMenuPermissions(permissionService.getMenuPermission(sysUser)); - tokenService.setLoginUser(loginUser); + loginUser.setMenuPermission(permissionService.getMenuPermission(sysUser)); + LoginUtils.setLoginUser(loginUser); } return R.success(); } @@ -120,7 +119,7 @@ public class SysRoleController extends BaseController { * 修改保存数据权限 */ @ApiOperation("修改保存数据权限") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PutMapping("/dataScope") public R dataScope(@RequestBody SysRole role) { @@ -132,7 +131,7 @@ public class SysRoleController extends BaseController { * 状态修改 */ @ApiOperation("状态修改") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") public R changeStatus(@RequestBody SysRole role) { @@ -144,7 +143,7 @@ public class SysRoleController extends BaseController { * 删除角色 */ @ApiOperation("删除角色") - @PreAuthorize("@ss.hasPermi('system:role:remove')") + @SaCheckPermission("system:role:remove") @Log(title = "角色管理", businessType = BusinessType.DELETE) @DeleteMapping("/{roleIds}") public R remove(@ApiParam("岗位ID串") @PathVariable Long[] roleIds) { @@ -155,7 +154,7 @@ public class SysRoleController extends BaseController { * 获取角色选择框列表 */ @ApiOperation("获取角色选择框列表") - @PreAuthorize("@ss.hasPermi('system:role:query')") + @SaCheckPermission("system:role:query") @GetMapping("/optionselect") public R> optionselect() { return R.success(roleService.selectRoleAll()); @@ -165,7 +164,7 @@ public class SysRoleController extends BaseController { * 查询已分配用户角色列表 */ @ApiOperation("查询已分配用户角色列表") - @PreAuthorize("@ss.hasPermi('system:role:list')") + @SaCheckPermission("system:role:list") @GetMapping("/authUser/allocatedList") public TableDataInfo allocatedList(SysUser user, PageQuery pageQuery) { return userService.selectAllocatedList(user, pageQuery); @@ -175,7 +174,7 @@ public class SysRoleController extends BaseController { * 查询未分配用户角色列表 */ @ApiOperation("查询未分配用户角色列表") - @PreAuthorize("@ss.hasPermi('system:role:list')") + @SaCheckPermission("system:role:list") @GetMapping("/authUser/unallocatedList") public TableDataInfo unallocatedList(SysUser user, PageQuery pageQuery) { return userService.selectUnallocatedList(user, pageQuery); @@ -185,7 +184,7 @@ public class SysRoleController extends BaseController { * 取消授权用户 */ @ApiOperation("取消授权用户") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.GRANT) @PutMapping("/authUser/cancel") public R cancelAuthUser(@RequestBody SysUserRole userRole) { @@ -200,7 +199,7 @@ public class SysRoleController extends BaseController { @ApiImplicitParam(name = "roleId", value = "角色ID", paramType = "query", dataTypeClass = String.class), @ApiImplicitParam(name = "userIds", value = "用户ID串", paramType = "query", dataTypeClass = String.class) }) - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.GRANT) @PutMapping("/authUser/cancelAll") public R cancelAuthUserAll(Long roleId, Long[] userIds) { @@ -215,7 +214,7 @@ public class SysRoleController extends BaseController { @ApiImplicitParam(name = "roleId", value = "角色ID", paramType = "query", dataTypeClass = String.class), @ApiImplicitParam(name = "userIds", value = "用户ID串", paramType = "query", dataTypeClass = String.class) }) - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.GRANT) @PutMapping("/authUser/selectAll") public R selectAuthUserAll(Long roleId, Long[] userIds) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index 2fcd19ec..50ae2462 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; @@ -26,7 +27,6 @@ import com.ruoyi.system.service.ISysUserService; import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -58,7 +58,7 @@ public class SysUserController extends BaseController { * 获取用户列表 */ @ApiOperation("获取用户列表") - @PreAuthorize("@ss.hasPermi('system:user:list')") + @SaCheckPermission("system:user:list") @GetMapping("/list") public TableDataInfo list(SysUser user, PageQuery pageQuery) { return userService.selectPageUserList(user, pageQuery); @@ -66,7 +66,7 @@ public class SysUserController extends BaseController { @ApiOperation("导出用户列表") @Log(title = "用户管理", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:user:export')") + @SaCheckPermission("system:user:export") @PostMapping("/export") public void export(SysUser user, HttpServletResponse response) { List list = userService.selectUserList(user); @@ -87,7 +87,7 @@ public class SysUserController extends BaseController { @ApiImplicitParam(name = "file", value = "导入文件", dataType = "java.io.File", required = true), }) @Log(title = "用户管理", businessType = BusinessType.IMPORT) - @PreAuthorize("@ss.hasPermi('system:user:import')") + @SaCheckPermission("system:user:import") @PostMapping("/importData") public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport)); @@ -104,8 +104,8 @@ public class SysUserController extends BaseController { * 根据用户编号获取详细信息 */ @ApiOperation("根据用户编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:user:query')") - @GetMapping(value = {"/", "/{userId}"}) + @SaCheckPermission("system:user:query") + @GetMapping(value = {"/", "/{userId}" }) public R> getInfo(@ApiParam("用户ID") @PathVariable(value = "userId", required = false) Long userId) { userService.checkUserDataScope(userId); Map ajax = new HashMap<>(); @@ -113,9 +113,10 @@ public class SysUserController extends BaseController { 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)) { - ajax.put("user", userService.selectUserById(userId)); + SysUser sysUser = userService.selectUserById(userId); + ajax.put("user", sysUser); ajax.put("postIds", postService.selectPostListByUserId(userId)); - ajax.put("roleIds", roleService.selectRoleListByUserId(userId)); + ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); } return R.success(ajax); } @@ -124,7 +125,7 @@ public class SysUserController extends BaseController { * 新增用户 */ @ApiOperation("新增用户") - @PreAuthorize("@ss.hasPermi('system:user:add')") + @SaCheckPermission("system:user:add") @Log(title = "用户管理", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody SysUser user) { @@ -145,7 +146,7 @@ public class SysUserController extends BaseController { * 修改用户 */ @ApiOperation("修改用户") - @PreAuthorize("@ss.hasPermi('system:user:edit')") + @SaCheckPermission("system:user:edit") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody SysUser user) { @@ -164,7 +165,7 @@ public class SysUserController extends BaseController { * 删除用户 */ @ApiOperation("删除用户") - @PreAuthorize("@ss.hasPermi('system:user:remove')") + @SaCheckPermission("system:user:remove") @Log(title = "用户管理", businessType = BusinessType.DELETE) @DeleteMapping("/{userIds}") public R remove(@ApiParam("角色ID串") @PathVariable Long[] userIds) { @@ -178,7 +179,7 @@ public class SysUserController extends BaseController { * 重置密码 */ @ApiOperation("重置密码") - @PreAuthorize("@ss.hasPermi('system:user:resetPwd')") + @SaCheckPermission("system:user:resetPwd") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping("/resetPwd") public R resetPwd(@RequestBody SysUser user) { @@ -191,7 +192,7 @@ public class SysUserController extends BaseController { * 状态修改 */ @ApiOperation("状态修改") - @PreAuthorize("@ss.hasPermi('system:user:edit')") + @SaCheckPermission("system:user:edit") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") public R changeStatus(@RequestBody SysUser user) { @@ -203,7 +204,7 @@ public class SysUserController extends BaseController { * 根据用户编号获取授权角色 */ @ApiOperation("根据用户编号获取授权角色") - @PreAuthorize("@ss.hasPermi('system:user:query')") + @SaCheckPermission("system:user:query") @GetMapping("/authRole/{userId}") public R> authRole(@ApiParam("用户ID") @PathVariable("userId") Long userId) { SysUser user = userService.selectUserById(userId); @@ -222,7 +223,7 @@ public class SysUserController extends BaseController { @ApiImplicitParam(name = "userId", value = "用户Id", paramType = "query", dataTypeClass = String.class), @ApiImplicitParam(name = "roleIds", value = "角色ID串", paramType = "query", dataTypeClass = String.class) }) - @PreAuthorize("@ss.hasPermi('system:user:edit')") + @SaCheckPermission("system:user:edit") @Log(title = "用户管理", businessType = BusinessType.GRANT) @PutMapping("/authRole") public R insertAuthRole(Long userId, Long[] roleIds) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowCategoryController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowCategoryController.java new file mode 100644 index 00000000..4898f005 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowCategoryController.java @@ -0,0 +1,117 @@ +package com.ruoyi.web.controller.workflow; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.workflow.domain.bo.FlowCategoryBo; +import com.ruoyi.workflow.domain.vo.FlowCategoryVo; +import com.ruoyi.workflow.service.IFlowCategoryService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 流程分类Controller + * + * @author ruoyi + * @date 2022-01-15 + */ +@Validated +@Api(value = "流程分类控制器", tags = {"流程分类管理"}) +@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RestController +@RequestMapping("/workflow/category") +public class FlowCategoryController extends BaseController { + + private final IFlowCategoryService iFlowCategoryService; + + /** + * 查询流程分类列表 + */ + @ApiOperation("查询流程分类列表") + @SaCheckPermission("workflow:category:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) FlowCategoryBo bo, PageQuery pageQuery) { + return iFlowCategoryService.queryPageList(bo, pageQuery); + } + + /** + * 导出流程分类列表 + */ + @ApiOperation("导出流程分类列表") + @SaCheckPermission("workflow:category:export") + @Log(title = "流程分类", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(@Validated FlowCategoryBo bo, HttpServletResponse response) { + List list = iFlowCategoryService.queryList(bo); + ExcelUtil.exportExcel(list, "流程分类", FlowCategoryVo.class, response); + } + + /** + * 获取流程分类详细信息 + */ + @ApiOperation("获取流程分类详细信息") + @SaCheckPermission("workflow:category:query") + @GetMapping("/{categoryId}") + public R getInfo(@ApiParam("主键") + @NotNull(message = "主键不能为空") + @PathVariable("categoryId") Long categoryId) { + return R.success(iFlowCategoryService.queryById(categoryId)); + } + + /** + * 新增流程分类 + */ + @ApiOperation("新增流程分类") + @SaCheckPermission("workflow:category:add") + @Log(title = "流程分类", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody FlowCategoryBo bo) { + return toAjax(iFlowCategoryService.insertByBo(bo) ? 1 : 0); + } + + /** + * 修改流程分类 + */ + @ApiOperation("修改流程分类") + @SaCheckPermission("workflow:category:edit") + @Log(title = "流程分类", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody FlowCategoryBo bo) { + return toAjax(iFlowCategoryService.updateByBo(bo) ? 1 : 0); + } + + /** + * 删除流程分类 + */ + @ApiOperation("删除流程分类") + @SaCheckPermission("workflow:category:remove") + @Log(title = "流程分类" , businessType = BusinessType.DELETE) + @DeleteMapping("/{categoryIds}") + public R remove(@ApiParam("主键串") + @NotEmpty(message = "主键不能为空") + @PathVariable Long[] categoryIds) { + return toAjax(iFlowCategoryService.deleteWithValidByIds(Arrays.asList(categoryIds), true) ? 1 : 0); + } +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowDefinitionController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowDefinitionController.java similarity index 95% rename from ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowDefinitionController.java rename to ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowDefinitionController.java index 4ede32a1..3eb96486 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowDefinitionController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowDefinitionController.java @@ -1,11 +1,11 @@ -package com.ruoyi.flowable.controller; +package com.ruoyi.web.controller.workflow; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.flowable.domain.dto.FlowProcDefDto; -import com.ruoyi.flowable.domain.dto.FlowSaveXmlVo; -import com.ruoyi.flowable.service.IFlowDefinitionService; +import com.ruoyi.workflow.domain.dto.FlowProcDefDto; +import com.ruoyi.workflow.domain.dto.FlowSaveXmlVo; +import com.ruoyi.workflow.service.IFlowDefinitionService; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; import io.swagger.annotations.Api; @@ -38,7 +38,7 @@ import java.util.Map; @Slf4j @Api(tags = "流程定义") @RestController -@RequestMapping("/flowable/definition") +@RequestMapping("/workflow/definition") public class FlowDefinitionController { @Autowired diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowInstanceController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowInstanceController.java similarity index 91% rename from ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowInstanceController.java rename to ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowInstanceController.java index 3f075fbb..cb34a77a 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowInstanceController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowInstanceController.java @@ -1,9 +1,9 @@ -package com.ruoyi.flowable.controller; +package com.ruoyi.web.controller.workflow; import com.ruoyi.common.core.domain.R; -import com.ruoyi.flowable.domain.vo.FlowTaskVo; -import com.ruoyi.flowable.service.IFlowInstanceService; +import com.ruoyi.workflow.domain.vo.FlowTaskVo; +import com.ruoyi.workflow.service.IFlowInstanceService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -22,7 +22,7 @@ import java.util.Map; @Slf4j @Api(tags = "工作流流程实例管理") @RestController -@RequestMapping("/flowable/instance") +@RequestMapping("/workflow/instance") public class FlowInstanceController { @Autowired diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowTaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowTaskController.java similarity index 96% rename from ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowTaskController.java rename to ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowTaskController.java index e952c33d..b03d50f2 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowTaskController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/FlowTaskController.java @@ -1,9 +1,9 @@ -package com.ruoyi.flowable.controller; +package com.ruoyi.web.controller.workflow; import com.ruoyi.common.core.domain.R; -import com.ruoyi.flowable.domain.dto.FlowTaskDto; -import com.ruoyi.flowable.domain.vo.FlowTaskVo; -import com.ruoyi.flowable.service.IFlowTaskService; +import com.ruoyi.workflow.domain.dto.FlowTaskDto; +import com.ruoyi.workflow.domain.vo.FlowTaskVo; +import com.ruoyi.workflow.service.IFlowTaskService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -27,7 +27,7 @@ import java.io.OutputStream; @Slf4j @Api(tags = "工作流流程任务管理") @RestController -@RequestMapping("/flowable/task") +@RequestMapping("/workflow/task") public class FlowTaskController { @Autowired diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/SysFormController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/SysFormController.java similarity index 78% rename from ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/SysFormController.java rename to ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/SysFormController.java index 4213808a..7fb6ce6a 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/SysFormController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/SysFormController.java @@ -1,17 +1,18 @@ -package com.ruoyi.flowable.controller; +package com.ruoyi.web.controller.workflow; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.flowable.service.ISysDeployFormService; -import com.ruoyi.flowable.service.ISysFormService; +import com.ruoyi.workflow.service.ISysDeployFormService; +import com.ruoyi.workflow.service.ISysFormService; import com.ruoyi.system.domain.SysDeployForm; import com.ruoyi.system.domain.SysForm; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; @@ -24,7 +25,7 @@ import java.util.List; * @date 2021-04-03 */ @RestController -@RequestMapping("/flowable/form") +@RequestMapping("/workflow/form") public class SysFormController extends BaseController { @Autowired private ISysFormService SysFormService; @@ -35,16 +36,16 @@ public class SysFormController extends BaseController { /** * 查询流程表单列表 */ - @PreAuthorize("@ss.hasPermi('flowable:form:list')") + @SaCheckPermission("flowable:form:list") @GetMapping("/list") - public TableDataInfo list(SysForm sysForm) { - return SysFormService.selectSysFormPage(sysForm); + public TableDataInfo list(SysForm sysForm, PageQuery pageQuery) { + return SysFormService.selectSysFormPage(sysForm, pageQuery); } /** * 导出流程表单列表 */ - @PreAuthorize("@ss.hasPermi('flowable:form:export')") + @SaCheckPermission("flowable:form:export") @Log(title = "流程表单", businessType = BusinessType.EXPORT) @GetMapping("/export") public void export(SysForm sysForm, HttpServletResponse response) { @@ -55,7 +56,7 @@ public class SysFormController extends BaseController { /** * 获取流程表单详细信息 */ - @PreAuthorize("@ss.hasPermi('flowable:form:query')") + @SaCheckPermission("flowable:form:query") @GetMapping(value = "/{formId}") public R getInfo(@PathVariable("formId") Long formId) { return R.success(SysFormService.selectSysFormById(formId)); @@ -64,7 +65,7 @@ public class SysFormController extends BaseController { /** * 新增流程表单 */ - @PreAuthorize("@ss.hasPermi('flowable:form:add')") + @SaCheckPermission("flowable:form:add") @Log(title = "流程表单", businessType = BusinessType.INSERT) @PostMapping public R add(@RequestBody SysForm sysForm) { @@ -74,7 +75,7 @@ public class SysFormController extends BaseController { /** * 修改流程表单 */ - @PreAuthorize("@ss.hasPermi('flowable:form:edit')") + @SaCheckPermission("flowable:form:edit") @Log(title = "流程表单", businessType = BusinessType.UPDATE) @PutMapping public R edit(@RequestBody SysForm sysForm) { @@ -84,7 +85,7 @@ public class SysFormController extends BaseController { /** * 删除流程表单 */ - @PreAuthorize("@ss.hasPermi('flowable:form:remove')") + @SaCheckPermission("flowable:form:remove") @Log(title = "流程表单", businessType = BusinessType.DELETE) @DeleteMapping("/{formIds}") public R remove(@PathVariable Long[] formIds) { diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 34d23ca5..90641a69 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -17,7 +17,7 @@ spring: xxl: job: # 执行器开关 - enabled: true + enabled: false # 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。 admin-addresses: http://localhost:9100/xxl-job-admin # 执行器通讯TOKEN:非空时启用 @@ -121,7 +121,7 @@ spring: # 数据库索引 database: 0 # 密码 - password: + password: konbai123.. # 连接超时时间 timeout: 10s # 是否开启ssl @@ -129,9 +129,9 @@ spring: redisson: # 线程池数量 - threads: 16 + threads: 4 # Netty线程池数量 - nettyThreads: 32 + nettyThreads: 8 # 传输模式 transportMode: "NIO" # 单节点配置 @@ -139,9 +139,9 @@ redisson: # 客户端名称 clientName: ${ruoyi.name} # 最小空闲连接数 - connectionMinimumIdleSize: 32 + connectionMinimumIdleSize: 8 # 连接池大小 - connectionPoolSize: 64 + connectionPoolSize: 32 # 连接空闲超时,单位:毫秒 idleConnectionTimeout: 10000 # 命令等待超时,单位:毫秒 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 48a1caa8..f2e6fb8d 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -83,6 +83,10 @@ spring: thymeleaf: # 将系统模板放置到最前面 否则会与 springboot-admin 页面冲突 template-resolver-order: 1 + mvc: + pathmatch: + # 适配 boot 2.6 路由与 springfox 兼容 + matching-strategy: ANT_PATH_MATCHER jackson: # 日期格式化 date-format: yyyy-MM-dd HH:mm:ss @@ -95,24 +99,46 @@ spring: # 允许对象忽略json中不存在的属性 fail_on_unknown_properties: false -# token配置 -token: - # 令牌自定义标识 - header: Authorization - # 令牌密钥 - secret: abcdefghijklmnopqrstuvwxyz - # 令牌有效期(默认30分钟) - expireTime: 30 +# Sa-Token配置 +sa-token: + # token名称 (同时也是cookie名称) + token-name: Authorization + # token有效期 设为一天 (必定过期) 单位: 秒 + timeout: 86400 + # token临时有效期 (指定时间无操作就过期) 单位: 秒 + activity-timeout: 1800 + # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + is-share: false + # 是否尝试从请求体里读取token + is-read-body: false + # 是否尝试从header里读取token + is-read-head: true + # 是否尝试从cookie里读取token + is-read-cookie: false + # token前缀 + token-prefix: "Bearer" + # token风格 + token-style: uuid + # jwt秘钥 + jwt-secret-key: abcdefghijklmnopqrstuvwxyz + # 是否输出操作日志 + is-log: true # security配置 security: - # 登出路径 - logout-url: /logout - # 匿名路径 - anonymous: + # 排除路径 + excludes: - /login + - /logout - /register - /captchaImage + # 静态资源 + - /*.html + - /**/*.html + - /**/*.css + - /**/*.js # swagger 文档配置 - /doc.html - /swagger-resources/** @@ -221,6 +247,10 @@ knife4j: enable: true # 是否开启生产环境保护策略 production: @knife4j.production@ + basic: + enable: true + username: ruoyi + password: 123456 # 前端Ui的个性化配置属性 setting: # 默认语言 diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml index 5d37af98..856ee2c7 100644 --- a/ruoyi-admin/src/main/resources/logback.xml +++ b/ruoyi-admin/src/main/resources/logback.xml @@ -5,13 +5,13 @@ value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %msg%n"/> - - + + - ${console.log.pattern} + ${console.log.pattern} utf-8 - - + + @@ -32,20 +32,20 @@ - - - ${log.path}/sys-info.log + + + ${log.path}/sys-info.log - + - ${log.path}/sys-info.%d{yyyy-MM-dd}.log - - 60 - + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + - ${log.pattern} - - + ${log.pattern} + + INFO @@ -53,16 +53,16 @@ DENY - + - - ${log.path}/sys-error.log + + ${log.path}/sys-error.log ${log.path}/sys-error.%d{yyyy-MM-dd}.log - - 60 + + 60 ${log.pattern} @@ -70,23 +70,23 @@ ERROR - + ACCEPT - + DENY - - - - + + + + - - - + + + - + diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 12ae6e73..9b265ee5 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -29,10 +29,20 @@ spring-web - + - org.springframework.boot - spring-boot-starter-security + cn.dev33 + sa-token-spring-boot-starter + + + + cn.dev33 + sa-token-jwt + + + + org.springframework.security + spring-security-crypto diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java deleted file mode 100644 index f1a4f9f3..00000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.ruoyi.common.annotation; - -import java.lang.annotation.*; - -/** - * 数据权限过滤注解 - * - * @author ruoyi - * @deprecated 3.6.0 移除 {@link com.ruoyi.common.annotation.DataPermission} - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Deprecated -public @interface DataScope { - - /** - * 部门表的别名 - */ - String deptAlias() default ""; - - /** - * 用户表的别名 - */ - String userAlias() default ""; - - /** - * 是否过滤用户权限 - */ - boolean isUser() default false; - -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java deleted file mode 100644 index 9bbc8125..00000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.ruoyi.common.annotation; - -import com.ruoyi.common.enums.DataSourceType; - -import java.lang.annotation.*; - -/** - * 自定义多数据源切换注解 - *

- * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 - * - * @author ruoyi - * @deprecated 3.6.0 移除 使用原生注解处理 方法更全 {@link com.baomidou.dynamic.datasource.annotation.DS} - */ -@Target({ElementType.METHOD, ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Inherited -@Deprecated -public @interface DataSource { - /** - * 切换数据源名称 - */ - DataSourceType value() default DataSourceType.MASTER; -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java new file mode 100644 index 00000000..ff17b09d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java @@ -0,0 +1,23 @@ +package com.ruoyi.common.annotation; + +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ruoyi.common.enums.SensitiveStrategy; +import com.ruoyi.common.jackson.SensitiveJsonSerializer; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 数据脱敏注解 + * @author zhujie + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@JacksonAnnotationsInside +@JsonSerialize(using = SensitiveJsonSerializer.class) +public @interface Sensitive { + SensitiveStrategy strategy(); +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java b/ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java index 9c0f26f5..ec2d6825 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java @@ -13,73 +13,73 @@ import com.ruoyi.common.utils.StringUtils; */ public class UnsignedMathGenerator implements CodeGenerator { - private static final long serialVersionUID = -5514819971774091076L; + private static final long serialVersionUID = -5514819971774091076L; - private static final String operators = "+-*"; + private static final String operators = "+-*"; - /** - * 参与计算数字最大长度 - */ - private final int numberLength; + /** + * 参与计算数字最大长度 + */ + private final int numberLength; - /** - * 构造 - */ - public UnsignedMathGenerator() { - this(2); - } + /** + * 构造 + */ + public UnsignedMathGenerator() { + this(2); + } - /** - * 构造 - * - * @param numberLength 参与计算最大数字位数 - */ - public UnsignedMathGenerator(int numberLength) { - this.numberLength = numberLength; - } + /** + * 构造 + * + * @param numberLength 参与计算最大数字位数 + */ + public UnsignedMathGenerator(int numberLength) { + this.numberLength = numberLength; + } - @Override - public String generate() { - final int limit = getLimit(); - int min = RandomUtil.randomInt(limit); - int max = RandomUtil.randomInt(min, limit); - String number1 = Integer.toString(max); - String number2 = Integer.toString(min); - number1 = StringUtils.rightPad(number1, this.numberLength, CharUtil.SPACE); - number2 = StringUtils.rightPad(number2, this.numberLength, CharUtil.SPACE); + @Override + public String generate() { + final int limit = getLimit(); + int min = RandomUtil.randomInt(limit); + int max = RandomUtil.randomInt(min, limit); + String number1 = Integer.toString(max); + String number2 = Integer.toString(min); + number1 = StringUtils.rightPad(number1, this.numberLength, CharUtil.SPACE); + number2 = StringUtils.rightPad(number2, this.numberLength, CharUtil.SPACE); - return number1 + RandomUtil.randomChar(operators) + number2 + '='; - } + return number1 + RandomUtil.randomChar(operators) + number2 + '='; + } - @Override - public boolean verify(String code, String userInputCode) { - int result; - try { - result = Integer.parseInt(userInputCode); - } catch (NumberFormatException e) { - // 用户输入非数字 - return false; - } + @Override + public boolean verify(String code, String userInputCode) { + int result; + try { + result = Integer.parseInt(userInputCode); + } catch (NumberFormatException e) { + // 用户输入非数字 + return false; + } - final int calculateResult = (int) Calculator.conversion(code); - return result == calculateResult; - } + final int calculateResult = (int) Calculator.conversion(code); + return result == calculateResult; + } - /** - * 获取验证码长度 - * - * @return 验证码长度 - */ - public int getLength() { - return this.numberLength * 2 + 2; - } + /** + * 获取验证码长度 + * + * @return 验证码长度 + */ + public int getLength() { + return this.numberLength * 2 + 2; + } - /** - * 根据长度获取参与计算数字最大值 - * - * @return 最大值 - */ - private int getLimit() { - return Integer.parseInt("1" + StringUtils.repeat('0', this.numberLength)); - } + /** + * 根据长度获取参与计算数字最大值 + * + * @return 最大值 + */ + private int getLimit() { + return Integer.parseInt("1" + StringUtils.repeat('0', this.numberLength)); + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index 76e959de..5e07c96c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -1,6 +1,5 @@ package com.ruoyi.common.constant; - /** * 通用常量信息 * @@ -66,7 +65,12 @@ public interface Constants { /** * 登录用户 redis key */ - String LOGIN_TOKEN_KEY = "login_tokens:"; + public static final String LOGIN_TOKEN_KEY = "Authorization:login:token:"; + + /** + * 在线用户 redis key + */ + public static final String ONLINE_TOKEN_KEY = "online_tokens:"; /** * 防重提交 redis key @@ -103,41 +107,11 @@ public interface Constants { */ String TOKEN = "token"; - /** - * 令牌前缀 - */ - String TOKEN_PREFIX = "Bearer "; - /** * 令牌前缀 */ String LOGIN_USER_KEY = "login_user_key"; - /** - * 用户ID - */ - String JWT_USERID = "userid"; - - /** - * 用户名称 - */ - String JWT_USERNAME = "sub"; - - /** - * 用户头像 - */ - String JWT_AVATAR = "avatar"; - - /** - * 创建时间 - */ - String JWT_CREATED = "created"; - - /** - * 用户权限 - */ - String JWT_AUTHORITIES = "authorities"; - /** * 参数管理 cache key */ @@ -149,3 +123,4 @@ public interface Constants { String SYS_DICT_KEY = "sys_dict:"; } + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelBigNumberConvert.java b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelBigNumberConvert.java index df1f95a0..690b4791 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelBigNumberConvert.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelBigNumberConvert.java @@ -20,32 +20,32 @@ import java.math.BigDecimal; @Slf4j public class ExcelBigNumberConvert implements Converter { - @Override - public Class supportJavaTypeKey() { - return Long.class; - } + @Override + public Class supportJavaTypeKey() { + return Long.class; + } - @Override - public CellDataTypeEnum supportExcelTypeKey() { - return CellDataTypeEnum.STRING; - } + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } - @Override - public Long convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - return Convert.toLong(cellData.getData()); - } + @Override + public Long convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + return Convert.toLong(cellData.getData()); + } - @Override - public CellData convertToExcelData(Long object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - if (ObjectUtil.isNotNull(object)) { - String str = Convert.toStr(object); - if (str.length() > 15) { - return new CellData<>(str); - } - } - CellData cellData = new CellData<>(new BigDecimal(object)); - cellData.setType(CellDataTypeEnum.NUMBER); - return cellData; - } + @Override + public CellData convertToExcelData(Long object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (ObjectUtil.isNotNull(object)) { + String str = Convert.toStr(object); + if (str.length() > 15) { + return new CellData<>(str); + } + } + CellData cellData = new CellData<>(new BigDecimal(object)); + cellData.setType(CellDataTypeEnum.NUMBER); + return cellData; + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java index 7c4d6312..cf612c98 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java @@ -24,48 +24,48 @@ import java.lang.reflect.Field; @Slf4j public class ExcelDictConvert implements Converter { - @Override - public Class supportJavaTypeKey() { - return Object.class; - } + @Override + public Class supportJavaTypeKey() { + return Object.class; + } - @Override - public CellDataTypeEnum supportExcelTypeKey() { - return null; - } + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return null; + } - @Override - public Object convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - ExcelDictFormat anno = getAnnotation(contentProperty.getField()); - String type = anno.dictType(); - String label = cellData.getStringValue(); - String value; - if (StringUtils.isBlank(type)) { - value = ExcelUtil.reverseByExp(label, anno.readConverterExp(), anno.separator()); - } else { - value = SpringUtils.getBean(DictService.class).getDictValue(type, label, anno.separator()); - } - return Convert.convert(contentProperty.getField().getType(), value); - } + @Override + public Object convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + ExcelDictFormat anno = getAnnotation(contentProperty.getField()); + String type = anno.dictType(); + String label = cellData.getStringValue(); + String value; + if (StringUtils.isBlank(type)) { + value = ExcelUtil.reverseByExp(label, anno.readConverterExp(), anno.separator()); + } else { + value = SpringUtils.getBean(DictService.class).getDictValue(type, label, anno.separator()); + } + return Convert.convert(contentProperty.getField().getType(), value); + } - @Override - public CellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - if (StringUtils.isNull(object)) { - return new CellData<>(""); - } - ExcelDictFormat anno = getAnnotation(contentProperty.getField()); - String type = anno.dictType(); - String value = Convert.toStr(object); - String label; - if (StringUtils.isBlank(type)) { - label = ExcelUtil.convertByExp(value, anno.readConverterExp(), anno.separator()); - } else { - label = SpringUtils.getBean(DictService.class).getDictLabel(type, value, anno.separator()); - } - return new CellData<>(label); - } + @Override + public CellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (StringUtils.isNull(object)) { + return new CellData<>(""); + } + ExcelDictFormat anno = getAnnotation(contentProperty.getField()); + String type = anno.dictType(); + String value = Convert.toStr(object); + String label; + if (StringUtils.isBlank(type)) { + label = ExcelUtil.convertByExp(value, anno.readConverterExp(), anno.separator()); + } else { + label = SpringUtils.getBean(DictService.class).getDictLabel(type, value, anno.separator()); + } + return new CellData<>(label); + } - private ExcelDictFormat getAnnotation(Field field) { - return AnnotationUtil.getAnnotation(field, ExcelDictFormat.class); - } + private ExcelDictFormat getAnnotation(Field field) { + return AnnotationUtil.getAnnotation(field, ExcelDictFormat.class); + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java index 2a934050..538b168d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java @@ -2,7 +2,7 @@ package com.ruoyi.common.core.controller; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.StringUtils; /** @@ -71,27 +71,27 @@ public class BaseController { * 获取用户缓存信息 */ public LoginUser getLoginUser() { - return SecurityUtils.getLoginUser(); + return LoginUtils.getLoginUser(); } /** * 获取登录用户id */ public Long getUserId() { - return getLoginUser().getUserId(); + return LoginUtils.getUserId(); } /** * 获取登录部门id */ public Long getDeptId() { - return getLoginUser().getDeptId(); + return LoginUtils.getDeptId(); } /** * 获取登录用户名 */ public String getUsername() { - return getLoginUser().getUsername(); + return LoginUtils.getUsername(); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java index b2180703..9c7857a5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java @@ -21,48 +21,48 @@ import java.util.Map; @Accessors(chain = true) public class BaseEntity implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 搜索值 - */ - @ApiModelProperty(value = "搜索值") - @TableField(exist = false) - private String searchValue; + /** + * 搜索值 + */ + @ApiModelProperty(value = "搜索值") + @TableField(exist = false) + private String searchValue; - /** - * 创建者 - */ - @ApiModelProperty(value = "创建者") - @TableField(fill = FieldFill.INSERT) - private String createBy; + /** + * 创建者 + */ + @ApiModelProperty(value = "创建者") + @TableField(fill = FieldFill.INSERT) + private String createBy; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间") - @TableField(fill = FieldFill.INSERT) - private Date createTime; + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + @TableField(fill = FieldFill.INSERT) + private Date createTime; - /** - * 更新者 - */ - @ApiModelProperty(value = "更新者") - @TableField(fill = FieldFill.INSERT_UPDATE) - private String updateBy; + /** + * 更新者 + */ + @ApiModelProperty(value = "更新者") + @TableField(fill = FieldFill.INSERT_UPDATE) + private String updateBy; - /** - * 更新时间 - */ - @ApiModelProperty(value = "更新时间") - @TableField(fill = FieldFill.INSERT_UPDATE) - private Date updateTime; + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; - /** - * 请求参数 - */ - @ApiModelProperty(value = "请求参数") - @TableField(exist = false) - private Map params = new HashMap<>(); + /** + * 请求参数 + */ + @ApiModelProperty(value = "请求参数") + @TableField(exist = false) + private Map params = new HashMap<>(); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java index d82779ad..5ffd5889 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java @@ -21,7 +21,7 @@ import java.io.Serializable; @Accessors(chain = true) public class PageQuery implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; /** * 分页大小 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java index af7401d3..18e13911 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java @@ -20,25 +20,25 @@ import lombok.experimental.Accessors; @ApiModel("请求响应对象") public class R { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 状态码 - */ - @ApiModelProperty("消息状态码") - private int code; + /** + * 状态码 + */ + @ApiModelProperty("消息状态码") + private int code; - /** - * 返回内容 - */ - @ApiModelProperty("消息内容") - private String msg; + /** + * 返回内容 + */ + @ApiModelProperty("消息内容") + private String msg; - /** - * 数据对象 - */ - @ApiModelProperty("数据对象") - private T data; + /** + * 数据对象 + */ + @ApiModelProperty("数据对象") + private T data; /** * 初始化一个新创建的 R 对象 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java index c0e62c71..819e6b72 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java @@ -20,26 +20,26 @@ import java.util.List; @Accessors(chain = true) public class TreeEntity extends BaseEntity { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 父菜单名称 - */ - @TableField(exist = false) - @ApiModelProperty(value = "父菜单名称") - private String parentName; + /** + * 父菜单名称 + */ + @TableField(exist = false) + @ApiModelProperty(value = "父菜单名称") + private String parentName; - /** - * 父菜单ID - */ - @ApiModelProperty(value = "父菜单ID") - private Long parentId; + /** + * 父菜单ID + */ + @ApiModelProperty(value = "父菜单ID") + private Long parentId; - /** - * 子部门 - */ - @TableField(exist = false) - @ApiModelProperty(value = "子部门") - private List children = new ArrayList<>(); + /** + * 子部门 + */ + @TableField(exist = false) + @ApiModelProperty(value = "子部门") + private List children = new ArrayList<>(); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java new file mode 100644 index 00000000..5eb52806 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java @@ -0,0 +1,62 @@ +package com.ruoyi.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 当前在线会话 + * + * @author ruoyi + */ + +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class UserOnlineDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 会话编号 + */ + private String tokenId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 用户名称 + */ + private String userName; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地址 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录时间 + */ + private Long loginTime; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java index 17ff6606..860f2f2c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java @@ -26,68 +26,68 @@ import javax.validation.constraints.Size; @TableName("sys_dept") @ApiModel("部门业务对象") public class SysDept extends TreeEntity { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 部门ID - */ - @ApiModelProperty(value = "部门id") - @TableId(value = "dept_id") - private Long deptId; + /** + * 部门ID + */ + @ApiModelProperty(value = "部门id") + @TableId(value = "dept_id") + private Long deptId; - /** - * 部门名称 - */ - @ApiModelProperty(value = "部门名称") - @NotBlank(message = "部门名称不能为空") - @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符") - private String deptName; + /** + * 部门名称 + */ + @ApiModelProperty(value = "部门名称") + @NotBlank(message = "部门名称不能为空") + @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符") + private String deptName; - /** - * 显示顺序 - */ - @ApiModelProperty(value = "显示顺序") - @NotBlank(message = "显示顺序不能为空") - private String orderNum; + /** + * 显示顺序 + */ + @ApiModelProperty(value = "显示顺序") + @NotBlank(message = "显示顺序不能为空") + private String orderNum; - /** - * 负责人 - */ - @ApiModelProperty(value = "负责人") - private String leader; + /** + * 负责人 + */ + @ApiModelProperty(value = "负责人") + private String leader; - /** - * 联系电话 - */ - @ApiModelProperty(value = "联系电话") - @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符") - private String phone; + /** + * 联系电话 + */ + @ApiModelProperty(value = "联系电话") + @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符") + private String phone; - /** - * 邮箱 - */ - @ApiModelProperty(value = "邮箱") - @Email(message = "邮箱格式不正确") - @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") - private String email; + /** + * 邮箱 + */ + @ApiModelProperty(value = "邮箱") + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + private String email; - /** - * 部门状态:0正常,1停用 - */ - @ApiModelProperty(value = "部门状态:0正常,1停用") - private String status; + /** + * 部门状态:0正常,1停用 + */ + @ApiModelProperty(value = "部门状态:0正常,1停用") + private String status; - /** - * 删除标志(0代表存在 2代表删除) - */ - @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)") - @TableLogic - private String delFlag; + /** + * 删除标志(0代表存在 2代表删除) + */ + @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)") + @TableLogic + private String delFlag; - /** - * 祖级列表 - */ - @ApiModelProperty(value = "祖级列表") - private String ancestors; + /** + * 祖级列表 + */ + @ApiModelProperty(value = "祖级列表") + private String ancestors; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java index 3c572bd2..241aecd8 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java @@ -31,85 +31,85 @@ import javax.validation.constraints.Size; @ApiModel("字典数据业务对象") public class SysDictData extends BaseEntity { - /** - * 字典编码 - */ - @ApiModelProperty(value = "字典编码") - @ExcelProperty(value = "字典编码") - @TableId(value = "dict_code") - private Long dictCode; + /** + * 字典编码 + */ + @ApiModelProperty(value = "字典编码") + @ExcelProperty(value = "字典编码") + @TableId(value = "dict_code") + private Long dictCode; - /** - * 字典排序 - */ - @ApiModelProperty(value = "字典排序") - @ExcelProperty(value = "字典排序") - private Long dictSort; + /** + * 字典排序 + */ + @ApiModelProperty(value = "字典排序") + @ExcelProperty(value = "字典排序") + private Long dictSort; - /** - * 字典标签 - */ - @ApiModelProperty(value = "字典标签") - @ExcelProperty(value = "字典标签") - @NotBlank(message = "字典标签不能为空") - @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") - private String dictLabel; + /** + * 字典标签 + */ + @ApiModelProperty(value = "字典标签") + @ExcelProperty(value = "字典标签") + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") + private String dictLabel; - /** - * 字典键值 - */ - @ApiModelProperty(value = "字典键值") - @ExcelProperty(value = "字典键值") - @NotBlank(message = "字典键值不能为空") - @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") - private String dictValue; + /** + * 字典键值 + */ + @ApiModelProperty(value = "字典键值") + @ExcelProperty(value = "字典键值") + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") + private String dictValue; - /** - * 字典类型 - */ - @ApiModelProperty(value = "字典类型") - @ExcelProperty(value = "字典类型") - @NotBlank(message = "字典类型不能为空") - @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") - private String dictType; + /** + * 字典类型 + */ + @ApiModelProperty(value = "字典类型") + @ExcelProperty(value = "字典类型") + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") + private String dictType; - /** - * 样式属性(其他样式扩展) - */ - @ApiModelProperty(value = "样式属性(其他样式扩展)") - @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") - private String cssClass; + /** + * 样式属性(其他样式扩展) + */ + @ApiModelProperty(value = "样式属性(其他样式扩展)") + @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") + private String cssClass; - /** - * 表格字典样式 - */ - @ApiModelProperty(value = "表格字典样式") - private String listClass; + /** + * 表格字典样式 + */ + @ApiModelProperty(value = "表格字典样式") + private String listClass; - /** - * 是否默认(Y是 N否) - */ - @ApiModelProperty(value = "是否默认(Y是 N否)") - @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_yes_no") - private String isDefault; + /** + * 是否默认(Y是 N否) + */ + @ApiModelProperty(value = "是否默认(Y是 N否)") + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_yes_no") + private String isDefault; - /** - * 状态(0正常 1停用) - */ - @ApiModelProperty(value = "状态(0正常 1停用)") - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_normal_disable") - private String status; + /** + * 状态(0正常 1停用) + */ + @ApiModelProperty(value = "状态(0正常 1停用)") + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; - /** - * 备注 - */ - @ApiModelProperty(value = "备注") - private String remark; + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; - public boolean getDefault() { - return UserConstants.YES.equals(this.isDefault); - } + public boolean getDefault() { + return UserConstants.YES.equals(this.isDefault); + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java index c6c9b1a2..702ec09d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java @@ -30,44 +30,44 @@ import javax.validation.constraints.Size; @ApiModel("字典类型业务对象") public class SysDictType extends BaseEntity { - /** - * 字典主键 - */ - @ApiModelProperty(value = "字典主键") - @ExcelProperty(value = "字典主键") - @TableId(value = "dict_id") - private Long dictId; + /** + * 字典主键 + */ + @ApiModelProperty(value = "字典主键") + @ExcelProperty(value = "字典主键") + @TableId(value = "dict_id") + private Long dictId; - /** - * 字典名称 - */ - @ApiModelProperty(value = "字典名称") - @ExcelProperty(value = "字典名称") - @NotBlank(message = "字典名称不能为空") - @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") - private String dictName; + /** + * 字典名称 + */ + @ApiModelProperty(value = "字典名称") + @ExcelProperty(value = "字典名称") + @NotBlank(message = "字典名称不能为空") + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") + private String dictName; - /** - * 字典类型 - */ - @ApiModelProperty(value = "字典类型") - @ExcelProperty(value = "字典类型") - @NotBlank(message = "字典类型不能为空") - @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") - private String dictType; + /** + * 字典类型 + */ + @ApiModelProperty(value = "字典类型") + @ExcelProperty(value = "字典类型") + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") + private String dictType; - /** - * 状态(0正常 1停用) - */ - @ApiModelProperty(value = "状态(0正常 1停用)") - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_normal_disable") - private String status; + /** + * 状态(0正常 1停用) + */ + @ApiModelProperty(value = "状态(0正常 1停用)") + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; - /** - * 备注 - */ - @ApiModelProperty(value = "备注") - private String remark; + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java index 8efc9f7a..3febc94b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java @@ -26,97 +26,97 @@ import javax.validation.constraints.Size; @ApiModel("菜单权限业务对象") public class SysMenu extends TreeEntity { - /** - * 菜单ID - */ - @ApiModelProperty(value = "菜单ID") - @TableId(value = "menu_id") - private Long menuId; + /** + * 菜单ID + */ + @ApiModelProperty(value = "菜单ID") + @TableId(value = "menu_id") + private Long menuId; - /** - * 菜单名称 - */ - @ApiModelProperty(value = "菜单名称") - @NotBlank(message = "菜单名称不能为空") - @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") - private String menuName; + /** + * 菜单名称 + */ + @ApiModelProperty(value = "菜单名称") + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") + private String menuName; - /** - * 显示顺序 - */ - @ApiModelProperty(value = "显示顺序") - @NotBlank(message = "显示顺序不能为空") - private String orderNum; + /** + * 显示顺序 + */ + @ApiModelProperty(value = "显示顺序") + @NotBlank(message = "显示顺序不能为空") + private String orderNum; - /** - * 路由地址 - */ - @ApiModelProperty(value = "路由地址") - @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") - private String path; + /** + * 路由地址 + */ + @ApiModelProperty(value = "路由地址") + @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") + private String path; - /** - * 组件路径 - */ - @ApiModelProperty(value = "组件路径") - @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") - private String component; + /** + * 组件路径 + */ + @ApiModelProperty(value = "组件路径") + @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") + private String component; /** * 路由参数 */ - @ApiModelProperty(value = "路由参数") + @ApiModelProperty(value = "路由参数") @TableField("`query`") private String query; - /** - * 是否为外链(0是 1否) - */ - @ApiModelProperty(value = "是否为外链(0是 1否)") - private String isFrame; + /** + * 是否为外链(0是 1否) + */ + @ApiModelProperty(value = "是否为外链(0是 1否)") + private String isFrame; - /** - * 是否缓存(0缓存 1不缓存) - */ - @ApiModelProperty(value = "是否缓存(0缓存 1不缓存)") - private String isCache; + /** + * 是否缓存(0缓存 1不缓存) + */ + @ApiModelProperty(value = "是否缓存(0缓存 1不缓存)") + private String isCache; - /** - * 类型(M目录 C菜单 F按钮) - */ - @ApiModelProperty(value = "类型(M目录 C菜单 F按钮)") - @NotBlank(message = "菜单类型不能为空") - private String menuType; + /** + * 类型(M目录 C菜单 F按钮) + */ + @ApiModelProperty(value = "类型(M目录 C菜单 F按钮)") + @NotBlank(message = "菜单类型不能为空") + private String menuType; - /** - * 显示状态(0显示 1隐藏) - */ - @ApiModelProperty(value = "显示状态(0显示 1隐藏)") - private String visible; + /** + * 显示状态(0显示 1隐藏) + */ + @ApiModelProperty(value = "显示状态(0显示 1隐藏)") + private String visible; - /** - * 菜单状态(0显示 1隐藏) - */ - @ApiModelProperty(value = "菜单状态(0显示 1隐藏)") - private String status; + /** + * 菜单状态(0显示 1隐藏) + */ + @ApiModelProperty(value = "菜单状态(0显示 1隐藏)") + private String status; - /** - * 权限字符串 - */ - @ApiModelProperty(value = "权限字符串") - @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") - private String perms; + /** + * 权限字符串 + */ + @ApiModelProperty(value = "权限字符串") + @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") + private String perms; - /** - * 菜单图标 - */ - @ApiModelProperty(value = "菜单图标") - private String icon; + /** + * 菜单图标 + */ + @ApiModelProperty(value = "菜单图标") + private String icon; - /** - * 备注 - */ - @ApiModelProperty(value = "备注") - private String remark; + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java index 1d186db5..3153e41b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java @@ -32,113 +32,113 @@ import javax.validation.constraints.Size; @ExcelIgnoreUnannotated public class SysRole extends BaseEntity { - /** - * 角色ID - */ - @ApiModelProperty(value = "角色ID") - @ExcelProperty(value = "角色序号") - @TableId(value = "role_id") - private Long roleId; + /** + * 角色ID + */ + @ApiModelProperty(value = "角色ID") + @ExcelProperty(value = "角色序号") + @TableId(value = "role_id") + private Long roleId; - /** - * 角色名称 - */ - @ApiModelProperty(value = "角色名称") - @ExcelProperty(value = "角色名称") - @NotBlank(message = "角色名称不能为空") - @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符") - private String roleName; + /** + * 角色名称 + */ + @ApiModelProperty(value = "角色名称") + @ExcelProperty(value = "角色名称") + @NotBlank(message = "角色名称不能为空") + @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符") + private String roleName; - /** - * 角色权限 - */ - @ApiModelProperty(value = "角色权限") - @ExcelProperty(value = "角色权限") - @NotBlank(message = "权限字符不能为空") - @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符") - private String roleKey; + /** + * 角色权限 + */ + @ApiModelProperty(value = "角色权限") + @ExcelProperty(value = "角色权限") + @NotBlank(message = "权限字符不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符") + private String roleKey; - /** - * 角色排序 - */ - @ApiModelProperty(value = "角色排序") - @ExcelProperty(value = "角色排序") - @NotBlank(message = "显示顺序不能为空") - private String roleSort; + /** + * 角色排序 + */ + @ApiModelProperty(value = "角色排序") + @ExcelProperty(value = "角色排序") + @NotBlank(message = "显示顺序不能为空") + private String roleSort; - /** - * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) - */ - @ApiModelProperty(value = "数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)") - @ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") - private String dataScope; + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + @ApiModelProperty(value = "数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)") + @ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") + private String dataScope; - /** - * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) - */ - @ApiModelProperty(value = "菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)") - private boolean menuCheckStrictly; + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + @ApiModelProperty(value = "菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)") + private boolean menuCheckStrictly; - /** - * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) - */ - @ApiModelProperty(value = "部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )") - private boolean deptCheckStrictly; + /** + * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) + */ + @ApiModelProperty(value = "部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )") + private boolean deptCheckStrictly; - /** - * 角色状态(0正常 1停用) - */ - @ApiModelProperty(value = "角色状态(0正常 1停用)") - @ExcelProperty(value = "角色状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_common_status") - private String status; + /** + * 角色状态(0正常 1停用) + */ + @ApiModelProperty(value = "角色状态(0正常 1停用)") + @ExcelProperty(value = "角色状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_common_status") + private String status; - /** - * 删除标志(0代表存在 2代表删除) - */ - @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)") - @TableLogic - private String delFlag; + /** + * 删除标志(0代表存在 2代表删除) + */ + @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)") + @TableLogic + private String delFlag; - /** - * 备注 - */ - @ApiModelProperty(value = "备注") - private String remark; + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; - /** - * 用户是否存在此角色标识 默认不存在 - */ - @ApiModelProperty(value = "用户是否存在此角色标识 默认不存在") - @TableField(exist = false) - private boolean flag = false; + /** + * 用户是否存在此角色标识 默认不存在 + */ + @ApiModelProperty(value = "用户是否存在此角色标识 默认不存在") + @TableField(exist = false) + private boolean flag = false; - /** - * 菜单组 - */ - @ApiModelProperty(value = "菜单组") - @TableField(exist = false) - private Long[] menuIds; + /** + * 菜单组 + */ + @ApiModelProperty(value = "菜单组") + @TableField(exist = false) + private Long[] menuIds; - /** - * 部门组(数据权限) - */ - @ApiModelProperty(value = "部门组(数据权限)") - @TableField(exist = false) - private Long[] deptIds; + /** + * 部门组(数据权限) + */ + @ApiModelProperty(value = "部门组(数据权限)") + @TableField(exist = false) + private Long[] deptIds; - public SysRole(Long roleId) { - this.roleId = roleId; - } + public SysRole(Long roleId) { + this.roleId = roleId; + } - @ApiModelProperty(value = "是否管理员") - public boolean isAdmin() { - return isAdmin(this.roleId); - } + @ApiModelProperty(value = "是否管理员") + public boolean isAdmin() { + return isAdmin(this.roleId); + } - public static boolean isAdmin(Long roleId) { - return roleId != null && 1L == roleId; - } + public static boolean isAdmin(Long roleId) { + return roleId != null && 1L == roleId; + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index dde679c3..09b82e99 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -3,7 +3,9 @@ package com.ruoyi.common.core.domain.entity; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.ruoyi.common.annotation.Sensitive; import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.enums.SensitiveStrategy; import com.ruoyi.common.xss.Xss; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -32,156 +34,158 @@ import java.util.List; @ApiModel("用户信息业务对象") public class SysUser extends BaseEntity { - /** - * 用户ID - */ - @ApiModelProperty(value = "用户ID") - @TableId(value = "user_id") - private Long userId; + /** + * 用户ID + */ + @ApiModelProperty(value = "用户ID") + @TableId(value = "user_id") + private Long userId; - /** - * 部门ID - */ - @ApiModelProperty(value = "部门ID") - private Long deptId; + /** + * 部门ID + */ + @ApiModelProperty(value = "部门ID") + private Long deptId; - /** - * 用户账号 - */ - @ApiModelProperty(value = "用户账号") + /** + * 用户账号 + */ + @ApiModelProperty(value = "用户账号") @Xss(message = "用户账号不能包含脚本字符") @NotBlank(message = "用户账号不能为空") - @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") - private String userName; + @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") + private String userName; - /** - * 用户昵称 - */ + /** + * 用户昵称 + */ @ApiModelProperty(value = "用户昵称") @Xss(message = "用户昵称不能包含脚本字符") @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") - private String nickName; + private String nickName; - /** - * 用户邮箱 - */ - @ApiModelProperty(value = "用户邮箱") - @Email(message = "邮箱格式不正确") - @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") - private String email; + /** + * 用户邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL) + @ApiModelProperty(value = "用户邮箱") + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + private String email; - /** - * 手机号码 - */ - @ApiModelProperty(value = "手机号码") - private String phonenumber; + /** + * 手机号码 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE) + @ApiModelProperty(value = "手机号码") + private String phonenumber; - /** - * 用户性别 - */ - @ApiModelProperty(value = "用户性别") - private String sex; + /** + * 用户性别 + */ + @ApiModelProperty(value = "用户性别") + private String sex; - /** - * 用户头像 - */ - @ApiModelProperty(value = "用户头像") - private String avatar; + /** + * 用户头像 + */ + @ApiModelProperty(value = "用户头像") + private String avatar; - /** - * 密码 - */ - @ApiModelProperty(value = "密码") - @TableField( - insertStrategy = FieldStrategy.NOT_EMPTY, - updateStrategy = FieldStrategy.NOT_EMPTY, - whereStrategy = FieldStrategy.NOT_EMPTY - ) - private String password; + /** + * 密码 + */ + @ApiModelProperty(value = "密码") + @TableField( + insertStrategy = FieldStrategy.NOT_EMPTY, + updateStrategy = FieldStrategy.NOT_EMPTY, + whereStrategy = FieldStrategy.NOT_EMPTY + ) + private String password; - @JsonIgnore - @JsonProperty - public String getPassword() { - return password; - } + @JsonIgnore + @JsonProperty + public String getPassword() { + return password; + } - /** - * 帐号状态(0正常 1停用) - */ - @ApiModelProperty(value = "帐号状态(0正常 1停用)") - private String status; + /** + * 帐号状态(0正常 1停用) + */ + @ApiModelProperty(value = "帐号状态(0正常 1停用)") + private String status; - /** - * 删除标志(0代表存在 2代表删除) - */ - @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)") - @TableLogic - private String delFlag; + /** + * 删除标志(0代表存在 2代表删除) + */ + @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)") + @TableLogic + private String delFlag; - /** - * 最后登录IP - */ - @ApiModelProperty(value = "最后登录IP") - private String loginIp; + /** + * 最后登录IP + */ + @ApiModelProperty(value = "最后登录IP") + private String loginIp; - /** - * 最后登录时间 - */ - @ApiModelProperty(value = "最后登录时间") - private Date loginDate; + /** + * 最后登录时间 + */ + @ApiModelProperty(value = "最后登录时间") + private Date loginDate; - /** - * 备注 - */ - @ApiModelProperty(value = "备注") - private String remark; + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; - /** - * 部门对象 - */ - @ApiModelProperty(value = "部门对象") - @TableField(exist = false) - private SysDept dept; + /** + * 部门对象 + */ + @ApiModelProperty(value = "部门对象") + @TableField(exist = false) + private SysDept dept; - /** - * 角色对象 - */ - @ApiModelProperty(value = "角色对象") - @TableField(exist = false) - private List roles; + /** + * 角色对象 + */ + @ApiModelProperty(value = "角色对象") + @TableField(exist = false) + private List roles; - /** - * 角色组 - */ - @ApiModelProperty(value = "角色组") - @TableField(exist = false) - private Long[] roleIds; + /** + * 角色组 + */ + @ApiModelProperty(value = "角色组") + @TableField(exist = false) + private Long[] roleIds; - /** - * 岗位组 - */ - @ApiModelProperty(value = "岗位组") - @TableField(exist = false) - private Long[] postIds; + /** + * 岗位组 + */ + @ApiModelProperty(value = "岗位组") + @TableField(exist = false) + private Long[] postIds; - /** - * 数据权限 当前角色ID - */ - @ApiModelProperty(value = "角色ID") - @TableField(exist = false) - private Long roleId; + /** + * 数据权限 当前角色ID + */ + @ApiModelProperty(value = "角色ID") + @TableField(exist = false) + private Long roleId; - public SysUser(Long userId) { - this.userId = userId; - } + public SysUser(Long userId) { + this.userId = userId; + } - @ApiModelProperty(value = "是否管理员") - public boolean isAdmin() { - return isAdmin(this.userId); - } + @ApiModelProperty(value = "是否管理员") + public boolean isAdmin() { + return isAdmin(this.userId); + } - public static boolean isAdmin(Long userId) { - return userId != null && 1L == userId; - } + public static boolean isAdmin(Long userId) { + return userId != null && 1L == userId; + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java index eace5e69..529ac619 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java @@ -1,13 +1,10 @@ package com.ruoyi.common.core.domain.model; -import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import java.util.Collection; +import java.io.Serializable; import java.util.Set; /** @@ -19,7 +16,7 @@ import java.util.Set; @Data @NoArgsConstructor @Accessors(chain = true) -public class LoginUser implements UserDetails { +public class LoginUser implements Serializable { private static final long serialVersionUID = 1L; @@ -71,12 +68,12 @@ public class LoginUser implements UserDetails { /** * 菜单权限 */ - private Set menuPermissions; + private Set menuPermission; /** * 角色权限 */ - private Set rolePermissions; + private Set rolePermission; /** * 昵称 @@ -88,60 +85,4 @@ public class LoginUser implements UserDetails { */ private String username; - /** - * 密码 - */ - private String password; - - @JsonIgnore - @Override - public String getPassword() { - return password; - } - - @Override - public String getUsername() { - return username; - } - - /** - * 账户是否未过期,过期无法验证 - */ - @JsonIgnore - @Override - public boolean isAccountNonExpired() { - return true; - } - - /** - * 指定用户是否解锁,锁定的用户无法进行身份验证 - */ - @JsonIgnore - @Override - public boolean isAccountNonLocked() { - return true; - } - - /** - * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 - */ - @JsonIgnore - @Override - public boolean isCredentialsNonExpired() { - return true; - } - - /** - * 是否可用 ,禁用的用户不能身份验证 - */ - @JsonIgnore - @Override - public boolean isEnabled() { - return true; - } - - @Override - public Collection getAuthorities() { - return null; - } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java new file mode 100644 index 00000000..de297935 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java @@ -0,0 +1,229 @@ +package com.ruoyi.common.core.mapper; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.enums.SqlMethod; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.baomidou.mybatisplus.core.toolkit.*; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import com.ruoyi.common.utils.BeanCopyUtils; +import org.apache.ibatis.binding.MapperMethod; +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 自定义 Mapper 接口, 实现 自定义扩展 + * + * @param mapper 泛型 + * @param table 泛型 + * @param vo 泛型 + * @author Lion Li + * @since 2021-05-13 + */ +@SuppressWarnings("unchecked") +public interface BaseMapperPlus extends BaseMapper { + + Log log = LogFactory.getLog(BaseMapperPlus.class); + + int DEFAULT_BATCH_SIZE = 1000; + + default Class currentVoClass() { + return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 2); + } + + default Class currentModelClass() { + return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 1); + } + + default Class currentMapperClass() { + return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 0); + } + + default List selectList() { + return this.selectList(new QueryWrapper<>()); + } + + /** + * 批量插入 + */ + default boolean insertBatch(Collection entityList) { + return insertBatch(entityList, DEFAULT_BATCH_SIZE); + } + + /** + * 批量更新 + */ + default boolean updateBatchById(Collection entityList) { + return updateBatchById(entityList, DEFAULT_BATCH_SIZE); + } + + /** + * 批量插入或更新 + */ + default boolean insertOrUpdateBatch(Collection entityList) { + return insertOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE); + } + + /** + * 批量插入(包含限制条数) + */ + default boolean insertBatch(Collection entityList, int batchSize) { + String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.INSERT_ONE); + return SqlHelper.executeBatch(this.currentModelClass(), log, entityList, batchSize, + (sqlSession, entity) -> sqlSession.insert(sqlStatement, entity)); + } + + /** + * 批量更新(包含限制条数) + */ + default boolean updateBatchById(Collection entityList, int batchSize) { + String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.UPDATE_BY_ID); + return SqlHelper.executeBatch(this.currentModelClass(), log, entityList, batchSize, + (sqlSession, entity) -> { + MapperMethod.ParamMap param = new MapperMethod.ParamMap<>(); + param.put(Constants.ENTITY, entity); + sqlSession.update(sqlStatement, param); + }); + } + + /** + * 批量插入或更新(包含限制条数) + */ + default boolean insertOrUpdateBatch(Collection entityList, int batchSize) { + TableInfo tableInfo = TableInfoHelper.getTableInfo(this.currentModelClass()); + Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!"); + String keyProperty = tableInfo.getKeyProperty(); + Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!"); + return SqlHelper.saveOrUpdateBatch(this.currentModelClass(), getClass(), log, entityList, batchSize, (sqlSession, entity) -> { + Object idVal = tableInfo.getPropertyValue(entity, keyProperty); + String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.INSERT_ONE); + return StringUtils.checkValNull(idVal) + || CollectionUtils.isEmpty(sqlSession.selectList(sqlStatement, entity)); + }, (sqlSession, entity) -> { + MapperMethod.ParamMap param = new MapperMethod.ParamMap<>(); + param.put(Constants.ENTITY, entity); + String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.UPDATE_BY_ID); + sqlSession.update(sqlStatement, param); + }); + } + + /** + * 插入或更新(包含限制条数) + */ + default boolean insertOrUpdate(T entity) { + if (null != entity) { + TableInfo tableInfo = TableInfoHelper.getTableInfo(this.currentModelClass()); + Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!"); + String keyProperty = tableInfo.getKeyProperty(); + Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!"); + Object idVal = tableInfo.getPropertyValue(entity, tableInfo.getKeyProperty()); + return StringUtils.checkValNull(idVal) || Objects.isNull(selectById((Serializable) idVal)) ? insert(entity) > 0 : updateById(entity) > 0; + } + return false; + } + + default V selectVoById(Serializable id) { + return selectVoById(id, this.currentVoClass()); + } + + /** + * 根据 ID 查询 + */ + default C selectVoById(Serializable id, Class voClass) { + T obj = this.selectById(id); + if (ObjectUtil.isNull(obj)) { + return null; + } + return BeanCopyUtils.copy(obj, voClass); + } + + default List selectVoById(Collection idList) { + return selectVoBatchIds(idList, this.currentVoClass()); + } + + /** + * 查询(根据ID 批量查询) + */ + default List selectVoBatchIds(Collection idList, Class voClass) { + List list = this.selectBatchIds(idList); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return BeanCopyUtils.copyList(list, voClass); + } + + default List selectVoByMap(Map map) { + return selectVoByMap(map, this.currentVoClass()); + } + + /** + * 查询(根据 columnMap 条件) + */ + default List selectVoByMap(Map map, Class voClass) { + List list = this.selectByMap(map); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return BeanCopyUtils.copyList(list, voClass); + } + + default V selectVoOne(Wrapper wrapper) { + return selectVoOne(wrapper, this.currentVoClass()); + } + + /** + * 根据 entity 条件,查询一条记录 + */ + default C selectVoOne(Wrapper wrapper, Class voClass) { + T obj = this.selectOne(wrapper); + if (ObjectUtil.isNull(obj)) { + return null; + } + return BeanCopyUtils.copy(obj, voClass); + } + + default List selectVoList(Wrapper wrapper) { + return selectVoList(wrapper, this.currentVoClass()); + } + + /** + * 根据 entity 条件,查询全部记录 + */ + default List selectVoList(Wrapper wrapper, Class voClass) { + List list = this.selectList(wrapper); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return BeanCopyUtils.copyList(list, voClass); + } + + default

> P selectVoPage(IPage page, Wrapper wrapper) { + return selectVoPage(page, wrapper, this.currentVoClass()); + } + + /** + * 分页查询VO + */ + default > P selectVoPage(IPage page, Wrapper wrapper, Class voClass) { + IPage pageData = this.selectPage(page, wrapper); + IPage voPage = new Page<>(pageData.getCurrent(), pageData.getSize(), pageData.getTotal()); + if (CollUtil.isEmpty(pageData.getRecords())) { + return (P) voPage; + } + voPage.setRecords(BeanCopyUtils.copyList(pageData.getRecords(), voClass)); + return (P) voPage; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/BaseMapperPlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/BaseMapperPlus.java deleted file mode 100644 index 0e50aeb5..00000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/BaseMapperPlus.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.ruoyi.common.core.mybatisplus.core; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Param; - -import java.util.Collection; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.common.utils.BeanCopyUtils; -import org.apache.ibatis.annotations.Param; - -import java.io.Serializable; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 自定义 Mapper 接口, 实现 自定义扩展 - * - * @author Lion Li - * @since 2021-05-13 - */ -public interface BaseMapperPlus extends BaseMapper { - - /** - * 单sql批量插入( 全量填充 ) - */ - int insertAll(@Param("list") Collection batchList); - - /** - * 根据 ID 查询 - */ - default V selectVoById(Serializable id, Class voClass){ - T obj = this.selectById(id); - if (ObjectUtil.isNull(obj)) { - return null; - } - return BeanCopyUtils.copy(obj, voClass); - } - - /** - * 查询(根据ID 批量查询) - */ - default List selectVoBatchIds(Collection idList, Class voClass){ - List list = this.selectBatchIds(idList); - if (CollUtil.isEmpty(list)) { - return CollUtil.newArrayList(); - } - return BeanCopyUtils.copyList(list, voClass); - } - - /** - * 查询(根据 columnMap 条件) - */ - default List selectVoByMap(Map map, Class voClass){ - List list = this.selectByMap(map); - if (CollUtil.isEmpty(list)) { - return CollUtil.newArrayList(); - } - return BeanCopyUtils.copyList(list, voClass); - } - - /** - * 根据 entity 条件,查询一条记录 - */ - default V selectVoOne(Wrapper wrapper, Class voClass) { - T obj = this.selectOne(wrapper); - if (ObjectUtil.isNull(obj)) { - return null; - } - return BeanCopyUtils.copy(obj, voClass); - } - - /** - * 根据 entity 条件,查询全部记录 - */ - default List selectVoList(Wrapper wrapper, Class voClass) { - List list = this.selectList(wrapper); - if (CollUtil.isEmpty(list)) { - return CollUtil.newArrayList(); - } - return BeanCopyUtils.copyList(list, voClass); - } - - /** - * 分页查询VO - */ - default > P selectVoPage(IPage page, Wrapper wrapper, Class voClass) { - IPage pageData = this.selectPage(page, wrapper); - IPage voPage = new Page<>(pageData.getCurrent(), pageData.getSize(), pageData.getTotal()); - if (CollUtil.isEmpty(pageData.getRecords())) { - return (P) voPage; - } - voPage.setRecords(BeanCopyUtils.copyList(pageData.getRecords(), voClass)); - return (P) voPage; - } - -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java deleted file mode 100644 index e645562a..00000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.ruoyi.common.core.mybatisplus.core; - -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.IService; -import com.ruoyi.common.core.page.PagePlus; - -import java.io.Serializable; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - -/** - * 自定义 Service 接口, 实现 数据库实体与 vo 对象转换返回 - * - * @param 数据实体类 - * @param vo类 - * @author Lion Li - */ -public interface IServicePlus extends IService { - - /** - * @param id 主键id - * @return V对象 - */ - V getVoById(Serializable id); - - /** - * @param convertor 自定义转换器 - */ - default V getVoById(Serializable id, Function convertor) { - return convertor.apply(getById(id)); - } - - /** - * @param idList id列表 - * @return V对象 - */ - List listVoByIds(Collection idList); - - /** - * @param convertor 自定义转换器 - */ - default List listVoByIds(Collection idList, - Function, List> convertor) { - List list = getBaseMapper().selectBatchIds(idList); - if (list == null) { - return null; - } - return convertor.apply(list); - } - - /** - * @param columnMap 表字段 map 对象 - * @return V对象 - */ - List listVoByMap(Map columnMap); - - /** - * @param convertor 自定义转换器 - */ - default List listVoByMap(Map columnMap, - Function, List> convertor) { - List list = getBaseMapper().selectByMap(columnMap); - if (list == null) { - return null; - } - return convertor.apply(list); - } - - /** - * @param queryWrapper 查询条件 - * @return V对象 - */ - V getVoOne(Wrapper queryWrapper); - - /** - * @param convertor 自定义转换器 - */ - default V getVoOne(Wrapper queryWrapper, Function convertor) { - return convertor.apply(getOne(queryWrapper, true)); - } - - /** - * @param queryWrapper 查询条件 - * @return V对象 - */ - List listVo(Wrapper queryWrapper); - - /** - * @param convertor 自定义转换器 - */ - default List listVo(Wrapper queryWrapper, Function, List> convertor) { - List list = getBaseMapper().selectList(queryWrapper); - if (list == null) { - return null; - } - return convertor.apply(list); - } - - default List listVo() { - return listVo(Wrappers.emptyWrapper()); - } - - /** - * @param convertor 自定义转换器 - */ - default List listVo(Function, List> convertor) { - return listVo(Wrappers.emptyWrapper(), convertor); - } - - /** - * @param page 分页对象 - * @param queryWrapper 查询条件 - * @return V对象 - * @deprecated 3.6.0 移除 请使用 {@link ServicePlusImpl#pageVo(IPage, Wrapper)} - */ - @Deprecated - PagePlus pageVo(PagePlus page, Wrapper queryWrapper); - - /** - * @param convertor 自定义转换器 - * @deprecated 3.6.0 移除 请使用 {@link ServicePlusImpl#pageVo(IPage, Wrapper)} - */ - @Deprecated - default PagePlus pageVo(PagePlus page, Wrapper queryWrapper, - Function, List> convertor) { - PagePlus result = getBaseMapper().selectPage(page, queryWrapper); - return result.setRecordsVo(convertor.apply(result.getRecords())); - } - - /** - * @deprecated 3.6.0 移除 请使用 {@link ServicePlusImpl#pageVo(IPage, Wrapper)} - */ - @Deprecated - default PagePlus pageVo(PagePlus page) { - return pageVo(page, Wrappers.emptyWrapper()); - } - - /** - * @param convertor 自定义转换器 - * @deprecated 3.6.0 移除 请使用 {@link ServicePlusImpl#pageVo(IPage, Wrapper)} - */ - @Deprecated - default PagePlus pageVo(PagePlus page, Function, List> convertor) { - return pageVo(page, Wrappers.emptyWrapper(), convertor); - } - - boolean saveAll(Collection entityList); - - boolean saveOrUpdateAll(Collection entityList); -} - diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java deleted file mode 100644 index 0650cfa9..00000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java +++ /dev/null @@ -1,226 +0,0 @@ -package com.ruoyi.common.core.mybatisplus.core; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.metadata.TableInfo; -import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; -import com.baomidou.mybatisplus.core.toolkit.Assert; -import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.ruoyi.common.core.page.PagePlus; -import com.ruoyi.common.utils.BeanCopyUtils; -import com.ruoyi.common.utils.reflect.ReflectUtils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * IServicePlus 实现类 - * - * @param Mapper类 - * @param 数据实体类 - * @param vo类 - * @author Lion Li - */ -@Slf4j -@SuppressWarnings("unchecked") -public class ServicePlusImpl, T, V> extends ServiceImpl implements IServicePlus { - - @Autowired - protected M baseMapper; - - @Override - public M getBaseMapper() { - return baseMapper; - } - - - protected Class entityClass = currentModelClass(); - - @Override - public Class getEntityClass() { - return entityClass; - } - - protected Class mapperClass = currentMapperClass(); - - protected Class voClass = currentVoClass(); - - public Class getVoClass() { - return voClass; - } - - @Override - protected Class currentMapperClass() { - return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), ServicePlusImpl.class, 0); - } - - @Override - protected Class currentModelClass() { - return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), ServicePlusImpl.class, 1); - } - - protected Class currentVoClass() { - return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), ServicePlusImpl.class, 2); - } - - /** - * 单条执行性能差 适用于列表对象内容不确定 - */ - @Override - public boolean saveBatch(Collection entityList, int batchSize) { - return super.saveBatch(entityList, batchSize); - } - - @Override - public boolean saveOrUpdate(T entity) { - return super.saveOrUpdate(entity); - } - - /** - * 单条执行性能差 适用于列表对象内容不确定 - */ - @Override - public boolean saveOrUpdateBatch(Collection entityList, int batchSize) { - return super.saveOrUpdateBatch(entityList, batchSize); - } - - @Override - public boolean updateBatchById(Collection entityList, int batchSize) { - return super.updateBatchById(entityList, batchSize); - } - - /** - * 单sql批量插入( 全量填充 无视数据库默认值 ) - * 适用于无脑插入 - */ - @Override - public boolean saveBatch(Collection entityList) { - return saveBatch(entityList, DEFAULT_BATCH_SIZE); - } - - @Override - public boolean saveOrUpdateBatch(Collection entityList) { - return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE); - } - - @Override - public boolean updateBatchById(Collection entityList) { - return updateBatchById(entityList, DEFAULT_BATCH_SIZE); - } - - /** - * 单sql批量插入( 全量填充 ) - */ - @Override - public boolean saveAll(Collection entityList) { - if (CollUtil.isEmpty(entityList)) { - return false; - } - return baseMapper.insertAll(entityList) == entityList.size(); - } - - /** - * 全量保存或更新 ( 按主键区分 ) - */ - @Override - public boolean saveOrUpdateAll(Collection entityList) { - if (CollUtil.isEmpty(entityList)) { - return false; - } - TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass); - Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!"); - String keyProperty = tableInfo.getKeyProperty(); - Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!"); - List addList = new ArrayList<>(); - List updateList = new ArrayList<>(); - int row = 0; - for (T entity : entityList) { - Object id = ReflectUtils.invokeGetter(entity, keyProperty); - if (ObjectUtil.isNull(id)) { - addList.add(entity); - } else { - updateList.add(entity); - } - } - if (CollUtil.isNotEmpty(updateList) && updateBatchById(updateList)) { - row += updateList.size(); - } - if (CollUtil.isNotEmpty(addList)) { - row += baseMapper.insertAll(addList); - } - return row == entityList.size(); - } - - /** - * 根据 ID 查询 - */ - @Override - public V getVoById(Serializable id) { - return getBaseMapper().selectVoById(id, voClass); - } - - /** - * 查询(根据ID 批量查询) - */ - @Override - public List listVoByIds(Collection idList) { - return getBaseMapper().selectVoBatchIds(idList, voClass); - } - - /** - * 查询(根据 columnMap 条件) - */ - @Override - public List listVoByMap(Map columnMap) { - return getBaseMapper().selectVoByMap(columnMap, voClass); - } - - /** - * 根据 Wrapper,查询一条记录
- *

结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

- */ - @Override - public V getVoOne(Wrapper queryWrapper) { - return getBaseMapper().selectVoOne(queryWrapper, voClass); - } - - /** - * 查询列表 - */ - @Override - public List listVo(Wrapper queryWrapper) { - return getBaseMapper().selectVoList(queryWrapper, voClass); - } - - /** - * 翻页查询 - * @deprecated 3.6.0 移除 请使用 {@link #pageVo(IPage, Wrapper)} - */ - @Override - @Deprecated - public PagePlus pageVo(PagePlus page, Wrapper queryWrapper) { - PagePlus result = getBaseMapper().selectPage(page, queryWrapper); - List volist = BeanCopyUtils.copyList(result.getRecords(), voClass); - result.setRecordsVo(volist); - return result; - } - - /** - * 翻页查询 - * - * @param page 翻页对象 - * @param queryWrapper 实体对象封装操作类 - */ - public

> P pageVo(IPage page, Wrapper queryWrapper) { - return getBaseMapper().selectVoPage(page, queryWrapper, voClass); - } - -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java deleted file mode 100644 index 403ea539..00000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/methods/InsertAll.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.ruoyi.common.core.mybatisplus.methods; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.core.injector.AbstractMethod; -import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; -import com.baomidou.mybatisplus.core.metadata.TableInfo; -import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; -import com.ruoyi.common.utils.StringUtils; -import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator; -import org.apache.ibatis.executor.keygen.KeyGenerator; -import org.apache.ibatis.executor.keygen.NoKeyGenerator; -import org.apache.ibatis.mapping.MappedStatement; -import org.apache.ibatis.mapping.SqlSource; - -import java.util.List; - -/** - * 单sql批量插入( 全量填充 ) - * - * @author Lion Li - */ -public class InsertAll extends AbstractMethod { - - private final static String[] FILL_PROPERTY = {"createTime", "createBy", "updateTime", "updateBy"}; - - @Override - public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { - final String sql = ""; - final String fieldSql = prepareFieldSql(tableInfo); - final String valueSql = prepareValuesSqlForMysqlBatch(tableInfo); - KeyGenerator keyGenerator = new NoKeyGenerator(); - String sqlMethod = "insertAll"; - String keyProperty = null; - String keyColumn = null; - // 表包含主键处理逻辑,如果不包含主键当普通字段处理 - if (StringUtils.isNotBlank(tableInfo.getKeyProperty())) { - if (tableInfo.getIdType() == IdType.AUTO) { - /** 自增主键 */ - keyGenerator = new Jdbc3KeyGenerator(); - keyProperty = tableInfo.getKeyProperty(); - keyColumn = tableInfo.getKeyColumn(); - } else { - if (null != tableInfo.getKeySequence()) { - keyGenerator = TableInfoHelper.genKeyGenerator(sqlMethod, tableInfo, builderAssistant); - keyProperty = tableInfo.getKeyProperty(); - keyColumn = tableInfo.getKeyColumn(); - } - } - } - final String sqlResult = String.format(sql, tableInfo.getTableName(), fieldSql, valueSql); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass); - return this.addInsertMappedStatement(mapperClass, modelClass, sqlMethod, sqlSource, keyGenerator, keyProperty, keyColumn); - } - - private String prepareFieldSql(TableInfo tableInfo) { - StringBuilder fieldSql = new StringBuilder(); - if (StringUtils.isNotBlank(tableInfo.getKeyColumn())) { - fieldSql.append(tableInfo.getKeyColumn()).append(","); - } - tableInfo.getFieldList().forEach(x -> fieldSql.append(x.getColumn()).append(",")); - fieldSql.delete(fieldSql.length() - 1, fieldSql.length()); - fieldSql.insert(0, "("); - fieldSql.append(")"); - return fieldSql.toString(); - } - - private String prepareValuesSqlForMysqlBatch(TableInfo tableInfo) { - final StringBuilder valueSql = new StringBuilder(); - valueSql.append(""); - if (StringUtils.isNotBlank(tableInfo.getKeyColumn())) { - valueSql.append("\n#{item.").append(tableInfo.getKeyProperty()).append("},\n"); - } - List fieldList = tableInfo.getFieldList(); - int last = fieldList.size() - 1; - for (int i = 0; i < fieldList.size(); i++) { - String property = fieldList.get(i).getProperty(); - if (!StringUtils.equalsAny(property, FILL_PROPERTY)) { - valueSql.append(""); - valueSql.append("#{item.").append(property).append("}"); - if (i != last) { - valueSql.append(","); - } - valueSql.append(""); - valueSql.append(""); - valueSql.append("DEFAULT"); - if (i != last) { - valueSql.append(","); - } - valueSql.append(""); - } else { - valueSql.append("#{item.").append(property).append("}"); - if (i != last) { - valueSql.append(","); - } - } - } - valueSql.append(""); - return valueSql.toString(); - } -} - diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java deleted file mode 100644 index bff381c4..00000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.ruoyi.common.core.page; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/** - * 分页 Page 增强对象 - * - * @param 数据库实体 - * @param vo实体 - * @author Lion Li - * @deprecated 3.6.0 删除 请使用 {@link com.ruoyi.common.core.domain.PageQuery#build()} - */ -@Data -@Accessors(chain = true) -@Deprecated -public class PagePlus implements IPage { - - /** - * domain实体列表 - */ - private List records = Collections.emptyList(); - - /** - * vo实体列表 - */ - private List recordsVo = Collections.emptyList(); - - /** - * 总数 - */ - private long total = 0L; - - /** - * 页长度 - */ - private long size = 10L; - - /** - * 当前页 - */ - private long current = 1L; - - /** - * 排序字段信息 - */ - private List orders = new ArrayList<>(); - - /** - * 自动优化 COUNT SQL - */ - private boolean optimizeCountSql = true; - - /** - * 是否进行 count 查询 - */ - private boolean isSearchCount = true; - - /** - * 是否命中count缓存 - */ - private boolean hitCount = false; - - /** - * countId - */ - private String countId; - - /** - * 最大limit - */ - private Long maxLimit; - - public PagePlus() { - } - - public PagePlus(long current, long size) { - this(current, size, 0L); - } - - public PagePlus(long current, long size, long total) { - this(current, size, total, true); - } - - public PagePlus(long current, long size, boolean isSearchCount) { - this(current, size, 0L, isSearchCount); - } - - public PagePlus(long current, long size, long total, boolean isSearchCount) { - if (current > 1L) { - this.current = current; - } - this.size = size; - this.total = total; - this.isSearchCount = isSearchCount; - } - - @Override - public String countId() { - return this.getCountId(); - } - - @Override - public Long maxLimit() { - return this.getMaxLimit(); - } - - public PagePlus addOrder(OrderItem... items) { - this.orders.addAll(Arrays.asList(items)); - return this; - } - - public PagePlus addOrder(List items) { - this.orders.addAll(items); - return this; - } - - @Override - public List orders() { - return this.getOrders(); - } - - @Override - public boolean optimizeCountSql() { - return this.optimizeCountSql; - } - - @Override - public long getPages() { - // 解决 github issues/3208 - return IPage.super.getPages(); - } - - public static PagePlus of(long current, long size) { - return of(current, size, 0); - } - - public static PagePlus of(long current, long size, long total) { - return of(current, size, total, true); - } - - public static PagePlus of(long current, long size, boolean searchCount) { - return of(current, size, 0, searchCount); - } - - public static PagePlus of(long current, long size, long total, boolean searchCount) { - return new PagePlus<>(current, size, total, searchCount); - } - -} - diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java index 46b01b94..b2537c18 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java @@ -22,42 +22,42 @@ import java.util.List; @Accessors(chain = true) @ApiModel("分页响应对象") public class TableDataInfo implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 总记录数 - */ - @ApiModelProperty("总记录数") - private long total; + /** + * 总记录数 + */ + @ApiModelProperty("总记录数") + private long total; - /** - * 列表数据 - */ - @ApiModelProperty("列表数据") - private List rows; + /** + * 列表数据 + */ + @ApiModelProperty("列表数据") + private List rows; - /** - * 消息状态码 - */ - @ApiModelProperty("消息状态码") - private int code; + /** + * 消息状态码 + */ + @ApiModelProperty("消息状态码") + private int code; - /** - * 消息内容 - */ - @ApiModelProperty("消息内容") - private String msg; + /** + * 消息内容 + */ + @ApiModelProperty("消息内容") + private String msg; - /** - * 分页 - * - * @param list 列表数据 - * @param total 总记录数 - */ - public TableDataInfo(List list, long total) { - this.rows = list; - this.total = total; - } + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, long total) { + this.rows = list; + this.total = total; + } public static TableDataInfo build(IPage page) { TableDataInfo rspData = new TableDataInfo<>(); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/SensitiveService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/SensitiveService.java new file mode 100644 index 00000000..7b27bb45 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/SensitiveService.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.core.service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +public interface SensitiveService { + + /** + * 是否脱敏 + */ + boolean isSensitive(); + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/TokenService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/TokenService.java deleted file mode 100644 index d9a9f0ac..00000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/TokenService.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.ruoyi.common.core.service; - -import com.ruoyi.common.core.domain.model.LoginUser; - -import javax.servlet.http.HttpServletRequest; - -/** - * token验证处理 - * - * @author Lion Li - */ -public interface TokenService { - - /** - * 获取用户身份信息 - * - * @return 用户信息 - */ - LoginUser getLoginUser(HttpServletRequest request); - - /** - * 设置用户身份信息 - */ - void setLoginUser(LoginUser loginUser); - - /** - * 删除用户身份信息 - */ - void delLoginUser(String token); - - /** - * 创建令牌 - * - * @param loginUser 用户信息 - * @return 令牌 - */ - String createToken(LoginUser loginUser); - - /** - * 验证令牌有效期,相差不足20分钟,自动刷新缓存 - * - * @param loginUser - * @return 令牌 - */ - void verifyToken(LoginUser loginUser); - - /** - * 刷新令牌有效期 - * - * @param loginUser 登录信息 - */ - void refreshToken(LoginUser loginUser); - - /** - * 设置用户代理信息 - * - * @param loginUser 登录信息 - */ - void setUserAgent(LoginUser loginUser); - - /** - * 从令牌中获取用户名 - * - * @param token 令牌 - * @return 用户名 - */ - String getUsernameFromToken(String token); - -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java deleted file mode 100644 index afa4e14f..00000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ruoyi.common.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 数据源 - * - * @author Lion Li - * @deprecated 3.6.0 移除 - */ -@AllArgsConstructor -@Deprecated -public enum DataSourceType { - /** - * 主库 - */ - MASTER("master"), - - /** - * 从库 - */ - SLAVE("slave"); - - @Getter - private final String source; -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java new file mode 100644 index 00000000..e6ac849d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 设备类型 + * 针对一套 用户体系 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum DeviceType { + + /** + * pc端 + */ + PC("pc"), + + /** + * app端 + */ + APP("app"); + + private final String device; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java new file mode 100644 index 00000000..f667173c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java @@ -0,0 +1,49 @@ +package com.ruoyi.common.enums; + +import cn.hutool.core.util.DesensitizedUtil; +import lombok.AllArgsConstructor; + +import java.util.function.Function; + +/** + * 脱敏策略 + * + * @author Yjoioooo + * @version 3.6.0 + */ +@AllArgsConstructor +public enum SensitiveStrategy { + + /** + * 身份证脱敏 + */ + ID_CARD(s -> DesensitizedUtil.idCardNum(s, 3, 4)), + + /** + * 手机号脱敏 + */ + PHONE(DesensitizedUtil::mobilePhone), + + /** + * 地址脱敏 + */ + ADDRESS(s -> DesensitizedUtil.address(s, 8)), + + /** + * 邮箱脱敏 + */ + EMAIL(DesensitizedUtil::email), + + /** + * 银行卡 + */ + BANK_CARD(DesensitizedUtil::bankCard); + + //可自行添加其他脱敏策略 + + private final Function desensitizer; + + public Function desensitizer() { + return desensitizer; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java new file mode 100644 index 00000000..9c3b5319 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 设备类型 + * 针对两套 用户体系 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum UserType { + + /** + * pc端 + */ + SYS_USER("sys_user:"), + + /** + * app端 + */ + APP_USER("app_user:"); + + private final String userType; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java b/ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java new file mode 100644 index 00000000..39038ab9 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java @@ -0,0 +1,45 @@ +package com.ruoyi.common.jackson; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import com.ruoyi.common.annotation.Sensitive; +import com.ruoyi.common.core.service.SensitiveService; +import com.ruoyi.common.enums.SensitiveStrategy; +import com.ruoyi.common.utils.spring.SpringUtils; + +import java.io.IOException; +import java.util.Objects; + +/** + * 数据脱敏json序列化工具 + * @author Yjoioooo + */ +public class SensitiveJsonSerializer extends JsonSerializer implements ContextualSerializer { + + private SensitiveStrategy strategy; + + @Override + public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + SensitiveService sensitiveService = SpringUtils.getBean(SensitiveService.class); + if (sensitiveService.isSensitive()){ + gen.writeString(value); + } else { + gen.writeString(strategy.desensitizer().apply(value)); + } + + } + + @Override + public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { + Sensitive annotation = property.getAnnotation(Sensitive.class); + if (Objects.nonNull(annotation)&&Objects.equals(String.class, property.getType().getRawClass())) { + this.strategy = annotation.strategy(); + return this; + } + return prov.findValueSerializer(property.getType(), property); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/properties/TokenProperties.java b/ruoyi-common/src/main/java/com/ruoyi/common/properties/TokenProperties.java deleted file mode 100644 index 927a9413..00000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/properties/TokenProperties.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.ruoyi.common.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - * token 配置属性 - * - * @author Lion Li - */ -@Data -@Component -@ConfigurationProperties(prefix = "token") -public class TokenProperties { - - /** - * 令牌自定义标识 - */ - private String header; - - /** - * 令牌秘钥 - */ - private String secret; - - /** - * 令牌有效期(默认30分钟) - */ - private int expireTime; -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java index 3309da14..8fa10f53 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java @@ -3,6 +3,7 @@ package com.ruoyi.common.utils; import cn.hutool.core.collection.CollUtil; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.utils.redis.RedisUtils; import java.util.Collection; import java.util.List; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java new file mode 100644 index 00000000..1fe939a2 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java @@ -0,0 +1,114 @@ +package com.ruoyi.common.utils; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.DeviceType; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.common.exception.UtilException; + +/** + * 登录鉴权工具 + * 为适配多端登录而封装 + * + * @author Lion Li + */ +public class LoginUtils { + + private final static String LOGIN_USER_KEY = "loginUser"; + + /** + * 登录系统 + * 针对两套用户体系 + * @param loginUser 登录用户信息 + */ + public static void login(LoginUser loginUser, UserType userType) { + StpUtil.login(userType.getUserType() + loginUser.getUserId()); + setLoginUser(loginUser); + } + + /** + * 登录系统 基于 设备类型 + * 针对一套用户体系 + * @param loginUser 登录用户信息 + */ + public static void loginByDevice(LoginUser loginUser, UserType userType, DeviceType deviceType) { + StpUtil.login(userType.getUserType() + loginUser.getUserId(), deviceType.getDevice()); + setLoginUser(loginUser); + } + + /** + * 设置用户数据 + */ + public static void setLoginUser(LoginUser loginUser) { + StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); + } + + /** + * 获取用户 + **/ + public static LoginUser getLoginUser() { + return (LoginUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY); + } + + /** + * 获取用户id + */ + public static Long getUserId() { + LoginUser loginUser = getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + String loginId = StpUtil.getLoginIdAsString(); + String userId; + String replace = ""; + if (StringUtils.contains(loginId, UserType.SYS_USER.getUserType())) { + userId = StringUtils.replace(loginId, UserType.SYS_USER.getUserType(), replace); + } else if (StringUtils.contains(loginId, UserType.APP_USER.getUserType())){ + userId = StringUtils.replace(loginId, UserType.APP_USER.getUserType(), replace); + } else { + throw new UtilException("登录用户: LoginId异常 => " + loginId); + } + return Long.parseLong(userId); + } + return loginUser.getUserId(); + } + + /** + * 获取部门ID + **/ + public static Long getDeptId() { + return getLoginUser().getDeptId(); + } + + /** + * 获取用户账户 + **/ + public static String getUsername() { + return getLoginUser().getUsername(); + } + + /** + * 获取用户账户 + **/ + public static String getNickName() { + return getLoginUser().getNickName(); + } + + /** + * 获取用户类型 + */ + public static UserType getUserType() { + String loginId = StpUtil.getLoginIdAsString(); + return getUserType(loginId); + } + + public static UserType getUserType(Object loginId) { + if (StringUtils.contains(loginId.toString(), UserType.SYS_USER.getUserType())) { + return UserType.SYS_USER; + } else if (StringUtils.contains(loginId.toString(), UserType.APP_USER.getUserType())){ + return UserType.APP_USER; + } else { + throw new UtilException("登录用户: LoginId异常 => " + loginId); + } + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java deleted file mode 100644 index 5042de40..00000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.ruoyi.common.utils; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.http.HttpStatus; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.page.PagePlus; -import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.utils.sql.SqlUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * 分页工具 - * - * @author Lion Li - * @deprecated 3.6.0 删除 请使用 {@link PageQuery} 与 {@link TableDataInfo} - */ -@Deprecated -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class PageUtils { - - /** - * 当前记录起始索引 - */ - @Deprecated - public static final String PAGE_NUM = "pageNum"; - - /** - * 每页显示记录数 - */ - @Deprecated - public static final String PAGE_SIZE = "pageSize"; - - /** - * 排序列 - */ - @Deprecated - public static final String ORDER_BY_COLUMN = "orderByColumn"; - - /** - * 排序的方向 "desc" 或者 "asc". - */ - @Deprecated - public static final String IS_ASC = "isAsc"; - - /** - * 当前记录起始索引 默认值 - */ - @Deprecated - public static final int DEFAULT_PAGE_NUM = 1; - - /** - * 每页显示记录数 默认值 默认查全部 - */ - @Deprecated - public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; - - /** - * 构建 plus 分页对象 - * - * @param domain 实体 - * @param vo 实体 - * @return 分页对象 - * @deprecated 3.6.0 删除 请使用 {@link PageQuery#build()} - * 由于使用 Servlet 获取只能从 param 获取 灵活性降低 故将传参操作交给用户 - */ - @Deprecated - public static PagePlus buildPagePlus() { - Integer pageNum = ServletUtils.getParameterToInt(PAGE_NUM, DEFAULT_PAGE_NUM); - Integer pageSize = ServletUtils.getParameterToInt(PAGE_SIZE, DEFAULT_PAGE_SIZE); - String orderByColumn = ServletUtils.getParameter(ORDER_BY_COLUMN); - String isAsc = ServletUtils.getParameter(IS_ASC); - if (pageNum <= 0) { - pageNum = DEFAULT_PAGE_NUM; - } - PagePlus page = new PagePlus<>(pageNum, pageSize); - OrderItem orderItem = buildOrderItem(orderByColumn, isAsc); - if (ObjectUtil.isNotNull(orderItem)) { - page.addOrder(orderItem); - } - return page; - } - - @Deprecated - public static Page buildPage() { - return buildPage(null, null); - } - - /** - * 构建 MP 普通分页对象 - * - * @param domain 实体 - * @return 分页对象 - * @deprecated 3.6.0 删除 请使用 {@link PageQuery#build()} - * 由于使用 Servlet 获取只能从 param 获取 灵活性降低 故将传参操作交给用户 - */ - @Deprecated - public static Page buildPage(String defaultOrderByColumn, String defaultIsAsc) { - Integer pageNum = ServletUtils.getParameterToInt(PAGE_NUM, DEFAULT_PAGE_NUM); - Integer pageSize = ServletUtils.getParameterToInt(PAGE_SIZE, DEFAULT_PAGE_SIZE); - String orderByColumn = ServletUtils.getParameter(ORDER_BY_COLUMN, defaultOrderByColumn); - String isAsc = ServletUtils.getParameter(IS_ASC, defaultIsAsc); - if (pageNum <= 0) { - pageNum = DEFAULT_PAGE_NUM; - } - Page page = new Page<>(pageNum, pageSize); - OrderItem orderItem = buildOrderItem(orderByColumn, isAsc); - if (ObjectUtil.isNotNull(orderItem)) { - page.addOrder(orderItem); - } - return page; - } - - private static OrderItem buildOrderItem(String orderByColumn, String isAsc) { - // 兼容前端排序类型 - if ("ascending".equals(isAsc)) { - isAsc = "asc"; - } else if ("descending".equals(isAsc)) { - isAsc = "desc"; - } - if (StringUtils.isNotBlank(orderByColumn)) { - String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); - orderBy = StringUtils.toUnderScoreCase(orderBy); - if ("asc".equals(isAsc)) { - return OrderItem.asc(orderBy); - } else if ("desc".equals(isAsc)) { - return OrderItem.desc(orderBy); - } - } - return null; - } - - /** - * 构建 MP 普通分页对象 - * - * @param domain 实体 - * @return 分页对象 - * @deprecated 3.6.0 删除 请使用 {@link PageQuery#build()} - * 由于使用 Servlet 获取只能从 param 获取 灵活性降低 故将传参操作交给用户 - */ - @Deprecated - public static TableDataInfo buildDataInfo(PagePlus page) { - TableDataInfo rspData = new TableDataInfo<>(); - rspData.setCode(HttpStatus.HTTP_OK); - rspData.setMsg("查询成功"); - rspData.setRows(page.getRecordsVo()); - rspData.setTotal(page.getTotal()); - return rspData; - } - - /** - * @deprecated 3.6.0 删除 请使用 {@link TableDataInfo#build(IPage)} - */ - @Deprecated - public static TableDataInfo buildDataInfo(Page page) { - TableDataInfo rspData = new TableDataInfo<>(); - rspData.setCode(HttpStatus.HTTP_OK); - rspData.setMsg("查询成功"); - rspData.setRows(page.getRecords()); - rspData.setTotal(page.getTotal()); - return rspData; - } - - /** - * @deprecated 3.6.0 删除 请使用 {@link TableDataInfo#build(List)} - */ - @Deprecated - public static TableDataInfo buildDataInfo(List list) { - TableDataInfo rspData = new TableDataInfo<>(); - rspData.setCode(HttpStatus.HTTP_OK); - rspData.setMsg("查询成功"); - rspData.setRows(list); - rspData.setTotal(list.size()); - return rspData; - } - - /** - * @deprecated 3.6.0 删除 请使用 {@link TableDataInfo#build()} - */ - @Deprecated - public static TableDataInfo buildDataInfo() { - TableDataInfo rspData = new TableDataInfo<>(); - rspData.setCode(HttpStatus.HTTP_OK); - rspData.setMsg("查询成功"); - return rspData; - } - -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java index 86fbbc90..72c9453c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java @@ -1,84 +1,17 @@ package com.ruoyi.common.utils; -import cn.hutool.http.HttpStatus; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.exception.ServiceException; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** * 安全服务工具类 * - * @author ruoyi + * @author Long Li */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class SecurityUtils { - /** - * 用户ID - **/ - public static Long getUserId() { - try { - return getLoginUser().getUserId(); - } catch (Exception e) { - throw new ServiceException("获取用户ID异常", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 获取部门ID - **/ - public static Long getDeptId() { - try { - return getLoginUser().getDeptId(); - } catch (Exception e) { - throw new ServiceException("获取部门ID异常", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 获取用户昵称 - **/ - public static String getNickName() { - try { - return getLoginUser().getNickName(); - } catch (Exception e) { - throw new ServiceException("获取用户账户异常", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 获取用户账户 - **/ - public static String getUsername() { - try { - return getLoginUser().getUsername(); - } catch (Exception e) { - throw new ServiceException("获取用户账户异常", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 获取用户 - **/ - public static LoginUser getLoginUser() { - try { - return (LoginUser) getAuthentication().getPrincipal(); - } catch (Exception e) { - throw new ServiceException("获取用户信息异常", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 获取Authentication - */ - public static Authentication getAuthentication() { - return SecurityContextHolder.getContext().getAuthentication(); - } - /** * 生成BCryptPasswordEncoder密码 * diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index f96c1e5a..0b1d3f41 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -5,10 +5,10 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.springframework.util.AntPathMatcher; import java.util.*; @@ -20,338 +20,339 @@ import java.util.*; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class StringUtils extends org.apache.commons.lang3.StringUtils { - /** - * 获取参数不为空值 - * - * @param value defaultValue 要判断的value - * @return value 返回值 - */ - public static T nvl(T value, T defaultValue) { - return ObjectUtil.defaultIfNull(value, defaultValue); - } + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) { + return ObjectUtil.defaultIfNull(value, defaultValue); + } - /** - * 获取参数不为空值 - * - * @param str defaultValue 要判断的value - * @return value 返回值 - */ - public static String blankToDefault(String str, String defaultValue) { - return StrUtil.blankToDefault(str, defaultValue); - } + /** + * 获取参数不为空值 + * + * @param str defaultValue 要判断的value + * @return value 返回值 + */ + public static String blankToDefault(String str, String defaultValue) { + return StrUtil.blankToDefault(str, defaultValue); + } - /** - * * 判断一个Collection是否为空, 包含List,Set,Queue - * - * @param coll 要判断的Collection - * @return true:为空 false:非空 - */ - public static boolean isEmpty(Collection coll) { - return CollUtil.isEmpty(coll); - } + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) { + return CollUtil.isEmpty(coll); + } - /** - * * 判断一个Collection是否非空,包含List,Set,Queue - * - * @param coll 要判断的Collection - * @return true:非空 false:空 - */ - public static boolean isNotEmpty(Collection coll) { - return !isEmpty(coll); - } + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) { + return !isEmpty(coll); + } - /** - * * 判断一个对象数组是否为空 - * - * @param objects 要判断的对象数组 - * * @return true:为空 false:非空 - */ - public static boolean isEmpty(Object[] objects) { - return ArrayUtil.isEmpty(objects); - } + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + * * @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) { + return ArrayUtil.isEmpty(objects); + } - /** - * * 判断一个对象数组是否非空 - * - * @param objects 要判断的对象数组 - * @return true:非空 false:空 - */ - public static boolean isNotEmpty(Object[] objects) { - return !isEmpty(objects); - } + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) { + return !isEmpty(objects); + } - /** - * * 判断一个对象是否为空 - * - * @param object 要判断的对象数组 - * * @return true:为空 false:非空 - */ - public static boolean isEmpty(Object object) { - return ObjectUtil.isEmpty(object); - } + /** + * * 判断一个对象是否为空 + * + * @param object 要判断的对象数组 + * * @return true:为空 false:非空 + */ + public static boolean isEmpty(Object object) { + return ObjectUtil.isEmpty(object); + } - /** - * * 判断一个对象是否非空 - * - * @param object 要判断的对象数组 - * @return true:非空 false:空 - */ - public static boolean isNotEmpty(Object object) { - return !isEmpty(object); - } + /** + * * 判断一个对象是否非空 + * + * @param object 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object object) { + return !isEmpty(object); + } - /** - * * 判断一个Map是否为空 - * - * @param map 要判断的Map - * @return true:为空 false:非空 - */ - public static boolean isEmpty(Map map) { - return MapUtil.isEmpty(map); - } + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) { + return MapUtil.isEmpty(map); + } - /** - * * 判断一个Map是否为空 - * - * @param map 要判断的Map - * @return true:非空 false:空 - */ - public static boolean isNotEmpty(Map map) { - return !isEmpty(map); - } + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) { + return !isEmpty(map); + } - /** - * * 判断一个字符串是否为空串 - * - * @param str String - * @return true:为空 false:非空 - */ - public static boolean isEmpty(String str) { - return StrUtil.isEmpty(str); - } + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) { + return StrUtil.isEmpty(str); + } - /** - * * 判断一个字符串是否为非空串 - * - * @param str String - * @return true:非空串 false:空串 - */ - public static boolean isNotEmpty(String str) { - return !isEmpty(str); - } + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } - /** - * * 判断一个对象是否为空 - * - * @param object Object - * @return true:为空 false:非空 - */ - public static boolean isNull(Object object) { - return ObjectUtil.isNull(object); - } + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return ObjectUtil.isNull(object); + } - /** - * * 判断一个对象是否非空 - * - * @param object Object - * @return true:非空 false:空 - */ - public static boolean isNotNull(Object object) { - return !isNull(object); - } + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) { + return !isNull(object); + } - /** - * * 判断一个对象是否是数组类型(Java基本型别的数组) - * - * @param object 对象 - * @return true:是数组 false:不是数组 - */ - public static boolean isArray(Object object) { - return ArrayUtil.isArray(object); - } + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) { + return ArrayUtil.isArray(object); + } - /** - * 去空格 - */ - public static String trim(String str) { - return StrUtil.trim(str); - } + /** + * 去空格 + */ + public static String trim(String str) { + return StrUtil.trim(str); + } - /** - * 截取字符串 - * - * @param str 字符串 - * @param start 开始 - * @return 结果 - */ - public static String substring(final String str, int start) { - return substring(str, start, str.length()); - } + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + return substring(str, start, str.length()); + } - /** - * 截取字符串 - * - * @param str 字符串 - * @param start 开始 - * @param end 结束 - * @return 结果 - */ - public static String substring(final String str, int start, int end) { - return StrUtil.sub(str, start, end); - } + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + return StrUtil.sub(str, start, end); + } - /** - * 格式化文本, {} 表示占位符
- * 此方法只是简单将占位符 {} 按照顺序替换为参数
- * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
- * 例:
- * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
- * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
- * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
- * - * @param template 文本模板,被替换的部分用 {} 表示 - * @param params 参数值 - * @return 格式化后的文本 - */ - public static String format(String template, Object... params) { - return StrUtil.format(template, params); - } + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) { + return StrUtil.format(template, params); + } - /** - * 是否为http(s)://开头 - * - * @param link 链接 - * @return 结果 - */ - public static boolean ishttp(String link) { - return Validator.isUrl(link); - } + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) { + return Validator.isUrl(link); + } - /** - * 字符串转set - * - * @param str 字符串 - * @param sep 分隔符 - * @return set集合 - */ - public static Set str2Set(String str, String sep) { - return new HashSet<>(str2List(str, sep, true, false)); - } + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static Set str2Set(String str, String sep) { + return new HashSet<>(str2List(str, sep, true, false)); + } - /** - * 字符串转list - * - * @param str 字符串 - * @param sep 分隔符 - * @param filterBlank 过滤纯空白 - * @param trim 去掉首尾空白 - * @return list集合 - */ - public static List str2List(String str, String sep, boolean filterBlank, boolean trim) { - List list = new ArrayList<>(); - if (isEmpty(str)) { - return list; - } + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static List str2List(String str, String sep, boolean filterBlank, boolean trim) { + List list = new ArrayList<>(); + if (isEmpty(str)) { + return list; + } - // 过滤空白字符串 - if (filterBlank && isBlank(str)) { - return list; - } - String[] split = str.split(sep); - for (String string : split) { - if (filterBlank && isBlank(string)) { - continue; - } - if (trim) { - string = trim(string); - } - list.add(string); - } + // 过滤空白字符串 + if (filterBlank && isBlank(str)) { + return list; + } + String[] split = str.split(sep); + for (String string : split) { + if (filterBlank && isBlank(string)) { + continue; + } + if (trim) { + string = trim(string); + } + list.add(string); + } - return list; - } + return list; + } - /** - * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 - * - * @param cs 指定字符串 - * @param searchCharSequences 需要检查的字符串数组 - * @return 是否包含任意一个字符串 - */ - public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { - return StrUtil.containsAnyIgnoreCase(cs, searchCharSequences); - } + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { + return StrUtil.containsAnyIgnoreCase(cs, searchCharSequences); + } - /** - * 驼峰转下划线命名 - */ - public static String toUnderScoreCase(String str) { - return StrUtil.toUnderlineCase(str); - } + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) { + return StrUtil.toUnderlineCase(str); + } - /** - * 是否包含字符串 - * - * @param str 验证字符串 - * @param strs 字符串组 - * @return 包含返回true - */ - public static boolean inStringIgnoreCase(String str, String... strs) { - return StrUtil.equalsAnyIgnoreCase(str, strs); - } + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) { + return StrUtil.equalsAnyIgnoreCase(str, strs); + } - /** - * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld - * - * @param name 转换前的下划线大写方式命名的字符串 - * @return 转换后的驼峰式命名的字符串 - */ - public static String convertToCamelCase(String name) { - return StrUtil.upperFirst(StrUtil.toCamelCase(name)); - } + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + return StrUtil.upperFirst(StrUtil.toCamelCase(name)); + } - /** - * 驼峰式命名法 例如:user_name->userName - */ - public static String toCamelCase(String s) { - return StrUtil.toCamelCase(s); - } + /** + * 驼峰式命名法 例如:user_name->userName + */ + public static String toCamelCase(String s) { + return StrUtil.toCamelCase(s); + } - /** - * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 - * - * @param str 指定字符串 - * @param strs 需要检查的字符串数组 - * @return 是否匹配 - */ - public static boolean matches(String str, List strs) { - if (isEmpty(str) || isEmpty(strs)) { - return false; - } - for (String pattern : strs) { - if (isMatch(pattern, str)) { - return true; - } - } - return false; - } + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) { + return true; + } + } + return false; + } - /** - * 判断url是否与规则配置: - * ? 表示单个字符; - * * 表示一层路径内的任意字符串,不可跨层级; - * ** 表示任意层路径; - * - * @param pattern 匹配规则 - * @param url 需要匹配的url - * @return - */ - public static boolean isMatch(String pattern, String url) { - return ReUtil.isMatch(pattern, url); - } + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } - @SuppressWarnings("unchecked") - public static T cast(Object obj) { - return (T) obj; - } + @SuppressWarnings("unchecked") + public static T cast(Object obj) { + return (T) obj; + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java index 522b989b..1fe2eaf6 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java @@ -17,9 +17,9 @@ import java.util.Set; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ValidatorUtils { - private static final Validator VALID = SpringUtils.getBean(Validator.class); + private static final Validator VALID = SpringUtils.getBean(Validator.class); - public static void validate(T object, Class... groups) { + public static void validate(T object, Class... groups) { Set> validate = VALID.validate(object, groups); if (!validate.isEmpty()) { throw new ConstraintViolationException("参数校验异常", validate); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java new file mode 100644 index 00000000..7850e016 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java @@ -0,0 +1,222 @@ +package com.ruoyi.common.utils.redis; + +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.redisson.api.*; + +import java.util.Comparator; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; + +/** + * 分布式队列工具 + * 轻量级队列 重量级数据量 请使用 MQ + * 要求 redis 5.X 以上 + * + * @author Lion Li + * @version 3.6.0 新增 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class QueueUtils { + + private static final RedissonClient CLIENT = SpringUtils.getBean(RedissonClient.class); + + + /** + * 获取客户端实例 + */ + public static RedissonClient getClient() { + return CLIENT; + } + + /** + * 添加延迟队列数据 默认毫秒 + * + * @param queueName 队列名 + * @param data 数据 + * @param time 延迟时间 + */ + public static void addDelayedQueueObject(String queueName, T data, long time) { + addDelayedQueueObject(queueName, data, time, TimeUnit.MILLISECONDS); + } + + /** + * 添加延迟队列数据 + * + * @param queueName 队列名 + * @param data 数据 + * @param time 延迟时间 + * @param timeUnit 单位 + */ + public static void addDelayedQueueObject(String queueName, T data, long time, TimeUnit timeUnit) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + delayedQueue.offer(data, time, timeUnit); + } + + /** + * 获取一个延迟队列数据 没有数据返回 null + * + * @param queueName 队列名 + */ + public static T getDelayedQueueObject(String queueName) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + return delayedQueue.poll(); + } + + /** + * 删除延迟队列数据 + */ + public static boolean removeDelayedQueueObject(String queueName, T data) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + return delayedQueue.remove(data); + } + + /** + * 销毁延迟队列 所有阻塞监听 报错 + */ + public static void destroyDelayedQueue(String queueName) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + delayedQueue.destroy(); + } + + /** + * 尝试设置 优先队列比较器 用于排序优先级 + * + * @param queueName 队列名 + * @param comparator 比较器 + */ + public static boolean trySetPriorityQueueComparator(String queueName, Comparator comparator) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + return priorityBlockingQueue.trySetComparator(comparator); + } + + /** + * 尝试设置 优先队列比较器 用于排序优先级 + * + * @param queueName 队列名 + * @param comparator 比较器 + * @param destroy 已存在是否销毁 + */ + public static boolean trySetPriorityQueueComparator(String queueName, Comparator comparator, boolean destroy) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + if (priorityBlockingQueue.isExists() && destroy) { + destroyPriorityQueueObject(queueName); + } + return priorityBlockingQueue.trySetComparator(comparator); + } + + /** + * 添加优先队列数据 + * + * @param queueName 队列名 + * @param data 数据 + */ + public static boolean addPriorityQueueObject(String queueName, T data) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + return priorityBlockingQueue.offer(data); + } + + /** + * 获取一个优先队列数据 没有数据返回 null + * + * @param queueName 队列名 + */ + public static T getPriorityQueueObject(String queueName) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + return priorityBlockingQueue.poll(); + } + + /** + * 删除优先队列数据 + */ + public static boolean removePriorityQueueObject(String queueName, T data) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + return priorityBlockingQueue.remove(data); + } + + /** + * 销毁优先队列 + */ + public static boolean destroyPriorityQueueObject(String queueName) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + return priorityBlockingQueue.delete(); + } + + /** + * 尝试设置 有界队列 容量 用于限制数量 + * + * @param queueName 队列名 + * @param capacity 容量 + */ + public static boolean trySetBoundedQueueCapacity(String queueName, int capacity) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.trySetCapacity(capacity); + } + + /** + * 尝试设置 有界队列 容量 用于限制数量 + * + * @param queueName 队列名 + * @param capacity 容量 + * @param destroy 已存在是否销毁 + */ + public static boolean trySetBoundedQueueCapacity(String queueName, int capacity, boolean destroy) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + if (boundedBlockingQueue.isExists() && destroy) { + destroyBoundedQueueObject(queueName); + } + return boundedBlockingQueue.trySetCapacity(capacity); + } + + /** + * 添加有界队列数据 + * + * @param queueName 队列名 + * @param data 数据 + * @return 添加成功 true 已达到界限 false + */ + public static boolean addBoundedQueueObject(String queueName, T data) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.offer(data); + } + + /** + * 获取一个有界队列数据 没有数据返回 null + * + * @param queueName 队列名 + */ + public static T getBoundedQueueObject(String queueName) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.poll(); + } + + /** + * 删除有界队列数据 + */ + public static boolean removeBoundedQueueObject(String queueName, T data) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.remove(data); + } + + /** + * 销毁有界队列 + */ + public static boolean destroyBoundedQueueObject(String queueName) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.delete(); + } + + /** + * 订阅阻塞队列(可订阅所有实现类 例如: 延迟 优先 有界 等) + */ + public static void subscribeBlockingQueue(String queueName, Consumer consumer) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + queue.subscribeOnElements(consumer); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java similarity index 97% rename from ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java rename to ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java index 0ccbe0fa..49ec4ed3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java @@ -1,4 +1,4 @@ -package com.ruoyi.common.utils; +package com.ruoyi.common.utils.redis; import cn.hutool.core.collection.IterUtil; import com.ruoyi.common.utils.spring.SpringUtils; @@ -376,4 +376,14 @@ public class RedisUtils { Iterable iterable = CLIENT.getKeys().getKeysByPattern(pattern); return IterUtil.toList(iterable); } + + /** + * 检查redis中是否存在key + * + * @param key 键 + */ + public static Boolean hasKey(String key) { + RKeys rKeys = CLIENT.getKeys(); + return rKeys.countExists(key) > 0; + } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java index abdb0531..8a648a55 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java @@ -1,7 +1,7 @@ package com.ruoyi.demo.controller; import com.ruoyi.common.core.domain.R; -import com.ruoyi.common.utils.RedisUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java index 39edbdd4..8c6639a1 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java @@ -1,7 +1,7 @@ package com.ruoyi.demo.controller; import com.ruoyi.common.core.domain.R; -import com.ruoyi.common.utils.RedisUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java index 1e17d358..0c3227b3 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.R; import com.ruoyi.demo.domain.TestDemo; -import com.ruoyi.demo.service.ITestDemoService; +import com.ruoyi.demo.mapper.TestDemoMapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -29,7 +29,10 @@ import java.util.List; @RequestMapping("/demo/batch") public class TestBatchController extends BaseController { - private final ITestDemoService iTestDemoService; + /** + * 为了便于测试 直接引入mapper + */ + private final TestDemoMapper testDemoMapper; /** * 新增批量方法 可完美替代 saveBatch 秒级插入上万数据 (对mysql负荷较大) @@ -38,13 +41,13 @@ public class TestBatchController extends BaseController { */ @ApiOperation(value = "新增批量方法") @PostMapping("/add") -// @DS("slave") +// @DS("slave") public R add() { List list = new ArrayList<>(); for (int i = 0; i < 1000; i++) { list.add(new TestDemo().setOrderNum(-1L).setTestKey("批量新增").setValue("测试新增")); } - return toAjax(iTestDemoService.saveAll(list) ? 1 : 0); + return toAjax(testDemoMapper.insertBatch(list) ? 1 : 0); } /** @@ -54,13 +57,13 @@ public class TestBatchController extends BaseController { */ @ApiOperation(value = "新增或更新批量方法") @PostMapping("/addOrUpdate") -// @DS("slave") +// @DS("slave") public R addOrUpdate() { List list = new ArrayList<>(); for (int i = 0; i < 1000; i++) { list.add(new TestDemo().setOrderNum(-1L).setTestKey("批量新增").setValue("测试新增")); } - iTestDemoService.saveAll(list); + testDemoMapper.insertBatch(list); for (int i = 0; i < list.size(); i++) { TestDemo testDemo = list.get(i); testDemo.setTestKey("批量新增或修改").setValue("批量新增或修改"); @@ -68,7 +71,7 @@ public class TestBatchController extends BaseController { testDemo.setId(null); } } - return toAjax(iTestDemoService.saveOrUpdateAll(list) ? 1 : 0); + return toAjax(testDemoMapper.insertOrUpdateBatch(list) ? 1 : 0); } /** @@ -76,10 +79,10 @@ public class TestBatchController extends BaseController { */ @ApiOperation(value = "删除批量方法") @DeleteMapping() -// @DS("slave") +// @DS("slave") public R remove() { - return toAjax(iTestDemoService.remove(new LambdaQueryWrapper() - .eq(TestDemo::getOrderNum, -1L)) ? 1 : 0); + return toAjax(testDemoMapper.delete(new LambdaQueryWrapper() + .eq(TestDemo::getOrderNum, -1L))); } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java index d95e4ccc..f2811605 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java @@ -1,5 +1,6 @@ package com.ruoyi.demo.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.bean.BeanUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; @@ -22,7 +23,6 @@ import com.ruoyi.demo.service.ITestDemoService; import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -53,7 +53,7 @@ public class TestDemoController extends BaseController { * 查询测试单表列表 */ @ApiOperation("查询测试单表列表") - @PreAuthorize("@ss.hasPermi('demo:demo:list')") + @SaCheckPermission("demo:demo:list") @GetMapping("/list") public TableDataInfo list(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { return iTestDemoService.queryPageList(bo, pageQuery); @@ -63,7 +63,7 @@ public class TestDemoController extends BaseController { * 自定义分页查询 */ @ApiOperation("自定义分页查询") - @PreAuthorize("@ss.hasPermi('demo:demo:list')") + @SaCheckPermission("demo:demo:list") @GetMapping("/page") public TableDataInfo page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { return iTestDemoService.customPageList(bo, pageQuery); @@ -74,13 +74,13 @@ public class TestDemoController extends BaseController { @ApiImplicitParam(name = "file", value = "导入文件", dataType = "java.io.File", required = true), }) @Log(title = "测试单表", businessType = BusinessType.IMPORT) - @PreAuthorize("@ss.hasPermi('demo:demo:import')") + @SaCheckPermission("demo:demo:import") @PostMapping("/importData") public R importData(@RequestPart("file") MultipartFile file) throws Exception { ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true); List volist = excelResult.getList(); List list = BeanUtil.copyToList(volist, TestDemo.class); - iTestDemoService.saveAll(list); + iTestDemoService.saveBatch(list); return R.success(excelResult.getAnalysis()); } @@ -88,15 +88,15 @@ public class TestDemoController extends BaseController { * 导出测试单表列表 */ @ApiOperation("导出测试单表列表") - @PreAuthorize("@ss.hasPermi('demo:demo:export')") + @SaCheckPermission("demo:demo:export") @Log(title = "测试单表", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(@Validated TestDemoBo bo, HttpServletResponse response) { List list = iTestDemoService.queryList(bo); // 测试雪花id导出 // for (TestDemoVo vo : list) { -// vo.setId(1234567891234567893L); -// } +// vo.setId(1234567891234567893L); +// } ExcelUtil.exportExcel(list, "测试单表", TestDemoVo.class, response); } @@ -104,7 +104,7 @@ public class TestDemoController extends BaseController { * 获取测试单表详细信息 */ @ApiOperation("获取测试单表详细信息") - @PreAuthorize("@ss.hasPermi('demo:demo:query')") + @SaCheckPermission("demo:demo:query") @GetMapping("/{id}") public R getInfo(@ApiParam("测试ID") @NotNull(message = "主键不能为空") @@ -116,7 +116,7 @@ public class TestDemoController extends BaseController { * 新增测试单表 */ @ApiOperation("新增测试单表") - @PreAuthorize("@ss.hasPermi('demo:demo:add')") + @SaCheckPermission("demo:demo:add") @Log(title = "测试单表", businessType = BusinessType.INSERT) @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "不允许重复提交") @PostMapping() @@ -131,7 +131,7 @@ public class TestDemoController extends BaseController { * 修改测试单表 */ @ApiOperation("修改测试单表") - @PreAuthorize("@ss.hasPermi('demo:demo:edit')") + @SaCheckPermission("demo:demo:edit") @Log(title = "测试单表", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping() @@ -143,8 +143,8 @@ public class TestDemoController extends BaseController { * 删除测试单表 */ @ApiOperation("删除测试单表") - @PreAuthorize("@ss.hasPermi('demo:demo:remove')") - @Log(title = "测试单表", businessType = BusinessType.DELETE) + @SaCheckPermission("demo:demo:remove") + @Log(title = "测试单表" , businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@ApiParam("测试ID串") @NotEmpty(message = "主键不能为空") diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java index 820ee2d7..8ee83eeb 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java @@ -27,22 +27,22 @@ import javax.validation.constraints.NotNull; @RequestMapping("/demo/i18n") public class TestI18nController { - /** - * 通过code获取国际化内容 - * code为 messages.properties 中的 key - * - * 测试使用 user.register.success - */ - @ApiOperation("通过code获取国际化内容") - @GetMapping() - public R get(@ApiParam("国际化code") String code) { - return R.success(MessageUtils.message(code)); - } + /** + * 通过code获取国际化内容 + * code为 messages.properties 中的 key + *

+ * 测试使用 user.register.success + */ + @ApiOperation("通过code获取国际化内容") + @GetMapping() + public R get(@ApiParam("国际化code") String code) { + return R.success(MessageUtils.message(code)); + } /** * Validator 校验国际化 * 不传值 分别查看异常返回 - * + *

* 测试使用 not.null */ @ApiOperation("Validator 校验国际化") @@ -54,7 +54,7 @@ public class TestI18nController { /** * Bean 校验国际化 * 不传值 分别查看异常返回 - * + *

* 测试使用 not.null */ @ApiOperation("Bean 校验国际化") diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java new file mode 100644 index 00000000..f61a9688 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java @@ -0,0 +1,81 @@ +package com.ruoyi.demo.controller; + +import com.ruoyi.common.annotation.Sensitive; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.enums.SensitiveStrategy; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 测试数据脱敏控制器 + * + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @see com.ruoyi.common.core.service.SensitiveService + * @author Lion Li + * @version 3.6.0 + */ +@Api(value = "测试数据脱敏控制器", tags = {"测试数据脱敏管理"}) +@RestController +@RequestMapping("/demo/sensitive") +public class TestSensitiveController extends BaseController { + + /** + * 测试数据脱敏 + */ + @ApiOperation("查询测试单表列表") + @GetMapping("/test") + public R test() { + TestSensitive testSensitive = new TestSensitive() + .setIdCard("210397198608215431") + .setPhone("17640125371") + .setAddress("北京市朝阳区某某四合院1203室") + .setEmail("17640125371@163.com") + .setBankCard("6226456952351452853"); + return R.success(testSensitive); + } + + @Data + @Accessors(chain = true) + static class TestSensitive { + + /** + * 身份证 + */ + @Sensitive(strategy = SensitiveStrategy.ID_CARD) + private String idCard; + + /** + * 电话 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phone; + + /** + * 地址 + */ + @Sensitive(strategy = SensitiveStrategy.ADDRESS) + private String address; + + /** + * 邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL) + private String email; + + /** + * 银行卡 + */ + @Sensitive(strategy = SensitiveStrategy.BANK_CARD) + private String bankCard; + + } + +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java index b7a15cb9..2c50a78c 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java @@ -1,5 +1,6 @@ package com.ruoyi.demo.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; @@ -17,7 +18,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -46,7 +46,7 @@ public class TestTreeController extends BaseController { * 查询测试树表列表 */ @ApiOperation("查询测试树表列表") - @PreAuthorize("@ss.hasPermi('demo:tree:list')") + @SaCheckPermission("demo:tree:list") @GetMapping("/list") public R> list(@Validated(QueryGroup.class) TestTreeBo bo) { List list = iTestTreeService.queryList(bo); @@ -57,7 +57,7 @@ public class TestTreeController extends BaseController { * 导出测试树表列表 */ @ApiOperation("导出测试树表列表") - @PreAuthorize("@ss.hasPermi('demo:tree:export')") + @SaCheckPermission("demo:tree:export") @Log(title = "测试树表", businessType = BusinessType.EXPORT) @GetMapping("/export") public void export(@Validated TestTreeBo bo, HttpServletResponse response) { @@ -69,7 +69,7 @@ public class TestTreeController extends BaseController { * 获取测试树表详细信息 */ @ApiOperation("获取测试树表详细信息") - @PreAuthorize("@ss.hasPermi('demo:tree:query')") + @SaCheckPermission("demo:tree:query") @GetMapping("/{id}") public R getInfo(@ApiParam("测试树ID") @NotNull(message = "主键不能为空") @@ -81,7 +81,7 @@ public class TestTreeController extends BaseController { * 新增测试树表 */ @ApiOperation("新增测试树表") - @PreAuthorize("@ss.hasPermi('demo:tree:add')") + @SaCheckPermission("demo:tree:add") @Log(title = "测试树表", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping() @@ -93,7 +93,7 @@ public class TestTreeController extends BaseController { * 修改测试树表 */ @ApiOperation("修改测试树表") - @PreAuthorize("@ss.hasPermi('demo:tree:edit')") + @SaCheckPermission("demo:tree:edit") @Log(title = "测试树表", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping() @@ -105,8 +105,8 @@ public class TestTreeController extends BaseController { * 删除测试树表 */ @ApiOperation("删除测试树表") - @PreAuthorize("@ss.hasPermi('demo:tree:remove')") - @Log(title = "测试树表", businessType = BusinessType.DELETE) + @SaCheckPermission("demo:tree:remove") + @Log(title = "测试树表" , businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@ApiParam("测试树ID串") @NotEmpty(message = "主键不能为空") diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java new file mode 100644 index 00000000..896d2b5a --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java @@ -0,0 +1,83 @@ +package com.ruoyi.demo.controller.queue; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.redis.QueueUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 有界队列 演示案例 + *

+ * 轻量级队列 重量级数据量 请使用 MQ + *

+ * 集群测试通过 同一个数据只会被消费一次 做好事务补偿 + * 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条 + * + * @author Lion Li + * @version 3.6.0 + */ +@Slf4j +@Api(value = "有界队列 演示案例", tags = {"有界队列"}) +@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RestController +@RequestMapping("/demo/queue/bounded") +public class BoundedQueueController { + + + @ApiOperation("添加队列数据") + @GetMapping("/add") + public R add(@ApiParam("队列名") String queueName, + @ApiParam("容量") int capacity) { + // 用完了一定要销毁 否则会一直存在 + boolean b = QueueUtils.destroyBoundedQueueObject(queueName); + log.info("通道: {} , 删除: {}", queueName, b); + // 初始化设置一次即可 + if (QueueUtils.trySetBoundedQueueCapacity(queueName, capacity)) { + log.info("通道: {} , 设置容量: {}", queueName, capacity); + } else { + log.info("通道: {} , 设置容量失败", queueName); + return R.error("操作失败"); + } + for (int i = 0; i < 11; i++) { + String data = "data-" + i; + boolean flag = QueueUtils.addBoundedQueueObject(queueName, data); + if (flag == false) { + log.info("通道: {} , 发送数据: {} 失败, 通道已满", queueName, data); + } else { + log.info("通道: {} , 发送数据: {}", queueName, data); + } + } + return R.success("操作成功"); + } + + @ApiOperation("删除队列数据") + @GetMapping("/remove") + public R remove(@ApiParam("队列名") String queueName) { + String data = "data-" + 5; + if (QueueUtils.removeBoundedQueueObject(queueName, data)) { + log.info("通道: {} , 删除数据: {}", queueName, data); + } else { + return R.error("操作失败"); + } + return R.success("操作成功"); + } + + @ApiOperation("获取队列数据") + @GetMapping("/get") + public R get(@ApiParam("队列名") String queueName) { + String data; + do { + data = QueueUtils.getBoundedQueueObject(queueName); + log.info("通道: {} , 获取数据: {}", queueName, data); + } while (data != null); + return R.success("操作成功"); + } + +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java new file mode 100644 index 00000000..33b63df6 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java @@ -0,0 +1,79 @@ +package com.ruoyi.demo.controller.queue; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.redis.QueueUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.TimeUnit; + +/** + * 延迟队列 演示案例 + *

+ * 轻量级队列 重量级数据量 请使用 MQ + * 例如: 创建订单30分钟后过期处理 + *

+ * 集群测试通过 同一个数据只会被消费一次 做好事务补偿 + * 集群测试流程 两台集群分别开启订阅 在其中一台发送数据 观察接收消息的规律 + * + * @author Lion Li + * @version 3.6.0 + */ +@Slf4j +@Api(value = "延迟队列 演示案例", tags = {"延迟队列"}) +@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RestController +@RequestMapping("/demo/queue/delayed") +public class DelayedQueueController { + + @ApiOperation("订阅队列") + @GetMapping("/subscribe") + public R subscribe(@ApiParam("队列名") String queueName) { + log.info("通道: {} 监听中......", queueName); + // 项目初始化设置一次即可 + QueueUtils.subscribeBlockingQueue(queueName, (String orderNum) -> { + // 观察接收时间 + log.info("通道: {}, 收到数据: {}", queueName, orderNum); + }); + return R.success("操作成功"); + } + + @ApiOperation("添加队列数据") + @GetMapping("/add") + public R add(@ApiParam("队列名") String queueName, + @ApiParam("订单号") String orderNum, + @ApiParam("延迟时间(秒)") Long time) { + QueueUtils.addDelayedQueueObject(queueName, orderNum, time, TimeUnit.SECONDS); + // 观察发送时间 + log.info("通道: {} , 发送数据: {}", queueName, orderNum); + return R.success("操作成功"); + } + + @ApiOperation("删除队列数据") + @GetMapping("/remove") + public R remove(@ApiParam("队列名") String queueName, + @ApiParam("订单号") String orderNum) { + if (QueueUtils.removeDelayedQueueObject(queueName, orderNum)) { + log.info("通道: {} , 删除数据: {}", queueName, orderNum); + } else { + return R.error("操作失败"); + } + return R.success("操作成功"); + } + + @ApiOperation("销毁队列") + @GetMapping("/destroy") + public R destroy(@ApiParam("队列名") String queueName) { + // 用完了一定要销毁 否则会一直存在 + QueueUtils.destroyDelayedQueue(queueName); + return R.success("操作成功"); + } + +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java new file mode 100644 index 00000000..08576904 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java @@ -0,0 +1,19 @@ +package com.ruoyi.demo.controller.queue; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 实体类 注意不允许使用内部类 否则会找不到类 + * + * @author Lion Li + * @version 3.6.0 + */ +@Data +@Accessors(chain = true) +@NoArgsConstructor +public class PriorityDemo { + private String name; + private Integer orderNum; +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java new file mode 100644 index 00000000..f72e6950 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java @@ -0,0 +1,16 @@ +package com.ruoyi.demo.controller.queue; + +import java.util.Comparator; + +/** + * 比较器 注意不允许使用 内部类或匿名类或lambda表达式 会找不到类 + * + * @author Lion Li + * @version 3.6.0 + */ +public class PriorityDemoComparator implements Comparator { + @Override + public int compare(PriorityDemo pd1, PriorityDemo pd2) { + return Integer.compare(pd1.getOrderNum(), pd2.getOrderNum()); + } +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java new file mode 100644 index 00000000..c66f55c6 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java @@ -0,0 +1,85 @@ +package com.ruoyi.demo.controller.queue; + +import cn.hutool.core.util.RandomUtil; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.redis.QueueUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 优先队列 演示案例 + *

+ * 轻量级队列 重量级数据量 请使用 MQ + *

+ * 集群测试通过 同一个消息只会被消费一次 做好事务补偿 + * 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条 + * + * @author Lion Li + * @version 3.6.0 + */ +@Slf4j +@Api(value = "优先队列 演示案例", tags = {"优先队列"}) +@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RestController +@RequestMapping("/demo/queue/priority") +public class PriorityQueueController { + + @ApiOperation("添加队列数据") + @GetMapping("/add") + public R add(@ApiParam("队列名") String queueName) { + // 用完了一定要销毁 否则会一直存在 + boolean b = QueueUtils.destroyPriorityQueueObject(queueName); + log.info("通道: {} , 删除: {}", queueName, b); + // 初始化设置一次即可 此处注意 不允许用内部类或匿名类 + boolean flag = QueueUtils.trySetPriorityQueueComparator(queueName, new PriorityDemoComparator()); + if (flag) { + log.info("通道: {} , 设置比较器成功", queueName); + } else { + log.info("通道: {} , 设置比较器失败", queueName); + return R.error("操作失败"); + } + for (int i = 0; i < 10; i++) { + int randomNum = RandomUtil.randomInt(10); + PriorityDemo data = new PriorityDemo().setName("data-" + i).setOrderNum(randomNum); + if (QueueUtils.addPriorityQueueObject(queueName, data)) { + log.info("通道: {} , 发送数据: {}", queueName, data); + } else { + log.info("通道: {} , 发送数据: {}, 发送失败", queueName, data); + } + } + return R.success("操作成功"); + } + + @ApiOperation("删除队列数据") + @GetMapping("/remove") + public R remove(@ApiParam("队列名") String queueName, + @ApiParam("对象名") String name, + @ApiParam("排序号") Integer orderNum) { + PriorityDemo data = new PriorityDemo().setName(name).setOrderNum(orderNum); + if (QueueUtils.removePriorityQueueObject(queueName, data)) { + log.info("通道: {} , 删除数据: {}", queueName, data); + } else { + return R.error("操作失败"); + } + return R.success("操作成功"); + } + + @ApiOperation("获取队列数据") + @GetMapping("/get") + public R get(@ApiParam("队列名") String queueName) { + PriorityDemo data; + do { + data = QueueUtils.getPriorityQueueObject(queueName); + log.info("通道: {} , 获取数据: {}", queueName, data); + } while (data != null); + return R.success("操作成功"); + } + +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java index 74b57d99..f36ae2b3 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java @@ -18,12 +18,12 @@ import lombok.experimental.Accessors; @TableName("test_demo") public class TestDemo extends BaseEntity { - private static final long serialVersionUID=1L; + private static final long serialVersionUID = 1L; - /** - * 主键 - */ + /** + * 主键 + */ @TableId(value = "id") private Long id; @@ -40,7 +40,7 @@ public class TestDemo extends BaseEntity { /** * 排序号 */ - @OrderBy(asc = false, sort = 1) + @OrderBy(asc = false, sort = 1) private Long orderNum; /** diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java index 92e005b8..7459362f 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java @@ -21,7 +21,7 @@ import lombok.experimental.Accessors; @TableName("test_tree") public class TestTree extends TreeEntity { - private static final long serialVersionUID=1L; + private static final long serialVersionUID = 1L; /** diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java index 63d28368..5c41204d 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java @@ -26,43 +26,43 @@ public class TestDemoBo extends BaseEntity { /** * 主键 */ - @ApiModelProperty("主键") - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + @ApiModelProperty("主键") + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) private Long id; /** * 部门id */ - @ApiModelProperty("部门id") - @NotNull(message = "部门id不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("部门id") + @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long deptId; /** * 用户id */ - @ApiModelProperty("用户id") - @NotNull(message = "用户id不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("用户id") + @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long userId; /** * 排序号 */ - @ApiModelProperty("排序号") - @NotNull(message = "排序号不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("排序号") + @NotNull(message = "排序号不能为空", groups = {AddGroup.class, EditGroup.class}) private Long orderNum; /** * key键 */ - @ApiModelProperty("key键") - @NotBlank(message = "key键不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("key键") + @NotBlank(message = "key键不能为空", groups = {AddGroup.class, EditGroup.class}) private String testKey; /** * 值 */ - @ApiModelProperty("值") - @NotBlank(message = "值不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("值") + @NotBlank(message = "值不能为空", groups = {AddGroup.class, EditGroup.class}) private String value; } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java index c561dd7a..29f4ac97 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java @@ -26,29 +26,29 @@ public class TestTreeBo extends TreeEntity { /** * 主键 */ - @ApiModelProperty("主键") - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + @ApiModelProperty("主键") + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) private Long id; /** * 部门id */ - @ApiModelProperty("部门id") - @NotNull(message = "部门id不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("部门id") + @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long deptId; /** * 用户id */ - @ApiModelProperty("用户id") - @NotNull(message = "用户id不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("用户id") + @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long userId; /** * 树节点名 */ - @ApiModelProperty("树节点名") - @NotBlank(message = "树节点名不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("树节点名") + @NotBlank(message = "树节点名不能为空", groups = {AddGroup.class, EditGroup.class}) private String treeName; } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java index 4919bbde..ef26ff32 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java @@ -9,7 +9,6 @@ import lombok.Data; import java.util.Date; - /** * 测试单表视图对象 test_demo * @@ -21,77 +20,77 @@ import java.util.Date; @ExcelIgnoreUnannotated public class TestDemoVo { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 主键 + /** + * 主键 */ - @ExcelProperty(value = "主键") - @ApiModelProperty("主键") - private Long id; + @ExcelProperty(value = "主键") + @ApiModelProperty("主键") + private Long id; /** * 部门id */ - @ExcelProperty(value = "部门id") - @ApiModelProperty("部门id") - private Long deptId; + @ExcelProperty(value = "部门id") + @ApiModelProperty("部门id") + private Long deptId; /** * 用户id */ - @ExcelProperty(value = "用户id") - @ApiModelProperty("用户id") - private Long userId; + @ExcelProperty(value = "用户id") + @ApiModelProperty("用户id") + private Long userId; /** * 排序号 */ - @ExcelProperty(value = "排序号") - @ApiModelProperty("排序号") - private Long orderNum; + @ExcelProperty(value = "排序号") + @ApiModelProperty("排序号") + private Long orderNum; /** * key键 */ - @ExcelProperty(value = "key键") - @ApiModelProperty("key键") - private String testKey; + @ExcelProperty(value = "key键") + @ApiModelProperty("key键") + private String testKey; /** * 值 */ - @ExcelProperty(value = "值") - @ApiModelProperty("值") - private String value; + @ExcelProperty(value = "值") + @ApiModelProperty("值") + private String value; /** * 创建时间 */ - @ExcelProperty(value = "创建时间") - @ApiModelProperty("创建时间") - private Date createTime; + @ExcelProperty(value = "创建时间") + @ApiModelProperty("创建时间") + private Date createTime; /** * 创建人 */ - @ExcelProperty(value = "创建人") - @ApiModelProperty("创建人") - private String createBy; + @ExcelProperty(value = "创建人") + @ApiModelProperty("创建人") + private String createBy; /** * 更新时间 */ - @ExcelProperty(value = "更新时间") - @ApiModelProperty("更新时间") - private Date updateTime; + @ExcelProperty(value = "更新时间") + @ApiModelProperty("更新时间") + private Date updateTime; /** * 更新人 */ - @ExcelProperty(value = "更新人") - @ApiModelProperty("更新人") - private String updateBy; + @ExcelProperty(value = "更新人") + @ApiModelProperty("更新人") + private String updateBy; } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java index dab81624..309a0ae4 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java @@ -9,7 +9,6 @@ import lombok.Data; import java.util.Date; - /** * 测试树表视图对象 test_tree * @@ -21,48 +20,48 @@ import java.util.Date; @ExcelIgnoreUnannotated public class TestTreeVo { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 主键 + /** + * 主键 */ - @ApiModelProperty("主键") - private Long id; + @ApiModelProperty("主键") + private Long id; /** * 父id */ - @ExcelProperty(value = "父id") - @ApiModelProperty("父id") - private Long parentId; + @ExcelProperty(value = "父id") + @ApiModelProperty("父id") + private Long parentId; /** * 部门id */ - @ExcelProperty(value = "部门id") - @ApiModelProperty("部门id") - private Long deptId; + @ExcelProperty(value = "部门id") + @ApiModelProperty("部门id") + private Long deptId; /** * 用户id */ - @ExcelProperty(value = "用户id") - @ApiModelProperty("用户id") - private Long userId; + @ExcelProperty(value = "用户id") + @ApiModelProperty("用户id") + private Long userId; /** * 树节点名 */ - @ExcelProperty(value = "树节点名") - @ApiModelProperty("树节点名") - private String treeName; + @ExcelProperty(value = "树节点名") + @ApiModelProperty("树节点名") + private String treeName; /** * 创建时间 */ - @ExcelProperty(value = "创建时间") - @ApiModelProperty("创建时间") - private Date createTime; + @ExcelProperty(value = "创建时间") + @ApiModelProperty("创建时间") + private Date createTime; } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java index 7a3cb62d..b1b80d26 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java @@ -6,12 +6,11 @@ import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.annotation.DataColumn; import com.ruoyi.common.annotation.DataPermission; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.demo.domain.TestDemo; import com.ruoyi.demo.domain.vo.TestDemoVo; import org.apache.ibatis.annotations.Param; -import java.io.Serializable; import java.util.Collection; import java.util.List; @@ -21,7 +20,7 @@ import java.util.List; * @author Lion Li * @date 2021-07-26 */ -public interface TestDemoMapper extends BaseMapperPlus { +public interface TestDemoMapper extends BaseMapperPlus { @DataPermission({ @DataColumn(key = "deptName", value = "dept_id"), @@ -55,5 +54,5 @@ public interface TestDemoMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) - int deleteBatchIds(@Param(Constants.COLLECTION) Collection idList); + int deleteBatchIds(@Param(Constants.COLLECTION) Collection idList); } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java index 0a7936cf..e37a9a75 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java @@ -2,8 +2,9 @@ package com.ruoyi.demo.mapper; import com.ruoyi.common.annotation.DataColumn; import com.ruoyi.common.annotation.DataPermission; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.demo.domain.TestTree; +import com.ruoyi.demo.domain.vo.TestTreeVo; /** * 测试树表Mapper接口 @@ -15,6 +16,6 @@ import com.ruoyi.demo.domain.TestTree; @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) -public interface TestTreeMapper extends BaseMapperPlus { +public interface TestTreeMapper extends BaseMapperPlus { } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java index 12834d30..f6b82fd6 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java @@ -1,11 +1,10 @@ package com.ruoyi.demo.service; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.demo.domain.TestDemo; -import com.ruoyi.demo.domain.vo.TestDemoVo; -import com.ruoyi.demo.domain.bo.TestDemoBo; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.demo.domain.TestDemo; +import com.ruoyi.demo.domain.bo.TestDemoBo; +import com.ruoyi.demo.domain.vo.TestDemoVo; import java.util.Collection; import java.util.List; @@ -16,48 +15,57 @@ import java.util.List; * @author Lion Li * @date 2021-07-26 */ -public interface ITestDemoService extends IServicePlus { - - /** - * 查询单个 - * @return - */ - TestDemoVo queryById(Long id); - - /** - * 查询列表 - */ - TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery); - - /** - * 自定义分页查询 - */ - TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery); +public interface ITestDemoService { /** - * 查询列表 - */ - List queryList(TestDemoBo bo); + * 查询单个 + * + * @return + */ + TestDemoVo queryById(Long id); - /** - * 根据新增业务对象插入测试单表 - * @param bo 测试单表新增业务对象 - * @return - */ - Boolean insertByBo(TestDemoBo bo); + /** + * 查询列表 + */ + TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery); - /** - * 根据编辑业务对象修改测试单表 - * @param bo 测试单表编辑业务对象 - * @return - */ - Boolean updateByBo(TestDemoBo bo); + /** + * 自定义分页查询 + */ + TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery); - /** - * 校验并删除数据 - * @param ids 主键集合 - * @param isValid 是否校验,true-删除前校验,false-不校验 - * @return - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + /** + * 查询列表 + */ + List queryList(TestDemoBo bo); + + /** + * 根据新增业务对象插入测试单表 + * + * @param bo 测试单表新增业务对象 + * @return + */ + Boolean insertByBo(TestDemoBo bo); + + /** + * 根据编辑业务对象修改测试单表 + * + * @param bo 测试单表编辑业务对象 + * @return + */ + Boolean updateByBo(TestDemoBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 批量保存 + */ + Boolean saveBatch(List list); } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestTreeService.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestTreeService.java index 9b8acb9c..366e5150 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestTreeService.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestTreeService.java @@ -1,9 +1,7 @@ package com.ruoyi.demo.service; -import com.ruoyi.demo.domain.TestTree; -import com.ruoyi.demo.domain.vo.TestTreeVo; import com.ruoyi.demo.domain.bo.TestTreeBo; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.ruoyi.demo.domain.vo.TestTreeVo; import java.util.Collection; import java.util.List; @@ -14,37 +12,41 @@ import java.util.List; * @author Lion Li * @date 2021-07-26 */ -public interface ITestTreeService extends IServicePlus { - /** - * 查询单个 - * @return - */ - TestTreeVo queryById(Long id); +public interface ITestTreeService { + /** + * 查询单个 + * + * @return + */ + TestTreeVo queryById(Long id); - /** - * 查询列表 - */ - List queryList(TestTreeBo bo); + /** + * 查询列表 + */ + List queryList(TestTreeBo bo); - /** - * 根据新增业务对象插入测试树表 - * @param bo 测试树表新增业务对象 - * @return - */ - Boolean insertByBo(TestTreeBo bo); + /** + * 根据新增业务对象插入测试树表 + * + * @param bo 测试树表新增业务对象 + * @return + */ + Boolean insertByBo(TestTreeBo bo); - /** - * 根据编辑业务对象修改测试树表 - * @param bo 测试树表编辑业务对象 - * @return - */ - Boolean updateByBo(TestTreeBo bo); + /** + * 根据编辑业务对象修改测试树表 + * + * @param bo 测试树表编辑业务对象 + * @return + */ + Boolean updateByBo(TestTreeBo bo); - /** - * 校验并删除数据 - * @param ids 主键集合 - * @param isValid 是否校验,true-删除前校验,false-不校验 - * @return - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java index a647d241..7ed7cd5b 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.demo.domain.TestDemo; @@ -13,6 +12,7 @@ import com.ruoyi.demo.domain.bo.TestDemoBo; import com.ruoyi.demo.domain.vo.TestDemoVo; import com.ruoyi.demo.mapper.TestDemoMapper; import com.ruoyi.demo.service.ITestDemoService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Collection; @@ -25,78 +25,86 @@ import java.util.Map; * @author Lion Li * @date 2021-07-26 */ +@RequiredArgsConstructor @Service -public class TestDemoServiceImpl extends ServicePlusImpl implements ITestDemoService { +public class TestDemoServiceImpl implements ITestDemoService { - @Override - public TestDemoVo queryById(Long id) { - return getVoById(id); - } + private final TestDemoMapper baseMapper; - @Override - public TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery) { + @Override + public TestDemoVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + @Override + public TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = pageVo(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } - /** - * 自定义分页查询 - */ - @Override - public TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery) { + /** + * 自定义分页查询 + */ + @Override + public TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.customPageList(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } + Page result = baseMapper.customPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } - @Override - public List queryList(TestDemoBo bo) { - return listVo(buildQueryWrapper(bo)); - } + @Override + public List queryList(TestDemoBo bo) { + return baseMapper.selectVoList(buildQueryWrapper(bo)); + } - private LambdaQueryWrapper buildQueryWrapper(TestDemoBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); - lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - return lqw; - } + private LambdaQueryWrapper buildQueryWrapper(TestDemoBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); + lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + return lqw; + } - @Override - public Boolean insertByBo(TestDemoBo bo) { - TestDemo add = BeanUtil.toBean(bo, TestDemo.class); - validEntityBeforeSave(add); - boolean flag = save(add); - if (flag) { - bo.setId(add.getId()); - } - return flag; - } + @Override + public Boolean insertByBo(TestDemoBo bo) { + TestDemo add = BeanUtil.toBean(bo, TestDemo.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } - @Override - public Boolean updateByBo(TestDemoBo bo) { - TestDemo update = BeanUtil.toBean(bo, TestDemo.class); - validEntityBeforeSave(update); - return updateById(update); - } + @Override + public Boolean updateByBo(TestDemoBo bo) { + TestDemo update = BeanUtil.toBean(bo, TestDemo.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } - /** - * 保存前的数据校验 - * - * @param entity 实体类数据 - */ - private void validEntityBeforeSave(TestDemo entity) { - //TODO 做一些数据校验,如唯一约束 - } + /** + * 保存前的数据校验 + * + * @param entity 实体类数据 + */ + private void validEntityBeforeSave(TestDemo entity) { + //TODO 做一些数据校验,如唯一约束 + } - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } - return removeByIds(ids); - } + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean saveBatch(List list) { + return baseMapper.insertBatch(list); + } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java index c4097e66..3e7fa20d 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java @@ -3,13 +3,13 @@ package com.ruoyi.demo.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.demo.domain.TestTree; import com.ruoyi.demo.domain.bo.TestTreeBo; import com.ruoyi.demo.domain.vo.TestTreeVo; import com.ruoyi.demo.mapper.TestTreeMapper; import com.ruoyi.demo.service.ITestTreeService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Collection; @@ -23,62 +23,65 @@ import java.util.Map; * @date 2021-07-26 */ // @DS("slave") // 切换从库查询 +@RequiredArgsConstructor @Service -public class TestTreeServiceImpl extends ServicePlusImpl implements ITestTreeService { +public class TestTreeServiceImpl implements ITestTreeService { - @Override - public TestTreeVo queryById(Long id) { - return getVoById(id); - } + private final TestTreeMapper baseMapper; -// @DS("slave") // 切换从库查询 - @Override - public List queryList(TestTreeBo bo) { + @Override + public TestTreeVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + // @DS("slave") // 切换从库查询 + @Override + public List queryList(TestTreeBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return listVo(lqw); - } + return baseMapper.selectVoList(lqw); + } - private LambdaQueryWrapper buildQueryWrapper(TestTreeBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - return lqw; - } + private LambdaQueryWrapper buildQueryWrapper(TestTreeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + return lqw; + } - @Override - public Boolean insertByBo(TestTreeBo bo) { - TestTree add = BeanUtil.toBean(bo, TestTree.class); - validEntityBeforeSave(add); - boolean flag = save(add); - if (flag) { - bo.setId(add.getId()); - } - return flag; - } + @Override + public Boolean insertByBo(TestTreeBo bo) { + TestTree add = BeanUtil.toBean(bo, TestTree.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } - @Override - public Boolean updateByBo(TestTreeBo bo) { - TestTree update = BeanUtil.toBean(bo, TestTree.class); - validEntityBeforeSave(update); - return updateById(update); - } + @Override + public Boolean updateByBo(TestTreeBo bo) { + TestTree update = BeanUtil.toBean(bo, TestTree.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } - /** - * 保存前的数据校验 - * - * @param entity 实体类数据 - */ - private void validEntityBeforeSave(TestTree entity) { - //TODO 做一些数据校验,如唯一约束 - } + /** + * 保存前的数据校验 + * + * @param entity 实体类数据 + */ + private void validEntityBeforeSave(TestTree entity) { + //TODO 做一些数据校验,如唯一约束 + } - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } - return removeByIds(ids); - } + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } } diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 4b0d591c..e21cc6da 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -34,6 +34,11 @@ spring-boot-admin-starter-client + + org.projectlombok + lombok + + diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/MonitorAdminApplication.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/MonitorAdminApplication.java index 1d1cbca5..d4f038c9 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/MonitorAdminApplication.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/MonitorAdminApplication.java @@ -11,9 +11,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MonitorAdminApplication { - public static void main(String[] args) { - SpringApplication.run(MonitorAdminApplication.class, args); - System.out.println("Admin 监控启动成功" ); - } + public static void main(String[] args) { + SpringApplication.run(MonitorAdminApplication.class, args); + System.out.println("Admin 监控启动成功"); + } } diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java index 04a0fdef..2b04f712 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java @@ -16,33 +16,33 @@ import org.springframework.security.web.authentication.SavedRequestAwareAuthenti @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { - private final String adminContextPath; + private final String adminContextPath; - public SecurityConfig(AdminServerProperties adminServerProperties) { - this.adminContextPath = adminServerProperties.getContextPath(); - } + public SecurityConfig(AdminServerProperties adminServerProperties) { + this.adminContextPath = adminServerProperties.getContextPath(); + } - @Override - protected void configure(HttpSecurity httpSecurity) throws Exception { - SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); - successHandler.setTargetUrlParameter("redirectTo"); - successHandler.setDefaultTargetUrl(adminContextPath + "/"); - // admin监控 用户鉴权 - httpSecurity.authorizeRequests() - //授予对所有静态资产和登录页面的公共访问权限。 - .antMatchers(adminContextPath + "/assets/**").permitAll() - .antMatchers(adminContextPath + "/login").permitAll() + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception { + SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); + successHandler.setTargetUrlParameter("redirectTo"); + successHandler.setDefaultTargetUrl(adminContextPath + "/"); + // admin监控 用户鉴权 + httpSecurity.authorizeRequests() + //授予对所有静态资产和登录页面的公共访问权限。 + .antMatchers(adminContextPath + "/assets/**").permitAll() + .antMatchers(adminContextPath + "/login").permitAll() .antMatchers("/actuator").permitAll() .antMatchers("/actuator/**").permitAll() - //必须对每个其他请求进行身份验证 - .anyRequest().authenticated().and() - //配置登录和注销 - .formLogin().loginPage(adminContextPath + "/login") - .successHandler(successHandler).and() - .logout().logoutUrl(adminContextPath + "/logout").and() - //启用HTTP-Basic支持。这是Spring Boot Admin Client注册所必需的 - .httpBasic().and().csrf().disable() - .headers().frameOptions().disable(); - } + //必须对每个其他请求进行身份验证 + .anyRequest().authenticated().and() + //配置登录和注销 + .formLogin().loginPage(adminContextPath + "/login") + .successHandler(successHandler).and() + .logout().logoutUrl(adminContextPath + "/logout").and() + //启用HTTP-Basic支持。这是Spring Boot Admin Client注册所必需的 + .httpBasic().and().csrf().disable() + .headers().frameOptions().disable(); + } } diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/notifier/CustomNotifier.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/notifier/CustomNotifier.java new file mode 100644 index 00000000..4d0a7a03 --- /dev/null +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/notifier/CustomNotifier.java @@ -0,0 +1,40 @@ +package com.ruoyi.monitor.admin.notifier; + +import de.codecentric.boot.admin.server.domain.entities.Instance; +import de.codecentric.boot.admin.server.domain.entities.InstanceRepository; +import de.codecentric.boot.admin.server.domain.events.InstanceEvent; +import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent; +import de.codecentric.boot.admin.server.notify.AbstractEventNotifier; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; + +/** + * 自定义事件通知处理 + * + * @author Lion Li + */ +@Slf4j +@Component +public class CustomNotifier extends AbstractEventNotifier { + + protected CustomNotifier(InstanceRepository repository) { + super(repository); + } + + @Override + @SuppressWarnings("all") + protected Mono doNotify(InstanceEvent event, Instance instance) { + return Mono.fromRunnable(() -> { + // 实例状态改变事件 + if (event instanceof InstanceStatusChangedEvent) { + String registName = instance.getRegistration().getName(); + String instanceId = event.getInstance().getValue(); + String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(); + log.info("Instance Status Change: [{}],[{}],[{}]", registName, instanceId, status); + } + + }); + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml index 640628e3..a2e64058 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml @@ -1,139 +1,126 @@ - 4.0.0 - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + ruoyi-extend com.ruoyi 3.5.0 - - ruoyi-xxl-job-admin - jar + + ruoyi-xxl-job-admin + jar - - 2.1.4 - 8.0.23 - + + 2.1.4 + 8.0.23 + - - - - org.springframework.boot - spring-boot-starter-parent - ${spring-boot.version} - pom - import - - - + + + + org.springframework.boot + spring-boot-starter-parent + ${spring-boot.version} + pom + import + + + - + - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + - - - org.springframework.boot - spring-boot-starter-freemarker - + + + org.springframework.boot + spring-boot-starter-freemarker + - - - org.springframework.boot - spring-boot-starter-mail - + + + org.springframework.boot + spring-boot-starter-mail + - - - org.springframework.boot - spring-boot-starter-actuator - + + + org.springframework.boot + spring-boot-starter-actuator + - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - ${mybatis-spring-boot-starter.version} - - - - mysql - mysql-connector-java - ${mysql-connector-java.version} - + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot-starter.version} + + + + mysql + mysql-connector-java + ${mysql-connector-java.version} + de.codecentric spring-boot-admin-starter-client - - - com.xuxueli - xxl-job-core - + + + com.xuxueli + xxl-job-core + - + - + ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - - - repackage - - - - - - org.apache.maven.plugins - maven-resources-plugin - 2.6 - - - ttf - jks - woff - woff2 - - - - - - com.spotify - docker-maven-plugin - ${docker.plugin.version} - - - ${docker.namespace}/${project.artifactId}:${project.version} - ${project.basedir} - ${docker.registry.host} - ${docker.registry.url} - ${docker.registry.url} - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - - - - - + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + com.spotify + docker-maven-plugin + ${docker.plugin.version} + + + ${docker.namespace}/${project.artifactId}:${project.version} + ${project.basedir} + ${docker.registry.host} + ${docker.registry.url} + ${docker.registry.url} + + + / + ${project.build.directory} + ${project.build.finalName}.jar + + + + + + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java index fce10a81..95ec1c41 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java @@ -9,8 +9,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class XxlJobAdminApplication { - public static void main(String[] args) { + public static void main(String[] args) { SpringApplication.run(XxlJobAdminApplication.class, args); - } + } -} \ No newline at end of file +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java index eb63f0bd..8d5495c5 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java @@ -24,73 +24,74 @@ import java.util.Map; /** * index controller + * * @author xuxueli 2015-12-19 16:13:16 */ @Controller public class IndexController { - @Resource - private XxlJobService xxlJobService; - @Resource - private LoginService loginService; + @Resource + private XxlJobService xxlJobService; + @Resource + private LoginService loginService; - @RequestMapping("/") - public String index(Model model) { + @RequestMapping("/") + public String index(Model model) { - Map dashboardMap = xxlJobService.dashboardInfo(); - model.addAllAttributes(dashboardMap); + Map dashboardMap = xxlJobService.dashboardInfo(); + model.addAllAttributes(dashboardMap); - return "index"; - } + return "index"; + } @RequestMapping("/chartInfo") - @ResponseBody - public ReturnT> chartInfo(Date startDate, Date endDate) { + @ResponseBody + public ReturnT> chartInfo(Date startDate, Date endDate) { ReturnT> chartInfo = xxlJobService.chartInfo(startDate, endDate); return chartInfo; } - - @RequestMapping("/toLogin") - @PermissionLimit(limit=false) - public ModelAndView toLogin(HttpServletRequest request, HttpServletResponse response,ModelAndView modelAndView) { - if (loginService.ifLogin(request, response) != null) { - modelAndView.setView(new RedirectView("/",true,false)); - return modelAndView; - } - return new ModelAndView("login"); - } - - @RequestMapping(value="login", method=RequestMethod.POST) - @ResponseBody - @PermissionLimit(limit=false) - public ReturnT loginDo(HttpServletRequest request, HttpServletResponse response, String userName, String password, String ifRemember){ - boolean ifRem = (ifRemember!=null && ifRemember.trim().length()>0 && "on".equals(ifRemember))?true:false; - return loginService.login(request, response, userName, password, ifRem); - } - - @RequestMapping(value="logout", method=RequestMethod.POST) - @ResponseBody - @PermissionLimit(limit=false) - public ReturnT logout(HttpServletRequest request, HttpServletResponse response){ - return loginService.logout(request, response); - } - - @RequestMapping("/help") - public String help() { - /*if (!PermissionInterceptor.ifLogin(request)) { - return "redirect:/toLogin"; - }*/ + @RequestMapping("/toLogin") + @PermissionLimit(limit = false) + public ModelAndView toLogin(HttpServletRequest request, HttpServletResponse response, ModelAndView modelAndView) { + if (loginService.ifLogin(request, response) != null) { + modelAndView.setView(new RedirectView("/" , true, false)); + return modelAndView; + } + return new ModelAndView("login"); + } - return "help"; - } + @RequestMapping(value = "login" , method = RequestMethod.POST) + @ResponseBody + @PermissionLimit(limit = false) + public ReturnT loginDo(HttpServletRequest request, HttpServletResponse response, String userName, String password, String ifRemember) { + boolean ifRem = (ifRemember != null && ifRemember.trim().length() > 0 && "on".equals(ifRemember)) ? true : false; + return loginService.login(request, response, userName, password, ifRem); + } + + @RequestMapping(value = "logout" , method = RequestMethod.POST) + @ResponseBody + @PermissionLimit(limit = false) + public ReturnT logout(HttpServletRequest request, HttpServletResponse response) { + return loginService.logout(request, response); + } + + @RequestMapping("/help") + public String help() { + + /*if (!PermissionInterceptor.ifLogin(request)) { + return "redirect:/toLogin"; + }*/ + + return "help"; + } + + @InitBinder + public void initBinder(WebDataBinder binder) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dateFormat.setLenient(false); + binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); + } - @InitBinder - public void initBinder(WebDataBinder binder) { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - dateFormat.setLenient(false); - binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); - } - } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java index fe4a0e84..0c8384f0 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java @@ -19,78 +19,79 @@ import java.util.List; /** * job code controller + * * @author xuxueli 2015-12-19 16:13:16 */ @Controller @RequestMapping("/jobcode") public class JobCodeController { - - @Resource - private XxlJobInfoDao xxlJobInfoDao; - @Resource - private XxlJobLogGlueDao xxlJobLogGlueDao; - @RequestMapping - public String index(HttpServletRequest request, Model model, int jobId) { - XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId); - List jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId); + @Resource + private XxlJobInfoDao xxlJobInfoDao; + @Resource + private XxlJobLogGlueDao xxlJobLogGlueDao; - if (jobInfo == null) { - throw new RuntimeException(I18nUtil.getString("jobinfo_glue_jobid_unvalid")); - } - if (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType())) { - throw new RuntimeException(I18nUtil.getString("jobinfo_glue_gluetype_unvalid")); - } + @RequestMapping + public String index(HttpServletRequest request, Model model, int jobId) { + XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId); + List jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId); - // valid permission - JobInfoController.validPermission(request, jobInfo.getJobGroup()); + if (jobInfo == null) { + throw new RuntimeException(I18nUtil.getString("jobinfo_glue_jobid_unvalid")); + } + if (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType())) { + throw new RuntimeException(I18nUtil.getString("jobinfo_glue_gluetype_unvalid")); + } - // Glue类型-字典 - model.addAttribute("GlueTypeEnum", GlueTypeEnum.values()); + // valid permission + JobInfoController.validPermission(request, jobInfo.getJobGroup()); - model.addAttribute("jobInfo", jobInfo); - model.addAttribute("jobLogGlues", jobLogGlues); - return "jobcode/jobcode.index"; - } - - @RequestMapping("/save") - @ResponseBody - public ReturnT save(Model model, int id, String glueSource, String glueRemark) { - // valid - if (glueRemark==null) { - return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_glue_remark")) ); - } - if (glueRemark.length()<4 || glueRemark.length()>100) { - return new ReturnT(500, I18nUtil.getString("jobinfo_glue_remark_limit")); - } - XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(id); - if (exists_jobInfo == null) { - return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid")); - } - - // update new code - exists_jobInfo.setGlueSource(glueSource); - exists_jobInfo.setGlueRemark(glueRemark); - exists_jobInfo.setGlueUpdatetime(new Date()); + // Glue类型-字典 + model.addAttribute("GlueTypeEnum" , GlueTypeEnum.values()); - exists_jobInfo.setUpdateTime(new Date()); - xxlJobInfoDao.update(exists_jobInfo); + model.addAttribute("jobInfo" , jobInfo); + model.addAttribute("jobLogGlues" , jobLogGlues); + return "jobcode/jobcode.index"; + } - // log old code - XxlJobLogGlue xxlJobLogGlue = new XxlJobLogGlue(); - xxlJobLogGlue.setJobId(exists_jobInfo.getId()); - xxlJobLogGlue.setGlueType(exists_jobInfo.getGlueType()); - xxlJobLogGlue.setGlueSource(glueSource); - xxlJobLogGlue.setGlueRemark(glueRemark); + @RequestMapping("/save") + @ResponseBody + public ReturnT save(Model model, int id, String glueSource, String glueRemark) { + // valid + if (glueRemark == null) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_glue_remark"))); + } + if (glueRemark.length() < 4 || glueRemark.length() > 100) { + return new ReturnT(500, I18nUtil.getString("jobinfo_glue_remark_limit")); + } + XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(id); + if (exists_jobInfo == null) { + return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid")); + } - xxlJobLogGlue.setAddTime(new Date()); - xxlJobLogGlue.setUpdateTime(new Date()); - xxlJobLogGlueDao.save(xxlJobLogGlue); + // update new code + exists_jobInfo.setGlueSource(glueSource); + exists_jobInfo.setGlueRemark(glueRemark); + exists_jobInfo.setGlueUpdatetime(new Date()); - // remove code backup more than 30 - xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 30); + exists_jobInfo.setUpdateTime(new Date()); + xxlJobInfoDao.update(exists_jobInfo); + + // log old code + XxlJobLogGlue xxlJobLogGlue = new XxlJobLogGlue(); + xxlJobLogGlue.setJobId(exists_jobInfo.getId()); + xxlJobLogGlue.setGlueType(exists_jobInfo.getGlueType()); + xxlJobLogGlue.setGlueSource(glueSource); + xxlJobLogGlue.setGlueRemark(glueRemark); + + xxlJobLogGlue.setAddTime(new Date()); + xxlJobLogGlue.setUpdateTime(new Date()); + xxlJobLogGlueDao.save(xxlJobLogGlue); + + // remove code backup more than 30 + xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 30); + + return ReturnT.SUCCESS; + } - return ReturnT.SUCCESS; - } - } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java index 4bb4b90a..4a462009 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -20,178 +20,179 @@ import java.util.*; /** * job group controller + * * @author xuxueli 2016-10-02 20:52:56 */ @Controller @RequestMapping("/jobgroup") public class JobGroupController { - @Resource - public XxlJobInfoDao xxlJobInfoDao; - @Resource - public XxlJobGroupDao xxlJobGroupDao; - @Resource - private XxlJobRegistryDao xxlJobRegistryDao; + @Resource + public XxlJobInfoDao xxlJobInfoDao; + @Resource + public XxlJobGroupDao xxlJobGroupDao; + @Resource + private XxlJobRegistryDao xxlJobRegistryDao; - @RequestMapping - public String index(Model model) { - return "jobgroup/jobgroup.index"; - } + @RequestMapping + public String index(Model model) { + return "jobgroup/jobgroup.index"; + } - @RequestMapping("/pageList") - @ResponseBody - public Map pageList(HttpServletRequest request, - @RequestParam(required = false, defaultValue = "0") int start, - @RequestParam(required = false, defaultValue = "10") int length, - String appname, String title) { + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(HttpServletRequest request, + @RequestParam(required = false, defaultValue = "0") int start, + @RequestParam(required = false, defaultValue = "10") int length, + String appname, String title) { - // page query - List list = xxlJobGroupDao.pageList(start, length, appname, title); - int list_count = xxlJobGroupDao.pageListCount(start, length, appname, title); + // page query + List list = xxlJobGroupDao.pageList(start, length, appname, title); + int list_count = xxlJobGroupDao.pageListCount(start, length, appname, title); - // package result - Map maps = new HashMap(); - maps.put("recordsTotal", list_count); // 总记录数 - maps.put("recordsFiltered", list_count); // 过滤后的总记录数 - maps.put("data", list); // 分页列表 - return maps; - } + // package result + Map maps = new HashMap(); + maps.put("recordsTotal" , list_count); // 总记录数 + maps.put("recordsFiltered" , list_count); // 过滤后的总记录数 + maps.put("data" , list); // 分页列表 + return maps; + } - @RequestMapping("/save") - @ResponseBody - public ReturnT save(XxlJobGroup xxlJobGroup){ + @RequestMapping("/save") + @ResponseBody + public ReturnT save(XxlJobGroup xxlJobGroup) { - // valid - if (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) { - return new ReturnT(500, (I18nUtil.getString("system_please_input")+"AppName") ); - } - if (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length") ); - } - if (xxlJobGroup.getAppname().contains(">") || xxlJobGroup.getAppname().contains("<")) { - return new ReturnT(500, "AppName"+I18nUtil.getString("system_unvalid") ); - } - if (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) { - return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) ); - } - if (xxlJobGroup.getTitle().contains(">") || xxlJobGroup.getTitle().contains("<")) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_title")+I18nUtil.getString("system_unvalid") ); - } - if (xxlJobGroup.getAddressType()!=0) { - if (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit") ); - } - if (xxlJobGroup.getAddressList().contains(">") || xxlJobGroup.getAddressList().contains("<")) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList")+I18nUtil.getString("system_unvalid") ); - } + // valid + if (xxlJobGroup.getAppname() == null || xxlJobGroup.getAppname().trim().length() == 0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + "AppName")); + } + if (xxlJobGroup.getAppname().length() < 4 || xxlJobGroup.getAppname().length() > 64) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length")); + } + if (xxlJobGroup.getAppname().contains(">") || xxlJobGroup.getAppname().contains("<")) { + return new ReturnT(500, "AppName" + I18nUtil.getString("system_unvalid")); + } + if (xxlJobGroup.getTitle() == null || xxlJobGroup.getTitle().trim().length() == 0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title"))); + } + if (xxlJobGroup.getTitle().contains(">") || xxlJobGroup.getTitle().contains("<")) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_title") + I18nUtil.getString("system_unvalid")); + } + if (xxlJobGroup.getAddressType() != 0) { + if (xxlJobGroup.getAddressList() == null || xxlJobGroup.getAddressList().trim().length() == 0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit")); + } + if (xxlJobGroup.getAddressList().contains(">") || xxlJobGroup.getAddressList().contains("<")) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList") + I18nUtil.getString("system_unvalid")); + } - String[] addresss = xxlJobGroup.getAddressList().split(","); - for (String item: addresss) { - if (item==null || item.trim().length()==0) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid") ); - } - } - } + String[] addresss = xxlJobGroup.getAddressList().split(","); + for (String item : addresss) { + if (item == null || item.trim().length() == 0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid")); + } + } + } - // process - xxlJobGroup.setUpdateTime(new Date()); + // process + xxlJobGroup.setUpdateTime(new Date()); - int ret = xxlJobGroupDao.save(xxlJobGroup); - return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL; - } + int ret = xxlJobGroupDao.save(xxlJobGroup); + return (ret > 0) ? ReturnT.SUCCESS : ReturnT.FAIL; + } - @RequestMapping("/update") - @ResponseBody - public ReturnT update(XxlJobGroup xxlJobGroup){ - // valid - if (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) { - return new ReturnT(500, (I18nUtil.getString("system_please_input")+"AppName") ); - } - if (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length") ); - } - if (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) { - return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) ); - } - if (xxlJobGroup.getAddressType() == 0) { - // 0=自动注册 - List registryList = findRegistryByAppName(xxlJobGroup.getAppname()); - String addressListStr = null; - if (registryList!=null && !registryList.isEmpty()) { - Collections.sort(registryList); - addressListStr = ""; - for (String item:registryList) { - addressListStr += item + ","; - } - addressListStr = addressListStr.substring(0, addressListStr.length()-1); - } - xxlJobGroup.setAddressList(addressListStr); - } else { - // 1=手动录入 - if (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit") ); - } - String[] addresss = xxlJobGroup.getAddressList().split(","); - for (String item: addresss) { - if (item==null || item.trim().length()==0) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid") ); - } - } - } + @RequestMapping("/update") + @ResponseBody + public ReturnT update(XxlJobGroup xxlJobGroup) { + // valid + if (xxlJobGroup.getAppname() == null || xxlJobGroup.getAppname().trim().length() == 0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + "AppName")); + } + if (xxlJobGroup.getAppname().length() < 4 || xxlJobGroup.getAppname().length() > 64) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length")); + } + if (xxlJobGroup.getTitle() == null || xxlJobGroup.getTitle().trim().length() == 0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title"))); + } + if (xxlJobGroup.getAddressType() == 0) { + // 0=自动注册 + List registryList = findRegistryByAppName(xxlJobGroup.getAppname()); + String addressListStr = null; + if (registryList != null && !registryList.isEmpty()) { + Collections.sort(registryList); + addressListStr = ""; + for (String item : registryList) { + addressListStr += item + ","; + } + addressListStr = addressListStr.substring(0, addressListStr.length() - 1); + } + xxlJobGroup.setAddressList(addressListStr); + } else { + // 1=手动录入 + if (xxlJobGroup.getAddressList() == null || xxlJobGroup.getAddressList().trim().length() == 0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit")); + } + String[] addresss = xxlJobGroup.getAddressList().split(","); + for (String item : addresss) { + if (item == null || item.trim().length() == 0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid")); + } + } + } - // process - xxlJobGroup.setUpdateTime(new Date()); + // process + xxlJobGroup.setUpdateTime(new Date()); - int ret = xxlJobGroupDao.update(xxlJobGroup); - return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL; - } + int ret = xxlJobGroupDao.update(xxlJobGroup); + return (ret > 0) ? ReturnT.SUCCESS : ReturnT.FAIL; + } - private List findRegistryByAppName(String appnameParam){ - HashMap> appAddressMap = new HashMap>(); - List list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); - if (list != null) { - for (XxlJobRegistry item: list) { - if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { - String appname = item.getRegistryKey(); - List registryList = appAddressMap.get(appname); - if (registryList == null) { - registryList = new ArrayList(); - } + private List findRegistryByAppName(String appnameParam) { + HashMap> appAddressMap = new HashMap>(); + List list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); + if (list != null) { + for (XxlJobRegistry item : list) { + if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { + String appname = item.getRegistryKey(); + List registryList = appAddressMap.get(appname); + if (registryList == null) { + registryList = new ArrayList(); + } - if (!registryList.contains(item.getRegistryValue())) { - registryList.add(item.getRegistryValue()); - } - appAddressMap.put(appname, registryList); - } - } - } - return appAddressMap.get(appnameParam); - } + if (!registryList.contains(item.getRegistryValue())) { + registryList.add(item.getRegistryValue()); + } + appAddressMap.put(appname, registryList); + } + } + } + return appAddressMap.get(appnameParam); + } - @RequestMapping("/remove") - @ResponseBody - public ReturnT remove(int id){ + @RequestMapping("/remove") + @ResponseBody + public ReturnT remove(int id) { - // valid - int count = xxlJobInfoDao.pageListCount(0, 10, id, -1, null, null, null); - if (count > 0) { - return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_0") ); - } + // valid + int count = xxlJobInfoDao.pageListCount(0, 10, id, -1, null, null, null); + if (count > 0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_0")); + } - List allList = xxlJobGroupDao.findAll(); - if (allList.size() == 1) { - return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_1") ); - } + List allList = xxlJobGroupDao.findAll(); + if (allList.size() == 1) { + return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_1")); + } - int ret = xxlJobGroupDao.remove(id); - return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL; - } + int ret = xxlJobGroupDao.remove(id); + return (ret > 0) ? ReturnT.SUCCESS : ReturnT.FAIL; + } - @RequestMapping("/loadById") - @ResponseBody - public ReturnT loadById(int id){ - XxlJobGroup jobGroup = xxlJobGroupDao.load(id); - return jobGroup!=null?new ReturnT(jobGroup):new ReturnT(ReturnT.FAIL_CODE, null); - } + @RequestMapping("/loadById") + @ResponseBody + public ReturnT loadById(int id) { + XxlJobGroup jobGroup = xxlJobGroupDao.load(id); + return jobGroup != null ? new ReturnT(jobGroup) : new ReturnT(ReturnT.FAIL_CODE, null); + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java index ea314b32..0f52bef7 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java @@ -1,6 +1,5 @@ package com.xxl.job.admin.controller; -import com.xxl.job.admin.core.cron.CronExpression; import com.xxl.job.admin.core.exception.XxlJobException; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; @@ -29,152 +28,153 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; -import java.text.ParseException; import java.util.*; /** * index controller + * * @author xuxueli 2015-12-19 16:13:16 */ @Controller @RequestMapping("/jobinfo") public class JobInfoController { - private static Logger logger = LoggerFactory.getLogger(JobInfoController.class); + private static Logger logger = LoggerFactory.getLogger(JobInfoController.class); - @Resource - private XxlJobGroupDao xxlJobGroupDao; - @Resource - private XxlJobService xxlJobService; - - @RequestMapping - public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) { + @Resource + private XxlJobGroupDao xxlJobGroupDao; + @Resource + private XxlJobService xxlJobService; - // 枚举-字典 - model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values()); // 路由策略-列表 - model.addAttribute("GlueTypeEnum", GlueTypeEnum.values()); // Glue类型-字典 - model.addAttribute("ExecutorBlockStrategyEnum", ExecutorBlockStrategyEnum.values()); // 阻塞处理策略-字典 - model.addAttribute("ScheduleTypeEnum", ScheduleTypeEnum.values()); // 调度类型 - model.addAttribute("MisfireStrategyEnum", MisfireStrategyEnum.values()); // 调度过期策略 + @RequestMapping + public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) { - // 执行器列表 - List jobGroupList_all = xxlJobGroupDao.findAll(); + // 枚举-字典 + model.addAttribute("ExecutorRouteStrategyEnum" , ExecutorRouteStrategyEnum.values()); // 路由策略-列表 + model.addAttribute("GlueTypeEnum" , GlueTypeEnum.values()); // Glue类型-字典 + model.addAttribute("ExecutorBlockStrategyEnum" , ExecutorBlockStrategyEnum.values()); // 阻塞处理策略-字典 + model.addAttribute("ScheduleTypeEnum" , ScheduleTypeEnum.values()); // 调度类型 + model.addAttribute("MisfireStrategyEnum" , MisfireStrategyEnum.values()); // 调度过期策略 - // filter group - List jobGroupList = filterJobGroupByRole(request, jobGroupList_all); - if (jobGroupList==null || jobGroupList.size()==0) { - throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); - } + // 执行器列表 + List jobGroupList_all = xxlJobGroupDao.findAll(); - model.addAttribute("JobGroupList", jobGroupList); - model.addAttribute("jobGroup", jobGroup); + // filter group + List jobGroupList = filterJobGroupByRole(request, jobGroupList_all); + if (jobGroupList == null || jobGroupList.size() == 0) { + throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); + } - return "jobinfo/jobinfo.index"; - } + model.addAttribute("JobGroupList" , jobGroupList); + model.addAttribute("jobGroup" , jobGroup); - public static List filterJobGroupByRole(HttpServletRequest request, List jobGroupList_all){ - List jobGroupList = new ArrayList<>(); - if (jobGroupList_all!=null && jobGroupList_all.size()>0) { - XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); - if (loginUser.getRole() == 1) { - jobGroupList = jobGroupList_all; - } else { - List groupIdStrs = new ArrayList<>(); - if (loginUser.getPermission()!=null && loginUser.getPermission().trim().length()>0) { - groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(",")); - } - for (XxlJobGroup groupItem:jobGroupList_all) { - if (groupIdStrs.contains(String.valueOf(groupItem.getId()))) { - jobGroupList.add(groupItem); - } - } - } - } - return jobGroupList; - } - public static void validPermission(HttpServletRequest request, int jobGroup) { - XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); - if (!loginUser.validPermission(jobGroup)) { - throw new RuntimeException(I18nUtil.getString("system_permission_limit") + "[username="+ loginUser.getUsername() +"]"); - } - } - - @RequestMapping("/pageList") - @ResponseBody - public Map pageList(@RequestParam(required = false, defaultValue = "0") int start, - @RequestParam(required = false, defaultValue = "10") int length, - int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) { - - return xxlJobService.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); - } - - @RequestMapping("/add") - @ResponseBody - public ReturnT add(XxlJobInfo jobInfo) { - return xxlJobService.add(jobInfo); - } - - @RequestMapping("/update") - @ResponseBody - public ReturnT update(XxlJobInfo jobInfo) { - return xxlJobService.update(jobInfo); - } - - @RequestMapping("/remove") - @ResponseBody - public ReturnT remove(int id) { - return xxlJobService.remove(id); - } - - @RequestMapping("/stop") - @ResponseBody - public ReturnT pause(int id) { - return xxlJobService.stop(id); - } - - @RequestMapping("/start") - @ResponseBody - public ReturnT start(int id) { - return xxlJobService.start(id); - } - - @RequestMapping("/trigger") - @ResponseBody - //@PermissionLimit(limit = false) - public ReturnT triggerJob(int id, String executorParam, String addressList) { - // force cover job param - if (executorParam == null) { - executorParam = ""; - } + return "jobinfo/jobinfo.index"; + } - JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList); - return ReturnT.SUCCESS; - } + public static List filterJobGroupByRole(HttpServletRequest request, List jobGroupList_all) { + List jobGroupList = new ArrayList<>(); + if (jobGroupList_all != null && jobGroupList_all.size() > 0) { + XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); + if (loginUser.getRole() == 1) { + jobGroupList = jobGroupList_all; + } else { + List groupIdStrs = new ArrayList<>(); + if (loginUser.getPermission() != null && loginUser.getPermission().trim().length() > 0) { + groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(",")); + } + for (XxlJobGroup groupItem : jobGroupList_all) { + if (groupIdStrs.contains(String.valueOf(groupItem.getId()))) { + jobGroupList.add(groupItem); + } + } + } + } + return jobGroupList; + } - @RequestMapping("/nextTriggerTime") - @ResponseBody - public ReturnT> nextTriggerTime(String scheduleType, String scheduleConf) { + public static void validPermission(HttpServletRequest request, int jobGroup) { + XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); + if (!loginUser.validPermission(jobGroup)) { + throw new RuntimeException(I18nUtil.getString("system_permission_limit") + "[username=" + loginUser.getUsername() + "]"); + } + } - XxlJobInfo paramXxlJobInfo = new XxlJobInfo(); - paramXxlJobInfo.setScheduleType(scheduleType); - paramXxlJobInfo.setScheduleConf(scheduleConf); + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(@RequestParam(required = false, defaultValue = "0") int start, + @RequestParam(required = false, defaultValue = "10") int length, + int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) { - List result = new ArrayList<>(); - try { - Date lastTime = new Date(); - for (int i = 0; i < 5; i++) { - lastTime = JobScheduleHelper.generateNextValidTime(paramXxlJobInfo, lastTime); - if (lastTime != null) { - result.add(DateUtil.formatDateTime(lastTime)); - } else { - break; - } - } - } catch (Exception e) { - logger.error(e.getMessage(), e); - return new ReturnT>(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) + e.getMessage()); - } - return new ReturnT>(result); + return xxlJobService.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); + } + + @RequestMapping("/add") + @ResponseBody + public ReturnT add(XxlJobInfo jobInfo) { + return xxlJobService.add(jobInfo); + } + + @RequestMapping("/update") + @ResponseBody + public ReturnT update(XxlJobInfo jobInfo) { + return xxlJobService.update(jobInfo); + } + + @RequestMapping("/remove") + @ResponseBody + public ReturnT remove(int id) { + return xxlJobService.remove(id); + } + + @RequestMapping("/stop") + @ResponseBody + public ReturnT pause(int id) { + return xxlJobService.stop(id); + } + + @RequestMapping("/start") + @ResponseBody + public ReturnT start(int id) { + return xxlJobService.start(id); + } + + @RequestMapping("/trigger") + @ResponseBody + //@PermissionLimit(limit = false) + public ReturnT triggerJob(int id, String executorParam, String addressList) { + // force cover job param + if (executorParam == null) { + executorParam = ""; + } + + JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList); + return ReturnT.SUCCESS; + } + + @RequestMapping("/nextTriggerTime") + @ResponseBody + public ReturnT> nextTriggerTime(String scheduleType, String scheduleConf) { + + XxlJobInfo paramXxlJobInfo = new XxlJobInfo(); + paramXxlJobInfo.setScheduleType(scheduleType); + paramXxlJobInfo.setScheduleConf(scheduleConf); + + List result = new ArrayList<>(); + try { + Date lastTime = new Date(); + for (int i = 0; i < 5; i++) { + lastTime = JobScheduleHelper.generateNextValidTime(paramXxlJobInfo, lastTime); + if (lastTime != null) { + result.add(DateUtil.formatDateTime(lastTime)); + } else { + break; + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT>(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")) + e.getMessage()); + } + return new ReturnT>(result); + + } - } - } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java index c64049d5..141b539c 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -1,7 +1,7 @@ package com.xxl.job.admin.controller; -import com.xxl.job.admin.core.exception.XxlJobException; import com.xxl.job.admin.core.complete.XxlJobCompleter; +import com.xxl.job.admin.core.exception.XxlJobException; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; @@ -33,201 +33,202 @@ import java.util.Map; /** * index controller + * * @author xuxueli 2015-12-19 16:13:16 */ @Controller @RequestMapping("/joblog") public class JobLogController { - private static Logger logger = LoggerFactory.getLogger(JobLogController.class); + private static Logger logger = LoggerFactory.getLogger(JobLogController.class); - @Resource - private XxlJobGroupDao xxlJobGroupDao; - @Resource - public XxlJobInfoDao xxlJobInfoDao; - @Resource - public XxlJobLogDao xxlJobLogDao; + @Resource + private XxlJobGroupDao xxlJobGroupDao; + @Resource + public XxlJobInfoDao xxlJobInfoDao; + @Resource + public XxlJobLogDao xxlJobLogDao; - @RequestMapping - public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) { + @RequestMapping + public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) { - // 执行器列表 - List jobGroupList_all = xxlJobGroupDao.findAll(); + // 执行器列表 + List jobGroupList_all = xxlJobGroupDao.findAll(); - // filter group - List jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all); - if (jobGroupList==null || jobGroupList.size()==0) { - throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); - } + // filter group + List jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all); + if (jobGroupList == null || jobGroupList.size() == 0) { + throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); + } - model.addAttribute("JobGroupList", jobGroupList); + model.addAttribute("JobGroupList" , jobGroupList); - // 任务 - if (jobId > 0) { - XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId); - if (jobInfo == null) { - throw new RuntimeException(I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_unvalid")); - } + // 任务 + if (jobId > 0) { + XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId); + if (jobInfo == null) { + throw new RuntimeException(I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_unvalid")); + } - model.addAttribute("jobInfo", jobInfo); + model.addAttribute("jobInfo" , jobInfo); - // valid permission - JobInfoController.validPermission(request, jobInfo.getJobGroup()); - } + // valid permission + JobInfoController.validPermission(request, jobInfo.getJobGroup()); + } - return "joblog/joblog.index"; - } + return "joblog/joblog.index"; + } - @RequestMapping("/getJobsByGroup") - @ResponseBody - public ReturnT> getJobsByGroup(int jobGroup){ - List list = xxlJobInfoDao.getJobsByGroup(jobGroup); - return new ReturnT>(list); - } - - @RequestMapping("/pageList") - @ResponseBody - public Map pageList(HttpServletRequest request, - @RequestParam(required = false, defaultValue = "0") int start, - @RequestParam(required = false, defaultValue = "10") int length, - int jobGroup, int jobId, int logStatus, String filterTime) { + @RequestMapping("/getJobsByGroup") + @ResponseBody + public ReturnT> getJobsByGroup(int jobGroup) { + List list = xxlJobInfoDao.getJobsByGroup(jobGroup); + return new ReturnT>(list); + } - // valid permission - JobInfoController.validPermission(request, jobGroup); // 仅管理员支持查询全部;普通用户仅支持查询有权限的 jobGroup - - // parse param - Date triggerTimeStart = null; - Date triggerTimeEnd = null; - if (filterTime!=null && filterTime.trim().length()>0) { - String[] temp = filterTime.split(" - "); - if (temp.length == 2) { - triggerTimeStart = DateUtil.parseDateTime(temp[0]); - triggerTimeEnd = DateUtil.parseDateTime(temp[1]); - } - } - - // page query - List list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus); - int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus); - - // package result - Map maps = new HashMap(); - maps.put("recordsTotal", list_count); // 总记录数 - maps.put("recordsFiltered", list_count); // 过滤后的总记录数 - maps.put("data", list); // 分页列表 - return maps; - } + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(HttpServletRequest request, + @RequestParam(required = false, defaultValue = "0") int start, + @RequestParam(required = false, defaultValue = "10") int length, + int jobGroup, int jobId, int logStatus, String filterTime) { - @RequestMapping("/logDetailPage") - public String logDetailPage(int id, Model model){ + // valid permission + JobInfoController.validPermission(request, jobGroup); // 仅管理员支持查询全部;普通用户仅支持查询有权限的 jobGroup - // base check - ReturnT logStatue = ReturnT.SUCCESS; - XxlJobLog jobLog = xxlJobLogDao.load(id); - if (jobLog == null) { + // parse param + Date triggerTimeStart = null; + Date triggerTimeEnd = null; + if (filterTime != null && filterTime.trim().length() > 0) { + String[] temp = filterTime.split(" - "); + if (temp.length == 2) { + triggerTimeStart = DateUtil.parseDateTime(temp[0]); + triggerTimeEnd = DateUtil.parseDateTime(temp[1]); + } + } + + // page query + List list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus); + int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus); + + // package result + Map maps = new HashMap(); + maps.put("recordsTotal" , list_count); // 总记录数 + maps.put("recordsFiltered" , list_count); // 过滤后的总记录数 + maps.put("data" , list); // 分页列表 + return maps; + } + + @RequestMapping("/logDetailPage") + public String logDetailPage(int id, Model model) { + + // base check + ReturnT logStatue = ReturnT.SUCCESS; + XxlJobLog jobLog = xxlJobLogDao.load(id); + if (jobLog == null) { throw new RuntimeException(I18nUtil.getString("joblog_logid_unvalid")); - } + } - model.addAttribute("triggerCode", jobLog.getTriggerCode()); - model.addAttribute("handleCode", jobLog.getHandleCode()); - model.addAttribute("executorAddress", jobLog.getExecutorAddress()); - model.addAttribute("triggerTime", jobLog.getTriggerTime().getTime()); - model.addAttribute("logId", jobLog.getId()); - return "joblog/joblog.detail"; - } + model.addAttribute("triggerCode" , jobLog.getTriggerCode()); + model.addAttribute("handleCode" , jobLog.getHandleCode()); + model.addAttribute("executorAddress" , jobLog.getExecutorAddress()); + model.addAttribute("triggerTime" , jobLog.getTriggerTime().getTime()); + model.addAttribute("logId" , jobLog.getId()); + return "joblog/joblog.detail"; + } - @RequestMapping("/logDetailCat") - @ResponseBody - public ReturnT logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum){ - try { - ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress); - ReturnT logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum)); + @RequestMapping("/logDetailCat") + @ResponseBody + public ReturnT logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum) { + try { + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress); + ReturnT logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum)); - // is end - if (logResult.getContent()!=null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) { + // is end + if (logResult.getContent() != null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) { XxlJobLog jobLog = xxlJobLogDao.load(logId); if (jobLog.getHandleCode() > 0) { logResult.getContent().setEnd(true); } } - return logResult; - } catch (Exception e) { - logger.error(e.getMessage(), e); - return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); - } - } + return logResult; + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); + } + } - @RequestMapping("/logKill") - @ResponseBody - public ReturnT logKill(int id){ - // base check - XxlJobLog log = xxlJobLogDao.load(id); - XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId()); - if (jobInfo==null) { - return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid")); - } - if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) { - return new ReturnT(500, I18nUtil.getString("joblog_kill_log_limit")); - } + @RequestMapping("/logKill") + @ResponseBody + public ReturnT logKill(int id) { + // base check + XxlJobLog log = xxlJobLogDao.load(id); + XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId()); + if (jobInfo == null) { + return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid")); + } + if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) { + return new ReturnT(500, I18nUtil.getString("joblog_kill_log_limit")); + } - // request of kill - ReturnT runResult = null; - try { - ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress()); - runResult = executorBiz.kill(new KillParam(jobInfo.getId())); - } catch (Exception e) { - logger.error(e.getMessage(), e); - runResult = new ReturnT(500, e.getMessage()); - } + // request of kill + ReturnT runResult = null; + try { + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress()); + runResult = executorBiz.kill(new KillParam(jobInfo.getId())); + } catch (Exception e) { + logger.error(e.getMessage(), e); + runResult = new ReturnT(500, e.getMessage()); + } - if (ReturnT.SUCCESS_CODE == runResult.getCode()) { - log.setHandleCode(ReturnT.FAIL_CODE); - log.setHandleMsg( I18nUtil.getString("joblog_kill_log_byman")+":" + (runResult.getMsg()!=null?runResult.getMsg():"")); - log.setHandleTime(new Date()); - XxlJobCompleter.updateHandleInfoAndFinish(log); - return new ReturnT(runResult.getMsg()); - } else { - return new ReturnT(500, runResult.getMsg()); - } - } + if (ReturnT.SUCCESS_CODE == runResult.getCode()) { + log.setHandleCode(ReturnT.FAIL_CODE); + log.setHandleMsg(I18nUtil.getString("joblog_kill_log_byman") + ":" + (runResult.getMsg() != null ? runResult.getMsg() : "")); + log.setHandleTime(new Date()); + XxlJobCompleter.updateHandleInfoAndFinish(log); + return new ReturnT(runResult.getMsg()); + } else { + return new ReturnT(500, runResult.getMsg()); + } + } - @RequestMapping("/clearLog") - @ResponseBody - public ReturnT clearLog(int jobGroup, int jobId, int type){ + @RequestMapping("/clearLog") + @ResponseBody + public ReturnT clearLog(int jobGroup, int jobId, int type) { - Date clearBeforeTime = null; - int clearBeforeNum = 0; - if (type == 1) { - clearBeforeTime = DateUtil.addMonths(new Date(), -1); // 清理一个月之前日志数据 - } else if (type == 2) { - clearBeforeTime = DateUtil.addMonths(new Date(), -3); // 清理三个月之前日志数据 - } else if (type == 3) { - clearBeforeTime = DateUtil.addMonths(new Date(), -6); // 清理六个月之前日志数据 - } else if (type == 4) { - clearBeforeTime = DateUtil.addYears(new Date(), -1); // 清理一年之前日志数据 - } else if (type == 5) { - clearBeforeNum = 1000; // 清理一千条以前日志数据 - } else if (type == 6) { - clearBeforeNum = 10000; // 清理一万条以前日志数据 - } else if (type == 7) { - clearBeforeNum = 30000; // 清理三万条以前日志数据 - } else if (type == 8) { - clearBeforeNum = 100000; // 清理十万条以前日志数据 - } else if (type == 9) { - clearBeforeNum = 0; // 清理所有日志数据 - } else { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_clean_type_unvalid")); - } + Date clearBeforeTime = null; + int clearBeforeNum = 0; + if (type == 1) { + clearBeforeTime = DateUtil.addMonths(new Date(), -1); // 清理一个月之前日志数据 + } else if (type == 2) { + clearBeforeTime = DateUtil.addMonths(new Date(), -3); // 清理三个月之前日志数据 + } else if (type == 3) { + clearBeforeTime = DateUtil.addMonths(new Date(), -6); // 清理六个月之前日志数据 + } else if (type == 4) { + clearBeforeTime = DateUtil.addYears(new Date(), -1); // 清理一年之前日志数据 + } else if (type == 5) { + clearBeforeNum = 1000; // 清理一千条以前日志数据 + } else if (type == 6) { + clearBeforeNum = 10000; // 清理一万条以前日志数据 + } else if (type == 7) { + clearBeforeNum = 30000; // 清理三万条以前日志数据 + } else if (type == 8) { + clearBeforeNum = 100000; // 清理十万条以前日志数据 + } else if (type == 9) { + clearBeforeNum = 0; // 清理所有日志数据 + } else { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_clean_type_unvalid")); + } - List logIds = null; - do { - logIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000); - if (logIds!=null && logIds.size()>0) { - xxlJobLogDao.clearLog(logIds); - } - } while (logIds!=null && logIds.size()>0); + List logIds = null; + do { + logIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000); + if (logIds != null && logIds.size() > 0) { + xxlJobLogDao.clearLog(logIds); + } + } while (logIds != null && logIds.size() > 0); - return ReturnT.SUCCESS; - } + return ReturnT.SUCCESS; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java index 3f4c7559..b38e1b1b 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java @@ -40,7 +40,7 @@ public class UserController { // 执行器列表 List groupList = xxlJobGroupDao.findAll(); - model.addAttribute("groupList", groupList); + model.addAttribute("groupList" , groupList); return "user/user.index"; } @@ -57,17 +57,17 @@ public class UserController { int list_count = xxlJobUserDao.pageListCount(start, length, username, role); // filter - if (list!=null && list.size()>0) { - for (XxlJobUser item: list) { + if (list != null && list.size() > 0) { + for (XxlJobUser item : list) { item.setPassword(null); } } // package result Map maps = new HashMap(); - maps.put("recordsTotal", list_count); // 总记录数 - maps.put("recordsFiltered", list_count); // 过滤后的总记录数 - maps.put("data", list); // 分页列表 + maps.put("recordsTotal" , list_count); // 总记录数 + maps.put("recordsFiltered" , list_count); // 过滤后的总记录数 + maps.put("data" , list); // 分页列表 return maps; } @@ -78,19 +78,19 @@ public class UserController { // valid username if (!StringUtils.hasText(xxlJobUser.getUsername())) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input")+I18nUtil.getString("user_username") ); + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input") + I18nUtil.getString("user_username")); } xxlJobUser.setUsername(xxlJobUser.getUsername().trim()); - if (!(xxlJobUser.getUsername().length()>=4 && xxlJobUser.getUsername().length()<=20)) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + if (!(xxlJobUser.getUsername().length() >= 4 && xxlJobUser.getUsername().length() <= 20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]"); } // valid password if (!StringUtils.hasText(xxlJobUser.getPassword())) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input")+I18nUtil.getString("user_password") ); + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input") + I18nUtil.getString("user_password")); } xxlJobUser.setPassword(xxlJobUser.getPassword().trim()); - if (!(xxlJobUser.getPassword().length()>=4 && xxlJobUser.getPassword().length()<=20)) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + if (!(xxlJobUser.getPassword().length() >= 4 && xxlJobUser.getPassword().length() <= 20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]"); } // md5 password xxlJobUser.setPassword(DigestUtils.md5DigestAsHex(xxlJobUser.getPassword().getBytes())); @@ -98,7 +98,7 @@ public class UserController { // check repeat XxlJobUser existUser = xxlJobUserDao.loadByUserName(xxlJobUser.getUsername()); if (existUser != null) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("user_username_repeat") ); + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("user_username_repeat")); } // write @@ -120,8 +120,8 @@ public class UserController { // valid password if (StringUtils.hasText(xxlJobUser.getPassword())) { xxlJobUser.setPassword(xxlJobUser.getPassword().trim()); - if (!(xxlJobUser.getPassword().length()>=4 && xxlJobUser.getPassword().length()<=20)) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + if (!(xxlJobUser.getPassword().length() >= 4 && xxlJobUser.getPassword().length() <= 20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]"); } // md5 password xxlJobUser.setPassword(DigestUtils.md5DigestAsHex(xxlJobUser.getPassword().getBytes())); @@ -151,15 +151,15 @@ public class UserController { @RequestMapping("/updatePwd") @ResponseBody - public ReturnT updatePwd(HttpServletRequest request, String password){ + public ReturnT updatePwd(HttpServletRequest request, String password) { // valid password - if (password==null || password.trim().length()==0){ + if (password == null || password.trim().length() == 0) { return new ReturnT(ReturnT.FAIL.getCode(), "密码不可为空"); } password = password.trim(); - if (!(password.length()>=4 && password.length()<=20)) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + if (!(password.length() >= 4 && password.length() <= 20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]"); } // md5 password diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java index 379efd46..054d6ef5 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java @@ -8,22 +8,23 @@ import java.lang.annotation.Target; /** * 权限限制 + * * @author xuxueli 2015-12-12 18:29:02 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface PermissionLimit { - - /** - * 登录拦截 (默认拦截) - */ - boolean limit() default true; - /** - * 要求管理员权限 - * - * @return - */ - boolean adminuser() default false; + /** + * 登录拦截 (默认拦截) + */ + boolean limit() default true; -} \ No newline at end of file + /** + * 要求管理员权限 + * + * @return + */ + boolean adminuser() default false; + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java index e55b890f..6714d1ec 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java @@ -19,25 +19,25 @@ import java.util.HashMap; @Component public class CookieInterceptor implements AsyncHandlerInterceptor { - @Override - public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, - ModelAndView modelAndView) throws Exception { + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, + ModelAndView modelAndView) throws Exception { - // cookie - if (modelAndView!=null && request.getCookies()!=null && request.getCookies().length>0) { - HashMap cookieMap = new HashMap(); - for (Cookie ck : request.getCookies()) { - cookieMap.put(ck.getName(), ck); - } - modelAndView.addObject("cookieMap", cookieMap); - } + // cookie + if (modelAndView != null && request.getCookies() != null && request.getCookies().length > 0) { + HashMap cookieMap = new HashMap(); + for (Cookie ck : request.getCookies()) { + cookieMap.put(ck.getName(), ck); + } + modelAndView.addObject("cookieMap" , cookieMap); + } - // static method - if (modelAndView != null) { - modelAndView.addObject("I18nUtil", FtlUtil.generateStaticModel(I18nUtil.class.getName())); - } + // static method + if (modelAndView != null) { + modelAndView.addObject("I18nUtil" , FtlUtil.generateStaticModel(I18nUtil.class.getName())); + } - AsyncHandlerInterceptor.super.postHandle(request, response, handler, modelAndView); - } + AsyncHandlerInterceptor.super.postHandle(request, response, handler, modelAndView); + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java index 19eac735..ecaeca0f 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java @@ -20,40 +20,40 @@ import javax.servlet.http.HttpServletResponse; @Component public class PermissionInterceptor implements AsyncHandlerInterceptor { - @Resource - private LoginService loginService; + @Resource + private LoginService loginService; - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - if (!(handler instanceof HandlerMethod)) { - return AsyncHandlerInterceptor.super.preHandle(request, response, handler); - } + if (!(handler instanceof HandlerMethod)) { + return AsyncHandlerInterceptor.super.preHandle(request, response, handler); + } - // if need login - boolean needLogin = true; - boolean needAdminuser = false; - HandlerMethod method = (HandlerMethod)handler; - PermissionLimit permission = method.getMethodAnnotation(PermissionLimit.class); - if (permission!=null) { - needLogin = permission.limit(); - needAdminuser = permission.adminuser(); - } + // if need login + boolean needLogin = true; + boolean needAdminuser = false; + HandlerMethod method = (HandlerMethod) handler; + PermissionLimit permission = method.getMethodAnnotation(PermissionLimit.class); + if (permission != null) { + needLogin = permission.limit(); + needAdminuser = permission.adminuser(); + } - if (needLogin) { - XxlJobUser loginUser = loginService.ifLogin(request, response); - if (loginUser == null) { - response.setStatus(302); - response.setHeader("location", request.getContextPath()+"/toLogin"); - return false; - } - if (needAdminuser && loginUser.getRole()!=1) { - throw new RuntimeException(I18nUtil.getString("system_permission_limit")); - } - request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser); - } + if (needLogin) { + XxlJobUser loginUser = loginService.ifLogin(request, response); + if (loginUser == null) { + response.setStatus(302); + response.setHeader("location" , request.getContextPath() + "/toLogin"); + return false; + } + if (needAdminuser && loginUser.getRole() != 1) { + throw new RuntimeException(I18nUtil.getString("system_permission_limit")); + } + request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser); + } - return AsyncHandlerInterceptor.super.preHandle(request, response, handler); - } + return AsyncHandlerInterceptor.super.preHandle(request, response, handler); + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java index 114407b6..4cd7f193 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java @@ -1,8 +1,8 @@ package com.xxl.job.admin.controller.resolver; import com.xxl.job.admin.core.exception.XxlJobException; -import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.admin.core.util.JacksonUtil; +import com.xxl.job.core.biz.model.ReturnT; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -22,45 +22,45 @@ import java.io.IOException; */ @Component public class WebExceptionResolver implements HandlerExceptionResolver { - private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class); + private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class); - @Override - public ModelAndView resolveException(HttpServletRequest request, - HttpServletResponse response, Object handler, Exception ex) { + @Override + public ModelAndView resolveException(HttpServletRequest request, + HttpServletResponse response, Object handler, Exception ex) { - if (!(ex instanceof XxlJobException)) { - logger.error("WebExceptionResolver:{}", ex); - } + if (!(ex instanceof XxlJobException)) { + logger.error("WebExceptionResolver:{}" , ex); + } - // if json - boolean isJson = false; - if (handler instanceof HandlerMethod) { - HandlerMethod method = (HandlerMethod)handler; - ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class); - if (responseBody != null) { - isJson = true; - } - } + // if json + boolean isJson = false; + if (handler instanceof HandlerMethod) { + HandlerMethod method = (HandlerMethod) handler; + ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class); + if (responseBody != null) { + isJson = true; + } + } - // error result - ReturnT errorResult = new ReturnT(ReturnT.FAIL_CODE, ex.toString().replaceAll("\n", "
")); + // error result + ReturnT errorResult = new ReturnT(ReturnT.FAIL_CODE, ex.toString().replaceAll("\n" , "
")); - // response - ModelAndView mv = new ModelAndView(); - if (isJson) { - try { - response.setContentType("application/json;charset=utf-8"); - response.getWriter().print(JacksonUtil.writeValueAsString(errorResult)); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - return mv; - } else { + // response + ModelAndView mv = new ModelAndView(); + if (isJson) { + try { + response.setContentType("application/json;charset=utf-8"); + response.getWriter().print(JacksonUtil.writeValueAsString(errorResult)); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + return mv; + } else { - mv.addObject("exceptionMsg", errorResult.getMsg()); - mv.setViewName("/common/common.exception"); - return mv; - } - } - -} \ No newline at end of file + mv.addObject("exceptionMsg" , errorResult.getMsg()); + mv.setViewName("/common/common.exception"); + return mv; + } + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java index e47b6dc6..d3d2914a 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java @@ -8,230 +8,230 @@ import java.util.Date; * @author xuxueli 2016-1-12 18:25:49 */ public class XxlJobInfo { - - private int id; // 主键ID - - private int jobGroup; // 执行器主键ID - private String jobDesc; - - private Date addTime; - private Date updateTime; - - private String author; // 负责人 - private String alarmEmail; // 报警邮件 - private String scheduleType; // 调度类型 - private String scheduleConf; // 调度配置,值含义取决于调度类型 - private String misfireStrategy; // 调度过期策略 + private int id; // 主键ID - private String executorRouteStrategy; // 执行器路由策略 - private String executorHandler; // 执行器,任务Handler名称 - private String executorParam; // 执行器,任务参数 - private String executorBlockStrategy; // 阻塞处理策略 - private int executorTimeout; // 任务执行超时时间,单位秒 - private int executorFailRetryCount; // 失败重试次数 - - private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum - private String glueSource; // GLUE源代码 - private String glueRemark; // GLUE备注 - private Date glueUpdatetime; // GLUE更新时间 + private int jobGroup; // 执行器主键ID + private String jobDesc; - private String childJobId; // 子任务ID,多个逗号分隔 + private Date addTime; + private Date updateTime; - private int triggerStatus; // 调度状态:0-停止,1-运行 - private long triggerLastTime; // 上次调度时间 - private long triggerNextTime; // 下次调度时间 + private String author; // 负责人 + private String alarmEmail; // 报警邮件 + + private String scheduleType; // 调度类型 + private String scheduleConf; // 调度配置,值含义取决于调度类型 + private String misfireStrategy; // 调度过期策略 + + private String executorRouteStrategy; // 执行器路由策略 + private String executorHandler; // 执行器,任务Handler名称 + private String executorParam; // 执行器,任务参数 + private String executorBlockStrategy; // 阻塞处理策略 + private int executorTimeout; // 任务执行超时时间,单位秒 + private int executorFailRetryCount; // 失败重试次数 + + private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum + private String glueSource; // GLUE源代码 + private String glueRemark; // GLUE备注 + private Date glueUpdatetime; // GLUE更新时间 + + private String childJobId; // 子任务ID,多个逗号分隔 + + private int triggerStatus; // 调度状态:0-停止,1-运行 + private long triggerLastTime; // 上次调度时间 + private long triggerNextTime; // 下次调度时间 - public int getId() { - return id; - } + public int getId() { + return id; + } - public void setId(int id) { - this.id = id; - } + public void setId(int id) { + this.id = id; + } - public int getJobGroup() { - return jobGroup; - } + public int getJobGroup() { + return jobGroup; + } - public void setJobGroup(int jobGroup) { - this.jobGroup = jobGroup; - } + public void setJobGroup(int jobGroup) { + this.jobGroup = jobGroup; + } - public String getJobDesc() { - return jobDesc; - } + public String getJobDesc() { + return jobDesc; + } - public void setJobDesc(String jobDesc) { - this.jobDesc = jobDesc; - } + public void setJobDesc(String jobDesc) { + this.jobDesc = jobDesc; + } - public Date getAddTime() { - return addTime; - } + public Date getAddTime() { + return addTime; + } - public void setAddTime(Date addTime) { - this.addTime = addTime; - } + public void setAddTime(Date addTime) { + this.addTime = addTime; + } - public Date getUpdateTime() { - return updateTime; - } + public Date getUpdateTime() { + return updateTime; + } - public void setUpdateTime(Date updateTime) { - this.updateTime = updateTime; - } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } - public String getAuthor() { - return author; - } + public String getAuthor() { + return author; + } - public void setAuthor(String author) { - this.author = author; - } + public void setAuthor(String author) { + this.author = author; + } - public String getAlarmEmail() { - return alarmEmail; - } + public String getAlarmEmail() { + return alarmEmail; + } - public void setAlarmEmail(String alarmEmail) { - this.alarmEmail = alarmEmail; - } + public void setAlarmEmail(String alarmEmail) { + this.alarmEmail = alarmEmail; + } - public String getScheduleType() { - return scheduleType; - } + public String getScheduleType() { + return scheduleType; + } - public void setScheduleType(String scheduleType) { - this.scheduleType = scheduleType; - } + public void setScheduleType(String scheduleType) { + this.scheduleType = scheduleType; + } - public String getScheduleConf() { - return scheduleConf; - } + public String getScheduleConf() { + return scheduleConf; + } - public void setScheduleConf(String scheduleConf) { - this.scheduleConf = scheduleConf; - } + public void setScheduleConf(String scheduleConf) { + this.scheduleConf = scheduleConf; + } - public String getMisfireStrategy() { - return misfireStrategy; - } + public String getMisfireStrategy() { + return misfireStrategy; + } - public void setMisfireStrategy(String misfireStrategy) { - this.misfireStrategy = misfireStrategy; - } + public void setMisfireStrategy(String misfireStrategy) { + this.misfireStrategy = misfireStrategy; + } - public String getExecutorRouteStrategy() { - return executorRouteStrategy; - } + public String getExecutorRouteStrategy() { + return executorRouteStrategy; + } - public void setExecutorRouteStrategy(String executorRouteStrategy) { - this.executorRouteStrategy = executorRouteStrategy; - } + public void setExecutorRouteStrategy(String executorRouteStrategy) { + this.executorRouteStrategy = executorRouteStrategy; + } - public String getExecutorHandler() { - return executorHandler; - } + public String getExecutorHandler() { + return executorHandler; + } - public void setExecutorHandler(String executorHandler) { - this.executorHandler = executorHandler; - } + public void setExecutorHandler(String executorHandler) { + this.executorHandler = executorHandler; + } - public String getExecutorParam() { - return executorParam; - } + public String getExecutorParam() { + return executorParam; + } - public void setExecutorParam(String executorParam) { - this.executorParam = executorParam; - } + public void setExecutorParam(String executorParam) { + this.executorParam = executorParam; + } - public String getExecutorBlockStrategy() { - return executorBlockStrategy; - } + public String getExecutorBlockStrategy() { + return executorBlockStrategy; + } - public void setExecutorBlockStrategy(String executorBlockStrategy) { - this.executorBlockStrategy = executorBlockStrategy; - } + public void setExecutorBlockStrategy(String executorBlockStrategy) { + this.executorBlockStrategy = executorBlockStrategy; + } - public int getExecutorTimeout() { - return executorTimeout; - } + public int getExecutorTimeout() { + return executorTimeout; + } - public void setExecutorTimeout(int executorTimeout) { - this.executorTimeout = executorTimeout; - } + public void setExecutorTimeout(int executorTimeout) { + this.executorTimeout = executorTimeout; + } - public int getExecutorFailRetryCount() { - return executorFailRetryCount; - } + public int getExecutorFailRetryCount() { + return executorFailRetryCount; + } - public void setExecutorFailRetryCount(int executorFailRetryCount) { - this.executorFailRetryCount = executorFailRetryCount; - } + public void setExecutorFailRetryCount(int executorFailRetryCount) { + this.executorFailRetryCount = executorFailRetryCount; + } - public String getGlueType() { - return glueType; - } + public String getGlueType() { + return glueType; + } - public void setGlueType(String glueType) { - this.glueType = glueType; - } + public void setGlueType(String glueType) { + this.glueType = glueType; + } - public String getGlueSource() { - return glueSource; - } + public String getGlueSource() { + return glueSource; + } - public void setGlueSource(String glueSource) { - this.glueSource = glueSource; - } + public void setGlueSource(String glueSource) { + this.glueSource = glueSource; + } - public String getGlueRemark() { - return glueRemark; - } + public String getGlueRemark() { + return glueRemark; + } - public void setGlueRemark(String glueRemark) { - this.glueRemark = glueRemark; - } + public void setGlueRemark(String glueRemark) { + this.glueRemark = glueRemark; + } - public Date getGlueUpdatetime() { - return glueUpdatetime; - } + public Date getGlueUpdatetime() { + return glueUpdatetime; + } - public void setGlueUpdatetime(Date glueUpdatetime) { - this.glueUpdatetime = glueUpdatetime; - } + public void setGlueUpdatetime(Date glueUpdatetime) { + this.glueUpdatetime = glueUpdatetime; + } - public String getChildJobId() { - return childJobId; - } + public String getChildJobId() { + return childJobId; + } - public void setChildJobId(String childJobId) { - this.childJobId = childJobId; - } + public void setChildJobId(String childJobId) { + this.childJobId = childJobId; + } - public int getTriggerStatus() { - return triggerStatus; - } + public int getTriggerStatus() { + return triggerStatus; + } - public void setTriggerStatus(int triggerStatus) { - this.triggerStatus = triggerStatus; - } + public void setTriggerStatus(int triggerStatus) { + this.triggerStatus = triggerStatus; + } - public long getTriggerLastTime() { - return triggerLastTime; - } + public long getTriggerLastTime() { + return triggerLastTime; + } - public void setTriggerLastTime(long triggerLastTime) { - this.triggerLastTime = triggerLastTime; - } + public void setTriggerLastTime(long triggerLastTime) { + this.triggerLastTime = triggerLastTime; + } - public long getTriggerNextTime() { - return triggerNextTime; - } + public long getTriggerNextTime() { + return triggerNextTime; + } - public void setTriggerNextTime(long triggerNextTime) { - this.triggerNextTime = triggerNextTime; - } + public void setTriggerNextTime(long triggerNextTime) { + this.triggerNextTime = triggerNextTime; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java index 7d3072aa..f3301af6 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java @@ -4,154 +4,155 @@ import java.util.Date; /** * xxl-job log, used to track trigger process + * * @author xuxueli 2015-12-19 23:19:09 */ public class XxlJobLog { - - private long id; - - // job info - private int jobGroup; - private int jobId; - // execute info - private String executorAddress; - private String executorHandler; - private String executorParam; - private String executorShardingParam; - private int executorFailRetryCount; - - // trigger info - private Date triggerTime; - private int triggerCode; - private String triggerMsg; - - // handle info - private Date handleTime; - private int handleCode; - private String handleMsg; + private long id; - // alarm info - private int alarmStatus; + // job info + private int jobGroup; + private int jobId; - public long getId() { - return id; - } + // execute info + private String executorAddress; + private String executorHandler; + private String executorParam; + private String executorShardingParam; + private int executorFailRetryCount; - public void setId(long id) { - this.id = id; - } + // trigger info + private Date triggerTime; + private int triggerCode; + private String triggerMsg; - public int getJobGroup() { - return jobGroup; - } + // handle info + private Date handleTime; + private int handleCode; + private String handleMsg; - public void setJobGroup(int jobGroup) { - this.jobGroup = jobGroup; - } + // alarm info + private int alarmStatus; - public int getJobId() { - return jobId; - } + public long getId() { + return id; + } - public void setJobId(int jobId) { - this.jobId = jobId; - } + public void setId(long id) { + this.id = id; + } - public String getExecutorAddress() { - return executorAddress; - } + public int getJobGroup() { + return jobGroup; + } - public void setExecutorAddress(String executorAddress) { - this.executorAddress = executorAddress; - } + public void setJobGroup(int jobGroup) { + this.jobGroup = jobGroup; + } - public String getExecutorHandler() { - return executorHandler; - } + public int getJobId() { + return jobId; + } - public void setExecutorHandler(String executorHandler) { - this.executorHandler = executorHandler; - } + public void setJobId(int jobId) { + this.jobId = jobId; + } - public String getExecutorParam() { - return executorParam; - } + public String getExecutorAddress() { + return executorAddress; + } - public void setExecutorParam(String executorParam) { - this.executorParam = executorParam; - } + public void setExecutorAddress(String executorAddress) { + this.executorAddress = executorAddress; + } - public String getExecutorShardingParam() { - return executorShardingParam; - } + public String getExecutorHandler() { + return executorHandler; + } - public void setExecutorShardingParam(String executorShardingParam) { - this.executorShardingParam = executorShardingParam; - } + public void setExecutorHandler(String executorHandler) { + this.executorHandler = executorHandler; + } - public int getExecutorFailRetryCount() { - return executorFailRetryCount; - } + public String getExecutorParam() { + return executorParam; + } - public void setExecutorFailRetryCount(int executorFailRetryCount) { - this.executorFailRetryCount = executorFailRetryCount; - } + public void setExecutorParam(String executorParam) { + this.executorParam = executorParam; + } - public Date getTriggerTime() { - return triggerTime; - } + public String getExecutorShardingParam() { + return executorShardingParam; + } - public void setTriggerTime(Date triggerTime) { - this.triggerTime = triggerTime; - } + public void setExecutorShardingParam(String executorShardingParam) { + this.executorShardingParam = executorShardingParam; + } - public int getTriggerCode() { - return triggerCode; - } + public int getExecutorFailRetryCount() { + return executorFailRetryCount; + } - public void setTriggerCode(int triggerCode) { - this.triggerCode = triggerCode; - } + public void setExecutorFailRetryCount(int executorFailRetryCount) { + this.executorFailRetryCount = executorFailRetryCount; + } - public String getTriggerMsg() { - return triggerMsg; - } + public Date getTriggerTime() { + return triggerTime; + } - public void setTriggerMsg(String triggerMsg) { - this.triggerMsg = triggerMsg; - } + public void setTriggerTime(Date triggerTime) { + this.triggerTime = triggerTime; + } - public Date getHandleTime() { - return handleTime; - } + public int getTriggerCode() { + return triggerCode; + } - public void setHandleTime(Date handleTime) { - this.handleTime = handleTime; - } + public void setTriggerCode(int triggerCode) { + this.triggerCode = triggerCode; + } - public int getHandleCode() { - return handleCode; - } + public String getTriggerMsg() { + return triggerMsg; + } - public void setHandleCode(int handleCode) { - this.handleCode = handleCode; - } + public void setTriggerMsg(String triggerMsg) { + this.triggerMsg = triggerMsg; + } - public String getHandleMsg() { - return handleMsg; - } + public Date getHandleTime() { + return handleTime; + } - public void setHandleMsg(String handleMsg) { - this.handleMsg = handleMsg; - } + public void setHandleTime(Date handleTime) { + this.handleTime = handleTime; + } - public int getAlarmStatus() { - return alarmStatus; - } + public int getHandleCode() { + return handleCode; + } - public void setAlarmStatus(int alarmStatus) { - this.alarmStatus = alarmStatus; - } + public void setHandleCode(int handleCode) { + this.handleCode = handleCode; + } + + public String getHandleMsg() { + return handleMsg; + } + + public void setHandleMsg(String handleMsg) { + this.handleMsg = handleMsg; + } + + public int getAlarmStatus() { + return alarmStatus; + } + + public void setAlarmStatus(int alarmStatus) { + this.alarmStatus = alarmStatus; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java index 2f59ffa8..2da3c2da 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java @@ -4,72 +4,73 @@ import java.util.Date; /** * xxl-job log for glue, used to track job code process + * * @author xuxueli 2016-5-19 17:57:46 */ public class XxlJobLogGlue { - - private int id; - private int jobId; // 任务主键ID - private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum - private String glueSource; - private String glueRemark; - private Date addTime; - private Date updateTime; - public int getId() { - return id; - } + private int id; + private int jobId; // 任务主键ID + private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum + private String glueSource; + private String glueRemark; + private Date addTime; + private Date updateTime; - public void setId(int id) { - this.id = id; - } + public int getId() { + return id; + } - public int getJobId() { - return jobId; - } + public void setId(int id) { + this.id = id; + } - public void setJobId(int jobId) { - this.jobId = jobId; - } + public int getJobId() { + return jobId; + } - public String getGlueType() { - return glueType; - } + public void setJobId(int jobId) { + this.jobId = jobId; + } - public void setGlueType(String glueType) { - this.glueType = glueType; - } + public String getGlueType() { + return glueType; + } - public String getGlueSource() { - return glueSource; - } + public void setGlueType(String glueType) { + this.glueType = glueType; + } - public void setGlueSource(String glueSource) { - this.glueSource = glueSource; - } + public String getGlueSource() { + return glueSource; + } - public String getGlueRemark() { - return glueRemark; - } + public void setGlueSource(String glueSource) { + this.glueSource = glueSource; + } - public void setGlueRemark(String glueRemark) { - this.glueRemark = glueRemark; - } + public String getGlueRemark() { + return glueRemark; + } - public Date getAddTime() { - return addTime; - } + public void setGlueRemark(String glueRemark) { + this.glueRemark = glueRemark; + } - public void setAddTime(Date addTime) { - this.addTime = addTime; - } + public Date getAddTime() { + return addTime; + } - public Date getUpdateTime() { - return updateTime; - } + public void setAddTime(Date addTime) { + this.addTime = addTime; + } - public void setUpdateTime(Date updateTime) { - this.updateTime = updateTime; - } + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java index db17327a..6f696df2 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java @@ -6,68 +6,68 @@ import org.springframework.util.StringUtils; * @author xuxueli 2019-05-04 16:43:12 */ public class XxlJobUser { - - private int id; - private String username; // 账号 - private String password; // 密码 - private int role; // 角色:0-普通用户、1-管理员 - private String permission; // 权限:执行器ID列表,多个逗号分割 - public int getId() { - return id; - } + private int id; + private String username; // 账号 + private String password; // 密码 + private int role; // 角色:0-普通用户、1-管理员 + private String permission; // 权限:执行器ID列表,多个逗号分割 - public void setId(int id) { - this.id = id; - } + public int getId() { + return id; + } - public String getUsername() { - return username; - } + public void setId(int id) { + this.id = id; + } - public void setUsername(String username) { - this.username = username; - } + public String getUsername() { + return username; + } - public String getPassword() { - return password; - } + public void setUsername(String username) { + this.username = username; + } - public void setPassword(String password) { - this.password = password; - } + public String getPassword() { + return password; + } - public int getRole() { - return role; - } + public void setPassword(String password) { + this.password = password; + } - public void setRole(int role) { - this.role = role; - } + public int getRole() { + return role; + } - public String getPermission() { - return permission; - } + public void setRole(int role) { + this.role = role; + } - public void setPermission(String permission) { - this.permission = permission; - } + public String getPermission() { + return permission; + } - // plugin - public boolean validPermission(int jobGroup){ - if (this.role == 1) { - return true; - } else { - if (StringUtils.hasText(this.permission)) { - for (String permissionItem : this.permission.split(",")) { - if (String.valueOf(jobGroup).equals(permissionItem)) { - return true; - } - } - } - return false; - } + public void setPermission(String permission) { + this.permission = permission; + } - } + // plugin + public boolean validPermission(int jobGroup) { + if (this.role == 1) { + return true; + } else { + if (StringUtils.hasText(this.permission)) { + for (String permissionItem : this.permission.split(",")) { + if (String.valueOf(jobGroup).equals(permissionItem)) { + return true; + } + } + } + return false; + } + + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java index 5698926a..95542fd0 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java @@ -20,83 +20,85 @@ import java.util.concurrent.*; * @author xuxueli 2015-9-1 18:05:56 */ public class JobCompleteHelper { - private static Logger logger = LoggerFactory.getLogger(JobCompleteHelper.class); - - private static JobCompleteHelper instance = new JobCompleteHelper(); - public static JobCompleteHelper getInstance(){ - return instance; - } + private static Logger logger = LoggerFactory.getLogger(JobCompleteHelper.class); - // ---------------------- monitor ---------------------- + private static JobCompleteHelper instance = new JobCompleteHelper(); - private ThreadPoolExecutor callbackThreadPool = null; - private Thread monitorThread; - private volatile boolean toStop = false; - public void start(){ + public static JobCompleteHelper getInstance() { + return instance; + } - // for callback - callbackThreadPool = new ThreadPoolExecutor( - 2, - 20, - 30L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(3000), - new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "xxl-job, admin JobLosedMonitorHelper-callbackThreadPool-" + r.hashCode()); - } - }, - new RejectedExecutionHandler() { - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - r.run(); - logger.warn(">>>>>>>>>>> xxl-job, callback too fast, match threadpool rejected handler(run now)."); - } - }); + // ---------------------- monitor ---------------------- + + private ThreadPoolExecutor callbackThreadPool = null; + private Thread monitorThread; + private volatile boolean toStop = false; + + public void start() { + + // for callback + callbackThreadPool = new ThreadPoolExecutor( + 2, + 20, + 30L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(3000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobLosedMonitorHelper-callbackThreadPool-" + r.hashCode()); + } + }, + new RejectedExecutionHandler() { + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { + r.run(); + logger.warn(">>>>>>>>>>> xxl-job, callback too fast, match threadpool rejected handler(run now)."); + } + }); - // for monitor - monitorThread = new Thread(new Runnable() { + // for monitor + monitorThread = new Thread(new Runnable() { - @Override - public void run() { + @Override + public void run() { - // wait for JobTriggerPoolHelper-init - try { - TimeUnit.MILLISECONDS.sleep(50); - } catch (InterruptedException e) { - if (!toStop) { - logger.error(e.getMessage(), e); - } - } + // wait for JobTriggerPoolHelper-init + try { + TimeUnit.MILLISECONDS.sleep(50); + } catch (InterruptedException e) { + if (!toStop) { + logger.error(e.getMessage(), e); + } + } - // monitor - while (!toStop) { - try { - // 任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败; - Date losedTime = DateUtil.addMinutes(new Date(), -10); - List losedJobIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLostJobIds(losedTime); + // monitor + while (!toStop) { + try { + // 任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败; + Date losedTime = DateUtil.addMinutes(new Date(), -10); + List losedJobIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLostJobIds(losedTime); - if (losedJobIds!=null && losedJobIds.size()>0) { - for (Long logId: losedJobIds) { + if (losedJobIds != null && losedJobIds.size() > 0) { + for (Long logId : losedJobIds) { - XxlJobLog jobLog = new XxlJobLog(); - jobLog.setId(logId); + XxlJobLog jobLog = new XxlJobLog(); + jobLog.setId(logId); - jobLog.setHandleTime(new Date()); - jobLog.setHandleCode(ReturnT.FAIL_CODE); - jobLog.setHandleMsg( I18nUtil.getString("joblog_lost_fail") ); + jobLog.setHandleTime(new Date()); + jobLog.setHandleCode(ReturnT.FAIL_CODE); + jobLog.setHandleMsg(I18nUtil.getString("joblog_lost_fail")); - XxlJobCompleter.updateHandleInfoAndFinish(jobLog); - } + XxlJobCompleter.updateHandleInfoAndFinish(jobLog); + } - } - } catch (Exception e) { - if (!toStop) { - logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e); - } - } + } + } catch (Exception e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}" , e); + } + } try { TimeUnit.SECONDS.sleep(60); @@ -108,77 +110,76 @@ public class JobCompleteHelper { } - logger.info(">>>>>>>>>>> xxl-job, JobLosedMonitorHelper stop"); + logger.info(">>>>>>>>>>> xxl-job, JobLosedMonitorHelper stop"); - } - }); - monitorThread.setDaemon(true); - monitorThread.setName("xxl-job, admin JobLosedMonitorHelper"); - monitorThread.start(); - } + } + }); + monitorThread.setDaemon(true); + monitorThread.setName("xxl-job, admin JobLosedMonitorHelper"); + monitorThread.start(); + } - public void toStop(){ - toStop = true; + public void toStop() { + toStop = true; - // stop registryOrRemoveThreadPool - callbackThreadPool.shutdownNow(); + // stop registryOrRemoveThreadPool + callbackThreadPool.shutdownNow(); - // stop monitorThread (interrupt and wait) - monitorThread.interrupt(); - try { - monitorThread.join(); - } catch (InterruptedException e) { - logger.error(e.getMessage(), e); - } - } + // stop monitorThread (interrupt and wait) + monitorThread.interrupt(); + try { + monitorThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } - // ---------------------- helper ---------------------- + // ---------------------- helper ---------------------- - public ReturnT callback(List callbackParamList) { + public ReturnT callback(List callbackParamList) { - callbackThreadPool.execute(new Runnable() { - @Override - public void run() { - for (HandleCallbackParam handleCallbackParam: callbackParamList) { - ReturnT callbackResult = callback(handleCallbackParam); - logger.debug(">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}", - (callbackResult.getCode()== ReturnT.SUCCESS_CODE?"success":"fail"), handleCallbackParam, callbackResult); - } - } - }); + callbackThreadPool.execute(new Runnable() { + @Override + public void run() { + for (HandleCallbackParam handleCallbackParam : callbackParamList) { + ReturnT callbackResult = callback(handleCallbackParam); + logger.debug(">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}" , + (callbackResult.getCode() == ReturnT.SUCCESS_CODE ? "success" : "fail"), handleCallbackParam, callbackResult); + } + } + }); - return ReturnT.SUCCESS; - } + return ReturnT.SUCCESS; + } - private ReturnT callback(HandleCallbackParam handleCallbackParam) { - // valid log item - XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(handleCallbackParam.getLogId()); - if (log == null) { - return new ReturnT(ReturnT.FAIL_CODE, "log item not found."); - } - if (log.getHandleCode() > 0) { - return new ReturnT(ReturnT.FAIL_CODE, "log repeate callback."); // avoid repeat callback, trigger child job etc - } + private ReturnT callback(HandleCallbackParam handleCallbackParam) { + // valid log item + XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(handleCallbackParam.getLogId()); + if (log == null) { + return new ReturnT(ReturnT.FAIL_CODE, "log item not found."); + } + if (log.getHandleCode() > 0) { + return new ReturnT(ReturnT.FAIL_CODE, "log repeate callback."); // avoid repeat callback, trigger child job etc + } - // handle msg - StringBuffer handleMsg = new StringBuffer(); - if (log.getHandleMsg()!=null) { - handleMsg.append(log.getHandleMsg()).append("
"); - } - if (handleCallbackParam.getHandleMsg() != null) { - handleMsg.append(handleCallbackParam.getHandleMsg()); - } + // handle msg + StringBuffer handleMsg = new StringBuffer(); + if (log.getHandleMsg() != null) { + handleMsg.append(log.getHandleMsg()).append("
"); + } + if (handleCallbackParam.getHandleMsg() != null) { + handleMsg.append(handleCallbackParam.getHandleMsg()); + } - // success, save log - log.setHandleTime(new Date()); - log.setHandleCode(handleCallbackParam.getHandleCode()); - log.setHandleMsg(handleMsg.toString()); - XxlJobCompleter.updateHandleInfoAndFinish(log); - - return ReturnT.SUCCESS; - } + // success, save log + log.setHandleTime(new Date()); + log.setHandleCode(handleCallbackParam.getHandleCode()); + log.setHandleMsg(handleMsg.toString()); + XxlJobCompleter.updateHandleInfoAndFinish(log); + return ReturnT.SUCCESS; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index 33e4d250..82c315db 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -17,65 +17,67 @@ import java.util.concurrent.TimeUnit; * @author xuxueli 2015-9-1 18:05:56 */ public class JobFailMonitorHelper { - private static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class); - - private static JobFailMonitorHelper instance = new JobFailMonitorHelper(); - public static JobFailMonitorHelper getInstance(){ - return instance; - } + private static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class); - // ---------------------- monitor ---------------------- + private static JobFailMonitorHelper instance = new JobFailMonitorHelper(); - private Thread monitorThread; - private volatile boolean toStop = false; - public void start(){ - monitorThread = new Thread(new Runnable() { + public static JobFailMonitorHelper getInstance() { + return instance; + } - @Override - public void run() { + // ---------------------- monitor ---------------------- - // monitor - while (!toStop) { - try { + private Thread monitorThread; + private volatile boolean toStop = false; - List failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findFailJobLogIds(1000); - if (failLogIds!=null && !failLogIds.isEmpty()) { - for (long failLogId: failLogIds) { + public void start() { + monitorThread = new Thread(new Runnable() { - // lock log - int lockRet = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, 0, -1); - if (lockRet < 1) { - continue; - } - XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(failLogId); - XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(log.getJobId()); + @Override + public void run() { - // 1、fail retry monitor - if (log.getExecutorFailRetryCount() > 0) { - JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount()-1), log.getExecutorShardingParam(), log.getExecutorParam(), null); - String retryMsg = "

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_type_retry") +"<<<<<<<<<<<
"; - log.setTriggerMsg(log.getTriggerMsg() + retryMsg); - XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(log); - } + // monitor + while (!toStop) { + try { - // 2、fail alarm monitor - int newAlarmStatus = 0; // 告警状态:0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败 - if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) { - boolean alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, log); - newAlarmStatus = alarmResult?2:3; - } else { - newAlarmStatus = 1; - } + List failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findFailJobLogIds(1000); + if (failLogIds != null && !failLogIds.isEmpty()) { + for (long failLogId : failLogIds) { - XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, -1, newAlarmStatus); - } - } + // lock log + int lockRet = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, 0, -1); + if (lockRet < 1) { + continue; + } + XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(failLogId); + XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(log.getJobId()); - } catch (Exception e) { - if (!toStop) { - logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e); - } - } + // 1、fail retry monitor + if (log.getExecutorFailRetryCount() > 0) { + JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount() - 1), log.getExecutorShardingParam(), log.getExecutorParam(), null); + String retryMsg = "

>>>>>>>>>>>" + I18nUtil.getString("jobconf_trigger_type_retry") + "<<<<<<<<<<<
"; + log.setTriggerMsg(log.getTriggerMsg() + retryMsg); + XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(log); + } + + // 2、fail alarm monitor + int newAlarmStatus = 0; // 告警状态:0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败 + if (info != null && info.getAlarmEmail() != null && info.getAlarmEmail().trim().length() > 0) { + boolean alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, log); + newAlarmStatus = alarmResult ? 2 : 3; + } else { + newAlarmStatus = 1; + } + + XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, -1, newAlarmStatus); + } + } + + } catch (Exception e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}" , e); + } + } try { TimeUnit.SECONDS.sleep(10); @@ -87,24 +89,24 @@ public class JobFailMonitorHelper { } - logger.info(">>>>>>>>>>> xxl-job, job fail monitor thread stop"); + logger.info(">>>>>>>>>>> xxl-job, job fail monitor thread stop"); - } - }); - monitorThread.setDaemon(true); - monitorThread.setName("xxl-job, admin JobFailMonitorHelper"); - monitorThread.start(); - } + } + }); + monitorThread.setDaemon(true); + monitorThread.setName("xxl-job, admin JobFailMonitorHelper"); + monitorThread.start(); + } - public void toStop(){ - toStop = true; - // interrupt and wait - monitorThread.interrupt(); - try { - monitorThread.join(); - } catch (InterruptedException e) { - logger.error(e.getMessage(), e); - } - } + public void toStop() { + toStop = true; + // interrupt and wait + monitorThread.interrupt(); + try { + monitorThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java index 37edfd98..a73fd7cd 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java @@ -15,190 +15,192 @@ import java.util.concurrent.*; /** * job registry instance + * * @author xuxueli 2016-10-02 19:10:24 */ public class JobRegistryHelper { - private static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class); + private static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class); - private static JobRegistryHelper instance = new JobRegistryHelper(); - public static JobRegistryHelper getInstance(){ - return instance; - } + private static JobRegistryHelper instance = new JobRegistryHelper(); - private ThreadPoolExecutor registryOrRemoveThreadPool = null; - private Thread registryMonitorThread; - private volatile boolean toStop = false; + public static JobRegistryHelper getInstance() { + return instance; + } - public void start(){ + private ThreadPoolExecutor registryOrRemoveThreadPool = null; + private Thread registryMonitorThread; + private volatile boolean toStop = false; - // for registry or remove - registryOrRemoveThreadPool = new ThreadPoolExecutor( - 2, - 10, - 30L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(2000), - new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "xxl-job, admin JobRegistryMonitorHelper-registryOrRemoveThreadPool-" + r.hashCode()); - } - }, - new RejectedExecutionHandler() { - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - r.run(); - logger.warn(">>>>>>>>>>> xxl-job, registry or remove too fast, match threadpool rejected handler(run now)."); - } - }); + public void start() { - // for monitor - registryMonitorThread = new Thread(new Runnable() { - @Override - public void run() { - while (!toStop) { - try { - // auto registry group - List groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().findByAddressType(0); - if (groupList!=null && !groupList.isEmpty()) { + // for registry or remove + registryOrRemoveThreadPool = new ThreadPoolExecutor( + 2, + 10, + 30L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(2000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobRegistryMonitorHelper-registryOrRemoveThreadPool-" + r.hashCode()); + } + }, + new RejectedExecutionHandler() { + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { + r.run(); + logger.warn(">>>>>>>>>>> xxl-job, registry or remove too fast, match threadpool rejected handler(run now)."); + } + }); - // remove dead address (admin/executor) - List ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date()); - if (ids!=null && ids.size()>0) { - XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids); - } + // for monitor + registryMonitorThread = new Thread(new Runnable() { + @Override + public void run() { + while (!toStop) { + try { + // auto registry group + List groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().findByAddressType(0); + if (groupList != null && !groupList.isEmpty()) { - // fresh online address (admin/executor) - HashMap> appAddressMap = new HashMap>(); - List list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); - if (list != null) { - for (XxlJobRegistry item: list) { - if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { - String appname = item.getRegistryKey(); - List registryList = appAddressMap.get(appname); - if (registryList == null) { - registryList = new ArrayList(); - } + // remove dead address (admin/executor) + List ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date()); + if (ids != null && ids.size() > 0) { + XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids); + } - if (!registryList.contains(item.getRegistryValue())) { - registryList.add(item.getRegistryValue()); - } - appAddressMap.put(appname, registryList); - } - } - } + // fresh online address (admin/executor) + HashMap> appAddressMap = new HashMap>(); + List list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); + if (list != null) { + for (XxlJobRegistry item : list) { + if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { + String appname = item.getRegistryKey(); + List registryList = appAddressMap.get(appname); + if (registryList == null) { + registryList = new ArrayList(); + } - // fresh group address - for (XxlJobGroup group: groupList) { - List registryList = appAddressMap.get(group.getAppname()); - String addressListStr = null; - if (registryList!=null && !registryList.isEmpty()) { - Collections.sort(registryList); - StringBuilder addressListSB = new StringBuilder(); - for (String item:registryList) { - addressListSB.append(item).append(","); - } - addressListStr = addressListSB.toString(); - addressListStr = addressListStr.substring(0, addressListStr.length()-1); - } - group.setAddressList(addressListStr); - group.setUpdateTime(new Date()); + if (!registryList.contains(item.getRegistryValue())) { + registryList.add(item.getRegistryValue()); + } + appAddressMap.put(appname, registryList); + } + } + } - XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group); - } - } - } catch (Exception e) { - if (!toStop) { - logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e); - } - } - try { - TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT); - } catch (InterruptedException e) { - if (!toStop) { - logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e); - } - } - } - logger.info(">>>>>>>>>>> xxl-job, job registry monitor thread stop"); - } - }); - registryMonitorThread.setDaemon(true); - registryMonitorThread.setName("xxl-job, admin JobRegistryMonitorHelper-registryMonitorThread"); - registryMonitorThread.start(); - } + // fresh group address + for (XxlJobGroup group : groupList) { + List registryList = appAddressMap.get(group.getAppname()); + String addressListStr = null; + if (registryList != null && !registryList.isEmpty()) { + Collections.sort(registryList); + StringBuilder addressListSB = new StringBuilder(); + for (String item : registryList) { + addressListSB.append(item).append(","); + } + addressListStr = addressListSB.toString(); + addressListStr = addressListStr.substring(0, addressListStr.length() - 1); + } + group.setAddressList(addressListStr); + group.setUpdateTime(new Date()); - public void toStop(){ - toStop = true; + XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group); + } + } + } catch (Exception e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}" , e); + } + } + try { + TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT); + } catch (InterruptedException e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}" , e); + } + } + } + logger.info(">>>>>>>>>>> xxl-job, job registry monitor thread stop"); + } + }); + registryMonitorThread.setDaemon(true); + registryMonitorThread.setName("xxl-job, admin JobRegistryMonitorHelper-registryMonitorThread"); + registryMonitorThread.start(); + } - // stop registryOrRemoveThreadPool - registryOrRemoveThreadPool.shutdownNow(); + public void toStop() { + toStop = true; - // stop monitir (interrupt and wait) - registryMonitorThread.interrupt(); - try { - registryMonitorThread.join(); - } catch (InterruptedException e) { - logger.error(e.getMessage(), e); - } - } + // stop registryOrRemoveThreadPool + registryOrRemoveThreadPool.shutdownNow(); + + // stop monitir (interrupt and wait) + registryMonitorThread.interrupt(); + try { + registryMonitorThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } - // ---------------------- helper ---------------------- + // ---------------------- helper ---------------------- - public ReturnT registry(RegistryParam registryParam) { + public ReturnT registry(RegistryParam registryParam) { - // valid - if (!StringUtils.hasText(registryParam.getRegistryGroup()) - || !StringUtils.hasText(registryParam.getRegistryKey()) - || !StringUtils.hasText(registryParam.getRegistryValue())) { - return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument."); - } + // valid + if (!StringUtils.hasText(registryParam.getRegistryGroup()) + || !StringUtils.hasText(registryParam.getRegistryKey()) + || !StringUtils.hasText(registryParam.getRegistryValue())) { + return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument."); + } - // async execute - registryOrRemoveThreadPool.execute(new Runnable() { - @Override - public void run() { - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); - if (ret < 1) { - XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + // async execute + registryOrRemoveThreadPool.execute(new Runnable() { + @Override + public void run() { + int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + if (ret < 1) { + XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); - // fresh - freshGroupRegistryInfo(registryParam); - } - } - }); + // fresh + freshGroupRegistryInfo(registryParam); + } + } + }); - return ReturnT.SUCCESS; - } + return ReturnT.SUCCESS; + } - public ReturnT registryRemove(RegistryParam registryParam) { + public ReturnT registryRemove(RegistryParam registryParam) { - // valid - if (!StringUtils.hasText(registryParam.getRegistryGroup()) - || !StringUtils.hasText(registryParam.getRegistryKey()) - || !StringUtils.hasText(registryParam.getRegistryValue())) { - return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument."); - } + // valid + if (!StringUtils.hasText(registryParam.getRegistryGroup()) + || !StringUtils.hasText(registryParam.getRegistryKey()) + || !StringUtils.hasText(registryParam.getRegistryValue())) { + return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument."); + } - // async execute - registryOrRemoveThreadPool.execute(new Runnable() { - @Override - public void run() { - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue()); - if (ret > 0) { - // fresh - freshGroupRegistryInfo(registryParam); - } - } - }); + // async execute + registryOrRemoveThreadPool.execute(new Runnable() { + @Override + public void run() { + int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue()); + if (ret > 0) { + // fresh + freshGroupRegistryInfo(registryParam); + } + } + }); - return ReturnT.SUCCESS; - } + return ReturnT.SUCCESS; + } - private void freshGroupRegistryInfo(RegistryParam registryParam){ - // Under consideration, prevent affecting core tables - } + private void freshGroupRegistryInfo(RegistryParam registryParam) { + // Under consideration, prevent affecting core tables + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java index 398713dd..775b916b 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java @@ -24,32 +24,32 @@ public class JobTriggerPoolHelper { private ThreadPoolExecutor fastTriggerPool = null; private ThreadPoolExecutor slowTriggerPool = null; - public void start(){ + public void start() { fastTriggerPool = new ThreadPoolExecutor( - 10, - XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax(), - 60L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(1000), - new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-" + r.hashCode()); - } - }); + 10, + XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax(), + 60L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(1000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-" + r.hashCode()); + } + }); slowTriggerPool = new ThreadPoolExecutor( - 10, - XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax(), - 60L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(2000), - new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-" + r.hashCode()); - } - }); + 10, + XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax(), + 60L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(2000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-" + r.hashCode()); + } + }); } @@ -62,7 +62,7 @@ public class JobTriggerPoolHelper { // job timeout count - private volatile long minTim = System.currentTimeMillis()/60000; // ms > min + private volatile long minTim = System.currentTimeMillis() / 60000; // ms > min private volatile ConcurrentMap jobTimeoutCountMap = new ConcurrentHashMap<>(); @@ -79,7 +79,7 @@ public class JobTriggerPoolHelper { // choose thread pool ThreadPoolExecutor triggerPool_ = fastTriggerPool; AtomicInteger jobTimeoutCount = jobTimeoutCountMap.get(jobId); - if (jobTimeoutCount!=null && jobTimeoutCount.get() > 10) { // job-timeout 10 times in 1 min + if (jobTimeoutCount != null && jobTimeoutCount.get() > 10) { // job-timeout 10 times in 1 min triggerPool_ = slowTriggerPool; } @@ -98,14 +98,14 @@ public class JobTriggerPoolHelper { } finally { // check timeout-count-map - long minTim_now = System.currentTimeMillis()/60000; + long minTim_now = System.currentTimeMillis() / 60000; if (minTim != minTim_now) { minTim = minTim_now; jobTimeoutCountMap.clear(); } // incr timeout-count-map - long cost = System.currentTimeMillis()-start; + long cost = System.currentTimeMillis() - start; if (cost > 500) { // ob-timeout threshold 500ms AtomicInteger timeoutCount = jobTimeoutCountMap.putIfAbsent(jobId, new AtomicInteger(1)); if (timeoutCount != null) { @@ -120,7 +120,6 @@ public class JobTriggerPoolHelper { } - // ---------------------- helper ---------------------- private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper(); @@ -128,6 +127,7 @@ public class JobTriggerPoolHelper { public static void toStart() { helper.start(); } + public static void toStop() { helper.stop(); } @@ -135,13 +135,11 @@ public class JobTriggerPoolHelper { /** * @param jobId * @param triggerType - * @param failRetryCount - * >=0: use this param - * <0: use param from job info config + * @param failRetryCount >=0: use this param + * <0: use param from job info config * @param executorShardingParam - * @param executorParam - * null: use job param - * not null: cover job param + * @param executorParam null: use job param + * not null: cover job param */ public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam, String addressList) { helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList); diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java index a1523aa4..297e97a3 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java @@ -11,88 +11,88 @@ import javax.servlet.http.HttpServletResponse; */ public class CookieUtil { - // 默认缓存时间,单位/秒, 2H - private static final int COOKIE_MAX_AGE = Integer.MAX_VALUE; - // 保存路径,根路径 - private static final String COOKIE_PATH = "/"; - - /** - * 保存 - * - * @param response - * @param key - * @param value - * @param ifRemember - */ - public static void set(HttpServletResponse response, String key, String value, boolean ifRemember) { - int age = ifRemember?COOKIE_MAX_AGE:-1; - set(response, key, value, null, COOKIE_PATH, age, true); - } + // 默认缓存时间,单位/秒, 2H + private static final int COOKIE_MAX_AGE = Integer.MAX_VALUE; + // 保存路径,根路径 + private static final String COOKIE_PATH = "/"; - /** - * 保存 - * - * @param response - * @param key - * @param value - * @param maxAge - */ - private static void set(HttpServletResponse response, String key, String value, String domain, String path, int maxAge, boolean isHttpOnly) { - Cookie cookie = new Cookie(key, value); - if (domain != null) { - cookie.setDomain(domain); - } - cookie.setPath(path); - cookie.setMaxAge(maxAge); - cookie.setHttpOnly(isHttpOnly); - response.addCookie(cookie); - } - - /** - * 查询value - * - * @param request - * @param key - * @return - */ - public static String getValue(HttpServletRequest request, String key) { - Cookie cookie = get(request, key); - if (cookie != null) { - return cookie.getValue(); - } - return null; - } + /** + * 保存 + * + * @param response + * @param key + * @param value + * @param ifRemember + */ + public static void set(HttpServletResponse response, String key, String value, boolean ifRemember) { + int age = ifRemember ? COOKIE_MAX_AGE : -1; + set(response, key, value, null, COOKIE_PATH, age, true); + } - /** - * 查询Cookie - * - * @param request - * @param key - */ - private static Cookie get(HttpServletRequest request, String key) { - Cookie[] arr_cookie = request.getCookies(); - if (arr_cookie != null && arr_cookie.length > 0) { - for (Cookie cookie : arr_cookie) { - if (cookie.getName().equals(key)) { - return cookie; - } - } - } - return null; - } - - /** - * 删除Cookie - * - * @param request - * @param response - * @param key - */ - public static void remove(HttpServletRequest request, HttpServletResponse response, String key) { - Cookie cookie = get(request, key); - if (cookie != null) { - set(response, key, "", null, COOKIE_PATH, 0, true); - } - } + /** + * 保存 + * + * @param response + * @param key + * @param value + * @param maxAge + */ + private static void set(HttpServletResponse response, String key, String value, String domain, String path, int maxAge, boolean isHttpOnly) { + Cookie cookie = new Cookie(key, value); + if (domain != null) { + cookie.setDomain(domain); + } + cookie.setPath(path); + cookie.setMaxAge(maxAge); + cookie.setHttpOnly(isHttpOnly); + response.addCookie(cookie); + } -} \ No newline at end of file + /** + * 查询value + * + * @param request + * @param key + * @return + */ + public static String getValue(HttpServletRequest request, String key) { + Cookie cookie = get(request, key); + if (cookie != null) { + return cookie.getValue(); + } + return null; + } + + /** + * 查询Cookie + * + * @param request + * @param key + */ + private static Cookie get(HttpServletRequest request, String key) { + Cookie[] arr_cookie = request.getCookies(); + if (arr_cookie != null && arr_cookie.length > 0) { + for (Cookie cookie : arr_cookie) { + if (cookie.getName().equals(key)) { + return cookie; + } + } + } + return null; + } + + /** + * 删除Cookie + * + * @param request + * @param response + * @param key + */ + public static void remove(HttpServletRequest request, HttpServletResponse response, String key) { + Cookie cookie = get(request, key); + if (cookie != null) { + set(response, key, "" , null, COOKIE_PATH, 0, true); + } + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java index 4f4ea3cc..a7559568 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java @@ -12,81 +12,82 @@ import java.io.IOException; /** * Jackson util - * + *

* 1、obj need private and set/get; * 2、do not support inner class; - * + * * @author xuxueli 2015-9-25 18:02:56 */ public class JacksonUtil { - private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class); + private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class); private final static ObjectMapper objectMapper = new ObjectMapper(); + public static ObjectMapper getInstance() { return objectMapper; } /** * bean、array、List、Map --> json - * + * * @param obj * @return json string * @throws Exception */ public static String writeValueAsString(Object obj) { - try { - return getInstance().writeValueAsString(obj); - } catch (JsonGenerationException e) { - logger.error(e.getMessage(), e); - } catch (JsonMappingException e) { - logger.error(e.getMessage(), e); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } + try { + return getInstance().writeValueAsString(obj); + } catch (JsonGenerationException e) { + logger.error(e.getMessage(), e); + } catch (JsonMappingException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } return null; } /** * string --> bean、Map、List(array) - * + * * @param jsonStr * @param clazz * @return obj * @throws Exception */ public static T readValue(String jsonStr, Class clazz) { - try { - return getInstance().readValue(jsonStr, clazz); - } catch (JsonParseException e) { - logger.error(e.getMessage(), e); - } catch (JsonMappingException e) { - logger.error(e.getMessage(), e); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - return null; + try { + return getInstance().readValue(jsonStr, clazz); + } catch (JsonParseException e) { + logger.error(e.getMessage(), e); + } catch (JsonMappingException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + return null; } - /** - * string --> List... - * - * @param jsonStr - * @param parametrized - * @param parameterClasses - * @param - * @return - */ - public static T readValue(String jsonStr, Class parametrized, Class... parameterClasses) { - try { - JavaType javaType = getInstance().getTypeFactory().constructParametricType(parametrized, parameterClasses); - return getInstance().readValue(jsonStr, javaType); - } catch (JsonParseException e) { - logger.error(e.getMessage(), e); - } catch (JsonMappingException e) { - logger.error(e.getMessage(), e); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - return null; - } + /** + * string --> List... + * + * @param jsonStr + * @param parametrized + * @param parameterClasses + * @param + * @return + */ + public static T readValue(String jsonStr, Class parametrized, Class... parameterClasses) { + try { + JavaType javaType = getInstance().getTypeFactory().constructParametricType(parametrized, parameterClasses); + return getInstance().readValue(jsonStr, javaType); + } catch (JsonParseException e) { + logger.error(e.getMessage(), e); + } catch (JsonMappingException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + return null; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java index d640efff..e01dd112 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java @@ -9,41 +9,43 @@ import java.util.List; /** * job info + * * @author xuxueli 2016-1-12 18:03:45 */ @Mapper public interface XxlJobInfoDao { - public List pageList(@Param("offset") int offset, - @Param("pagesize") int pagesize, - @Param("jobGroup") int jobGroup, - @Param("triggerStatus") int triggerStatus, - @Param("jobDesc") String jobDesc, - @Param("executorHandler") String executorHandler, - @Param("author") String author); - public int pageListCount(@Param("offset") int offset, - @Param("pagesize") int pagesize, - @Param("jobGroup") int jobGroup, - @Param("triggerStatus") int triggerStatus, - @Param("jobDesc") String jobDesc, - @Param("executorHandler") String executorHandler, - @Param("author") String author); - - public int save(XxlJobInfo info); + public List pageList(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("triggerStatus") int triggerStatus, + @Param("jobDesc") String jobDesc, + @Param("executorHandler") String executorHandler, + @Param("author") String author); - public XxlJobInfo loadById(@Param("id") int id); - - public int update(XxlJobInfo xxlJobInfo); - - public int delete(@Param("id") long id); + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("triggerStatus") int triggerStatus, + @Param("jobDesc") String jobDesc, + @Param("executorHandler") String executorHandler, + @Param("author") String author); - public List getJobsByGroup(@Param("jobGroup") int jobGroup); + public int save(XxlJobInfo info); - public int findAllCount(); + public XxlJobInfo loadById(@Param("id") int id); - public List scheduleJobQuery(@Param("maxNextTime") long maxNextTime, @Param("pagesize") int pagesize ); + public int update(XxlJobInfo xxlJobInfo); - public int scheduleUpdate(XxlJobInfo xxlJobInfo); + public int delete(@Param("id") long id); + + public List getJobsByGroup(@Param("jobGroup") int jobGroup); + + public int findAllCount(); + + public List scheduleJobQuery(@Param("maxNextTime") long maxNextTime, @Param("pagesize") int pagesize); + + public int scheduleUpdate(XxlJobInfo xxlJobInfo); } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java index 62fa3b4f..7beaf755 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java @@ -10,53 +10,56 @@ import java.util.Map; /** * job log + * * @author xuxueli 2016-1-12 18:03:06 */ @Mapper public interface XxlJobLogDao { - // exist jobId not use jobGroup, not exist use jobGroup - public List pageList(@Param("offset") int offset, - @Param("pagesize") int pagesize, - @Param("jobGroup") int jobGroup, - @Param("jobId") int jobId, - @Param("triggerTimeStart") Date triggerTimeStart, - @Param("triggerTimeEnd") Date triggerTimeEnd, - @Param("logStatus") int logStatus); - public int pageListCount(@Param("offset") int offset, - @Param("pagesize") int pagesize, - @Param("jobGroup") int jobGroup, - @Param("jobId") int jobId, - @Param("triggerTimeStart") Date triggerTimeStart, - @Param("triggerTimeEnd") Date triggerTimeEnd, - @Param("logStatus") int logStatus); - - public XxlJobLog load(@Param("id") long id); + // exist jobId not use jobGroup, not exist use jobGroup + public List pageList(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("jobId") int jobId, + @Param("triggerTimeStart") Date triggerTimeStart, + @Param("triggerTimeEnd") Date triggerTimeEnd, + @Param("logStatus") int logStatus); - public long save(XxlJobLog xxlJobLog); + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("jobId") int jobId, + @Param("triggerTimeStart") Date triggerTimeStart, + @Param("triggerTimeEnd") Date triggerTimeEnd, + @Param("logStatus") int logStatus); - public int updateTriggerInfo(XxlJobLog xxlJobLog); + public XxlJobLog load(@Param("id") long id); - public int updateHandleInfo(XxlJobLog xxlJobLog); - - public int delete(@Param("jobId") int jobId); + public long save(XxlJobLog xxlJobLog); - public Map findLogReport(@Param("from") Date from, - @Param("to") Date to); + public int updateTriggerInfo(XxlJobLog xxlJobLog); - public List findClearLogIds(@Param("jobGroup") int jobGroup, - @Param("jobId") int jobId, - @Param("clearBeforeTime") Date clearBeforeTime, - @Param("clearBeforeNum") int clearBeforeNum, - @Param("pagesize") int pagesize); - public int clearLog(@Param("logIds") List logIds); + public int updateHandleInfo(XxlJobLog xxlJobLog); - public List findFailJobLogIds(@Param("pagesize") int pagesize); + public int delete(@Param("jobId") int jobId); - public int updateAlarmStatus(@Param("logId") long logId, - @Param("oldAlarmStatus") int oldAlarmStatus, - @Param("newAlarmStatus") int newAlarmStatus); + public Map findLogReport(@Param("from") Date from, + @Param("to") Date to); - public List findLostJobIds(@Param("losedTime") Date losedTime); + public List findClearLogIds(@Param("jobGroup") int jobGroup, + @Param("jobId") int jobId, + @Param("clearBeforeTime") Date clearBeforeTime, + @Param("clearBeforeNum") int clearBeforeNum, + @Param("pagesize") int pagesize); + + public int clearLog(@Param("logIds") List logIds); + + public List findFailJobLogIds(@Param("pagesize") int pagesize); + + public int updateAlarmStatus(@Param("logId") long logId, + @Param("oldAlarmStatus") int oldAlarmStatus, + @Param("newAlarmStatus") int newAlarmStatus); + + public List findLostJobIds(@Param("losedTime") Date losedTime); } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java index 3028aed2..8b2b414c 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java @@ -8,17 +8,18 @@ import java.util.List; /** * job log for glue + * * @author xuxueli 2016-5-19 18:04:56 */ @Mapper public interface XxlJobLogGlueDao { - - public int save(XxlJobLogGlue xxlJobLogGlue); - - public List findByJobId(@Param("jobId") int jobId); - public int removeOld(@Param("jobId") int jobId, @Param("limit") int limit); + public int save(XxlJobLogGlue xxlJobLogGlue); + + public List findByJobId(@Param("jobId") int jobId); + + public int removeOld(@Param("jobId") int jobId, @Param("limit") int limit); + + public int deleteByJobId(@Param("jobId") int jobId); - public int deleteByJobId(@Param("jobId") int jobId); - } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java index f4b3dc81..d4e0381a 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java @@ -9,18 +9,19 @@ import java.util.List; /** * job log + * * @author xuxueli 2019-11-22 */ @Mapper public interface XxlJobLogReportDao { - public int save(XxlJobLogReport xxlJobLogReport); + public int save(XxlJobLogReport xxlJobLogReport); - public int update(XxlJobLogReport xxlJobLogReport); + public int update(XxlJobLogReport xxlJobLogReport); - public List queryLogReport(@Param("triggerDayFrom") Date triggerDayFrom, - @Param("triggerDayTo") Date triggerDayTo); + public List queryLogReport(@Param("triggerDayFrom") Date triggerDayFrom, + @Param("triggerDayTo") Date triggerDayTo); - public XxlJobLogReport queryLogReportTotal(); + public XxlJobLogReport queryLogReportTotal(); } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java index e8404947..064ce19f 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java @@ -3,6 +3,7 @@ package com.xxl.job.admin.dao; import com.xxl.job.admin.core.model.XxlJobUser; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; + import java.util.List; /** @@ -11,21 +12,22 @@ import java.util.List; @Mapper public interface XxlJobUserDao { - public List pageList(@Param("offset") int offset, + public List pageList(@Param("offset") int offset, @Param("pagesize") int pagesize, @Param("username") String username, - @Param("role") int role); - public int pageListCount(@Param("offset") int offset, - @Param("pagesize") int pagesize, - @Param("username") String username, - @Param("role") int role); + @Param("role") int role); - public XxlJobUser loadByUserName(@Param("username") String username); + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("username") String username, + @Param("role") int role); - public int save(XxlJobUser xxlJobUser); + public XxlJobUser loadByUserName(@Param("username") String username); - public int update(XxlJobUser xxlJobUser); - - public int delete(@Param("id") int id); + public int save(XxlJobUser xxlJobUser); + + public int update(XxlJobUser xxlJobUser); + + public int delete(@Param("id") int id); } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java index 61da3a27..43c2eff6 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java @@ -9,78 +9,79 @@ import java.util.Map; /** * core job action for xxl-job - * + * * @author xuxueli 2016-5-28 15:30:33 */ public interface XxlJobService { - /** - * page list - * - * @param start - * @param length - * @param jobGroup - * @param jobDesc - * @param executorHandler - * @param author - * @return - */ - public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author); + /** + * page list + * + * @param start + * @param length + * @param jobGroup + * @param jobDesc + * @param executorHandler + * @param author + * @return + */ + public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author); - /** - * add job - * - * @param jobInfo - * @return - */ - public ReturnT add(XxlJobInfo jobInfo); + /** + * add job + * + * @param jobInfo + * @return + */ + public ReturnT add(XxlJobInfo jobInfo); - /** - * update job - * - * @param jobInfo - * @return - */ - public ReturnT update(XxlJobInfo jobInfo); + /** + * update job + * + * @param jobInfo + * @return + */ + public ReturnT update(XxlJobInfo jobInfo); - /** - * remove job - * * - * @param id - * @return - */ - public ReturnT remove(int id); + /** + * remove job + * * + * + * @param id + * @return + */ + public ReturnT remove(int id); - /** - * start job - * - * @param id - * @return - */ - public ReturnT start(int id); + /** + * start job + * + * @param id + * @return + */ + public ReturnT start(int id); - /** - * stop job - * - * @param id - * @return - */ - public ReturnT stop(int id); + /** + * stop job + * + * @param id + * @return + */ + public ReturnT stop(int id); - /** - * dashboard info - * - * @return - */ - public Map dashboardInfo(); + /** + * dashboard info + * + * @return + */ + public Map dashboardInfo(); - /** - * chart info - * - * @param startDate - * @param endDate - * @return - */ - public ReturnT> chartInfo(Date startDate, Date endDate); + /** + * chart info + * + * @param startDate + * @param endDate + * @return + */ + public ReturnT> chartInfo(Date startDate, Date endDate); } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java index 530ee41c..f8f0b433 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java @@ -25,410 +25,411 @@ import java.util.*; /** * core job action for xxl-job + * * @author xuxueli 2016-5-28 15:30:33 */ @Service public class XxlJobServiceImpl implements XxlJobService { - private static Logger logger = LoggerFactory.getLogger(XxlJobServiceImpl.class); + private static Logger logger = LoggerFactory.getLogger(XxlJobServiceImpl.class); - @Resource - private XxlJobGroupDao xxlJobGroupDao; - @Resource - private XxlJobInfoDao xxlJobInfoDao; - @Resource - public XxlJobLogDao xxlJobLogDao; - @Resource - private XxlJobLogGlueDao xxlJobLogGlueDao; - @Resource - private XxlJobLogReportDao xxlJobLogReportDao; - - @Override - public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) { + @Resource + private XxlJobGroupDao xxlJobGroupDao; + @Resource + private XxlJobInfoDao xxlJobInfoDao; + @Resource + public XxlJobLogDao xxlJobLogDao; + @Resource + private XxlJobLogGlueDao xxlJobLogGlueDao; + @Resource + private XxlJobLogReportDao xxlJobLogReportDao; - // page list - List list = xxlJobInfoDao.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); - int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); - - // package result - Map maps = new HashMap(); - maps.put("recordsTotal", list_count); // 总记录数 - maps.put("recordsFiltered", list_count); // 过滤后的总记录数 - maps.put("data", list); // 分页列表 - return maps; - } + @Override + public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) { - @Override - public ReturnT add(XxlJobInfo jobInfo) { + // page list + List list = xxlJobInfoDao.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); + int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); - // valid base - XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup()); - if (group == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_choose")+I18nUtil.getString("jobinfo_field_jobgroup")) ); - } - if (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) ); - } - if (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) ); - } + // package result + Map maps = new HashMap(); + maps.put("recordsTotal" , list_count); // 总记录数 + maps.put("recordsFiltered" , list_count); // 过滤后的总记录数 + maps.put("data" , list); // 分页列表 + return maps; + } - // valid trigger - ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); - if (scheduleTypeEnum == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - if (scheduleTypeEnum == ScheduleTypeEnum.CRON) { - if (jobInfo.getScheduleConf()==null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) { - return new ReturnT(ReturnT.FAIL_CODE, "Cron"+I18nUtil.getString("system_unvalid")); - } - } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE/* || scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) { - if (jobInfo.getScheduleConf() == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")) ); - } - try { - int fixSecond = Integer.valueOf(jobInfo.getScheduleConf()); - if (fixSecond < 1) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - } catch (Exception e) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - } + @Override + public ReturnT add(XxlJobInfo jobInfo) { - // valid job - if (GlueTypeEnum.match(jobInfo.getGlueType()) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_gluetype")+I18nUtil.getString("system_unvalid")) ); - } - if (GlueTypeEnum.BEAN==GlueTypeEnum.match(jobInfo.getGlueType()) && (jobInfo.getExecutorHandler()==null || jobInfo.getExecutorHandler().trim().length()==0) ) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+"JobHandler") ); - } - // 》fix "\r" in shell - if (GlueTypeEnum.GLUE_SHELL==GlueTypeEnum.match(jobInfo.getGlueType()) && jobInfo.getGlueSource()!=null) { - jobInfo.setGlueSource(jobInfo.getGlueSource().replaceAll("\r", "")); - } + // valid base + XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup()); + if (group == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_choose") + I18nUtil.getString("jobinfo_field_jobgroup"))); + } + if (jobInfo.getJobDesc() == null || jobInfo.getJobDesc().trim().length() == 0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_jobdesc"))); + } + if (jobInfo.getAuthor() == null || jobInfo.getAuthor().trim().length() == 0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_author"))); + } - // valid advanced - if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy")+I18nUtil.getString("system_unvalid")) ); - } - if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy")+I18nUtil.getString("system_unvalid")) ); - } - if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy")+I18nUtil.getString("system_unvalid")) ); - } + // valid trigger + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); + if (scheduleTypeEnum == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + if (scheduleTypeEnum == ScheduleTypeEnum.CRON) { + if (jobInfo.getScheduleConf() == null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) { + return new ReturnT(ReturnT.FAIL_CODE, "Cron" + I18nUtil.getString("system_unvalid")); + } + } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE/* || scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) { + if (jobInfo.getScheduleConf() == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type"))); + } + try { + int fixSecond = Integer.valueOf(jobInfo.getScheduleConf()); + if (fixSecond < 1) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + } catch (Exception e) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + } - // 》ChildJobId valid - if (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) { - String[] childJobIds = jobInfo.getChildJobId().split(","); - for (String childJobIdItem: childJobIds) { - if (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) { - XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem)); - if (childJobInfo==null) { - return new ReturnT(ReturnT.FAIL_CODE, - MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_not_found")), childJobIdItem)); - } - } else { - return new ReturnT(ReturnT.FAIL_CODE, - MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_unvalid")), childJobIdItem)); - } - } + // valid job + if (GlueTypeEnum.match(jobInfo.getGlueType()) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_gluetype") + I18nUtil.getString("system_unvalid"))); + } + if (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType()) && (jobInfo.getExecutorHandler() == null || jobInfo.getExecutorHandler().trim().length() == 0)) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + "JobHandler")); + } + // 》fix "\r" in shell + if (GlueTypeEnum.GLUE_SHELL == GlueTypeEnum.match(jobInfo.getGlueType()) && jobInfo.getGlueSource() != null) { + jobInfo.setGlueSource(jobInfo.getGlueSource().replaceAll("\r" , "")); + } - // join , avoid "xxx,," - String temp = ""; - for (String item:childJobIds) { - temp += item + ","; - } - temp = temp.substring(0, temp.length()-1); + // valid advanced + if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy") + I18nUtil.getString("system_unvalid"))); + } + if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy") + I18nUtil.getString("system_unvalid"))); + } + if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy") + I18nUtil.getString("system_unvalid"))); + } - jobInfo.setChildJobId(temp); - } + // 》ChildJobId valid + if (jobInfo.getChildJobId() != null && jobInfo.getChildJobId().trim().length() > 0) { + String[] childJobIds = jobInfo.getChildJobId().split(","); + for (String childJobIdItem : childJobIds) { + if (childJobIdItem != null && childJobIdItem.trim().length() > 0 && isNumeric(childJobIdItem)) { + XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem)); + if (childJobInfo == null) { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_not_found")), childJobIdItem)); + } + } else { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_unvalid")), childJobIdItem)); + } + } - // add in db - jobInfo.setAddTime(new Date()); - jobInfo.setUpdateTime(new Date()); - jobInfo.setGlueUpdatetime(new Date()); - xxlJobInfoDao.save(jobInfo); - if (jobInfo.getId() < 1) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add")+I18nUtil.getString("system_fail")) ); - } + // join , avoid "xxx,," + String temp = ""; + for (String item : childJobIds) { + temp += item + ","; + } + temp = temp.substring(0, temp.length() - 1); - return new ReturnT(String.valueOf(jobInfo.getId())); - } + jobInfo.setChildJobId(temp); + } - private boolean isNumeric(String str){ - try { - int result = Integer.valueOf(str); - return true; - } catch (NumberFormatException e) { - return false; - } - } + // add in db + jobInfo.setAddTime(new Date()); + jobInfo.setUpdateTime(new Date()); + jobInfo.setGlueUpdatetime(new Date()); + xxlJobInfoDao.save(jobInfo); + if (jobInfo.getId() < 1) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add") + I18nUtil.getString("system_fail"))); + } - @Override - public ReturnT update(XxlJobInfo jobInfo) { + return new ReturnT(String.valueOf(jobInfo.getId())); + } - // valid base - if (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) ); - } - if (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) ); - } + private boolean isNumeric(String str) { + try { + int result = Integer.valueOf(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } - // valid trigger - ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); - if (scheduleTypeEnum == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - if (scheduleTypeEnum == ScheduleTypeEnum.CRON) { - if (jobInfo.getScheduleConf()==null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) { - return new ReturnT(ReturnT.FAIL_CODE, "Cron"+I18nUtil.getString("system_unvalid") ); - } - } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE /*|| scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) { - if (jobInfo.getScheduleConf() == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - try { - int fixSecond = Integer.valueOf(jobInfo.getScheduleConf()); - if (fixSecond < 1) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - } catch (Exception e) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - } + @Override + public ReturnT update(XxlJobInfo jobInfo) { - // valid advanced - if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy")+I18nUtil.getString("system_unvalid")) ); - } - if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy")+I18nUtil.getString("system_unvalid")) ); - } - if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy")+I18nUtil.getString("system_unvalid")) ); - } + // valid base + if (jobInfo.getJobDesc() == null || jobInfo.getJobDesc().trim().length() == 0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_jobdesc"))); + } + if (jobInfo.getAuthor() == null || jobInfo.getAuthor().trim().length() == 0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_author"))); + } - // 》ChildJobId valid - if (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) { - String[] childJobIds = jobInfo.getChildJobId().split(","); - for (String childJobIdItem: childJobIds) { - if (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) { - XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem)); - if (childJobInfo==null) { - return new ReturnT(ReturnT.FAIL_CODE, - MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_not_found")), childJobIdItem)); - } - } else { - return new ReturnT(ReturnT.FAIL_CODE, - MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_unvalid")), childJobIdItem)); - } - } + // valid trigger + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); + if (scheduleTypeEnum == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + if (scheduleTypeEnum == ScheduleTypeEnum.CRON) { + if (jobInfo.getScheduleConf() == null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) { + return new ReturnT(ReturnT.FAIL_CODE, "Cron" + I18nUtil.getString("system_unvalid")); + } + } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE /*|| scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) { + if (jobInfo.getScheduleConf() == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + try { + int fixSecond = Integer.valueOf(jobInfo.getScheduleConf()); + if (fixSecond < 1) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + } catch (Exception e) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + } - // join , avoid "xxx,," - String temp = ""; - for (String item:childJobIds) { - temp += item + ","; - } - temp = temp.substring(0, temp.length()-1); + // valid advanced + if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy") + I18nUtil.getString("system_unvalid"))); + } + if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy") + I18nUtil.getString("system_unvalid"))); + } + if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy") + I18nUtil.getString("system_unvalid"))); + } - jobInfo.setChildJobId(temp); - } + // 》ChildJobId valid + if (jobInfo.getChildJobId() != null && jobInfo.getChildJobId().trim().length() > 0) { + String[] childJobIds = jobInfo.getChildJobId().split(","); + for (String childJobIdItem : childJobIds) { + if (childJobIdItem != null && childJobIdItem.trim().length() > 0 && isNumeric(childJobIdItem)) { + XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem)); + if (childJobInfo == null) { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_not_found")), childJobIdItem)); + } + } else { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_unvalid")), childJobIdItem)); + } + } - // group valid - XxlJobGroup jobGroup = xxlJobGroupDao.load(jobInfo.getJobGroup()); - if (jobGroup == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_jobgroup")+I18nUtil.getString("system_unvalid")) ); - } + // join , avoid "xxx,," + String temp = ""; + for (String item : childJobIds) { + temp += item + ","; + } + temp = temp.substring(0, temp.length() - 1); - // stage job info - XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId()); - if (exists_jobInfo == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_not_found")) ); - } + jobInfo.setChildJobId(temp); + } - // next trigger time (5s后生效,避开预读周期) - long nextTriggerTime = exists_jobInfo.getTriggerNextTime(); - boolean scheduleDataNotChanged = jobInfo.getScheduleType().equals(exists_jobInfo.getScheduleType()) && jobInfo.getScheduleConf().equals(exists_jobInfo.getScheduleConf()); - if (exists_jobInfo.getTriggerStatus() == 1 && !scheduleDataNotChanged) { - try { - Date nextValidTime = JobScheduleHelper.generateNextValidTime(jobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); - if (nextValidTime == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - nextTriggerTime = nextValidTime.getTime(); - } catch (Exception e) { - logger.error(e.getMessage(), e); - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - } + // group valid + XxlJobGroup jobGroup = xxlJobGroupDao.load(jobInfo.getJobGroup()); + if (jobGroup == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_jobgroup") + I18nUtil.getString("system_unvalid"))); + } - exists_jobInfo.setJobGroup(jobInfo.getJobGroup()); - exists_jobInfo.setJobDesc(jobInfo.getJobDesc()); - exists_jobInfo.setAuthor(jobInfo.getAuthor()); - exists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail()); - exists_jobInfo.setScheduleType(jobInfo.getScheduleType()); - exists_jobInfo.setScheduleConf(jobInfo.getScheduleConf()); - exists_jobInfo.setMisfireStrategy(jobInfo.getMisfireStrategy()); - exists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy()); - exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler()); - exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam()); - exists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); - exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout()); - exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount()); - exists_jobInfo.setChildJobId(jobInfo.getChildJobId()); - exists_jobInfo.setTriggerNextTime(nextTriggerTime); + // stage job info + XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId()); + if (exists_jobInfo == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_not_found"))); + } - exists_jobInfo.setUpdateTime(new Date()); + // next trigger time (5s后生效,避开预读周期) + long nextTriggerTime = exists_jobInfo.getTriggerNextTime(); + boolean scheduleDataNotChanged = jobInfo.getScheduleType().equals(exists_jobInfo.getScheduleType()) && jobInfo.getScheduleConf().equals(exists_jobInfo.getScheduleConf()); + if (exists_jobInfo.getTriggerStatus() == 1 && !scheduleDataNotChanged) { + try { + Date nextValidTime = JobScheduleHelper.generateNextValidTime(jobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); + if (nextValidTime == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + nextTriggerTime = nextValidTime.getTime(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + } + + exists_jobInfo.setJobGroup(jobInfo.getJobGroup()); + exists_jobInfo.setJobDesc(jobInfo.getJobDesc()); + exists_jobInfo.setAuthor(jobInfo.getAuthor()); + exists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail()); + exists_jobInfo.setScheduleType(jobInfo.getScheduleType()); + exists_jobInfo.setScheduleConf(jobInfo.getScheduleConf()); + exists_jobInfo.setMisfireStrategy(jobInfo.getMisfireStrategy()); + exists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy()); + exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler()); + exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam()); + exists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); + exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout()); + exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount()); + exists_jobInfo.setChildJobId(jobInfo.getChildJobId()); + exists_jobInfo.setTriggerNextTime(nextTriggerTime); + + exists_jobInfo.setUpdateTime(new Date()); xxlJobInfoDao.update(exists_jobInfo); - return ReturnT.SUCCESS; - } + return ReturnT.SUCCESS; + } - @Override - public ReturnT remove(int id) { - XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); - if (xxlJobInfo == null) { - return ReturnT.SUCCESS; - } + @Override + public ReturnT remove(int id) { + XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); + if (xxlJobInfo == null) { + return ReturnT.SUCCESS; + } - xxlJobInfoDao.delete(id); - xxlJobLogDao.delete(id); - xxlJobLogGlueDao.deleteByJobId(id); - return ReturnT.SUCCESS; - } + xxlJobInfoDao.delete(id); + xxlJobLogDao.delete(id); + xxlJobLogGlueDao.deleteByJobId(id); + return ReturnT.SUCCESS; + } - @Override - public ReturnT start(int id) { - XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); - - // valid - ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(xxlJobInfo.getScheduleType(), ScheduleTypeEnum.NONE); - if (ScheduleTypeEnum.NONE == scheduleTypeEnum) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type_none_limit_start")) ); - } - - // next trigger time (5s后生效,避开预读周期) - long nextTriggerTime = 0; - try { - Date nextValidTime = JobScheduleHelper.generateNextValidTime(xxlJobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); - if (nextValidTime == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - nextTriggerTime = nextValidTime.getTime(); - } catch (Exception e) { - logger.error(e.getMessage(), e); - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - - xxlJobInfo.setTriggerStatus(1); - xxlJobInfo.setTriggerLastTime(0); - xxlJobInfo.setTriggerNextTime(nextTriggerTime); - - xxlJobInfo.setUpdateTime(new Date()); - xxlJobInfoDao.update(xxlJobInfo); - return ReturnT.SUCCESS; - } - - @Override - public ReturnT stop(int id) { + @Override + public ReturnT start(int id) { XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); - xxlJobInfo.setTriggerStatus(0); - xxlJobInfo.setTriggerLastTime(0); - xxlJobInfo.setTriggerNextTime(0); + // valid + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(xxlJobInfo.getScheduleType(), ScheduleTypeEnum.NONE); + if (ScheduleTypeEnum.NONE == scheduleTypeEnum) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type_none_limit_start"))); + } - xxlJobInfo.setUpdateTime(new Date()); - xxlJobInfoDao.update(xxlJobInfo); - return ReturnT.SUCCESS; - } + // next trigger time (5s后生效,避开预读周期) + long nextTriggerTime = 0; + try { + Date nextValidTime = JobScheduleHelper.generateNextValidTime(xxlJobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); + if (nextValidTime == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + nextTriggerTime = nextValidTime.getTime(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } - @Override - public Map dashboardInfo() { + xxlJobInfo.setTriggerStatus(1); + xxlJobInfo.setTriggerLastTime(0); + xxlJobInfo.setTriggerNextTime(nextTriggerTime); - int jobInfoCount = xxlJobInfoDao.findAllCount(); - int jobLogCount = 0; - int jobLogSuccessCount = 0; - XxlJobLogReport xxlJobLogReport = xxlJobLogReportDao.queryLogReportTotal(); - if (xxlJobLogReport != null) { - jobLogCount = xxlJobLogReport.getRunningCount() + xxlJobLogReport.getSucCount() + xxlJobLogReport.getFailCount(); - jobLogSuccessCount = xxlJobLogReport.getSucCount(); - } + xxlJobInfo.setUpdateTime(new Date()); + xxlJobInfoDao.update(xxlJobInfo); + return ReturnT.SUCCESS; + } - // executor count - Set executorAddressSet = new HashSet(); - List groupList = xxlJobGroupDao.findAll(); + @Override + public ReturnT stop(int id) { + XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); - if (groupList!=null && !groupList.isEmpty()) { - for (XxlJobGroup group: groupList) { - if (group.getRegistryList()!=null && !group.getRegistryList().isEmpty()) { - executorAddressSet.addAll(group.getRegistryList()); - } - } - } + xxlJobInfo.setTriggerStatus(0); + xxlJobInfo.setTriggerLastTime(0); + xxlJobInfo.setTriggerNextTime(0); - int executorCount = executorAddressSet.size(); + xxlJobInfo.setUpdateTime(new Date()); + xxlJobInfoDao.update(xxlJobInfo); + return ReturnT.SUCCESS; + } - Map dashboardMap = new HashMap(); - dashboardMap.put("jobInfoCount", jobInfoCount); - dashboardMap.put("jobLogCount", jobLogCount); - dashboardMap.put("jobLogSuccessCount", jobLogSuccessCount); - dashboardMap.put("executorCount", executorCount); - return dashboardMap; - } + @Override + public Map dashboardInfo() { - @Override - public ReturnT> chartInfo(Date startDate, Date endDate) { + int jobInfoCount = xxlJobInfoDao.findAllCount(); + int jobLogCount = 0; + int jobLogSuccessCount = 0; + XxlJobLogReport xxlJobLogReport = xxlJobLogReportDao.queryLogReportTotal(); + if (xxlJobLogReport != null) { + jobLogCount = xxlJobLogReport.getRunningCount() + xxlJobLogReport.getSucCount() + xxlJobLogReport.getFailCount(); + jobLogSuccessCount = xxlJobLogReport.getSucCount(); + } - // process - List triggerDayList = new ArrayList(); - List triggerDayCountRunningList = new ArrayList(); - List triggerDayCountSucList = new ArrayList(); - List triggerDayCountFailList = new ArrayList(); - int triggerCountRunningTotal = 0; - int triggerCountSucTotal = 0; - int triggerCountFailTotal = 0; + // executor count + Set executorAddressSet = new HashSet(); + List groupList = xxlJobGroupDao.findAll(); - List logReportList = xxlJobLogReportDao.queryLogReport(startDate, endDate); + if (groupList != null && !groupList.isEmpty()) { + for (XxlJobGroup group : groupList) { + if (group.getRegistryList() != null && !group.getRegistryList().isEmpty()) { + executorAddressSet.addAll(group.getRegistryList()); + } + } + } - if (logReportList!=null && logReportList.size()>0) { - for (XxlJobLogReport item: logReportList) { - String day = DateUtil.formatDate(item.getTriggerDay()); - int triggerDayCountRunning = item.getRunningCount(); - int triggerDayCountSuc = item.getSucCount(); - int triggerDayCountFail = item.getFailCount(); + int executorCount = executorAddressSet.size(); - triggerDayList.add(day); - triggerDayCountRunningList.add(triggerDayCountRunning); - triggerDayCountSucList.add(triggerDayCountSuc); - triggerDayCountFailList.add(triggerDayCountFail); + Map dashboardMap = new HashMap(); + dashboardMap.put("jobInfoCount" , jobInfoCount); + dashboardMap.put("jobLogCount" , jobLogCount); + dashboardMap.put("jobLogSuccessCount" , jobLogSuccessCount); + dashboardMap.put("executorCount" , executorCount); + return dashboardMap; + } - triggerCountRunningTotal += triggerDayCountRunning; - triggerCountSucTotal += triggerDayCountSuc; - triggerCountFailTotal += triggerDayCountFail; - } - } else { - for (int i = -6; i <= 0; i++) { - triggerDayList.add(DateUtil.formatDate(DateUtil.addDays(new Date(), i))); - triggerDayCountRunningList.add(0); - triggerDayCountSucList.add(0); - triggerDayCountFailList.add(0); - } - } + @Override + public ReturnT> chartInfo(Date startDate, Date endDate) { - Map result = new HashMap(); - result.put("triggerDayList", triggerDayList); - result.put("triggerDayCountRunningList", triggerDayCountRunningList); - result.put("triggerDayCountSucList", triggerDayCountSucList); - result.put("triggerDayCountFailList", triggerDayCountFailList); + // process + List triggerDayList = new ArrayList(); + List triggerDayCountRunningList = new ArrayList(); + List triggerDayCountSucList = new ArrayList(); + List triggerDayCountFailList = new ArrayList(); + int triggerCountRunningTotal = 0; + int triggerCountSucTotal = 0; + int triggerCountFailTotal = 0; - result.put("triggerCountRunningTotal", triggerCountRunningTotal); - result.put("triggerCountSucTotal", triggerCountSucTotal); - result.put("triggerCountFailTotal", triggerCountFailTotal); + List logReportList = xxlJobLogReportDao.queryLogReport(startDate, endDate); - return new ReturnT>(result); - } + if (logReportList != null && logReportList.size() > 0) { + for (XxlJobLogReport item : logReportList) { + String day = DateUtil.formatDate(item.getTriggerDay()); + int triggerDayCountRunning = item.getRunningCount(); + int triggerDayCountSuc = item.getSucCount(); + int triggerDayCountFail = item.getFailCount(); + + triggerDayList.add(day); + triggerDayCountRunningList.add(triggerDayCountRunning); + triggerDayCountSucList.add(triggerDayCountSuc); + triggerDayCountFailList.add(triggerDayCountFail); + + triggerCountRunningTotal += triggerDayCountRunning; + triggerCountSucTotal += triggerDayCountSuc; + triggerCountFailTotal += triggerDayCountFail; + } + } else { + for (int i = -6; i <= 0; i++) { + triggerDayList.add(DateUtil.formatDate(DateUtil.addDays(new Date(), i))); + triggerDayCountRunningList.add(0); + triggerDayCountSucList.add(0); + triggerDayCountFailList.add(0); + } + } + + Map result = new HashMap(); + result.put("triggerDayList" , triggerDayList); + result.put("triggerDayCountRunningList" , triggerDayCountRunningList); + result.put("triggerDayCountSucList" , triggerDayCountSucList); + result.put("triggerDayCountFailList" , triggerDayCountFailList); + + result.put("triggerCountRunningTotal" , triggerCountRunningTotal); + result.put("triggerCountSucTotal" , triggerCountSucTotal); + result.put("triggerCountFailTotal" , triggerCountFailTotal); + + return new ReturnT>(result); + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml index 87299f88..ee592bb7 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml @@ -1,91 +1,91 @@ - + - - - - - - - - - - - t.id, - t.app_name, - t.title, - t.address_type, - t.address_list, - t.update_time - + + + + + + + + - + + t.id, + t.app_name, + t.title, + t.address_type, + t.address_list, + t.update_time + - + - - INSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`, `update_time`) - values ( #{appname}, #{title}, #{addressType}, #{addressList}, #{updateTime} ); - + - - UPDATE xxl_job_group - SET `app_name` = #{appname}, - `title` = #{title}, - `address_type` = #{addressType}, - `address_list` = #{addressList}, - `update_time` = #{updateTime} - WHERE id = #{id} - + + INSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`, `update_time`) + values ( #{appname}, #{title}, #{addressType}, #{addressList}, #{updateTime} ); + - - DELETE FROM xxl_job_group - WHERE id = #{id} - + + UPDATE xxl_job_group + SET `app_name` = #{appname}, + `title` = #{title}, + `address_type` = #{addressType}, + `address_list` = #{addressList}, + `update_time` = #{updateTime} + WHERE id = #{id} + - + + DELETE FROM xxl_job_group + WHERE id = #{id} + - + - + - \ No newline at end of file + + + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml index 7b3c3a3e..c40b059d 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml @@ -1,240 +1,240 @@ + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - + + - - + + - - + + - - + + - - - + + + - - - - - - + + + + + + - - - - + + + + - + - - - - + + + + - - t.id, - t.job_group, - t.job_desc, - t.add_time, - t.update_time, - t.author, - t.alarm_email, - t.schedule_type, - t.schedule_conf, - t.misfire_strategy, - t.executor_route_strategy, - t.executor_handler, - t.executor_param, - t.executor_block_strategy, - t.executor_timeout, - t.executor_fail_retry_count, - t.glue_type, - t.glue_source, - t.glue_remark, - t.glue_updatetime, - t.child_jobid, - t.trigger_status, - t.trigger_last_time, - t.trigger_next_time - + + t.id, + t.job_group, + t.job_desc, + t.add_time, + t.update_time, + t.author, + t.alarm_email, + t.schedule_type, + t.schedule_conf, + t.misfire_strategy, + t.executor_route_strategy, + t.executor_handler, + t.executor_param, + t.executor_block_strategy, + t.executor_timeout, + t.executor_fail_retry_count, + t.glue_type, + t.glue_source, + t.glue_remark, + t.glue_updatetime, + t.child_jobid, + t.trigger_status, + t.trigger_last_time, + t.trigger_next_time + - + SELECT + FROM xxl_job_info AS t + + + AND t.job_group = #{jobGroup} + AND t.trigger_status = #{triggerStatus} - - AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') - - - AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') - - - AND t.author like CONCAT(CONCAT('%', #{author}), '%') - - - ORDER BY id DESC - LIMIT #{offset}, #{pagesize} - + + AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') + + + AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') + + + AND t.author like CONCAT(CONCAT('%', #{author}), '%') + + + ORDER BY id DESC + LIMIT #{offset}, #{pagesize} + - + SELECT count(1) + FROM xxl_job_info AS t + + + AND t.job_group = #{jobGroup} + AND t.trigger_status = #{triggerStatus} - - AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') - - - AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') - - - AND t.author like CONCAT(CONCAT('%', #{author}), '%') - - - + + AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') + + + AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') + + + AND t.author like CONCAT(CONCAT('%', #{author}), '%') + + + - - INSERT INTO xxl_job_info ( - job_group, - job_desc, - add_time, - update_time, - author, - alarm_email, - schedule_type, - schedule_conf, - misfire_strategy, + + INSERT INTO xxl_job_info ( + job_group, + job_desc, + add_time, + update_time, + author, + alarm_email, + schedule_type, + schedule_conf, + misfire_strategy, executor_route_strategy, - executor_handler, - executor_param, - executor_block_strategy, - executor_timeout, - executor_fail_retry_count, - glue_type, - glue_source, - glue_remark, - glue_updatetime, - child_jobid, - trigger_status, - trigger_last_time, - trigger_next_time - ) VALUES ( - #{jobGroup}, - #{jobDesc}, - #{addTime}, - #{updateTime}, - #{author}, - #{alarmEmail}, - #{scheduleType}, - #{scheduleConf}, - #{misfireStrategy}, - #{executorRouteStrategy}, - #{executorHandler}, - #{executorParam}, - #{executorBlockStrategy}, - #{executorTimeout}, - #{executorFailRetryCount}, - #{glueType}, - #{glueSource}, - #{glueRemark}, - #{glueUpdatetime}, - #{childJobId}, - #{triggerStatus}, - #{triggerLastTime}, - #{triggerNextTime} - ); - - + executor_handler, + executor_param, + executor_block_strategy, + executor_timeout, + executor_fail_retry_count, + glue_type, + glue_source, + glue_remark, + glue_updatetime, + child_jobid, + trigger_status, + trigger_last_time, + trigger_next_time + ) VALUES ( + #{jobGroup}, + #{jobDesc}, + #{addTime}, + #{updateTime}, + #{author}, + #{alarmEmail}, + #{scheduleType}, + #{scheduleConf}, + #{misfireStrategy}, + #{executorRouteStrategy}, + #{executorHandler}, + #{executorParam}, + #{executorBlockStrategy}, + #{executorTimeout}, + #{executorFailRetryCount}, + #{glueType}, + #{glueSource}, + #{glueRemark}, + #{glueUpdatetime}, + #{childJobId}, + #{triggerStatus}, + #{triggerLastTime}, + #{triggerNextTime} + ); + + - + - - UPDATE xxl_job_info - SET - job_group = #{jobGroup}, - job_desc = #{jobDesc}, - update_time = #{updateTime}, - author = #{author}, - alarm_email = #{alarmEmail}, - schedule_type = #{scheduleType}, - schedule_conf = #{scheduleConf}, - misfire_strategy = #{misfireStrategy}, - executor_route_strategy = #{executorRouteStrategy}, - executor_handler = #{executorHandler}, - executor_param = #{executorParam}, - executor_block_strategy = #{executorBlockStrategy}, - executor_timeout = ${executorTimeout}, - executor_fail_retry_count = ${executorFailRetryCount}, - glue_type = #{glueType}, - glue_source = #{glueSource}, - glue_remark = #{glueRemark}, - glue_updatetime = #{glueUpdatetime}, - child_jobid = #{childJobId}, - trigger_status = #{triggerStatus}, - trigger_last_time = #{triggerLastTime}, - trigger_next_time = #{triggerNextTime} - WHERE id = #{id} - + + UPDATE xxl_job_info + SET + job_group = #{jobGroup}, + job_desc = #{jobDesc}, + update_time = #{updateTime}, + author = #{author}, + alarm_email = #{alarmEmail}, + schedule_type = #{scheduleType}, + schedule_conf = #{scheduleConf}, + misfire_strategy = #{misfireStrategy}, + executor_route_strategy = #{executorRouteStrategy}, + executor_handler = #{executorHandler}, + executor_param = #{executorParam}, + executor_block_strategy = #{executorBlockStrategy}, + executor_timeout = ${executorTimeout}, + executor_fail_retry_count = ${executorFailRetryCount}, + glue_type = #{glueType}, + glue_source = #{glueSource}, + glue_remark = #{glueRemark}, + glue_updatetime = #{glueUpdatetime}, + child_jobid = #{childJobId}, + trigger_status = #{triggerStatus}, + trigger_last_time = #{triggerLastTime}, + trigger_next_time = #{triggerNextTime} + WHERE id = #{id} + - - DELETE - FROM xxl_job_info - WHERE id = #{id} - + + DELETE + FROM xxl_job_info + WHERE id = #{id} + - + - + - + - - UPDATE xxl_job_info - SET - trigger_last_time = #{triggerLastTime}, - trigger_next_time = #{triggerNextTime}, - trigger_status = #{triggerStatus} - WHERE id = #{id} - + + UPDATE xxl_job_info + SET + trigger_last_time = #{triggerLastTime}, + trigger_next_time = #{triggerNextTime}, + trigger_status = #{triggerStatus} + WHERE id = #{id} + - \ No newline at end of file + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml index 699277c5..dc680f37 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml @@ -1,71 +1,71 @@ - + - - - - - - - - - - - - t.id, - t.job_id, - t.glue_type, - t.glue_source, - t.glue_remark, - t.add_time, - t.update_time - - - - INSERT INTO xxl_job_logglue ( - `job_id`, - `glue_type`, - `glue_source`, - `glue_remark`, - `add_time`, - `update_time` - ) VALUES ( - #{jobId}, - #{glueType}, - #{glueSource}, - #{glueRemark}, - #{addTime}, - #{updateTime} - ); - - - - - - - DELETE FROM xxl_job_logglue - WHERE id NOT in( - SELECT id FROM( - SELECT id FROM xxl_job_logglue - WHERE `job_id` = #{jobId} - ORDER BY update_time desc - LIMIT 0, #{limit} - ) t1 - ) AND `job_id` = #{jobId} - - - - DELETE FROM xxl_job_logglue - WHERE `job_id` = #{jobId} - - - \ No newline at end of file + + + + + + + + + + + + t.id, + t.job_id, + t.glue_type, + t.glue_source, + t.glue_remark, + t.add_time, + t.update_time + + + + INSERT INTO xxl_job_logglue ( + `job_id`, + `glue_type`, + `glue_source`, + `glue_remark`, + `add_time`, + `update_time` + ) VALUES ( + #{jobId}, + #{glueType}, + #{glueSource}, + #{glueRemark}, + #{addTime}, + #{updateTime} + ); + + + + + + + DELETE FROM xxl_job_logglue + WHERE id NOT in( + SELECT id FROM( + SELECT id FROM xxl_job_logglue + WHERE `job_id` = #{jobId} + ORDER BY update_time desc + LIMIT 0, #{limit} + ) t1 + ) AND `job_id` = #{jobId} + + + + DELETE FROM xxl_job_logglue + WHERE `job_id` = #{jobId} + + + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml index 4155f179..e5fa9039 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml @@ -1,273 +1,273 @@ - + - - - - - + + - - - - - - - - - - - - - + + - - + + + + + - - t.id, - t.job_group, - t.job_id, - t.executor_address, - t.executor_handler, - t.executor_param, - t.executor_sharding_param, - t.executor_fail_retry_count, - t.trigger_time, - t.trigger_code, - t.trigger_msg, - t.handle_time, - t.handle_code, - t.handle_msg, - t.alarm_status - - - - - - - + + + - - - INSERT INTO xxl_job_log ( - `job_group`, - `job_id`, - `trigger_time`, - `trigger_code`, - `handle_code` - ) VALUES ( - #{jobGroup}, - #{jobId}, - #{triggerTime}, - #{triggerCode}, - #{handleCode} - ); - - + + + - - UPDATE xxl_job_log - SET - `trigger_time`= #{triggerTime}, - `trigger_code`= #{triggerCode}, - `trigger_msg`= #{triggerMsg}, - `executor_address`= #{executorAddress}, - `executor_handler`=#{executorHandler}, - `executor_param`= #{executorParam}, - `executor_sharding_param`= #{executorShardingParam}, - `executor_fail_retry_count`= #{executorFailRetryCount} - WHERE `id`= #{id} - + + - - UPDATE xxl_job_log - SET - `handle_time`= #{handleTime}, - `handle_code`= #{handleCode}, - `handle_msg`= #{handleMsg} - WHERE `id`= #{id} - - - - delete from xxl_job_log - WHERE job_id = #{jobId} - + + t.id, + t.job_group, + t.job_id, + t.executor_address, + t.executor_handler, + t.executor_param, + t.executor_sharding_param, + t.executor_fail_retry_count, + t.trigger_time, + t.trigger_code, + t.trigger_msg, + t.handle_time, + t.handle_code, + t.handle_msg, + t.alarm_status + + + + + + + + + + + INSERT INTO xxl_job_log ( + `job_group`, + `job_id`, + `trigger_time`, + `trigger_code`, + `handle_code` + ) VALUES ( + #{jobGroup}, + #{jobId}, + #{triggerTime}, + #{triggerCode}, + #{handleCode} + ); + + + + + UPDATE xxl_job_log + SET + `trigger_time`= #{triggerTime}, + `trigger_code`= #{triggerCode}, + `trigger_msg`= #{triggerMsg}, + `executor_address`= #{executorAddress}, + `executor_handler`=#{executorHandler}, + `executor_param`= #{executorParam}, + `executor_sharding_param`= #{executorShardingParam}, + `executor_fail_retry_count`= #{executorFailRetryCount} + WHERE `id`= #{id} + + + + UPDATE xxl_job_log + SET + `handle_time`= #{handleTime}, + `handle_code`= #{handleCode}, + `handle_msg`= #{handleMsg} + WHERE `id`= #{id} + + + + delete from xxl_job_log + WHERE job_id = #{jobId} + - + - - delete from xxl_job_log - WHERE id in - - #{item} - - + + delete from xxl_job_log + WHERE id in + + #{item} + + - + - - UPDATE xxl_job_log - SET - `alarm_status` = #{newAlarmStatus} - WHERE `id`= #{logId} AND `alarm_status` = #{oldAlarmStatus} - + + UPDATE xxl_job_log + SET + `alarm_status` = #{newAlarmStatus} + WHERE `id`= #{logId} AND `alarm_status` = #{oldAlarmStatus} + - - + + - \ No newline at end of file + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml index 579d5f39..a993a5ba 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml @@ -1,62 +1,62 @@ - + - - - - - - - - - - t.id, - t.trigger_day, - t.running_count, - t.suc_count, - t.fail_count - - - - INSERT INTO xxl_job_log_report ( - `trigger_day`, - `running_count`, - `suc_count`, - `fail_count` - ) VALUES ( - #{triggerDay}, - #{runningCount}, - #{sucCount}, - #{failCount} - ); - - + + + + + + + - + + t.id, + t.trigger_day, + t.running_count, + t.suc_count, + t.fail_count + + + + INSERT INTO xxl_job_log_report ( + `trigger_day`, + `running_count`, + `suc_count`, + `fail_count` + ) VALUES ( + #{triggerDay}, + #{runningCount}, + #{sucCount}, + #{failCount} + ); + + + + UPDATE xxl_job_log_report SET `running_count` = #{runningCount}, - `suc_count` = #{sucCount}, - `fail_count` = #{failCount} + `suc_count` = #{sucCount}, + `fail_count` = #{failCount} WHERE `trigger_day` = #{triggerDay} - + - + - \ No newline at end of file + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml index 4cae667a..690841fa 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml @@ -1,43 +1,43 @@ - + - - - - - - - - - - t.id, - t.registry_group, - t.registry_key, - t.registry_value, - t.update_time - + + + + + + + - - - - DELETE FROM xxl_job_registry - WHERE id in - - #{item} - - + + t.id, + t.registry_group, + t.registry_key, + t.registry_value, + t.update_time + - + + + + DELETE FROM xxl_job_registry + WHERE id in + + #{item} + + + + UPDATE xxl_job_registry @@ -52,11 +52,11 @@ VALUES( #{registryGroup} , #{registryKey} , #{registryValue}, #{updateTime}) - - DELETE FROM xxl_job_registry - WHERE registry_group = #{registryGroup} - AND registry_key = #{registryKey} - AND registry_value = #{registryValue} - + + DELETE FROM xxl_job_registry + WHERE registry_group = #{registryGroup} + AND registry_key = #{registryKey} + AND registry_value = #{registryValue} + - \ No newline at end of file + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml index 9e09b4aa..334d2c58 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml @@ -1,87 +1,87 @@ + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - + + + + + + + - - t.id, - t.username, - t.password, - t.role, - t.permission - + + t.id, + t.username, + t.password, + t.role, + t.permission + - + - + - + - - INSERT INTO xxl_job_user ( - username, - password, - role, - permission - ) VALUES ( - #{username}, - #{password}, - #{role}, - #{permission} - ); - + + INSERT INTO xxl_job_user ( + username, + password, + role, + permission + ) VALUES ( + #{username}, + #{password}, + #{role}, + #{permission} + ); + - - UPDATE xxl_job_user - SET - - password = #{password}, - - role = #{role}, - permission = #{permission} - WHERE id = #{id} - + + UPDATE xxl_job_user + SET + + password = #{password}, + + role = #{role}, + permission = #{permission} + WHERE id = #{id} + - - DELETE - FROM xxl_job_user - WHERE id = #{id} - + + DELETE + FROM xxl_job_user + WHERE id = #{id} + - \ No newline at end of file + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/user.index.1.js b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/user.index.1.js index 48d3f302..1d834614 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/user.index.1.js +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/user.index.1.js @@ -1,48 +1,48 @@ $(function() { - // init date tables - var userListTable = $("#user_list").dataTable({ - "deferRender": true, - "processing" : true, - "serverSide": true, - "ajax": { - url: base_url + "/user/pageList", - type:"post", - data : function ( d ) { - var obj = {}; + // init date tables + var userListTable = $("#user_list").dataTable({ + "deferRender": true, + "processing" : true, + "serverSide": true, + "ajax": { + url: base_url + "/user/pageList", + type:"post", + data : function ( d ) { + var obj = {}; obj.username = $('#username').val(); obj.role = $('#role').val(); - obj.start = d.start; - obj.length = d.length; + obj.start = d.start; + obj.length = d.length; return obj; } - }, - "searching": false, - "ordering": false, - //"scrollX": true, // scroll x,close self-adaption - "columns": [ - { - "data": 'id', - "visible" : false, - "width":'10%' - }, - { - "data": 'username', - "visible" : true, - "width":'20%' - }, - { - "data": 'password', - "visible" : false, + }, + "searching": false, + "ordering": false, + //"scrollX": true, // scroll x,close self-adaption + "columns": [ + { + "data": 'id', + "visible" : false, + "width":'10%' + }, + { + "data": 'username', + "visible" : true, + "width":'20%' + }, + { + "data": 'password', + "visible" : false, "width":'20%', "render": function ( data, type, row ) { return '*********'; } - }, - { - "data": 'role', - "visible" : true, - "width":'10%', + }, + { + "data": 'role', + "visible" : true, + "width":'10%', "render": function ( data, type, row ) { if (data == 1) { return I18n.user_role_admin @@ -50,101 +50,101 @@ $(function() { return I18n.user_role_normal } } - }, - { - "data": 'permission', - "width":'10%', - "visible" : false - }, - { - "data": I18n.system_opt , - "width":'15%', - "render": function ( data, type, row ) { - return function(){ - // html + }, + { + "data": 'permission', + "width":'10%', + "visible" : false + }, + { + "data": I18n.system_opt , + "width":'15%', + "render": function ( data, type, row ) { + return function(){ + // html tableData['key'+row.id] = row; - var html = '

'+ - ' '+ - ' '+ - '

'; + var html = '

'+ + ' '+ + ' '+ + '

'; - return html; - }; - } - } - ], - "language" : { - "sProcessing" : I18n.dataTable_sProcessing , - "sLengthMenu" : I18n.dataTable_sLengthMenu , - "sZeroRecords" : I18n.dataTable_sZeroRecords , - "sInfo" : I18n.dataTable_sInfo , - "sInfoEmpty" : I18n.dataTable_sInfoEmpty , - "sInfoFiltered" : I18n.dataTable_sInfoFiltered , - "sInfoPostFix" : "", - "sSearch" : I18n.dataTable_sSearch , - "sUrl" : "", - "sEmptyTable" : I18n.dataTable_sEmptyTable , - "sLoadingRecords" : I18n.dataTable_sLoadingRecords , - "sInfoThousands" : ",", - "oPaginate" : { - "sFirst" : I18n.dataTable_sFirst , - "sPrevious" : I18n.dataTable_sPrevious , - "sNext" : I18n.dataTable_sNext , - "sLast" : I18n.dataTable_sLast - }, - "oAria" : { - "sSortAscending" : I18n.dataTable_sSortAscending , - "sSortDescending" : I18n.dataTable_sSortDescending - } - } - }); + return html; + }; + } + } + ], + "language" : { + "sProcessing" : I18n.dataTable_sProcessing , + "sLengthMenu" : I18n.dataTable_sLengthMenu , + "sZeroRecords" : I18n.dataTable_sZeroRecords , + "sInfo" : I18n.dataTable_sInfo , + "sInfoEmpty" : I18n.dataTable_sInfoEmpty , + "sInfoFiltered" : I18n.dataTable_sInfoFiltered , + "sInfoPostFix" : "", + "sSearch" : I18n.dataTable_sSearch , + "sUrl" : "", + "sEmptyTable" : I18n.dataTable_sEmptyTable , + "sLoadingRecords" : I18n.dataTable_sLoadingRecords , + "sInfoThousands" : ",", + "oPaginate" : { + "sFirst" : I18n.dataTable_sFirst , + "sPrevious" : I18n.dataTable_sPrevious , + "sNext" : I18n.dataTable_sNext , + "sLast" : I18n.dataTable_sLast + }, + "oAria" : { + "sSortAscending" : I18n.dataTable_sSortAscending , + "sSortDescending" : I18n.dataTable_sSortDescending + } + } + }); // table data var tableData = {}; - // search btn - $('#searchBtn').on('click', function(){ + // search btn + $('#searchBtn').on('click', function(){ userListTable.fnDraw(); - }); - - // job operate - $("#user_list").on('click', '.delete',function() { - var id = $(this).parent('p').attr("id"); + }); - layer.confirm( I18n.system_ok + I18n.system_opt_del + '?', { - icon: 3, - title: I18n.system_tips , + // job operate + $("#user_list").on('click', '.delete',function() { + var id = $(this).parent('p').attr("id"); + + layer.confirm( I18n.system_ok + I18n.system_opt_del + '?', { + icon: 3, + title: I18n.system_tips , btn: [ I18n.system_ok, I18n.system_cancel ] - }, function(index){ - layer.close(index); + }, function(index){ + layer.close(index); - $.ajax({ - type : 'POST', - url : base_url + "/user/remove", - data : { - "id" : id - }, - dataType : "json", - success : function(data){ - if (data.code == 200) { + $.ajax({ + type : 'POST', + url : base_url + "/user/remove", + data : { + "id" : id + }, + dataType : "json", + success : function(data){ + if (data.code == 200) { layer.msg( I18n.system_success ); - userListTable.fnDraw(false); - } else { + userListTable.fnDraw(false); + } else { layer.msg( data.msg || I18n.system_opt_del + I18n.system_fail ); - } - } - }); - }); - }); + } + } + }); + }); + }); - // add role + // add role $("#addModal .form input[name=role]").change(function () { - var role = $(this).val(); - if (role == 1) { + var role = $(this).val(); + if (role == 1) { $("#addModal .form input[name=permission]").parents('.form-group').hide(); - } else { + } else { $("#addModal .form input[name=permission]").parents('.form-group').show(); - } + } $("#addModal .form input[name='permission']").prop("checked",false); }); @@ -154,28 +154,28 @@ $(function() { return this.optional(element) || valid.test(value); }, I18n.user_username_valid ); - // add - $(".add").click(function(){ - $('#addModal').modal({backdrop: false, keyboard: false}).modal('show'); - }); - var addModalValidate = $("#addModal .form").validate({ - errorElement : 'span', + // add + $(".add").click(function(){ + $('#addModal').modal({backdrop: false, keyboard: false}).modal('show'); + }); + var addModalValidate = $("#addModal .form").validate({ + errorElement : 'span', errorClass : 'help-block', - focusInvalid : true, + focusInvalid : true, rules : { username : { - required : true, + required : true, rangelength:[4, 20], myValid01: true - }, + }, password : { required : true, rangelength:[4, 20] } - }, + }, messages : { username : { - required : I18n.system_please_input + I18n.user_username, + required : I18n.system_please_input + I18n.user_username, rangelength: I18n.system_lengh_limit + "[4-20]" }, password : { @@ -183,15 +183,15 @@ $(function() { rangelength: I18n.system_lengh_limit + "[4-20]" } }, - highlight : function(element) { - $(element).closest('.form-group').addClass('has-error'); + highlight : function(element) { + $(element).closest('.form-group').addClass('has-error'); }, - success : function(label) { - label.closest('.form-group').removeClass('has-error'); - label.remove(); + success : function(label) { + label.closest('.form-group').removeClass('has-error'); + label.remove(); }, - errorPlacement : function(error, element) { - element.parent('div').append(error); + errorPlacement : function(error, element) { + element.parent('div').append(error); }, submitHandler : function(form) { @@ -200,38 +200,38 @@ $(function() { permissionArr.push($(this).val()); }); - var paramData = { - "username": $("#addModal .form input[name=username]").val(), + var paramData = { + "username": $("#addModal .form input[name=username]").val(), "password": $("#addModal .form input[name=password]").val(), "role": $("#addModal .form input[name=role]:checked").val(), "permission": permissionArr.join(',') - }; + }; - $.post(base_url + "/user/add", paramData, function(data, status) { - if (data.code == "200") { - $('#addModal').modal('hide'); + $.post(base_url + "/user/add", paramData, function(data, status) { + if (data.code == "200") { + $('#addModal').modal('hide'); layer.msg( I18n.system_add_suc ); userListTable.fnDraw(); - } else { - layer.open({ - title: I18n.system_tips , + } else { + layer.open({ + title: I18n.system_tips , btn: [ I18n.system_ok ], - content: (data.msg || I18n.system_add_fail), - icon: '2' - }); - } - }); - } - }); - $("#addModal").on('hide.bs.modal', function () { - $("#addModal .form")[0].reset(); - addModalValidate.resetForm(); - $("#addModal .form .form-group").removeClass("has-error"); - $(".remote_panel").show(); // remote + content: (data.msg || I18n.system_add_fail), + icon: '2' + }); + } + }); + } + }); + $("#addModal").on('hide.bs.modal', function () { + $("#addModal .form")[0].reset(); + addModalValidate.resetForm(); + $("#addModal .form .form-group").removeClass("has-error"); + $(".remote_panel").show(); // remote $("#addModal .form input[name=permission]").parents('.form-group').show(); - }); + }); // update role $("#updateModal .form input[name=role]").change(function () { @@ -244,21 +244,21 @@ $(function() { $("#updateModal .form input[name='permission']").prop("checked",false); }); - // update - $("#user_list").on('click', '.update',function() { + // update + $("#user_list").on('click', '.update',function() { var id = $(this).parent('p').attr("id"); var row = tableData['key'+id]; - // base data - $("#updateModal .form input[name='id']").val( row.id ); - $("#updateModal .form input[name='username']").val( row.username ); - $("#updateModal .form input[name='password']").val( '' ); - $("#updateModal .form input[name='role'][value='"+ row.role +"']").click(); + // base data + $("#updateModal .form input[name='id']").val( row.id ); + $("#updateModal .form input[name='username']").val( row.username ); + $("#updateModal .form input[name='password']").val( '' ); + $("#updateModal .form input[name='role'][value='"+ row.role +"']").click(); var permissionArr = []; if (row.permission) { permissionArr = row.permission.split(","); - } + } $("#updateModal .form input[name='permission']").each(function () { if($.inArray($(this).val(), permissionArr) > -1) { $(this).prop("checked",true); @@ -267,22 +267,22 @@ $(function() { } }); - // show - $('#updateModal').modal({backdrop: false, keyboard: false}).modal('show'); - }); - var updateModalValidate = $("#updateModal .form").validate({ - errorElement : 'span', + // show + $('#updateModal').modal({backdrop: false, keyboard: false}).modal('show'); + }); + var updateModalValidate = $("#updateModal .form").validate({ + errorElement : 'span', errorClass : 'help-block', focusInvalid : true, - highlight : function(element) { - $(element).closest('.form-group').addClass('has-error'); + highlight : function(element) { + $(element).closest('.form-group').addClass('has-error'); }, - success : function(label) { - label.closest('.form-group').removeClass('has-error'); - label.remove(); + success : function(label) { + label.closest('.form-group').removeClass('has-error'); + label.remove(); }, - errorPlacement : function(error, element) { - element.parent('div').append(error); + errorPlacement : function(error, element) { + element.parent('div').append(error); }, submitHandler : function(form) { @@ -314,15 +314,15 @@ $(function() { }); } }); - } - }); - $("#updateModal").on('hide.bs.modal', function () { + } + }); + $("#updateModal").on('hide.bs.modal', function () { $("#updateModal .form")[0].reset(); updateModalValidate.resetForm(); $("#updateModal .form .form-group").removeClass("has-error"); - $(".remote_panel").show(); // remote + $(".remote_panel").show(); // remote $("#updateModal .form input[name=permission]").parents('.form-group').show(); - }); + }); }); diff --git a/ruoyi-flowable/pom.xml b/ruoyi-flowable/pom.xml index 1180892c..7c059529 100644 --- a/ruoyi-flowable/pom.xml +++ b/ruoyi-flowable/pom.xml @@ -17,10 +17,6 @@ com.ruoyi ruoyi-framework - - com.ruoyi - ruoyi-system - com.ruoyi ruoyi-common diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java deleted file mode 100644 index 1a0d8e04..00000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.ruoyi.framework.aspectj; - -import com.ruoyi.common.annotation.DataScope; -import com.ruoyi.common.core.domain.BaseEntity; -import com.ruoyi.common.core.domain.entity.SysRole; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.UserService; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.spring.SpringUtils; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.springframework.stereotype.Component; - -/** - * 数据过滤处理 - * - * @author Lion Li - * @deprecated 3.6.0 移除 {@link com.ruoyi.framework.handler.PlusDataPermissionHandler} - */ -@Aspect -@Component -@Deprecated -public class DataScopeAspect { - - /** - * 全部数据权限 - */ - public static final String DATA_SCOPE_ALL = "1"; - - /** - * 自定数据权限 - */ - public static final String DATA_SCOPE_CUSTOM = "2"; - - /** - * 部门数据权限 - */ - public static final String DATA_SCOPE_DEPT = "3"; - - /** - * 部门及以下数据权限 - */ - public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; - - /** - * 仅本人数据权限 - */ - public static final String DATA_SCOPE_SELF = "5"; - - /** - * 数据权限过滤关键字 - */ - public static final String DATA_SCOPE = "dataScope"; - - @Before("@annotation(controllerDataScope)") - public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable { - clearDataScope(point); - handleDataScope(point, controllerDataScope); - } - - protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) { - // 获取当前的用户 - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNotNull(loginUser)) { - SysUser currentUser = SpringUtils.getBean(UserService.class).selectUserById(loginUser.getUserId()); - // 如果是超级管理员,则不过滤数据 - if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { - dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), - controllerDataScope.userAlias(), controllerDataScope.isUser()); - } - } - } - - /** - * 数据范围过滤 - * - * @param joinPoint 切点 - * @param user 用户 - * @param userAlias 别名 - */ - public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, boolean isUser) { - StringBuilder sqlString = new StringBuilder(); - - // 将 "." 提取出,不写别名为单表查询,写别名为多表查询 - deptAlias = StringUtils.isNotBlank(deptAlias) ? deptAlias + "." : ""; - userAlias = StringUtils.isNotBlank(userAlias) ? userAlias + "." : ""; - - for (SysRole role : user.getRoles()) { - String dataScope = role.getDataScope(); - if (DATA_SCOPE_ALL.equals(dataScope)) { - sqlString = new StringBuilder(); - break; - } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { - sqlString.append(StringUtils.format( - " OR {}dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", - deptAlias, role.getRoleId())); - } else if (DATA_SCOPE_DEPT.equals(dataScope)) { - sqlString.append(StringUtils.format(" OR {}dept_id = {} ", - deptAlias, user.getDeptId())); - } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { - sqlString.append(StringUtils.format( - " OR {}dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", - deptAlias, user.getDeptId(), user.getDeptId())); - } else if (DATA_SCOPE_SELF.equals(dataScope)) { - if (isUser) { - sqlString.append(StringUtils.format(" OR {}user_id = {} ", - userAlias, user.getUserId())); - } else { - // 数据权限为仅本人且没有userAlias别名不查询任何数据 - sqlString.append(" OR 1=0 "); - } - } - } - - if (StringUtils.isNotBlank(sqlString.toString())) { - putDataScope(joinPoint, sqlString.substring(4)); - } - } - - /** - * 拼接权限sql前先清空params.dataScope参数防止注入 - */ - private void clearDataScope(final JoinPoint joinPoint) { - Object params = joinPoint.getArgs()[0]; - if (StringUtils.isNotNull(params)) { - putDataScope(joinPoint, ""); - } - } - - private static void putDataScope(JoinPoint joinPoint, String sql) { - Object params = joinPoint.getArgs()[0]; - if (StringUtils.isNotNull(params)) { - if (params instanceof BaseEntity) { - BaseEntity baseEntity = (BaseEntity) params; - baseEntity.getParams().put(DATA_SCOPE, sql); - } - } - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java deleted file mode 100644 index 0b1c898b..00000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.ruoyi.framework.aspectj; - -import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; -import com.ruoyi.common.annotation.DataSource; -import com.ruoyi.common.utils.StringUtils; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -/** - * 多数据源处理 - * - * @author Lion Li - * @deprecated 3.6.0 移除 使用原生方法处理 功能更全 - */ -@Aspect -@Order(-500) -@Component -@Deprecated -public class DataSourceAspect { - - @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)" - + "|| @within(com.ruoyi.common.annotation.DataSource)") - public void dsPointCut() { - } - - @Around("dsPointCut()") - public Object around(ProceedingJoinPoint point) throws Throwable { - DataSource dataSource = getDataSource(point); - - if (StringUtils.isNotNull(dataSource)) { - DynamicDataSourceContextHolder.poll(); - String source = dataSource.value().getSource(); - DynamicDataSourceContextHolder.push(source); - } - - try { - return point.proceed(); - } finally { - // 销毁数据源 在执行方法之后 - DynamicDataSourceContextHolder.clear(); - } - } - - /** - * 获取需要切换的数据源 - */ - public DataSource getDataSource(ProceedingJoinPoint point) { - MethodSignature signature = (MethodSignature) point.getSignature(); - DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); - if (Objects.nonNull(dataSource)) { - return dataSource; - } - - return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); - } - -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java index 642076d9..e7aa9099 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -2,12 +2,11 @@ package com.ruoyi.framework.aspectj; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.dto.OperLogDTO; -import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.service.OperLogService; import com.ruoyi.common.enums.BusinessStatus; import com.ruoyi.common.enums.HttpMethod; import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; @@ -60,9 +59,6 @@ public class LogAspect { protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) { try { - // 获取当前的用户 - LoginUser loginUser = SecurityUtils.getLoginUser(); - // *========数据库日志=========*// OperLogDTO operLog = new OperLogDTO(); operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); @@ -70,9 +66,7 @@ public class LogAspect { String ip = ServletUtils.getClientIP(); operLog.setOperIp(ip); operLog.setOperUrl(ServletUtils.getRequest().getRequestURI()); - if (loginUser != null) { - operLog.setOperName(loginUser.getUsername()); - } + operLog.setOperName(LoginUtils.getUsername()); if (e != null) { operLog.setStatus(BusinessStatus.FAIL.ordinal()); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java index ce3de2be..0120432a 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -3,7 +3,7 @@ package com.ruoyi.framework.aspectj; import com.ruoyi.common.annotation.RateLimiter; import com.ruoyi.common.enums.LimitType; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.RedisUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.common.utils.ServletUtils; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java index f8f5c370..9fa586b4 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java @@ -1,12 +1,12 @@ package com.ruoyi.framework.aspectj; +import cn.dev33.satoken.SaManager; import cn.hutool.crypto.SecureUtil; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.properties.TokenProperties; import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.RedisUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.config.properties.RepeatSubmitProperties; @@ -37,7 +37,6 @@ import java.util.concurrent.TimeUnit; @Component public class RepeatSubmitAspect { - private final TokenProperties tokenProperties; private final RepeatSubmitProperties repeatSubmitProperties; @Before("@annotation(repeatSubmit)") @@ -57,13 +56,11 @@ public class RepeatSubmitAspect { String url = request.getRequestURI(); // 唯一值(没有消息头则使用请求地址) - String submitKey = request.getHeader(tokenProperties.getHeader()); - if (StringUtils.isEmpty(submitKey)) { - submitKey = url; - } + String submitKey = StringUtils.trimToEmpty(request.getHeader(SaManager.getConfig().getTokenName())); + submitKey = SecureUtil.md5(submitKey + ":" + nowParams); - // 唯一标识(指定key + 消息头) - String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + submitKey; + // 唯一标识(指定key + url + 消息头) + String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + url + submitKey; String key = RedisUtils.getCacheObject(cacheRepeatKey); if (key == null) { RedisUtils.setCacheObject(cacheRepeatKey, "", interval, TimeUnit.MILLISECONDS); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java deleted file mode 100644 index 95f3c9b7..00000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ruoyi.framework.config; - -import cn.hutool.core.util.ArrayUtil; -import com.ruoyi.common.exception.ServiceException; -import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.AsyncConfigurerSupport; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.security.concurrent.DelegatingSecurityContextExecutorService; - -import java.util.Arrays; -import java.util.concurrent.Executor; -import java.util.concurrent.ScheduledExecutorService; - -/** - * 异步配置 - * - * @author Lion Li - */ -@EnableAsync -@Configuration -public class AsyncConfig extends AsyncConfigurerSupport { - - @Autowired - @Qualifier("scheduledExecutorService") - private ScheduledExecutorService scheduledExecutorService; - - /** - * 异步执行需要使用权限框架自带的包装线程池 保证权限信息的传递 - */ - @Override - public Executor getAsyncExecutor() { - return new DelegatingSecurityContextExecutorService(scheduledExecutorService); - } - - /** - * 异步执行异常处理 - */ - @Override - public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { - return (throwable, method, objects) -> { - throwable.printStackTrace(); - StringBuilder sb = new StringBuilder(); - sb.append("Exception message - ").append(throwable.getMessage()) - .append(", Method name - ").append(method.getName()); - if (ArrayUtil.isNotEmpty(objects)) { - sb.append(", Parameter value - ").append(Arrays.toString(objects)); - } - throw new ServiceException(sb.toString()); - }; - } - -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java index 735f7e35..6f7a82ec 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java @@ -21,11 +21,10 @@ public class DruidConfig { /** * 去除监控页面底部的广告 */ - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({"rawtypes", "unchecked"}) @Bean @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") - public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) - { + public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) { // 获取web监控页面的参数 DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); // 提取common.js的配置路径 @@ -33,16 +32,14 @@ public class DruidConfig { String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); final String filePath = "support/http/resources/js/common.js"; // 创建filter进行过滤 - Filter filter = new Filter() - { + Filter filter = new Filter() { @Override - public void init(javax.servlet.FilterConfig filterConfig) throws ServletException - { + public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { } + @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException - { + throws IOException, ServletException { chain.doFilter(request, response); // 重置缓冲区,响应头不会被重置 // response.resetBuffer(); @@ -53,9 +50,9 @@ public class DruidConfig { text = text.replaceAll("powered.*?shrek.wang", ""); response.getWriter().write(text); } + @Override - public void destroy() - { + public void destroy() { } }; FilterRegistrationBean registrationBean = new FilterRegistrationBean(); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java index 20b52a8e..e64fa3a7 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java @@ -17,30 +17,30 @@ import java.util.Locale; @Configuration public class I18nConfig { - @Bean - public LocaleResolver localeResolver() { - return new I18nLocaleResolver(); - } + @Bean + public LocaleResolver localeResolver() { + return new I18nLocaleResolver(); + } - /** - * 获取请求头国际化信息 - */ - static class I18nLocaleResolver implements LocaleResolver { + /** + * 获取请求头国际化信息 + */ + static class I18nLocaleResolver implements LocaleResolver { - @Override - public Locale resolveLocale(HttpServletRequest httpServletRequest) { - String language = httpServletRequest.getHeader("content-language"); - Locale locale = Locale.getDefault(); - if (StrUtil.isNotBlank(language)) { - String[] split = language.split("_"); - locale = new Locale(split[0], split[1]); - } - return locale; - } + @Override + public Locale resolveLocale(HttpServletRequest httpServletRequest) { + String language = httpServletRequest.getHeader("content-language"); + Locale locale = Locale.getDefault(); + if (StrUtil.isNotBlank(language)) { + String[] split = language.split("_"); + locale = new Locale(split[0], split[1]); + } + return locale; + } - @Override - public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) { + @Override + public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) { - } - } + } + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/JacksonConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/JacksonConfig.java index 55756d49..a5d63716 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/JacksonConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/JacksonConfig.java @@ -28,23 +28,23 @@ import java.util.TimeZone; @Configuration public class JacksonConfig { - @Primary - @Bean - public ObjectMapper getObjectMapper(Jackson2ObjectMapperBuilder builder, JacksonProperties jacksonProperties) { - ObjectMapper objectMapper = builder.createXmlMapper(false).build(); - // 全局配置序列化返回 JSON 处理 - SimpleModule simpleModule = new SimpleModule(); - simpleModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); - simpleModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); - simpleModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); - simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern(jacksonProperties.getDateFormat()); - simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); - simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); - objectMapper.registerModule(simpleModule); - objectMapper.setTimeZone(TimeZone.getDefault()); - log.info("初始化 jackson 配置"); - return objectMapper; - } + @Primary + @Bean + public ObjectMapper getObjectMapper(Jackson2ObjectMapperBuilder builder, JacksonProperties jacksonProperties) { + ObjectMapper objectMapper = builder.createXmlMapper(false).build(); + // 全局配置序列化返回 JSON 处理 + SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(jacksonProperties.getDateFormat()); + simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); + simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); + objectMapper.registerModule(simpleModule); + objectMapper.setTimeZone(TimeZone.getDefault()); + log.info("初始化 jackson 配置"); + return objectMapper; + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java index 5daaa9ac..ffd2c155 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java @@ -4,14 +4,9 @@ import cn.hutool.core.net.NetUtil; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; -import com.baomidou.mybatisplus.core.injector.AbstractMethod; -import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; -import com.baomidou.mybatisplus.core.injector.ISqlInjector; -import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import com.ruoyi.common.core.mybatisplus.methods.InsertAll; import com.ruoyi.framework.handler.CreateAndUpdateMetaObjectHandler; import com.ruoyi.framework.interceptor.PlusDataPermissionInterceptor; import org.mybatis.spring.annotation.MapperScan; @@ -19,8 +14,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; -import java.util.List; - /** * mybatis-plus配置类(下方注释有插件介绍) * @@ -31,17 +24,17 @@ import java.util.List; @MapperScan("${mybatis-plus.mapperPackage}") public class MybatisPlusConfig { - @Bean - public MybatisPlusInterceptor mybatisPlusInterceptor() { - MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 数据权限处理 interceptor.addInnerInterceptor(dataPermissionInterceptor()); - // 分页插件 - interceptor.addInnerInterceptor(paginationInnerInterceptor()); - // 乐观锁插件 - interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); - return interceptor; - } + // 分页插件 + interceptor.addInnerInterceptor(paginationInnerInterceptor()); + // 乐观锁插件 + interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); + return interceptor; + } /** * 数据权限拦截器 @@ -50,47 +43,32 @@ public class MybatisPlusConfig { return new PlusDataPermissionInterceptor(); } - /** - * 分页插件,自动识别数据库类型 - */ - public PaginationInnerInterceptor paginationInnerInterceptor() { - PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); - // 设置最大单页限制数量,默认 500 条,-1 不受限制 - paginationInnerInterceptor.setMaxLimit(-1L); - // 分页合理化 - paginationInnerInterceptor.setOverflow(true); - return paginationInnerInterceptor; - } + /** + * 分页插件,自动识别数据库类型 + */ + public PaginationInnerInterceptor paginationInnerInterceptor() { + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); + // 设置最大单页限制数量,默认 500 条,-1 不受限制 + paginationInnerInterceptor.setMaxLimit(-1L); + // 分页合理化 + paginationInnerInterceptor.setOverflow(true); + return paginationInnerInterceptor; + } - /** - * 乐观锁插件 - */ - public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { - return new OptimisticLockerInnerInterceptor(); - } + /** + * 乐观锁插件 + */ + public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { + return new OptimisticLockerInnerInterceptor(); + } - /** - * 元对象字段填充控制器 - */ - @Bean - public MetaObjectHandler metaObjectHandler() { - return new CreateAndUpdateMetaObjectHandler(); - } - - /** - * sql注入器配置 - */ - @Bean - public ISqlInjector sqlInjector() { - return new DefaultSqlInjector() { - @Override - public List getMethodList(Class mapperClass, TableInfo tableInfo) { - List methodList = super.getMethodList(mapperClass, tableInfo); - methodList.add(new InsertAll()); - return methodList; - } - }; - } + /** + * 元对象字段填充控制器 + */ + @Bean + public MetaObjectHandler metaObjectHandler() { + return new CreateAndUpdateMetaObjectHandler(); + } /** * 使用网卡信息绑定雪花生成器 @@ -101,24 +79,24 @@ public class MybatisPlusConfig { return new DefaultIdentifierGenerator(NetUtil.getLocalhost()); } - /** - * PaginationInnerInterceptor 分页插件,自动识别数据库类型 - * https://baomidou.com/pages/97710a/ - * OptimisticLockerInnerInterceptor 乐观锁插件 - * https://baomidou.com/pages/0d93c0/ - * MetaObjectHandler 元对象字段填充控制器 - * https://baomidou.com/pages/4c6bcf/ - * ISqlInjector sql注入器 - * https://baomidou.com/pages/42ea4a/ - * BlockAttackInnerInterceptor 如果是对全表的删除或更新操作,就会终止该操作 - * https://baomidou.com/pages/f9a237/ - * IllegalSQLInnerInterceptor sql性能规范插件(垃圾SQL拦截) - * IdentifierGenerator 自定义主键策略 - * https://baomidou.com/pages/568eb2/ - * TenantLineInnerInterceptor 多租户插件 - * https://baomidou.com/pages/aef2f2/ - * DynamicTableNameInnerInterceptor 动态表名插件 - * https://baomidou.com/pages/2a45ff/ - */ + /** + * PaginationInnerInterceptor 分页插件,自动识别数据库类型 + * https://baomidou.com/pages/97710a/ + * OptimisticLockerInnerInterceptor 乐观锁插件 + * https://baomidou.com/pages/0d93c0/ + * MetaObjectHandler 元对象字段填充控制器 + * https://baomidou.com/pages/4c6bcf/ + * ISqlInjector sql注入器 + * https://baomidou.com/pages/42ea4a/ + * BlockAttackInnerInterceptor 如果是对全表的删除或更新操作,就会终止该操作 + * https://baomidou.com/pages/f9a237/ + * IllegalSQLInnerInterceptor sql性能规范插件(垃圾SQL拦截) + * IdentifierGenerator 自定义主键策略 + * https://baomidou.com/pages/568eb2/ + * TenantLineInnerInterceptor 多租户插件 + * https://baomidou.com/pages/aef2f2/ + * DynamicTableNameInnerInterceptor 动态表名插件 + * https://baomidou.com/pages/2a45ff/ + */ } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java index 83565b6e..f43ecab7 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java @@ -19,10 +19,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class ResourcesConfig implements WebMvcConfigurer { - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - } - @Override public void addInterceptors(InterceptorRegistry registry) { // 全局链路跟踪拦截器 @@ -31,6 +27,10 @@ public class ResourcesConfig implements WebMvcConfigurer { registry.addInterceptor(new PlusWebInvokeTimeInterceptor()); } + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + } + /** * 跨域配置 */ diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java new file mode 100644 index 00000000..05cff030 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java @@ -0,0 +1,61 @@ +package com.ruoyi.framework.config; + +import cn.dev33.satoken.interceptor.SaAnnotationInterceptor; +import cn.dev33.satoken.interceptor.SaRouteInterceptor; +import cn.dev33.satoken.jwt.StpLogicJwtForStyle; +import cn.dev33.satoken.router.SaRouter; +import cn.dev33.satoken.stp.StpLogic; +import com.ruoyi.framework.config.properties.SecurityProperties; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * sa-token 配置 + * + * @author Lion Li + */ +@Slf4j +@Configuration +public class SaTokenConfig implements WebMvcConfigurer { + + @Autowired + private SecurityProperties securityProperties; + + /** + * 注册sa-token的拦截器 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册路由拦截器,自定义验证规则 + registry.addInterceptor(new SaRouteInterceptor((request, response, handler) -> { + // 登录验证 -- 排除多个路径 + SaRouter + // 获取所有的 + .match("/**") + // 排除下不需要拦截的 + .notMatch(securityProperties.getExcludes()) + .check(() -> { + // 做一些访问检查 +// if (log.isDebugEnabled()) { +// Long userId = LoginUtils.getUserId(); +// if (StringUtils.isNotNull(userId)) { +// log.debug("剩余有效时间: {}", StpUtil.getTokenTimeout()); +// log.debug("临时有效时间: {}", StpUtil.getTokenActivityTimeout()); +// } +// } + }); + })).addPathPatterns("/**"); + registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**"); + } + + @Bean + public StpLogic getStpLogicJwt() { + // Sa-Token 整合 jwt (Style模式) + return new StpLogicJwtForStyle(); + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java deleted file mode 100644 index 450eccd4..00000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.ruoyi.framework.config; - -import com.ruoyi.framework.config.properties.SecurityProperties; -import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter; -import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl; -import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.authentication.logout.LogoutFilter; -import org.springframework.web.filter.CorsFilter; - -/** - * spring security配置 - * - * @author ruoyi - */ -@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) -public class SecurityConfig extends WebSecurityConfigurerAdapter { - /** - * 自定义用户认证逻辑 - */ - @Autowired - private UserDetailsService userDetailsService; - - /** - * 认证失败处理类 - */ - @Autowired - private AuthenticationEntryPointImpl unauthorizedHandler; - - /** - * 退出处理类 - */ - @Autowired - private LogoutSuccessHandlerImpl logoutSuccessHandler; - - /** - * token认证过滤器 - */ - @Autowired - private JwtAuthenticationTokenFilter authenticationTokenFilter; - - /** - * 跨域过滤器 - */ - @Autowired - private CorsFilter corsFilter; - - @Autowired - private SecurityProperties securityProperties; - - /** - * 解决 无法直接注入 AuthenticationManager - * - * @return - * @throws Exception - */ - @Bean - @Override - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); - } - - /** - * anyRequest | 匹配所有请求路径 - * access | SpringEl表达式结果为true时可以访问 - * anonymous | 匿名可以访问 - * denyAll | 用户不能访问 - * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) - * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 - * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 - * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 - * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 - * hasRole | 如果有参数,参数表示角色,则其角色可以访问 - * permitAll | 用户可以任意访问 - * rememberMe | 允许通过remember-me登录的用户访问 - * authenticated | 用户登录后可访问 - */ - @Override - protected void configure(HttpSecurity httpSecurity) throws Exception { - httpSecurity - // CSRF禁用,因为不使用session - .csrf().disable() - // 认证失败处理类 - .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() - // 基于token,所以不需要session - .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() - // 过滤请求 - .authorizeRequests() - .antMatchers( - HttpMethod.GET, - "/", - "/*.html", - "/**/*.html", - "/**/*.css", - "/**/*.js" - ).permitAll() - .antMatchers(securityProperties.getAnonymous()).anonymous() - .antMatchers(securityProperties.getPermitAll()).permitAll() - // 除上面外的所有请求全部需要鉴权认证 - .anyRequest().authenticated() - .and() - .headers().frameOptions().disable(); - httpSecurity.logout().logoutUrl(securityProperties.getLogoutUrl()).logoutSuccessHandler(logoutSuccessHandler); - // 添加JWT filter - httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); - // 添加CORS filter - httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class); - httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class); - } - - /** - * 强散列哈希加密实现 - */ - @Bean - public BCryptPasswordEncoder bCryptPasswordEncoder() { - return new BCryptPasswordEncoder(); - } - - /** - * 身份认证接口 - */ - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java index bf6bc8f9..167ac2ec 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java @@ -1,14 +1,19 @@ package com.ruoyi.framework.config; +import cn.dev33.satoken.config.SaTokenConfig; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; -import com.ruoyi.common.properties.TokenProperties; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.config.properties.SwaggerProperties; import io.swagger.models.auth.In; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.util.ReflectionUtils; +import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; @@ -16,8 +21,11 @@ import springfox.documentation.service.*; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; +import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; import javax.annotation.PostConstruct; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; @@ -26,48 +34,75 @@ import java.util.List; * * @author Lion Li */ +@RequiredArgsConstructor @Configuration @EnableKnife4j public class SwaggerConfig { - @Autowired - private SwaggerProperties swaggerProperties; + private final SwaggerProperties swaggerProperties; + private final SaTokenConfig saTokenConfig; + private final OpenApiExtensionResolver openApiExtensionResolver; - @Autowired - private TokenProperties tokenProperties; + /** + * 用于适配springboot 2.6 + */ + @Bean + @SuppressWarnings("all") + public BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { + return new BeanPostProcessor() { + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { + customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); + } + return bean; + } - @Autowired - private OpenApiExtensionResolver openApiExtensionResolver; + private void customizeSpringfoxHandlerMappings(List mappings) { + mappings.removeIf(mapping -> mapping.getPatternParser() != null); + } + + private List getHandlerMappings(Object bean) { + try { + Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); + field.setAccessible(true); + return (List) field.get(bean); + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + }; + } /** * 创建API */ @PostConstruct public void createRestApi() { - for (SwaggerProperties.Groups group : swaggerProperties.getGroups()) { - String basePackage = group.getBasePackage(); - Docket docket = new Docket(DocumentationType.OAS_30) - .enable(swaggerProperties.getEnabled()) - // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) - .apiInfo(apiInfo()) - // 设置哪些接口暴露给Swagger展示 - .select() - // 扫描所有有注解的api,用这种方式更灵活 - //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) - // 扫描指定包中的swagger注解 - .apis(RequestHandlerSelectors.basePackage(basePackage)) - // 扫描所有 .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build() - .groupName(group.getName()) - // 设置安全模式,swagger可以设置访问token - .securitySchemes(securitySchemes()) - .securityContexts(securityContexts()) - .extensions(openApiExtensionResolver.buildExtensions(group.getName())) - .pathMapping(swaggerProperties.getPathMapping()); - String beanName = StringUtils.substringAfterLast(basePackage, ".") + "Docket"; - SpringUtils.registerBean(beanName, docket); - } + for (SwaggerProperties.Groups group : swaggerProperties.getGroups()) { + String basePackage = group.getBasePackage(); + Docket docket = new Docket(DocumentationType.OAS_30) + .enable(swaggerProperties.getEnabled()) + // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo()) + // 设置哪些接口暴露给Swagger展示 + .select() + // 扫描所有有注解的api,用这种方式更灵活 + //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 扫描指定包中的swagger注解 + .apis(RequestHandlerSelectors.basePackage(basePackage)) + // 扫描所有 .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + .groupName(group.getName()) + // 设置安全模式,swagger可以设置访问token + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .extensions(openApiExtensionResolver.buildExtensions(group.getName())) + .pathMapping(swaggerProperties.getPathMapping()); + String beanName = StringUtils.substringAfterLast(basePackage, ".") + "Docket"; + SpringUtils.registerBean(beanName, docket); + } } /** @@ -75,8 +110,8 @@ public class SwaggerConfig { */ private List securitySchemes() { List apiKeyList = new ArrayList(); - String header = tokenProperties.getHeader(); - apiKeyList.add(new ApiKey(header, header, In.HEADER.toValue())); + String header = saTokenConfig.getTokenName(); + apiKeyList.add(new ApiKey(header, header, In.HEADER.toValue())); return apiKeyList; } @@ -86,10 +121,10 @@ public class SwaggerConfig { private List securityContexts() { List securityContexts = new ArrayList<>(); securityContexts.add( - SecurityContext.builder() - .securityReferences(defaultAuth()) - .operationSelector(o -> o.requestMappingPattern().matches("/.*")) - .build()); + SecurityContext.builder() + .securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern().matches("/.*")) + .build()); return securityContexts; } @@ -97,11 +132,11 @@ public class SwaggerConfig { * 默认的安全上引用 */ private List defaultAuth() { - AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope authorizationScope = new AuthorizationScope("global" , "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; List securityReferences = new ArrayList<>(); - securityReferences.add(new SecurityReference(tokenProperties.getHeader(), authorizationScopes)); + securityReferences.add(new SecurityReference(saTokenConfig.getTokenName(), authorizationScopes)); return securityReferences; } @@ -112,14 +147,14 @@ public class SwaggerConfig { // 用ApiInfoBuilder进行定制 SwaggerProperties.Contact contact = swaggerProperties.getContact(); return new ApiInfoBuilder() - // 设置标题 - .title(swaggerProperties.getTitle()) - // 描述 - .description(swaggerProperties.getDescription()) - // 作者信息 - .contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail())) - // 版本 - .version(swaggerProperties.getVersion()) - .build(); + // 设置标题 + .title(swaggerProperties.getTitle()) + // 描述 + .description(swaggerProperties.getDescription()) + // 作者信息 + .contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail())) + // 版本 + .version(swaggerProperties.getVersion()) + .build(); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java index 354d8c30..1b41c66c 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java @@ -16,23 +16,23 @@ import org.springframework.stereotype.Component; @ConfigurationProperties(prefix = "captcha") public class CaptchaProperties { - /** - * 验证码类型 - */ + /** + * 验证码类型 + */ private CaptchaType type; - /** - * 验证码类别 - */ + /** + * 验证码类别 + */ private CaptchaCategory category; - /** - * 数字验证码位数 - */ + /** + * 数字验证码位数 + */ private Integer numberLength; - /** - * 字符验证码长度 - */ + /** + * 字符验证码长度 + */ private Integer charLength; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java index 4516da26..0b9024d2 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java @@ -20,217 +20,217 @@ import java.util.List; @ConfigurationProperties(prefix = "redisson") public class RedissonProperties { - /** - * 线程池数量,默认值 = 当前处理核数量 * 2 - */ - private int threads; + /** + * 线程池数量,默认值 = 当前处理核数量 * 2 + */ + private int threads; - /** - * Netty线程池数量,默认值 = 当前处理核数量 * 2 - */ - private int nettyThreads; + /** + * Netty线程池数量,默认值 = 当前处理核数量 * 2 + */ + private int nettyThreads; - /** - * 传输模式 - */ - private TransportMode transportMode; + /** + * 传输模式 + */ + private TransportMode transportMode; - /** - * 单机服务配置 - */ - private SingleServerConfig singleServerConfig; + /** + * 单机服务配置 + */ + private SingleServerConfig singleServerConfig; - /** - * 集群服务配置 - */ - private ClusterServersConfig clusterServersConfig; + /** + * 集群服务配置 + */ + private ClusterServersConfig clusterServersConfig; - /** - * 缓存组 - */ - private List cacheGroup; + /** + * 缓存组 + */ + private List cacheGroup; - @Data - @NoArgsConstructor - public static class SingleServerConfig { + @Data + @NoArgsConstructor + public static class SingleServerConfig { - /** - * 客户端名称 - */ - private String clientName; + /** + * 客户端名称 + */ + private String clientName; - /** - * 最小空闲连接数 - */ - private int connectionMinimumIdleSize; + /** + * 最小空闲连接数 + */ + private int connectionMinimumIdleSize; - /** - * 连接池大小 - */ - private int connectionPoolSize; + /** + * 连接池大小 + */ + private int connectionPoolSize; - /** - * 连接空闲超时,单位:毫秒 - */ - private int idleConnectionTimeout; + /** + * 连接空闲超时,单位:毫秒 + */ + private int idleConnectionTimeout; - /** - * 命令等待超时,单位:毫秒 - */ - private int timeout; + /** + * 命令等待超时,单位:毫秒 + */ + private int timeout; - /** - * 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。 - */ - private int retryAttempts; + /** + * 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。 + */ + private int retryAttempts; - /** - * 命令重试发送时间间隔,单位:毫秒 - */ - private int retryInterval; + /** + * 命令重试发送时间间隔,单位:毫秒 + */ + private int retryInterval; - /** - * 发布和订阅连接的最小空闲连接数 - */ - private int subscriptionConnectionMinimumIdleSize; + /** + * 发布和订阅连接的最小空闲连接数 + */ + private int subscriptionConnectionMinimumIdleSize; - /** - * 发布和订阅连接池大小 - */ - private int subscriptionConnectionPoolSize; + /** + * 发布和订阅连接池大小 + */ + private int subscriptionConnectionPoolSize; - /** - * 单个连接最大订阅数量 - */ - private int subscriptionsPerConnection; + /** + * 单个连接最大订阅数量 + */ + private int subscriptionsPerConnection; - /** - * DNS监测时间间隔,单位:毫秒 - */ - private int dnsMonitoringInterval; + /** + * DNS监测时间间隔,单位:毫秒 + */ + private int dnsMonitoringInterval; - } + } - @Data - @NoArgsConstructor - public static class ClusterServersConfig { + @Data + @NoArgsConstructor + public static class ClusterServersConfig { - /** - * 客户端名称 - */ - private String clientName; + /** + * 客户端名称 + */ + private String clientName; - /** - * master最小空闲连接数 - */ - private int masterConnectionMinimumIdleSize; + /** + * master最小空闲连接数 + */ + private int masterConnectionMinimumIdleSize; - /** - * master连接池大小 - */ - private int masterConnectionPoolSize; + /** + * master连接池大小 + */ + private int masterConnectionPoolSize; - /** - * slave最小空闲连接数 - */ - private int slaveConnectionMinimumIdleSize; + /** + * slave最小空闲连接数 + */ + private int slaveConnectionMinimumIdleSize; - /** - * slave连接池大小 - */ - private int slaveConnectionPoolSize; + /** + * slave连接池大小 + */ + private int slaveConnectionPoolSize; - /** - * 连接空闲超时,单位:毫秒 - */ - private int idleConnectionTimeout; + /** + * 连接空闲超时,单位:毫秒 + */ + private int idleConnectionTimeout; - /** - * ping超时 - */ - private int pingConnectionInterval; + /** + * ping超时 + */ + private int pingConnectionInterval; - /** - * 命令等待超时,单位:毫秒 - */ - private int timeout; + /** + * 命令等待超时,单位:毫秒 + */ + private int timeout; - /** - * 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。 - */ - private int retryAttempts; + /** + * 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。 + */ + private int retryAttempts; - /** - * 命令重试发送时间间隔,单位:毫秒 - */ - private int retryInterval; + /** + * 命令重试发送时间间隔,单位:毫秒 + */ + private int retryInterval; - /** - * 错误重试次数 - */ - private int failedSlaveReconnectionInterval; + /** + * 错误重试次数 + */ + private int failedSlaveReconnectionInterval; - /** - * 发布和订阅连接池最小空闲连接数 - */ - private int subscriptionConnectionMinimumIdleSize; + /** + * 发布和订阅连接池最小空闲连接数 + */ + private int subscriptionConnectionMinimumIdleSize; - /** - * 发布和订阅连接池大小 - */ - private int subscriptionConnectionPoolSize; + /** + * 发布和订阅连接池大小 + */ + private int subscriptionConnectionPoolSize; - /** - * 单个连接最大订阅数量 - */ - private int subscriptionsPerConnection; + /** + * 单个连接最大订阅数量 + */ + private int subscriptionsPerConnection; - /** - * 扫描间隔 - */ - private int scanInterval; + /** + * 扫描间隔 + */ + private int scanInterval; - /** - * DNS监测时间间隔,单位:毫秒 - */ - private int dnsMonitoringInterval; + /** + * DNS监测时间间隔,单位:毫秒 + */ + private int dnsMonitoringInterval; - /** - * 读取模式 - */ - private ReadMode readMode; + /** + * 读取模式 + */ + private ReadMode readMode; - /** - * 订阅模式 - */ - private SubscriptionMode subscriptionMode; + /** + * 订阅模式 + */ + private SubscriptionMode subscriptionMode; - } + } - @Data - @NoArgsConstructor - public static class CacheGroup { + @Data + @NoArgsConstructor + public static class CacheGroup { - /** - * 组id - */ - private String groupId; + /** + * 组id + */ + private String groupId; - /** - * 组过期时间 - */ - private long ttl; + /** + * 组过期时间 + */ + private long ttl; - /** - * 组最大空闲时间 - */ - private long maxIdleTime; + /** + * 组最大空闲时间 + */ + private long maxIdleTime; - /** - * 组最大长度 - */ - private int maxSize; + /** + * 组最大长度 + */ + private int maxSize; - } + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java index c83ffccb..b3741818 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java @@ -15,18 +15,9 @@ import org.springframework.stereotype.Component; public class SecurityProperties { /** - * 退出登录url + * 排除路径 */ - private String logoutUrl; + private String[] excludes; - /** - * 匿名放行路径 - */ - private String[] anonymous; - - /** - * 用户任意访问放行路径 - */ - private String[] permitAll; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java index 9c4cd238..c2b3f97b 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java @@ -21,10 +21,10 @@ public class SwaggerProperties { * 验证码类型 */ private Boolean enabled; - /** - * 设置请求的统一前缀 - */ - private String pathMapping; + /** + * 设置请求的统一前缀 + */ + private String pathMapping; /** * 验证码类别 */ @@ -38,51 +38,51 @@ public class SwaggerProperties { */ private String version; - /** - * 联系方式 - */ + /** + * 联系方式 + */ private Contact contact; - /** - * 组配置 - */ - private List groups; + /** + * 组配置 + */ + private List groups; @Data - @NoArgsConstructor - public static class Contact { + @NoArgsConstructor + public static class Contact { - /** - * 联系人 - */ - private String name; + /** + * 联系人 + */ + private String name; - /** - * 联系人url - */ - private String url; + /** + * 联系人url + */ + private String url; - /** - * 联系人email - */ - private String email; + /** + * 联系人email + */ + private String email; - } + } - @Data - @NoArgsConstructor - public static class Groups { + @Data + @NoArgsConstructor + public static class Groups { - /** - * 组名 - */ - private String name; + /** + * 组名 + */ + private String name; - /** - * 基础包路径 - */ - private String basePackage; + /** + * 基础包路径 + */ + private String basePackage; - } + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java index 7cf64c46..f311a65c 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; @@ -22,43 +22,43 @@ import java.util.Date; @Slf4j public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { - @Override - public void insertFill(MetaObject metaObject) { - try { - if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) { - BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject(); - Date current = new Date(); - // 创建时间为空 则填充 - if (ObjectUtil.isNull(baseEntity.getCreateTime())) { - baseEntity.setCreateTime(current); - } - // 更新时间为空 则填充 - if (ObjectUtil.isNull(baseEntity.getUpdateTime())) { - baseEntity.setUpdateTime(current); - } - String username = getLoginUsername(); - // 当前已登录 且 创建人为空 则填充 - if (StringUtils.isNotBlank(username) - && StringUtils.isBlank(baseEntity.getCreateBy())) { - baseEntity.setCreateBy(username); - } - // 当前已登录 且 更新人为空 则填充 - if (StringUtils.isNotBlank(username) - && StringUtils.isBlank(baseEntity.getUpdateBy())) { - baseEntity.setUpdateBy(username); - } - } - } catch (Exception e) { - throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); - } - } + @Override + public void insertFill(MetaObject metaObject) { + try { + if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) { + BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject(); + Date current = new Date(); + // 创建时间为空 则填充 + if (ObjectUtil.isNull(baseEntity.getCreateTime())) { + baseEntity.setCreateTime(current); + } + // 更新时间为空 则填充 + if (ObjectUtil.isNull(baseEntity.getUpdateTime())) { + baseEntity.setUpdateTime(current); + } + String username = getLoginUsername(); + // 当前已登录 且 创建人为空 则填充 + if (StringUtils.isNotBlank(username) + && StringUtils.isBlank(baseEntity.getCreateBy())) { + baseEntity.setCreateBy(username); + } + // 当前已登录 且 更新人为空 则填充 + if (StringUtils.isNotBlank(username) + && StringUtils.isBlank(baseEntity.getUpdateBy())) { + baseEntity.setUpdateBy(username); + } + } + } catch (Exception e) { + throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); + } + } - @Override - public void updateFill(MetaObject metaObject) { - try { - if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) { - BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject(); - Date current = new Date(); + @Override + public void updateFill(MetaObject metaObject) { + try { + if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) { + BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject(); + Date current = new Date(); // 更新时间填充(不管为不为空) baseEntity.setUpdateTime(current); String username = getLoginUsername(); @@ -66,24 +66,24 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { if (StringUtils.isNotBlank(username)) { baseEntity.setUpdateBy(username); } - } - } catch (Exception e) { - throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); - } - } + } + } catch (Exception e) { + throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); + } + } - /** - * 获取登录用户名 - */ - private String getLoginUsername() { - LoginUser loginUser; - try { - loginUser = SecurityUtils.getLoginUser(); - } catch (Exception e) { - log.warn("自动注入警告 => 用户未登录"); - return null; - } - return loginUser.getUsername(); - } + /** + * 获取登录用户名 + */ + private String getLoginUsername() { + LoginUser loginUser; + try { + loginUser = LoginUtils.getLoginUser(); + } catch (Exception e) { + log.warn("自动注入警告 => 用户未登录"); + return null; + } + return loginUser.getUsername(); + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java index d5f4f583..2318f6f4 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java @@ -13,7 +13,7 @@ import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.enums.DataScopeType; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.helper.DataPermissionHelper; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import lombok.extern.slf4j.Slf4j; @@ -76,7 +76,7 @@ public class PlusDataPermissionHandler { } SysUser currentUser = DataPermissionHelper.getVariable("user"); if (ObjectUtil.isNull(currentUser)) { - currentUser = SpringUtils.getBean(UserService.class).selectUserById(SecurityUtils.getUserId()); + currentUser = SpringUtils.getBean(UserService.class).selectUserById(LoginUtils.getUserId()); DataPermissionHelper.setVariable("user", currentUser); } // 如果是超级管理员,则不过滤数据 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java index 1781b94b..a4aee155 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java @@ -15,28 +15,28 @@ import java.io.IOException; @JacksonStdImpl public class BigNumberSerializer extends NumberSerializer { - /** - * 根据 JS Number.MAX_SAFE_INTEGER 与 Number.MIN_SAFE_INTEGER 得来 - */ - private static final long MAX_SAFE_INTEGER = 9007199254740991L; - private static final long MIN_SAFE_INTEGER = -9007199254740991L; + /** + * 根据 JS Number.MAX_SAFE_INTEGER 与 Number.MIN_SAFE_INTEGER 得来 + */ + private static final long MAX_SAFE_INTEGER = 9007199254740991L; + private static final long MIN_SAFE_INTEGER = -9007199254740991L; - /** - * 提供实例 - */ - public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); + /** + * 提供实例 + */ + public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); - public BigNumberSerializer(Class rawType) { - super(rawType); - } + public BigNumberSerializer(Class rawType) { + super(rawType); + } - @Override - public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { - // 超出范围 序列化位字符串 - if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { - super.serialize(value, gen, provider); - } else { - gen.writeString(value.toString()); - } - } + @Override + public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { + // 超出范围 序列化位字符串 + if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { + super.serialize(value, gen, provider); + } else { + gen.writeString(value.toString()); + } + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java new file mode 100644 index 00000000..15b04d82 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java @@ -0,0 +1,121 @@ +package com.ruoyi.framework.listener; + +import cn.dev33.satoken.config.SaTokenConfig; +import cn.dev33.satoken.listener.SaTokenListener; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.dto.UserOnlineDTO; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.service.UserService; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.common.utils.LoginUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.AddressUtils; +import com.ruoyi.common.utils.redis.RedisUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * 用户行为 侦听器的实现 + */ +@Component +@Slf4j +public class UserActionListener implements SaTokenListener { + + @Autowired + private SaTokenConfig saTokenConfig; + + /** + * 每次登录时触发 + */ + @Override + public void doLogin(String loginType, Object loginId, SaLoginModel loginModel) { + UserType userType = LoginUtils.getUserType(loginId); + if (userType == UserType.SYS_USER) { + UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = ServletUtils.getClientIP(); + SysUser user = SpringUtils.getBean(UserService.class).selectUserById(LoginUtils.getUserId()); + String tokenValue = StpUtil.getTokenValue(); + UserOnlineDTO userOnlineDTO = new UserOnlineDTO() + .setIpaddr(ip) + .setLoginLocation(AddressUtils.getRealAddressByIP(ip)) + .setBrowser(userAgent.getBrowser().getName()) + .setOs(userAgent.getOs().getName()) + .setLoginTime(System.currentTimeMillis()) + .setTokenId(tokenValue) + .setUserName(user.getUserName()); + if (StringUtils.isNotNull(user.getDept())) { + userOnlineDTO.setDeptName(user.getDept().getDeptName()); + } + RedisUtils.setCacheObject(Constants.ONLINE_TOKEN_KEY + tokenValue, userOnlineDTO, saTokenConfig.getTimeout(), TimeUnit.SECONDS); + log.info("user doLogin, useId:{}, token:{}" , loginId, tokenValue); + } else if (userType == UserType.APP_USER) { + // app端 自行根据业务编写 + } + } + + /** + * 每次注销时触发 + */ + @Override + public void doLogout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogout, useId:{}, token:{}" , loginId, tokenValue); + } + + /** + * 每次被踢下线时触发 + */ + @Override + public void doKickout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogoutByLoginId, useId:{}, token:{}" , loginId, tokenValue); + } + + /** + * 每次被顶下线时触发 + */ + @Override + public void doReplaced(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doReplaced, useId:{}, token:{}" , loginId, tokenValue); + } + + /** + * 每次被封禁时触发 + */ + @Override + public void doDisable(String loginType, Object loginId, long disableTime) { + } + + /** + * 每次被解封时触发 + */ + @Override + public void doUntieDisable(String loginType, Object loginId) { + } + + /** + * 每次创建Session时触发 + */ + @Override + public void doCreateSession(String id) { + } + + /** + * 每次注销Session时触发 + */ + @Override + public void doLogoutSession(String id) { + } + + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java index ef77a219..9d27874e 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java @@ -18,24 +18,24 @@ import java.util.concurrent.ScheduledExecutorService; @Component public class ShutdownManager { - @Autowired - @Qualifier("scheduledExecutorService") - private ScheduledExecutorService scheduledExecutorService; + @Autowired + @Qualifier("scheduledExecutorService") + private ScheduledExecutorService scheduledExecutorService; - @PreDestroy - public void destroy() { - shutdownAsyncManager(); - } + @PreDestroy + public void destroy() { + shutdownAsyncManager(); + } - /** - * 停止异步执行任务 - */ - private void shutdownAsyncManager() { - try { - log.info("====关闭后台任务任务线程池===="); - Threads.shutdownAndAwaitTermination(scheduledExecutorService); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - } + /** + * 停止异步执行任务 + */ + private void shutdownAsyncManager() { + try { + log.info("====关闭后台任务任务线程池===="); + Threads.shutdownAndAwaitTermination(scheduledExecutorService); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java new file mode 100644 index 00000000..174cd0f8 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java @@ -0,0 +1,178 @@ +package com.ruoyi.framework.satoken.dao; + +import cn.dev33.satoken.dao.SaTokenDao; +import cn.dev33.satoken.util.SaFoxUtil; +import com.ruoyi.common.utils.redis.RedisUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Sa-Token持久层接口(使用框架自带RedisUtils实现 协议统一) + * + * @author Lion Li + */ +@Component +public class PlusSaTokenDao implements SaTokenDao { + + /** + * 获取Value,如无返空 + */ + @Override + public String get(String key) { + return RedisUtils.getCacheObject(key); + } + + /** + * 写入Value,并设定存活时间 (单位: 秒) + */ + @Override + public void set(String key, String value, long timeout) { + if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + // 判断是否为永不过期 + if(timeout == SaTokenDao.NEVER_EXPIRE) { + RedisUtils.setCacheObject(key, value); + } else { + RedisUtils.setCacheObject(key, value, timeout, TimeUnit.SECONDS); + } + } + + /** + * 修修改指定key-value键值对 (过期时间不变) + */ + @Override + public void update(String key, String value) { + long expire = getTimeout(key); + // -2 = 无此键 + if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + this.set(key, value, expire); + } + + /** + * 删除Value + */ + @Override + public void delete(String key) { + RedisUtils.deleteObject(key); + } + + /** + * 获取Value的剩余存活时间 (单位: 秒) + */ + @Override + public long getTimeout(String key) { + return RedisUtils.getTimeToLive(key) / 1000; + } + + /** + * 修改Value的剩余存活时间 (单位: 秒) + */ + @Override + public void updateTimeout(String key, long timeout) { + // 判断是否想要设置为永久 + if(timeout == SaTokenDao.NEVER_EXPIRE) { + long expire = getTimeout(key); + if(expire == SaTokenDao.NEVER_EXPIRE) { + // 如果其已经被设置为永久,则不作任何处理 + } else { + // 如果尚未被设置为永久,那么再次set一次 + this.set(key, this.get(key), timeout); + } + return; + } + RedisUtils.expire(key, timeout, TimeUnit.SECONDS); + } + + + + /** + * 获取Object,如无返空 + */ + @Override + public Object getObject(String key) { + return RedisUtils.getCacheObject(key); + } + + /** + * 写入Object,并设定存活时间 (单位: 秒) + */ + @Override + public void setObject(String key, Object object, long timeout) { + if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + // 判断是否为永不过期 + if(timeout == SaTokenDao.NEVER_EXPIRE) { + RedisUtils.setCacheObject(key, object); + } else { + RedisUtils.setCacheObject(key, object, timeout, TimeUnit.SECONDS); + } + } + + /** + * 更新Object (过期时间不变) + */ + @Override + public void updateObject(String key, Object object) { + long expire = getObjectTimeout(key); + // -2 = 无此键 + if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + this.setObject(key, object, expire); + } + + /** + * 删除Object + */ + @Override + public void deleteObject(String key) { + RedisUtils.deleteObject(key); + } + + /** + * 获取Object的剩余存活时间 (单位: 秒) + */ + @Override + public long getObjectTimeout(String key) { + return RedisUtils.getTimeToLive(key) / 1000; + } + + /** + * 修改Object的剩余存活时间 (单位: 秒) + */ + @Override + public void updateObjectTimeout(String key, long timeout) { + // 判断是否想要设置为永久 + if(timeout == SaTokenDao.NEVER_EXPIRE) { + long expire = getObjectTimeout(key); + if(expire == SaTokenDao.NEVER_EXPIRE) { + // 如果其已经被设置为永久,则不作任何处理 + } else { + // 如果尚未被设置为永久,那么再次set一次 + this.setObject(key, this.getObject(key), timeout); + } + return; + } + RedisUtils.expire(key, timeout, TimeUnit.SECONDS); + } + + + /** + * 搜索数据 + */ + @Override + public List searchData(String prefix, String keyword, int start, int size) { + Collection keys = RedisUtils.keys(prefix + "*" + keyword + "*"); + List list = new ArrayList<>(keys); + return SaFoxUtil.searchList(list, start, size); + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java new file mode 100644 index 00000000..e5bacd34 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java @@ -0,0 +1,38 @@ +package com.ruoyi.framework.satoken.service; + +import cn.dev33.satoken.stp.StpInterface; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.common.utils.LoginUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class SaInterfaceImpl implements StpInterface { + + @Override + public List getPermissionList(Object loginId, String loginType) { + UserType userType = LoginUtils.getUserType(loginId); + if (userType == UserType.SYS_USER) { + LoginUser loginUser = LoginUtils.getLoginUser(); + return new ArrayList<>(loginUser.getMenuPermission()); + } else if (userType == UserType.APP_USER) { + // app端权限返回 自行根据业务编写 + } + return new ArrayList<>(); + } + + @Override + public List getRoleList(Object loginId, String loginType) { + UserType userType = LoginUtils.getUserType(loginId); + if (userType == UserType.SYS_USER) { + LoginUser loginUser = LoginUtils.getLoginUser(); + return new ArrayList<>(loginUser.getRolePermission()); + } else if (userType == UserType.APP_USER) { + // app端权限返回 自行根据业务编写 + } + return new ArrayList<>(); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java deleted file mode 100644 index 4ebb4aae..00000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.ruoyi.framework.security.filter; - -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.TokenService; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * token过滤器 验证token有效性 - * - * @author ruoyi - */ -@Component -public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { - - @Autowired - private TokenService tokenService; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) - throws ServletException, IOException { - LoginUser loginUser = tokenService.getLoginUser(request); - if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) { - tokenService.verifyToken(loginUser); - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); - authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - SecurityContextHolder.getContext().setAuthentication(authenticationToken); - } - chain.doFilter(request, response); - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java deleted file mode 100644 index 8abbc929..00000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.ruoyi.framework.security.handle; - -import cn.hutool.http.HttpStatus; -import com.ruoyi.common.core.domain.R; -import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.stereotype.Component; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.Serializable; - -/** - * 认证失败处理类 返回未授权 - * - * @author ruoyi - */ -@Component -public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable { - private static final long serialVersionUID = -8970718410437077606L; - - @Override - public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) - throws IOException { - int code = HttpStatus.HTTP_UNAUTHORIZED; - String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); - ServletUtils.renderString(response, JsonUtils.toJsonString(R.error(code, msg))); - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java deleted file mode 100644 index 86c79630..00000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ruoyi.framework.security.handle; - -import cn.hutool.http.HttpStatus; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.R; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.LogininforService; -import com.ruoyi.common.core.service.TokenService; -import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.MessageUtils; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.core.Authentication; -import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * 自定义退出处理类 返回成功 - * - * @author ruoyi - */ -@Configuration -public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { - - @Autowired - private TokenService tokenService; - - @Autowired - private LogininforService asyncService; - - /** - * 退出处理 - */ - @Override - public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) - throws IOException, ServletException { - LoginUser loginUser = tokenService.getLoginUser(request); - String message = MessageUtils.message("user.logout.success"); - if (StringUtils.isNotNull(loginUser)) { - String userName = loginUser.getUsername(); - // 删除用户缓存记录 - tokenService.delLoginUser(loginUser.getToken()); - // 记录用户退出日志 - asyncService.recordLogininfor(userName, Constants.LOGOUT, message, request); - } - ServletUtils.renderString(response, JsonUtils.toJsonString(R.error(HttpStatus.HTTP_OK, message))); - } - -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index 8533aa8d..0ce71ace 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -1,5 +1,8 @@ package com.ruoyi.framework.web.exception; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.exception.NotPermissionException; +import cn.dev33.satoken.exception.NotRoleException; import cn.hutool.http.HttpStatus; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.exception.DemoModeException; @@ -7,7 +10,6 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.context.support.DefaultMessageSourceResolvable; -import org.springframework.security.access.AccessDeniedException; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -31,13 +33,33 @@ public class GlobalExceptionHandler { /** * 权限校验异常 */ - @ExceptionHandler(AccessDeniedException.class) - public R handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) { + @ExceptionHandler(NotPermissionException.class) + public R handleAccessDeniedException(NotPermissionException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage()); return R.error(HttpStatus.HTTP_FORBIDDEN, "没有权限,请联系管理员授权"); } + /** + * 角色校验异常 + */ + @ExceptionHandler(NotRoleException.class) + public R handleAccessDeniedException(NotRoleException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',角色校验失败'{}'", requestURI, e.getMessage()); + return R.error(HttpStatus.HTTP_FORBIDDEN, "没有角色,请联系管理员授权"); + } + + /** + * 认证失败 + */ + @ExceptionHandler(NotLoginException.class) + public R handleAccessDeniedException(NotLoginException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage()); + return R.error(HttpStatus.HTTP_UNAUTHORIZED, StringUtils.format("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI)); + } + /** * 请求方式不支持 */ diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java deleted file mode 100644 index 0e97b92f..00000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.ruoyi.framework.web.service; - -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import java.util.Set; - -/** - * RuoYi首创 自定义权限实现,ss取自SpringSecurity首字母 - * - * @author ruoyi - */ -@Service("ss") -public class PermissionService { - /** - * 所有权限标识 - */ - private static final String ALL_PERMISSION = "*:*:*"; - - /** - * 管理员角色权限标识 - */ - private static final String SUPER_ADMIN = "admin"; - - private static final String ROLE_DELIMETER = ","; - - private static final String PERMISSION_DELIMETER = ","; - - /** - * 验证用户是否具备某权限 - * - * @param permission 权限字符串 - * @return 用户是否具备某权限 - */ - public boolean hasPermi(String permission) { - if (StringUtils.isEmpty(permission)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getMenuPermissions())) { - return false; - } - return hasPermissions(loginUser.getMenuPermissions(), permission); - } - - /** - * 验证用户是否不具备某权限,与 hasPermi逻辑相反 - * - * @param permission 权限字符串 - * @return 用户是否不具备某权限 - */ - public boolean lacksPermi(String permission) { - return hasPermi(permission) != true; - } - - /** - * 验证用户是否具有以下任意一个权限 - * - * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表 - * @return 用户是否具有以下任意一个权限 - */ - public boolean hasAnyPermi(String permissions) { - if (StringUtils.isEmpty(permissions)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getMenuPermissions())) { - return false; - } - Set authorities = loginUser.getMenuPermissions(); - for (String permission : permissions.split(PERMISSION_DELIMETER)) { - if (permission != null && hasPermissions(authorities, permission)) { - return true; - } - } - return false; - } - - /** - * 判断用户是否拥有某个角色 - * - * @param role 角色字符串 - * @return 用户是否具备某角色 - */ - public boolean hasRole(String role) { - if (StringUtils.isEmpty(role)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser)) { - return false; - } - Set rolePermissions = loginUser.getRolePermissions(); - if (CollectionUtils.isEmpty(rolePermissions)) { - return false; - } - for (String roleKey : rolePermissions) { - if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) { - return true; - } - } - return false; - } - - /** - * 验证用户是否不具备某角色,与 isRole逻辑相反。 - * - * @param role 角色名称 - * @return 用户是否不具备某角色 - */ - public boolean lacksRole(String role) { - return hasRole(role) != true; - } - - /** - * 验证用户是否具有以下任意一个角色 - * - * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 - * @return 用户是否具有以下任意一个角色 - */ - public boolean hasAnyRoles(String roles) { - if (StringUtils.isEmpty(roles)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser)) { - return false; - } - Set rolePermissions = loginUser.getRolePermissions(); - if (CollectionUtils.isEmpty(rolePermissions)) { - return false; - } - for (String role : roles.split(ROLE_DELIMETER)) { - for (String roleKey : rolePermissions) { - if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) { - return true; - } - } - } - return false; - } - - /** - * 判断是否包含权限 - * - * @param permissions 权限列表 - * @param permission 权限字符串 - * @return 用户是否具备某权限 - */ - private boolean hasPermissions(Set permissions, String permission) { - return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission)); - } -} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java index b203701b..d2241906 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java @@ -1,5 +1,6 @@ package com.ruoyi.generator.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; import com.ruoyi.common.annotation.Log; @@ -16,7 +17,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -45,7 +45,7 @@ public class GenController extends BaseController { * 查询代码生成列表 */ @ApiOperation("查询代码生成列表") - @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @SaCheckPermission("tool:gen:list") @GetMapping("/list") public TableDataInfo genList(GenTable genTable, PageQuery pageQuery) { return genTableService.selectPageGenTableList(genTable, pageQuery); @@ -55,7 +55,7 @@ public class GenController extends BaseController { * 修改代码生成业务 */ @ApiOperation("修改代码生成业务") - @PreAuthorize("@ss.hasPermi('tool:gen:query')") + @SaCheckPermission("tool:gen:query") @GetMapping(value = "/{talbleId}") public R> getInfo(@PathVariable Long talbleId) { GenTable table = genTableService.selectGenTableById(talbleId); @@ -72,7 +72,7 @@ public class GenController extends BaseController { * 查询数据库列表 */ @ApiOperation("查询数据库列表") - @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @SaCheckPermission("tool:gen:list") @GetMapping("/db/list") public TableDataInfo dataList(GenTable genTable, PageQuery pageQuery) { return genTableService.selectPageDbTableList(genTable, pageQuery); @@ -82,7 +82,7 @@ public class GenController extends BaseController { * 查询数据表字段列表 */ @ApiOperation("查询数据表字段列表") - @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @SaCheckPermission("tool:gen:list") @GetMapping(value = "/column/{talbleId}") public TableDataInfo columnList(Long tableId) { TableDataInfo dataInfo = new TableDataInfo<>(); @@ -96,7 +96,7 @@ public class GenController extends BaseController { * 导入表结构(保存) */ @ApiOperation("导入表结构(保存)") - @PreAuthorize("@ss.hasPermi('tool:gen:import')") + @SaCheckPermission("tool:gen:import") @Log(title = "代码生成", businessType = BusinessType.IMPORT) @PostMapping("/importTable") public R importTableSave(String tables) { @@ -111,7 +111,7 @@ public class GenController extends BaseController { * 修改保存代码生成业务 */ @ApiOperation("修改保存代码生成业务") - @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @SaCheckPermission("tool:gen:edit") @Log(title = "代码生成", businessType = BusinessType.UPDATE) @PutMapping public R editSave(@Validated @RequestBody GenTable genTable) { @@ -124,7 +124,7 @@ public class GenController extends BaseController { * 删除代码生成 */ @ApiOperation("删除代码生成") - @PreAuthorize("@ss.hasPermi('tool:gen:remove')") + @SaCheckPermission("tool:gen:remove") @Log(title = "代码生成", businessType = BusinessType.DELETE) @DeleteMapping("/{tableIds}") public R remove(@PathVariable Long[] tableIds) { @@ -136,7 +136,7 @@ public class GenController extends BaseController { * 预览代码 */ @ApiOperation("预览代码") - @PreAuthorize("@ss.hasPermi('tool:gen:preview')") + @SaCheckPermission("tool:gen:preview") @GetMapping("/preview/{tableId}") public R> preview(@PathVariable("tableId") Long tableId) throws IOException { Map dataMap = genTableService.previewCode(tableId); @@ -147,7 +147,7 @@ public class GenController extends BaseController { * 生成代码(下载方式) */ @ApiOperation("生成代码(下载方式)") - @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @SaCheckPermission("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/download/{tableName}") public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { @@ -159,7 +159,7 @@ public class GenController extends BaseController { * 生成代码(自定义路径) */ @ApiOperation("生成代码(自定义路径)") - @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @SaCheckPermission("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/genCode/{tableName}") public R genCode(@PathVariable("tableName") String tableName) { @@ -171,7 +171,7 @@ public class GenController extends BaseController { * 同步数据库 */ @ApiOperation("同步数据库") - @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @SaCheckPermission("tool:gen:edit") @Log(title = "代码生成", businessType = BusinessType.UPDATE) @GetMapping("/synchDb/{tableName}") public R synchDb(@PathVariable("tableName") String tableName) { @@ -183,7 +183,7 @@ public class GenController extends BaseController { * 批量生成代码 */ @ApiOperation("批量生成代码") - @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @SaCheckPermission("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/batchGenCode") public void batchGenCode(HttpServletResponse response, String tables) throws IOException { diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java index d81a45ad..93578f2e 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java @@ -1,7 +1,7 @@ package com.ruoyi.generator.mapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.generator.domain.GenTableColumn; import java.util.List; @@ -12,7 +12,7 @@ import java.util.List; * @author Lion Li */ @InterceptorIgnore(dataPermission = "true") -public interface GenTableColumnMapper extends BaseMapperPlus { +public interface GenTableColumnMapper extends BaseMapperPlus { /** * 根据表名称查询列信息 * diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java index 8ea66a2e..cbb92fdc 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -2,7 +2,7 @@ package com.ruoyi.generator.mapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.generator.domain.GenTable; import org.apache.ibatis.annotations.Param; @@ -14,7 +14,7 @@ import java.util.List; * @author Lion Li */ @InterceptorIgnore(dataPermission = "true") -public interface GenTableMapper extends BaseMapperPlus { +public interface GenTableMapper extends BaseMapperPlus { Page selectPageGenTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java index cd4d8754..214e7f31 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java @@ -1,9 +1,9 @@ package com.ruoyi.generator.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.generator.domain.GenTableColumn; import com.ruoyi.generator.mapper.GenTableColumnMapper; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -14,8 +14,11 @@ import java.util.List; * * @author Lion Li */ +@RequiredArgsConstructor @Service -public class GenTableColumnServiceImpl extends ServicePlusImpl implements IGenTableColumnService { +public class GenTableColumnServiceImpl implements IGenTableColumnService { + + private final GenTableColumnMapper baseMapper; /** * 查询业务字段列表 @@ -25,7 +28,7 @@ public class GenTableColumnServiceImpl extends ServicePlusImpl selectGenTableColumnListByTableId(Long tableId) { - return list(new LambdaQueryWrapper() + return baseMapper.selectList(new LambdaQueryWrapper() .eq(GenTableColumn::getTableId, tableId) .orderByAsc(GenTableColumn::getSort)); } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index d571468a..83824438 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -8,12 +8,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.*; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; @@ -22,12 +19,11 @@ import com.ruoyi.generator.mapper.GenTableMapper; import com.ruoyi.generator.util.GenUtils; import com.ruoyi.generator.util.VelocityInitializer; import com.ruoyi.generator.util.VelocityUtils; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.util.IOUtils; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -47,11 +43,12 @@ import java.util.zip.ZipOutputStream; * @author Lion Li */ @Slf4j +@RequiredArgsConstructor @Service -public class GenTableServiceImpl extends ServicePlusImpl implements IGenTableService { +public class GenTableServiceImpl implements IGenTableService { - @Autowired - private GenTableColumnMapper genTableColumnMapper; + private final GenTableMapper baseMapper; + private final GenTableColumnMapper genTableColumnMapper; /** * 查询业务信息 @@ -150,7 +147,7 @@ public class GenTableServiceImpl extends ServicePlusImpl ids = Arrays.asList(tableIds); - removeByIds(ids); + baseMapper.deleteBatchIds(ids); genTableColumnMapper.delete(new LambdaQueryWrapper().in(GenTableColumn::getTableId, ids)); } @@ -162,7 +159,7 @@ public class GenTableServiceImpl extends ServicePlusImpl tableList) { - String operName = SecurityUtils.getUsername(); + String operName = LoginUtils.getUsername(); try { for (GenTable table : tableList) { String tableName = table.getTableName(); @@ -177,7 +174,7 @@ public class GenTableServiceImpl extends ServicePlusImpl delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); @@ -317,7 +314,7 @@ public class GenTableServiceImpl extends ServicePlusImpl { +public interface IGenTableColumnService { /** * 查询业务字段列表 * diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java index 2f7832e4..27fac79e 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -1,6 +1,5 @@ package com.ruoyi.generator.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.generator.domain.GenTable; @@ -13,7 +12,7 @@ import java.util.Map; * * @author Lion Li */ -public interface IGenTableService extends IService { +public interface IGenTableService { TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml index be07a9cb..7ef97445 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -3,7 +3,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -28,11 +28,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - - \ No newline at end of file + + + diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml index 1aa9ea59..8f0c2690 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -4,31 +4,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + @@ -53,124 +53,124 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, 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 - + - - - - - - + select table_name, table_comment, create_time, update_time from information_schema.tables + where table_schema = (select database()) + AND table_name NOT LIKE 'xxl_job_%' AND table_name NOT LIKE 'gen_%' + AND table_name NOT IN (select table_name from gen_table) + + AND lower(table_name) like lower(concat('%', #{genTable.tableName}, '%')) + + + AND lower(table_comment) like lower(concat('%', #{genTable.tableComment}, '%')) + + + AND date_format(create_time,'%y%m%d') >= date_format(#{genTable.params.beginTime},'%y%m%d') + + + AND date_format(create_time,'%y%m%d') <= date_format(#{genTable.params.endTime},'%y%m%d') + order by create_time desc - + - + + + + AND lower(table_name) like lower(concat('%', #{tableName}, '%')) + + + AND lower(table_comment) like lower(concat('%', #{tableComment}, '%')) + + + AND date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') + + + AND date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') + + + + + + + + - + - + - + - + diff --git a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm index a21abc5c..66db4261 100644 --- a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -7,7 +7,7 @@ import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; -import org.springframework.security.access.prepost.PreAuthorize; +import cn.dev33.satoken.annotation.SaCheckPermission; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; @@ -51,7 +51,7 @@ public class ${ClassName}Controller extends BaseController { * 查询${functionName}列表 */ @ApiOperation("查询${functionName}列表") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") + @SaCheckPermission("${permissionPrefix}:list") @GetMapping("/list") #if($table.crud || $table.sub) public TableDataInfo<${ClassName}Vo> list(@Validated(QueryGroup.class) ${ClassName}Bo bo, PageQuery pageQuery) { @@ -68,7 +68,7 @@ public class ${ClassName}Controller extends BaseController { * 导出${functionName}列表 */ @ApiOperation("导出${functionName}列表") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") + @SaCheckPermission("${permissionPrefix}:export") @Log(title = "${functionName}", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(@Validated ${ClassName}Bo bo, HttpServletResponse response) { @@ -80,7 +80,7 @@ public class ${ClassName}Controller extends BaseController { * 获取${functionName}详细信息 */ @ApiOperation("获取${functionName}详细信息") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") + @SaCheckPermission("${permissionPrefix}:query") @GetMapping("/{${pkColumn.javaField}}") public R<${ClassName}Vo> getInfo(@ApiParam("主键") @NotNull(message = "主键不能为空") @@ -92,7 +92,7 @@ public class ${ClassName}Controller extends BaseController { * 新增${functionName} */ @ApiOperation("新增${functionName}") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") + @SaCheckPermission("${permissionPrefix}:add") @Log(title = "${functionName}", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() @@ -104,7 +104,7 @@ public class ${ClassName}Controller extends BaseController { * 修改${functionName} */ @ApiOperation("修改${functionName}") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") + @SaCheckPermission("${permissionPrefix}:edit") @Log(title = "${functionName}", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() @@ -116,7 +116,7 @@ public class ${ClassName}Controller extends BaseController { * 删除${functionName} */ @ApiOperation("删除${functionName}") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") + @SaCheckPermission("${permissionPrefix}:remove") @Log(title = "${functionName}" , businessType = BusinessType.DELETE) @DeleteMapping("/{${pkColumn.javaField}s}") public R remove(@ApiParam("主键串") diff --git a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm index af2edb67..37e73453 100644 --- a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm @@ -1,7 +1,8 @@ package ${packageName}.mapper; import ${packageName}.domain.${ClassName}; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import ${packageName}.domain.vo.${ClassName}Vo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; /** * ${functionName}Mapper接口 @@ -9,6 +10,6 @@ import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; * @author ${author} * @date ${datetime} */ -public interface ${ClassName}Mapper extends BaseMapperPlus<${ClassName}> { +public interface ${ClassName}Mapper extends BaseMapperPlus<${ClassName}Mapper, ${ClassName}, ${ClassName}Vo> { } diff --git a/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-generator/src/main/resources/vm/java/service.java.vm index f93053c3..4a3eb56b 100644 --- a/ruoyi-generator/src/main/resources/vm/java/service.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/service.java.vm @@ -3,7 +3,6 @@ package ${packageName}.service; import ${packageName}.domain.${ClassName}; import ${packageName}.domain.vo.${ClassName}Vo; import ${packageName}.domain.bo.${ClassName}Bo; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; #if($table.crud || $table.sub) import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; @@ -18,44 +17,44 @@ import java.util.List; * @author ${author} * @date ${datetime} */ -public interface I${ClassName}Service extends IServicePlus<${ClassName}, ${ClassName}Vo> { - /** - * 查询单个 - * @return - */ - ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}); +public interface I${ClassName}Service { + /** + * 查询单个 + * @return + */ + ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}); #if($table.crud || $table.sub) - /** - * 查询列表 - */ + /** + * 查询列表 + */ TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery); #end - /** - * 查询列表 - */ - List<${ClassName}Vo> queryList(${ClassName}Bo bo); + /** + * 查询列表 + */ + List<${ClassName}Vo> queryList(${ClassName}Bo bo); - /** - * 根据新增业务对象插入${functionName} - * @param bo ${functionName}新增业务对象 - * @return - */ - Boolean insertByBo(${ClassName}Bo bo); + /** + * 根据新增业务对象插入${functionName} + * @param bo ${functionName}新增业务对象 + * @return + */ + Boolean insertByBo(${ClassName}Bo bo); - /** - * 根据编辑业务对象修改${functionName} - * @param bo ${functionName}编辑业务对象 - * @return - */ - Boolean updateByBo(${ClassName}Bo bo); + /** + * 根据编辑业务对象修改${functionName} + * @param bo ${functionName}编辑业务对象 + * @return + */ + Boolean updateByBo(${ClassName}Bo bo); - /** - * 校验并删除数据 - * @param ids 主键集合 - * @param isValid 是否校验,true-删除前校验,false-不校验 - * @return - */ - Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid); + /** + * 校验并删除数据 + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid); } diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm index bf201516..2d491714 100644 --- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -6,8 +6,8 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; #end +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -27,19 +27,22 @@ import java.util.Collection; * @author ${author} * @date ${datetime} */ +@RequiredArgsConstructor @Service -public class ${ClassName}ServiceImpl extends ServicePlusImpl<${ClassName}Mapper, ${ClassName}, ${ClassName}Vo> implements I${ClassName}Service { +public class ${ClassName}ServiceImpl implements I${ClassName}Service { + + private final ${ClassName}Mapper baseMapper; @Override public ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}){ - return getVoById(${pkColumn.javaField}); + return baseMapper.selectVoById(${pkColumn.javaField}); } #if($table.crud || $table.sub) @Override public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery) { LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); - Page<${ClassName}Vo> result = pageVo(pageQuery.build(), lqw); + Page<${ClassName}Vo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(result); } #end @@ -47,7 +50,7 @@ public class ${ClassName}ServiceImpl extends ServicePlusImpl<${ClassName}Mapper, @Override public List<${ClassName}Vo> queryList(${ClassName}Bo bo) { LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); - return listVo(lqw); + return baseMapper.selectVoList(lqw); } private LambdaQueryWrapper<${ClassName}> buildQueryWrapper(${ClassName}Bo bo) { @@ -81,7 +84,7 @@ public class ${ClassName}ServiceImpl extends ServicePlusImpl<${ClassName}Mapper, public Boolean insertByBo(${ClassName}Bo bo) { ${ClassName} add = BeanUtil.toBean(bo, ${ClassName}.class); validEntityBeforeSave(add); - boolean flag = save(add); + boolean flag = baseMapper.insert(add) > 0; #set($pk=$pkColumn.javaField.substring(0,1).toUpperCase() + ${pkColumn.javaField.substring(1)}) if (flag) { bo.set$pk(add.get$pk()); @@ -93,7 +96,7 @@ public class ${ClassName}ServiceImpl extends ServicePlusImpl<${ClassName}Mapper, public Boolean updateByBo(${ClassName}Bo bo) { ${ClassName} update = BeanUtil.toBean(bo, ${ClassName}.class); validEntityBeforeSave(update); - return updateById(update); + return baseMapper.updateById(update) > 0; } /** @@ -110,6 +113,6 @@ public class ${ClassName}ServiceImpl extends ServicePlusImpl<${ClassName}Mapper, if(isValid){ //TODO 做一些业务上的校验,判断是否需要校验 } - return removeByIds(ids); + return baseMapper.deleteBatchIds(ids) > 0; } } diff --git a/ruoyi-generator/src/main/resources/vm/java/vo.java.vm b/ruoyi-generator/src/main/resources/vm/java/vo.java.vm index 489723ef..216e90fc 100644 --- a/ruoyi-generator/src/main/resources/vm/java/vo.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/vo.java.vm @@ -25,7 +25,7 @@ import java.util.Date; @ExcelIgnoreUnannotated public class ${ClassName}Vo { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; #foreach ($column in $columns) #if($column.isList) @@ -42,13 +42,13 @@ public class ${ClassName}Vo { @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "${column.dictType}") #elseif($parentheseIndex != -1) - @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") #else - @ExcelProperty(value = "${comment}") + @ExcelProperty(value = "${comment}") #end - @ApiModelProperty("$column.columnComment") - private $column.javaType $column.javaField; + @ApiModelProperty("$column.columnComment") + private $column.javaType $column.javaField; #end #end diff --git a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm index 7c530cb1..37928941 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm +++ b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -105,6 +105,12 @@ {{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }} +#elseif($column.list && $column.htmlType == "imageUpload") + + + #elseif($column.list && $column.dictType && "" != $column.dictType) +#elseif($column.list && $column.htmlType == "imageUpload") + + + #elseif($column.list && $column.dictType && "" != $column.dictType) +#elseif($column.list && $column.htmlType == "imageUpload") + + + #elseif($column.list && $column.dictType && "" != $column.dictType)