From 46e8f22f873dd488e93fd8e1f4c3a32bb4df9669 Mon Sep 17 00:00:00 2001 From: qinyanbinGitee <3063944438@qq.com> Date: Sun, 9 Feb 2025 19:55:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=99=BA=E6=85=A7=E5=81=9C=E8=BD=A6=20--=20?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E6=A1=86=E6=9E=B6=20=20=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=97=B6=E9=97=B4=EF=BC=9A2025/02/09?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 43 + LICENSE | 21 + bin/clean.bat | 12 + bin/package.bat | 12 + bin/run-auth.bat | 14 + bin/run-gateway.bat | 14 + bin/run-modules-file.bat | 14 + bin/run-modules-gen.bat | 14 + bin/run-modules-job.bat | 14 + bin/run-modules-system.bat | 14 + bin/run-monitor.bat | 14 + pom.xml | 264 +++++ smart-api/pom.xml | 22 + smart-api/smart-api-system/pom.xml | 28 + .../zhentao/system/api/RemoteFileService.java | 29 + .../zhentao/system/api/RemoteLogService.java | 40 + .../zhentao/system/api/RemoteUserService.java | 27 + .../zhentao/system/api/domain/SysDept.java | 202 ++++ .../zhentao/system/api/domain/SysFile.java | 50 + .../zhentao/system/api/domain/SysOperLog.java | 241 ++++ .../zhentao/system/api/domain/SysRole.java | 225 ++++ .../zhentao/system/api/domain/SysUser.java | 326 ++++++ .../factory/RemoteFileFallbackFactory.java | 35 + .../api/factory/RemoteLogFallbackFactory.java | 41 + .../factory/RemoteUserFallbackFactory.java | 34 + .../zhentao/system/api/model/LoginUser.java | 150 +++ .../main/resources/META-INF/spring.factories | 4 + smart-auth/pom.xml | 80 ++ .../zhentao/auth/RuoYiAuthApplication.java | 30 + .../auth/controller/TokenController.java | 67 ++ .../java/com/zhentao/auth/form/LoginBody.java | 39 + .../zhentao/auth/service/SysLoginService.java | 95 ++ smart-auth/src/main/resources/banner.txt | 10 + smart-auth/src/main/resources/bootstrap.yml | 30 + smart-auth/src/main/resources/logback.xml | 74 ++ smart-common/pom.xml | 28 + smart-common/smart-common-core/pom.xml | 111 ++ .../zhentao/common/core/annotation/Excel.java | 160 +++ .../common/core/annotation/Excels.java | 18 + .../common/core/config/MybatisPlusConfig.java | 57 + .../common/core/constant/CacheConstants.java | 39 + .../common/core/constant/Constants.java | 109 ++ .../common/core/constant/GenConstants.java | 114 ++ .../common/core/constant/HttpStatus.java | 89 ++ .../core/constant/ScheduleConstants.java | 50 + .../core/constant/ServiceNameConstants.java | 24 + .../common/core/constant/UserConstants.java | 78 ++ .../com/zhentao/common/core/domain/R.java | 105 ++ .../zhentao/common/core/enums/UserStatus.java | 30 + .../common/core/exception/BaseException.java | 79 ++ .../core/exception/CaptchaException.java | 16 + .../core/exception/CheckedException.java | 31 + .../core/exception/CustomException.java | 43 + .../core/exception/DemoModeException.java | 15 + .../core/exception/PreAuthorizeException.java | 15 + .../common/core/exception/UtilException.java | 26 + .../core/exception/file/FileException.java | 19 + .../FileNameLengthLimitExceededException.java | 16 + .../file/FileSizeLimitExceededException.java | 16 + .../file/InvalidExtensionException.java | 81 ++ .../core/exception/job/TaskException.java | 34 + .../user/CaptchaExpireException.java | 16 + .../core/exception/user/UserException.java | 18 + .../user/UserPasswordNotMatchException.java | 16 + .../zhentao/common/core/text/CharsetKit.java | 86 ++ .../com/zhentao/common/core/text/Convert.java | 999 ++++++++++++++++ .../common/core/text/StrFormatter.java | 92 ++ .../com/zhentao/common/core/text/UUID.java | 484 ++++++++ .../zhentao/common/core/utils/DateUtils.java | 155 +++ .../common/core/utils/ExceptionUtil.java | 40 + .../zhentao/common/core/utils/IdUtils.java | 51 + .../com/zhentao/common/core/utils/ReUtil.java | 163 +++ .../common/core/utils/SecurityUtils.java | 89 ++ .../common/core/utils/ServletUtils.java | 217 ++++ .../common/core/utils/SpringUtils.java | 114 ++ .../common/core/utils/StringUtils.java | 523 +++++++++ .../common/core/utils/bean/BeanUtils.java | 110 ++ .../common/core/utils/file/FileTypeUtils.java | 76 ++ .../common/core/utils/file/FileUtils.java | 260 +++++ .../common/core/utils/file/ImageUtils.java | 86 ++ .../common/core/utils/file/MimeTypeUtils.java | 59 + .../zhentao/common/core/utils/ip/IpUtils.java | 204 ++++ .../common/core/utils/poi/ExcelUtil.java | 1027 +++++++++++++++++ .../core/utils/reflect/ReflectUtils.java | 410 +++++++ .../common/core/utils/sign/Base64.java | 291 +++++ .../common/core/utils/sql/SqlUtil.java | 37 + .../core/web/controller/BaseController.java | 88 ++ .../common/core/web/domain/AjaxResult.java | 162 +++ .../common/core/web/domain/BaseEntity.java | 114 ++ .../common/core/web/domain/TreeEntity.java | 79 ++ .../common/core/web/page/PageDomain.java | 72 ++ .../common/core/web/page/TableDataInfo.java | 85 ++ .../common/core/web/page/TableSupport.java | 49 + .../main/resources/META-INF/spring.factories | 5 + smart-common/smart-common-datascope/pom.xml | 27 + .../datascope/annotation/DataScope.java | 28 + .../datascope/aspect/DataScopeAspect.java | 173 +++ .../main/resources/META-INF/spring.factories | 4 + smart-common/smart-common-datasource/pom.xml | 41 + .../common/datasource/annotation/Master.java | 22 + .../common/datasource/annotation/Slave.java | 22 + smart-common/smart-common-log/pom.xml | 27 + .../zhentao/common/log/annotation/Log.java | 41 + .../zhentao/common/log/aspect/LogAspect.java | 242 ++++ .../common/log/enums/BusinessStatus.java | 20 + .../common/log/enums/BusinessType.java | 59 + .../common/log/enums/OperatorType.java | 24 + .../common/log/service/AsyncLogService.java | 28 + .../main/resources/META-INF/spring.factories | 3 + smart-common/smart-common-redis/pom.xml | 33 + .../FastJson2JsonRedisSerializer.java | 71 ++ .../common/redis/configure/RedisConfig.java | 43 + .../common/redis/service/RedisService.java | 234 ++++ .../main/resources/META-INF/spring.factories | 5 + smart-common/smart-common-security/pom.xml | 33 + .../annotation/EnableCustomConfig.java | 31 + .../annotation/EnableRyFeignClients.java | 27 + .../security/annotation/PreAuthorize.java | 46 + .../security/aspect/PreAuthorizeAspect.java | 226 ++++ .../security/config/ApplicationConfig.java | 22 + .../feign/FeignAutoConfiguration.java | 20 + .../feign/FeignRequestInterceptor.java | 45 + .../handler/GlobalExceptionHandler.java | 94 ++ .../common/security/service/TokenService.java | 123 ++ .../main/resources/META-INF/spring.factories | 4 + smart-common/smart-common-swagger/pom.xml | 34 + .../annotation/EnableCustomSwagger2.java | 21 + .../config/SwaggerAutoConfiguration.java | 129 +++ .../swagger/config/SwaggerProperties.java | 345 ++++++ .../main/resources/META-INF/spring.factories | 2 + smart-gateway/pom.xml | 104 ++ .../gateway/RuoYiGatewayApplication.java | 31 + .../zhentao/gateway/config/CaptchaConfig.java | 83 ++ .../zhentao/gateway/config/GatewayConfig.java | 32 + .../gateway/config/KaptchaTextCreator.java | 75 ++ .../config/RouterFunctionConfiguration.java | 31 + .../gateway/config/SwaggerProvider.java | 66 ++ .../properties/IgnoreWhiteProperties.java | 33 + .../zhentao/gateway/filter/AuthFilter.java | 125 ++ .../gateway/filter/BlackListUrlFilter.java | 70 ++ .../gateway/filter/CacheRequestFilter.java | 100 ++ .../gateway/filter/ValidateCodeFilter.java | 80 ++ .../handler/GatewayExceptionHandler.java | 66 ++ .../handler/SentinelFallbackHandler.java | 47 + .../gateway/handler/SwaggerHandler.java | 56 + .../gateway/handler/ValidateCodeHandler.java | 41 + .../gateway/service/ValidateCodeService.java | 23 + .../service/impl/ValidateCodeServiceImpl.java | 110 ++ smart-gateway/src/main/resources/banner.txt | 22 + .../src/main/resources/bootstrap.yml | 48 + smart-gateway/src/main/resources/logback.xml | 74 ++ smart-modules/pom.xml | 25 + smart-modules/smart-file/pom.xml | 95 ++ .../com/zhentao/file/RuoYFileApplication.java | 33 + .../com/zhentao/file/config/MinioConfig.java | 82 ++ .../zhentao/file/config/ResourcesConfig.java | 36 + .../file/controller/SysFileController.java | 48 + .../service/FastDfsSysFileServiceImpl.java | 42 + .../zhentao/file/service/ISysFileService.java | 20 + .../file/service/LocalSysFileServiceImpl.java | 49 + .../file/service/MinioSysFileServiceImpl.java | 44 + .../zhentao/file/utils/FileUploadUtils.java | 197 ++++ .../smart-file/src/main/resources/banner.txt | 10 + .../src/main/resources/bootstrap.yml | 27 + .../smart-file/src/main/resources/logback.xml | 74 ++ smart-modules/smart-gen/pom.xml | 94 ++ .../com/zhentao/gen/RuoYiGenApplication.java | 34 + .../com/zhentao/gen/config/GenConfig.java | 66 ++ .../zhentao/gen/controller/GenController.java | 212 ++++ .../java/com/zhentao/gen/domain/GenTable.java | 370 ++++++ .../zhentao/gen/domain/GenTableColumn.java | 374 ++++++ .../gen/mapper/GenTableColumnMapper.java | 60 + .../zhentao/gen/mapper/GenTableMapper.java | 83 ++ .../service/GenTableColumnServiceImpl.java | 68 ++ .../gen/service/GenTableServiceImpl.java | 500 ++++++++ .../gen/service/IGenTableColumnService.java | 44 + .../zhentao/gen/service/IGenTableService.java | 121 ++ .../java/com/zhentao/gen/util/GenUtils.java | 258 +++++ .../zhentao/gen/util/VelocityInitializer.java | 35 + .../com/zhentao/gen/util/VelocityUtils.java | 361 ++++++ .../smart-gen/src/main/resources/banner.txt | 10 + .../src/main/resources/bootstrap.yml | 27 + .../smart-gen/src/main/resources/logback.xml | 74 ++ .../mapper/generator/GenTableColumnMapper.xml | 127 ++ .../mapper/generator/GenTableMapper.xml | 201 ++++ .../main/resources/vm/java/controller.java.vm | 116 ++ .../src/main/resources/vm/java/domain.java.vm | 101 ++ .../src/main/resources/vm/java/mapper.java.vm | 91 ++ .../main/resources/vm/java/service.java.vm | 61 + .../resources/vm/java/serviceImpl.java.vm | 166 +++ .../main/resources/vm/java/sub-domain.java.vm | 73 ++ .../src/main/resources/vm/js/api.js.vm | 44 + .../src/main/resources/vm/sql/sql.vm | 22 + .../main/resources/vm/vue/index-tree.vue.vm | 523 +++++++++ .../src/main/resources/vm/vue/index.vue.vm | 634 ++++++++++ .../src/main/resources/vm/xml/mapper.xml.vm | 135 +++ smart-modules/smart-job/pom.xml | 100 ++ .../com/zhentao/job/RuoYiJobApplication.java | 34 + .../zhentao/job/config/ScheduleConfig.java | 57 + .../job/controller/SysJobController.java | 145 +++ .../job/controller/SysJobLogController.java | 93 ++ .../java/com/zhentao/job/domain/SysJob.java | 172 +++ .../com/zhentao/job/domain/SysJobLog.java | 155 +++ .../zhentao/job/mapper/SysJobLogMapper.java | 64 + .../com/zhentao/job/mapper/SysJobMapper.java | 67 ++ .../job/service/ISysJobLogService.java | 56 + .../zhentao/job/service/ISysJobService.java | 103 ++ .../job/service/SysJobLogServiceImpl.java | 87 ++ .../job/service/SysJobServiceImpl.java | 254 ++++ .../java/com/zhentao/job/task/RyTask.java | 28 + .../zhentao/job/util/AbstractQuartzJob.java | 107 ++ .../java/com/zhentao/job/util/CronUtils.java | 63 + .../com/zhentao/job/util/JobInvokeUtil.java | 182 +++ .../QuartzDisallowConcurrentExecution.java | 21 + .../zhentao/job/util/QuartzJobExecution.java | 19 + .../com/zhentao/job/util/ScheduleUtils.java | 113 ++ .../smart-job/src/main/resources/banner.txt | 10 + .../src/main/resources/bootstrap.yml | 27 + .../smart-job/src/main/resources/logback.xml | 74 ++ .../resources/mapper/job/SysJobLogMapper.xml | 93 ++ .../resources/mapper/job/SysJobMapper.xml | 111 ++ smart-modules/smart-system/pom.xml | 105 ++ .../system/RuoYiSystemApplication.java | 34 + .../system/controller/SmartCsController.java | 28 + .../controller/SysConfigController.java | 135 +++ .../system/controller/SysDeptController.java | 164 +++ .../controller/SysDictDataController.java | 123 ++ .../controller/SysDictTypeController.java | 134 +++ .../controller/SysLogininforController.java | 98 ++ .../system/controller/SysMenuController.java | 163 +++ .../controller/SysNoticeController.java | 93 ++ .../controller/SysOperlogController.java | 77 ++ .../system/controller/SysPostController.java | 133 +++ .../controller/SysProfileController.java | 139 +++ .../system/controller/SysRoleController.java | 157 +++ .../system/controller/SysUserController.java | 251 ++++ .../controller/SysUserOnlineController.java | 93 ++ .../com/zhentao/system/domain/SmartCs.java | 45 + .../com/zhentao/system/domain/SysConfig.java | 111 ++ .../zhentao/system/domain/SysDictData.java | 176 +++ .../zhentao/system/domain/SysDictType.java | 94 ++ .../zhentao/system/domain/SysLogininfor.java | 102 ++ .../com/zhentao/system/domain/SysMenu.java | 246 ++++ .../com/zhentao/system/domain/SysNotice.java | 101 ++ .../com/zhentao/system/domain/SysPost.java | 123 ++ .../zhentao/system/domain/SysRoleDept.java | 46 + .../zhentao/system/domain/SysRoleMenu.java | 46 + .../zhentao/system/domain/SysUserOnline.java | 100 ++ .../zhentao/system/domain/SysUserPost.java | 46 + .../zhentao/system/domain/SysUserRole.java | 46 + .../com/zhentao/system/domain/vo/MetaVo.java | 71 ++ .../zhentao/system/domain/vo/RouterVo.java | 133 +++ .../zhentao/system/domain/vo/TreeSelect.java | 77 ++ .../zhentao/system/mapper/SmartCsMapper.java | 18 + .../system/mapper/SysConfigMapper.java | 69 ++ .../zhentao/system/mapper/SysDeptMapper.java | 120 ++ .../system/mapper/SysDictDataMapper.java | 97 ++ .../system/mapper/SysDictTypeMapper.java | 87 ++ .../system/mapper/SysLogininforMapper.java | 42 + .../zhentao/system/mapper/SysMenuMapper.java | 119 ++ .../system/mapper/SysNoticeMapper.java | 61 + .../system/mapper/SysOperLogMapper.java | 49 + .../zhentao/system/mapper/SysPostMapper.java | 100 ++ .../system/mapper/SysRoleDeptMapper.java | 45 + .../zhentao/system/mapper/SysRoleMapper.java | 108 ++ .../system/mapper/SysRoleMenuMapper.java | 45 + .../zhentao/system/mapper/SysUserMapper.java | 113 ++ .../system/mapper/SysUserPostMapper.java | 45 + .../system/mapper/SysUserRoleMapper.java | 64 + .../system/service/ISysConfigService.java | 74 ++ .../system/service/ISysDeptService.java | 110 ++ .../system/service/ISysDictDataService.java | 61 + .../system/service/ISysDictTypeService.java | 89 ++ .../system/service/ISysLogininforService.java | 40 + .../system/service/ISysMenuService.java | 137 +++ .../system/service/ISysNoticeService.java | 61 + .../system/service/ISysOperLogService.java | 49 + .../system/service/ISysPermissionService.java | 22 + .../system/service/ISysPostService.java | 101 ++ .../system/service/ISysRoleService.java | 132 +++ .../system/service/ISysUserOnlineService.java | 48 + .../system/service/ISysUserService.java | 168 +++ .../system/service/SmartCsService.java | 13 + .../service/impl/SmartCsServiceImpl.java | 22 + .../service/impl/SysConfigServiceImpl.java | 194 ++++ .../service/impl/SysDeptServiceImpl.java | 306 +++++ .../service/impl/SysDictDataServiceImpl.java | 109 ++ .../service/impl/SysDictTypeServiceImpl.java | 205 ++++ .../impl/SysLogininforServiceImpl.java | 65 ++ .../service/impl/SysMenuServiceImpl.java | 465 ++++++++ .../service/impl/SysNoticeServiceImpl.java | 94 ++ .../service/impl/SysOperLogServiceImpl.java | 78 ++ .../impl/SysPermissionServiceImpl.java | 66 ++ .../service/impl/SysPostServiceImpl.java | 181 +++ .../service/impl/SysRoleServiceImpl.java | 329 ++++++ .../impl/SysUserOnlineServiceImpl.java | 89 ++ .../service/impl/SysUserServiceImpl.java | 464 ++++++++ .../com/zhentao/system/utils/DictUtils.java | 65 ++ .../src/main/resources/banner.txt | 10 + .../src/main/resources/bootstrap.yml | 27 + .../src/main/resources/logback.xml | 74 ++ .../main/resources/mapper/SmartCsMapper.xml | 15 + .../mapper/system/SysConfigMapper.xml | 112 ++ .../resources/mapper/system/SysDeptMapper.xml | 157 +++ .../mapper/system/SysDictDataMapper.xml | 124 ++ .../mapper/system/SysDictTypeMapper.xml | 105 ++ .../mapper/system/SysLogininforMapper.xml | 54 + .../resources/mapper/system/SysMenuMapper.xml | 191 +++ .../mapper/system/SysNoticeMapper.xml | 89 ++ .../mapper/system/SysOperLogMapper.xml | 82 ++ .../resources/mapper/system/SysPostMapper.xml | 122 ++ .../mapper/system/SysRoleDeptMapper.xml | 34 + .../resources/mapper/system/SysRoleMapper.xml | 153 +++ .../mapper/system/SysRoleMenuMapper.xml | 34 + .../resources/mapper/system/SysUserMapper.xml | 182 +++ .../mapper/system/SysUserPostMapper.xml | 34 + .../mapper/system/SysUserRoleMapper.xml | 44 + smart-visual/pom.xml | 22 + smart-visual/smart-monitor/pom.xml | 75 ++ .../monitor/RuoYiMonitorApplication.java | 30 + .../monitor/config/WebSecurityConfigurer.java | 49 + .../src/main/resources/banner.txt | 10 + .../src/main/resources/bootstrap.yml | 27 + .../src/main/resources/logback.xml | 74 ++ sql/quartz.sql | 170 +++ sql/ry_20210108.sql | 693 +++++++++++ sql/ry_config_20210128.sql | 216 ++++ sql/ry_seata_20210128.sql | 693 +++++++++++ 328 files changed, 33988 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 bin/clean.bat create mode 100644 bin/package.bat create mode 100644 bin/run-auth.bat create mode 100644 bin/run-gateway.bat create mode 100644 bin/run-modules-file.bat create mode 100644 bin/run-modules-gen.bat create mode 100644 bin/run-modules-job.bat create mode 100644 bin/run-modules-system.bat create mode 100644 bin/run-monitor.bat create mode 100644 pom.xml create mode 100644 smart-api/pom.xml create mode 100644 smart-api/smart-api-system/pom.xml create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteFileService.java create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteLogService.java create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteUserService.java create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysDept.java create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysFile.java create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysOperLog.java create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysRole.java create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysUser.java create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteFileFallbackFactory.java create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteLogFallbackFactory.java create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteUserFallbackFactory.java create mode 100644 smart-api/smart-api-system/src/main/java/com/zhentao/system/api/model/LoginUser.java create mode 100644 smart-api/smart-api-system/src/main/resources/META-INF/spring.factories create mode 100644 smart-auth/pom.xml create mode 100644 smart-auth/src/main/java/com/zhentao/auth/RuoYiAuthApplication.java create mode 100644 smart-auth/src/main/java/com/zhentao/auth/controller/TokenController.java create mode 100644 smart-auth/src/main/java/com/zhentao/auth/form/LoginBody.java create mode 100644 smart-auth/src/main/java/com/zhentao/auth/service/SysLoginService.java create mode 100644 smart-auth/src/main/resources/banner.txt create mode 100644 smart-auth/src/main/resources/bootstrap.yml create mode 100644 smart-auth/src/main/resources/logback.xml create mode 100644 smart-common/pom.xml create mode 100644 smart-common/smart-common-core/pom.xml create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/annotation/Excel.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/annotation/Excels.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/config/MybatisPlusConfig.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/CacheConstants.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/Constants.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/GenConstants.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/HttpStatus.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/ScheduleConstants.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/ServiceNameConstants.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/UserConstants.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/domain/R.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/enums/UserStatus.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/BaseException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CaptchaException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CheckedException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CustomException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/DemoModeException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/PreAuthorizeException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/UtilException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileNameLengthLimitExceededException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileSizeLimitExceededException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/InvalidExtensionException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/job/TaskException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/CaptchaExpireException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/UserException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/UserPasswordNotMatchException.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/CharsetKit.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/Convert.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/StrFormatter.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/UUID.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/DateUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ExceptionUtil.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/IdUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ReUtil.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/SecurityUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ServletUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/SpringUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/StringUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/bean/BeanUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/FileTypeUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/FileUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/ImageUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/MimeTypeUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ip/IpUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/poi/ExcelUtil.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/reflect/ReflectUtils.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/sign/Base64.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/sql/SqlUtil.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/controller/BaseController.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/AjaxResult.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/BaseEntity.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/TreeEntity.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/PageDomain.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/TableDataInfo.java create mode 100644 smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/TableSupport.java create mode 100644 smart-common/smart-common-core/src/main/resources/META-INF/spring.factories create mode 100644 smart-common/smart-common-datascope/pom.xml create mode 100644 smart-common/smart-common-datascope/src/main/java/com/zhentao/common/datascope/annotation/DataScope.java create mode 100644 smart-common/smart-common-datascope/src/main/java/com/zhentao/common/datascope/aspect/DataScopeAspect.java create mode 100644 smart-common/smart-common-datascope/src/main/resources/META-INF/spring.factories create mode 100644 smart-common/smart-common-datasource/pom.xml create mode 100644 smart-common/smart-common-datasource/src/main/java/com/zhentao/common/datasource/annotation/Master.java create mode 100644 smart-common/smart-common-datasource/src/main/java/com/zhentao/common/datasource/annotation/Slave.java create mode 100644 smart-common/smart-common-log/pom.xml create mode 100644 smart-common/smart-common-log/src/main/java/com/zhentao/common/log/annotation/Log.java create mode 100644 smart-common/smart-common-log/src/main/java/com/zhentao/common/log/aspect/LogAspect.java create mode 100644 smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/BusinessStatus.java create mode 100644 smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/BusinessType.java create mode 100644 smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/OperatorType.java create mode 100644 smart-common/smart-common-log/src/main/java/com/zhentao/common/log/service/AsyncLogService.java create mode 100644 smart-common/smart-common-log/src/main/resources/META-INF/spring.factories create mode 100644 smart-common/smart-common-redis/pom.xml create mode 100644 smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/configure/FastJson2JsonRedisSerializer.java create mode 100644 smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/configure/RedisConfig.java create mode 100644 smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/service/RedisService.java create mode 100644 smart-common/smart-common-redis/src/main/resources/META-INF/spring.factories create mode 100644 smart-common/smart-common-security/pom.xml create mode 100644 smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/EnableCustomConfig.java create mode 100644 smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/EnableRyFeignClients.java create mode 100644 smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/PreAuthorize.java create mode 100644 smart-common/smart-common-security/src/main/java/com/zhentao/common/security/aspect/PreAuthorizeAspect.java create mode 100644 smart-common/smart-common-security/src/main/java/com/zhentao/common/security/config/ApplicationConfig.java create mode 100644 smart-common/smart-common-security/src/main/java/com/zhentao/common/security/feign/FeignAutoConfiguration.java create mode 100644 smart-common/smart-common-security/src/main/java/com/zhentao/common/security/feign/FeignRequestInterceptor.java create mode 100644 smart-common/smart-common-security/src/main/java/com/zhentao/common/security/handler/GlobalExceptionHandler.java create mode 100644 smart-common/smart-common-security/src/main/java/com/zhentao/common/security/service/TokenService.java create mode 100644 smart-common/smart-common-security/src/main/resources/META-INF/spring.factories create mode 100644 smart-common/smart-common-swagger/pom.xml create mode 100644 smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/annotation/EnableCustomSwagger2.java create mode 100644 smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/config/SwaggerAutoConfiguration.java create mode 100644 smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/config/SwaggerProperties.java create mode 100644 smart-common/smart-common-swagger/src/main/resources/META-INF/spring.factories create mode 100644 smart-gateway/pom.xml create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/RuoYiGatewayApplication.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/config/CaptchaConfig.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/config/GatewayConfig.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/config/KaptchaTextCreator.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/config/RouterFunctionConfiguration.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/config/SwaggerProvider.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/config/properties/IgnoreWhiteProperties.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/filter/AuthFilter.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/filter/BlackListUrlFilter.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/filter/CacheRequestFilter.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/filter/ValidateCodeFilter.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/handler/GatewayExceptionHandler.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/handler/SentinelFallbackHandler.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/handler/SwaggerHandler.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/handler/ValidateCodeHandler.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/service/ValidateCodeService.java create mode 100644 smart-gateway/src/main/java/com/zhentao/gateway/service/impl/ValidateCodeServiceImpl.java create mode 100644 smart-gateway/src/main/resources/banner.txt create mode 100644 smart-gateway/src/main/resources/bootstrap.yml create mode 100644 smart-gateway/src/main/resources/logback.xml create mode 100644 smart-modules/pom.xml create mode 100644 smart-modules/smart-file/pom.xml create mode 100644 smart-modules/smart-file/src/main/java/com/zhentao/file/RuoYFileApplication.java create mode 100644 smart-modules/smart-file/src/main/java/com/zhentao/file/config/MinioConfig.java create mode 100644 smart-modules/smart-file/src/main/java/com/zhentao/file/config/ResourcesConfig.java create mode 100644 smart-modules/smart-file/src/main/java/com/zhentao/file/controller/SysFileController.java create mode 100644 smart-modules/smart-file/src/main/java/com/zhentao/file/service/FastDfsSysFileServiceImpl.java create mode 100644 smart-modules/smart-file/src/main/java/com/zhentao/file/service/ISysFileService.java create mode 100644 smart-modules/smart-file/src/main/java/com/zhentao/file/service/LocalSysFileServiceImpl.java create mode 100644 smart-modules/smart-file/src/main/java/com/zhentao/file/service/MinioSysFileServiceImpl.java create mode 100644 smart-modules/smart-file/src/main/java/com/zhentao/file/utils/FileUploadUtils.java create mode 100644 smart-modules/smart-file/src/main/resources/banner.txt create mode 100644 smart-modules/smart-file/src/main/resources/bootstrap.yml create mode 100644 smart-modules/smart-file/src/main/resources/logback.xml create mode 100644 smart-modules/smart-gen/pom.xml create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/RuoYiGenApplication.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/config/GenConfig.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/controller/GenController.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/domain/GenTable.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/domain/GenTableColumn.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/mapper/GenTableColumnMapper.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/mapper/GenTableMapper.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/GenTableColumnServiceImpl.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/GenTableServiceImpl.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/IGenTableColumnService.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/IGenTableService.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/GenUtils.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/VelocityInitializer.java create mode 100644 smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/VelocityUtils.java create mode 100644 smart-modules/smart-gen/src/main/resources/banner.txt create mode 100644 smart-modules/smart-gen/src/main/resources/bootstrap.yml create mode 100644 smart-modules/smart-gen/src/main/resources/logback.xml create mode 100644 smart-modules/smart-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml create mode 100644 smart-modules/smart-gen/src/main/resources/mapper/generator/GenTableMapper.xml create mode 100644 smart-modules/smart-gen/src/main/resources/vm/java/controller.java.vm create mode 100644 smart-modules/smart-gen/src/main/resources/vm/java/domain.java.vm create mode 100644 smart-modules/smart-gen/src/main/resources/vm/java/mapper.java.vm create mode 100644 smart-modules/smart-gen/src/main/resources/vm/java/service.java.vm create mode 100644 smart-modules/smart-gen/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 smart-modules/smart-gen/src/main/resources/vm/java/sub-domain.java.vm create mode 100644 smart-modules/smart-gen/src/main/resources/vm/js/api.js.vm create mode 100644 smart-modules/smart-gen/src/main/resources/vm/sql/sql.vm create mode 100644 smart-modules/smart-gen/src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 smart-modules/smart-gen/src/main/resources/vm/vue/index.vue.vm create mode 100644 smart-modules/smart-gen/src/main/resources/vm/xml/mapper.xml.vm create mode 100644 smart-modules/smart-job/pom.xml create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/RuoYiJobApplication.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/config/ScheduleConfig.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/controller/SysJobController.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/controller/SysJobLogController.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/domain/SysJob.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/domain/SysJobLog.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/mapper/SysJobLogMapper.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/mapper/SysJobMapper.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/service/ISysJobLogService.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/service/ISysJobService.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/service/SysJobLogServiceImpl.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/service/SysJobServiceImpl.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/task/RyTask.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/util/AbstractQuartzJob.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/util/CronUtils.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/util/JobInvokeUtil.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/util/QuartzDisallowConcurrentExecution.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/util/QuartzJobExecution.java create mode 100644 smart-modules/smart-job/src/main/java/com/zhentao/job/util/ScheduleUtils.java create mode 100644 smart-modules/smart-job/src/main/resources/banner.txt create mode 100644 smart-modules/smart-job/src/main/resources/bootstrap.yml create mode 100644 smart-modules/smart-job/src/main/resources/logback.xml create mode 100644 smart-modules/smart-job/src/main/resources/mapper/job/SysJobLogMapper.xml create mode 100644 smart-modules/smart-job/src/main/resources/mapper/job/SysJobMapper.xml create mode 100644 smart-modules/smart-system/pom.xml create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/RuoYiSystemApplication.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SmartCsController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysConfigController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDeptController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDictDataController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDictTypeController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysLogininforController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysMenuController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysNoticeController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysOperlogController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysPostController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysProfileController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysRoleController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysUserController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysUserOnlineController.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SmartCs.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysConfig.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysDictData.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysDictType.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysLogininfor.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysMenu.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysNotice.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysPost.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysRoleDept.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysRoleMenu.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserOnline.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserPost.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserRole.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/MetaVo.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/RouterVo.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/TreeSelect.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SmartCsMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysConfigMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDeptMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDictDataMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDictTypeMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysLogininforMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysMenuMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysNoticeMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysOperLogMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysPostMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleDeptMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleMenuMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserPostMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserRoleMapper.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysConfigService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDeptService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDictDataService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDictTypeService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysLogininforService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysMenuService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysNoticeService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysOperLogService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysPermissionService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysPostService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysRoleService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysUserOnlineService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysUserService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/SmartCsService.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SmartCsServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysConfigServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDeptServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDictDataServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDictTypeServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysLogininforServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysMenuServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysNoticeServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysOperLogServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysPermissionServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysPostServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysRoleServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysUserOnlineServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysUserServiceImpl.java create mode 100644 smart-modules/smart-system/src/main/java/com/zhentao/system/utils/DictUtils.java create mode 100644 smart-modules/smart-system/src/main/resources/banner.txt create mode 100644 smart-modules/smart-system/src/main/resources/bootstrap.yml create mode 100644 smart-modules/smart-system/src/main/resources/logback.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/SmartCsMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysConfigMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysDeptMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysDictDataMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysDictTypeMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysLogininforMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysMenuMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysNoticeMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysOperLogMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysPostMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysRoleMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysUserMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysUserPostMapper.xml create mode 100644 smart-modules/smart-system/src/main/resources/mapper/system/SysUserRoleMapper.xml create mode 100644 smart-visual/pom.xml create mode 100644 smart-visual/smart-monitor/pom.xml create mode 100644 smart-visual/smart-monitor/src/main/java/com/zhentao/modules/monitor/RuoYiMonitorApplication.java create mode 100644 smart-visual/smart-monitor/src/main/java/com/zhentao/modules/monitor/config/WebSecurityConfigurer.java create mode 100644 smart-visual/smart-monitor/src/main/resources/banner.txt create mode 100644 smart-visual/smart-monitor/src/main/resources/bootstrap.yml create mode 100644 smart-visual/smart-monitor/src/main/resources/logback.xml create mode 100644 sql/quartz.sql create mode 100644 sql/ry_20210108.sql create mode 100644 sql/ry_config_20210128.sql create mode 100644 sql/ry_seata_20210128.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd446f4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +###################################################################### +# Build Tools + +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +target/ +!.mvn/wrapper/maven-wrapper.jar + +###################################################################### +# IDE + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/* +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +###################################################################### +# Others +*.log +*.xml.versionsBackup + +!*/build/*.java +!*/build/*.html +!*/build/*.xml \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bd95df1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 鑻ヤ緷 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/bin/clean.bat b/bin/clean.bat new file mode 100644 index 0000000..5c2a3b2 --- /dev/null +++ b/bin/clean.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [信息] 清理生成路径。 +echo. + +%~d0 +cd %~dp0 + +cd .. +call mvn clean + +pause \ No newline at end of file diff --git a/bin/package.bat b/bin/package.bat new file mode 100644 index 0000000..c693ec0 --- /dev/null +++ b/bin/package.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [信息] 打包Web工程,生成war/jar包文件。 +echo. + +%~d0 +cd %~dp0 + +cd .. +call mvn clean package -Dmaven.test.skip=true + +pause \ No newline at end of file diff --git a/bin/run-auth.bat b/bin/run-auth.bat new file mode 100644 index 0000000..c84864f --- /dev/null +++ b/bin/run-auth.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [信息] 运行auth工程。 +echo. + +cd %~dp0 +cd ../ruoyi-auth/target + +set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -Dfile.encoding=utf-8 -jar %JAVA_OPTS% ruoyi-auth.jar + +cd bin +pause \ No newline at end of file diff --git a/bin/run-gateway.bat b/bin/run-gateway.bat new file mode 100644 index 0000000..66324d0 --- /dev/null +++ b/bin/run-gateway.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [信息] 运行gateway工程。 +echo. + +cd %~dp0 +cd ../ruoyi-gateway/target + +set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -Dfile.encoding=utf-8 -jar %JAVA_OPTS% ruoyi-gateway.jar + +cd bin +pause \ No newline at end of file diff --git a/bin/run-modules-file.bat b/bin/run-modules-file.bat new file mode 100644 index 0000000..5906a3b --- /dev/null +++ b/bin/run-modules-file.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [信息] 运行modules-file工程。 +echo. + +cd %~dp0 +cd ../ruoyi-modules/ruoyi-file/target + +set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -Dfile.encoding=utf-8 -jar %JAVA_OPTS% ruoyi-modules-file.jar + +cd bin +pause \ No newline at end of file diff --git a/bin/run-modules-gen.bat b/bin/run-modules-gen.bat new file mode 100644 index 0000000..ffccc92 --- /dev/null +++ b/bin/run-modules-gen.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [信息] 运行modules-gen工程。 +echo. + +cd %~dp0 +cd ../ruoyi-modules/ruoyi-gen/target + +set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -Dfile.encoding=utf-8 -jar %JAVA_OPTS% ruoyi-modules-gen.jar + +cd bin +pause \ No newline at end of file diff --git a/bin/run-modules-job.bat b/bin/run-modules-job.bat new file mode 100644 index 0000000..36ff4f1 --- /dev/null +++ b/bin/run-modules-job.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [信息] 运行modules-job工程。 +echo. + +cd %~dp0 +cd ../ruoyi-modules/ruoyi-job/target + +set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -Dfile.encoding=utf-8 -jar %JAVA_OPTS% ruoyi-modules-job.jar + +cd bin +pause \ No newline at end of file diff --git a/bin/run-modules-system.bat b/bin/run-modules-system.bat new file mode 100644 index 0000000..8f79643 --- /dev/null +++ b/bin/run-modules-system.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [信息] 运行modules-system工程。 +echo. + +cd %~dp0 +cd ../ruoyi-modules/ruoyi-system/target + +set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -Dfile.encoding=utf-8 -jar %JAVA_OPTS% ruoyi-modules-system.jar + +cd bin +pause \ No newline at end of file diff --git a/bin/run-monitor.bat b/bin/run-monitor.bat new file mode 100644 index 0000000..8218a49 --- /dev/null +++ b/bin/run-monitor.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [信息] 运行monitor工程。 +echo. + +cd %~dp0 +cd ../ruoyi-visual/ruoyi-monitor/target + +set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -Dfile.encoding=utf-8 -jar %JAVA_OPTS% ruoyi-visual-monitor.jar + +cd bin +pause \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..793fa67 --- /dev/null +++ b/pom.xml @@ -0,0 +1,264 @@ + + + 4.0.0 + + com.ruoyi + CloudParking + 2.5.0 + + + 2.5.0 + UTF-8 + UTF-8 + 1.8 + 2.3.7.RELEASE + Hoxton.SR9 + 2.2.5.RELEASE + 2.3.1 + 2.1.3 + 2.9.2 + 1.5.24 + 1.26.5 + 2.3.2 + 1.3.0 + 1.2.4 + 3.2.1 + 2.5 + 1.3.3 + 1.7 + 1.2.75 + 8.0.3 + 4.1.2 + 2.6.2 + 3.5.1 + + + + + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + com.github.jsqlparser + jsqlparser + + + + + + com.github.jsqlparser + jsqlparser + 4.6 + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring-cloud-alibaba.version} + pom + import + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin.version} + + + + + com.github.tobato + fastdfs-client + ${tobato.version} + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${spring-boot.mybatis} + + + + + io.swagger + swagger-models + ${swagger.core.version} + + + io.swagger + swagger-annotations + ${swagger.core.version} + + + + + com.github.penggle + kaptcha + ${kaptcha.version} + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.boot.version} + + + + + commons-io + commons-io + ${commons.io.version} + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + + commons-fileupload + commons-fileupload + ${commons.fileupload.version} + + + + + org.apache.velocity + velocity + ${velocity.version} + + + + + com.alibaba + fastjson + ${fastjson.version} + + + + + org.apache.commons + commons-pool2 + ${common-pool.version} + + + + + com.ruoyi + smart-common-core + ${ruoyi.version} + + + + + com.ruoyi + smart-common-swagger + ${ruoyi.version} + + + + + com.ruoyi + smart-common-security + ${ruoyi.version} + + + + + com.ruoyi + smart-common-datascope + ${ruoyi.version} + + + + + com.ruoyi + smart-common-datasource + ${ruoyi.version} + + + + + com.ruoyi + smart-common-log + ${ruoyi.version} + + + + + com.ruoyi + smart-common-redis + ${ruoyi.version} + + + + + com.ruoyi + smart-api-system + ${ruoyi.version} + + + + + + + smart-auth + smart-gateway + smart-visual + smart-modules + smart-api + smart-common + + pom + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + diff --git a/smart-api/pom.xml b/smart-api/pom.xml new file mode 100644 index 0000000..640c3c4 --- /dev/null +++ b/smart-api/pom.xml @@ -0,0 +1,22 @@ + + + + com.ruoyi + CloudParking + 2.5.0 + + 4.0.0 + + + smart-api-system + + + smart-api + pom + + + smart-api绯荤粺鎺ュ彛 + + + diff --git a/smart-api/smart-api-system/pom.xml b/smart-api/smart-api-system/pom.xml new file mode 100644 index 0000000..156b13f --- /dev/null +++ b/smart-api/smart-api-system/pom.xml @@ -0,0 +1,28 @@ + + + + com.ruoyi + smart-api + 2.5.0 + + 4.0.0 + + smart-api-system + + + smart-api-system绯荤粺鎺ュ彛妯″潡 + + + + + + + com.ruoyi + smart-common-core + + + + + diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteFileService.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteFileService.java new file mode 100644 index 0000000..a45cbb3 --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteFileService.java @@ -0,0 +1,29 @@ +package com.zhentao.system.api; + +import com.zhentao.system.api.factory.RemoteFileFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; +import com.zhentao.common.core.constant.ServiceNameConstants; +import com.zhentao.common.core.domain.R; +import com.zhentao.system.api.domain.SysFile; + +/** + * 鏂囦欢鏈嶅姟 + * + * @author ruoyi + */ +@FeignClient(contextId = "remoteFileService", value = ServiceNameConstants.FILE_SERVICE, fallbackFactory = RemoteFileFallbackFactory.class) +public interface RemoteFileService +{ + /** + * 涓婁紶鏂囦欢 + * + * @param file 鏂囦欢淇℃伅 + * @return 缁撴灉 + */ + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R upload(@RequestPart(value = "file") MultipartFile file); +} diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteLogService.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteLogService.java new file mode 100644 index 0000000..01d490e --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteLogService.java @@ -0,0 +1,40 @@ +package com.zhentao.system.api; + +import com.zhentao.system.api.factory.RemoteLogFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import com.zhentao.common.core.constant.ServiceNameConstants; +import com.zhentao.common.core.domain.R; +import com.zhentao.system.api.domain.SysOperLog; + +/** + * 鏃ュ織鏈嶅姟 + * + * @author ruoyi + */ +@FeignClient(contextId = "remoteLogService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteLogFallbackFactory.class) +public interface RemoteLogService +{ + /** + * 淇濆瓨绯荤粺鏃ュ織 + * + * @param sysOperLog 鏃ュ織瀹炰綋 + * @return 缁撴灉 + */ + @PostMapping("/operlog") + R saveLog(@RequestBody SysOperLog sysOperLog); + + /** + * 淇濆瓨璁块棶璁板綍 + * + * @param username 鐢ㄦ埛鍚嶇О + * @param status 鐘舵 + * @param message 娑堟伅 + * @return 缁撴灉 + */ + @PostMapping("/logininfor") + R saveLogininfor(@RequestParam("username") String username, @RequestParam("status") String status, + @RequestParam("message") String message); +} diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteUserService.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteUserService.java new file mode 100644 index 0000000..962e2bc --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/RemoteUserService.java @@ -0,0 +1,27 @@ +package com.zhentao.system.api; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import com.zhentao.common.core.constant.ServiceNameConstants; +import com.zhentao.common.core.domain.R; +import com.zhentao.system.api.factory.RemoteUserFallbackFactory; +import com.zhentao.system.api.model.LoginUser; + +/** + * 鐢ㄦ埛鏈嶅姟 + * + * @author ruoyi + */ +@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class) +public interface RemoteUserService +{ + /** + * 閫氳繃鐢ㄦ埛鍚嶆煡璇㈢敤鎴蜂俊鎭 + * + * @param username 鐢ㄦ埛鍚 + * @return 缁撴灉 + */ + @GetMapping(value = "/user/info/{username}") + public R getUserInfo(@PathVariable("username") String username); +} diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysDept.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysDept.java new file mode 100644 index 0000000..702a5e0 --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysDept.java @@ -0,0 +1,202 @@ +package com.zhentao.system.api.domain; + +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 閮ㄩ棬琛 sys_dept + * + * @author ruoyi + */ +public class SysDept extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 閮ㄩ棬ID */ + private Long deptId; + + /** 鐖堕儴闂↖D */ + private Long parentId; + + /** 绁栫骇鍒楄〃 */ + private String ancestors; + + /** 閮ㄩ棬鍚嶇О */ + private String deptName; + + /** 鏄剧ず椤哄簭 */ + private String orderNum; + + /** 璐熻矗浜 */ + private String leader; + + /** 鑱旂郴鐢佃瘽 */ + private String phone; + + /** 閭 */ + private String email; + + /** 閮ㄩ棬鐘舵:0姝e父,1鍋滅敤 */ + private String status; + + /** 鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛 */ + private String delFlag; + + /** 鐖堕儴闂ㄥ悕绉 */ + private String parentName; + + /** 瀛愰儴闂 */ + private List children = new ArrayList(); + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public String getAncestors() + { + return ancestors; + } + + public void setAncestors(String ancestors) + { + this.ancestors = ancestors; + } + + @NotBlank(message = "閮ㄩ棬鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 30, message = "閮ㄩ棬鍚嶇О闀垮害涓嶈兘瓒呰繃30涓瓧绗") + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + @NotBlank(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖") + public String getOrderNum() + { + return orderNum; + } + + public void setOrderNum(String orderNum) + { + this.orderNum = orderNum; + } + + public String getLeader() + { + return leader; + } + + public void setLeader(String leader) + { + this.leader = leader; + } + + @Size(min = 0, max = 11, message = "鑱旂郴鐢佃瘽闀垮害涓嶈兘瓒呰繃11涓瓧绗") + public String getPhone() + { + return phone; + } + + public void setPhone(String phone) + { + this.phone = phone; + } + + @Email(message = "閭鏍煎紡涓嶆纭") + @Size(min = 0, max = 50, message = "閭闀垮害涓嶈兘瓒呰繃50涓瓧绗") + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("deptId", getDeptId()) + .append("parentId", getParentId()) + .append("ancestors", getAncestors()) + .append("deptName", getDeptName()) + .append("orderNum", getOrderNum()) + .append("leader", getLeader()) + .append("phone", getPhone()) + .append("email", getEmail()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysFile.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysFile.java new file mode 100644 index 0000000..80ef2c9 --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysFile.java @@ -0,0 +1,50 @@ +package com.zhentao.system.api.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 鏂囦欢淇℃伅 + * + * @author ruoyi + */ +public class SysFile +{ + /** + * 鏂囦欢鍚嶇О + */ + private String name; + + /** + * 鏂囦欢鍦板潃 + */ + private String url; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getUrl() + { + return url; + } + + public void setUrl(String url) + { + this.url = url; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("name", getName()) + .append("url", getUrl()) + .toString(); + } +} diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysOperLog.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysOperLog.java new file mode 100644 index 0000000..a96a9d2 --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysOperLog.java @@ -0,0 +1,241 @@ +package com.zhentao.system.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.zhentao.common.core.annotation.Excel; +import com.zhentao.common.core.annotation.Excel.ColumnType; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 鎿嶄綔鏃ュ織璁板綍琛 oper_log + * + * @author ruoyi + */ +public class SysOperLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 鏃ュ織涓婚敭 */ + @Excel(name = "鎿嶄綔搴忓彿", cellType = ColumnType.NUMERIC) + private Long operId; + + /** 鎿嶄綔妯″潡 */ + @Excel(name = "鎿嶄綔妯″潡") + private String title; + + /** 涓氬姟绫诲瀷锛0鍏跺畠 1鏂板 2淇敼 3鍒犻櫎锛 */ + @Excel(name = "涓氬姟绫诲瀷", readConverterExp = "0=鍏跺畠,1=鏂板,2=淇敼,3=鍒犻櫎,4=鎺堟潈,5=瀵煎嚭,6=瀵煎叆,7=寮洪,8=鐢熸垚浠g爜,9=娓呯┖鏁版嵁") + private Integer businessType; + + /** 涓氬姟绫诲瀷鏁扮粍 */ + private Integer[] businessTypes; + + /** 璇锋眰鏂规硶 */ + @Excel(name = "璇锋眰鏂规硶") + private String method; + + /** 璇锋眰鏂瑰紡 */ + @Excel(name = "璇锋眰鏂瑰紡") + private String requestMethod; + + /** 鎿嶄綔绫诲埆锛0鍏跺畠 1鍚庡彴鐢ㄦ埛 2鎵嬫満绔敤鎴凤級 */ + @Excel(name = "鎿嶄綔绫诲埆", readConverterExp = "0=鍏跺畠,1=鍚庡彴鐢ㄦ埛,2=鎵嬫満绔敤鎴") + private Integer operatorType; + + /** 鎿嶄綔浜哄憳 */ + @Excel(name = "鎿嶄綔浜哄憳") + private String operName; + + /** 閮ㄩ棬鍚嶇О */ + @Excel(name = "閮ㄩ棬鍚嶇О") + private String deptName; + + /** 璇锋眰url */ + @Excel(name = "璇锋眰鍦板潃") + private String operUrl; + + /** 鎿嶄綔鍦板潃 */ + @Excel(name = "鎿嶄綔鍦板潃") + private String operIp; + + /** 璇锋眰鍙傛暟 */ + @Excel(name = "璇锋眰鍙傛暟") + private String operParam; + + /** 杩斿洖鍙傛暟 */ + @Excel(name = "杩斿洖鍙傛暟") + private String jsonResult; + + /** 鎿嶄綔鐘舵侊紙0姝e父 1寮傚父锛 */ + @Excel(name = "鐘舵", readConverterExp = "0=姝e父,1=寮傚父") + private Integer status; + + /** 閿欒娑堟伅 */ + @Excel(name = "閿欒娑堟伅") + private String errorMsg; + + /** 鎿嶄綔鏃堕棿 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "鎿嶄綔鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date operTime; + + public Long getOperId() + { + return operId; + } + + public void setOperId(Long operId) + { + this.operId = operId; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public Integer getBusinessType() + { + return businessType; + } + + public void setBusinessType(Integer businessType) + { + this.businessType = businessType; + } + + public Integer[] getBusinessTypes() + { + return businessTypes; + } + + public void setBusinessTypes(Integer[] businessTypes) + { + this.businessTypes = businessTypes; + } + + public String getMethod() + { + return method; + } + + public void setMethod(String method) + { + this.method = method; + } + + public String getRequestMethod() + { + return requestMethod; + } + + public void setRequestMethod(String requestMethod) + { + this.requestMethod = requestMethod; + } + + public Integer getOperatorType() + { + return operatorType; + } + + public void setOperatorType(Integer operatorType) + { + this.operatorType = operatorType; + } + + public String getOperName() + { + return operName; + } + + public void setOperName(String operName) + { + this.operName = operName; + } + + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + public String getOperUrl() + { + return operUrl; + } + + public void setOperUrl(String operUrl) + { + this.operUrl = operUrl; + } + + public String getOperIp() + { + return operIp; + } + + public void setOperIp(String operIp) + { + this.operIp = operIp; + } + + public String getOperParam() + { + return operParam; + } + + public void setOperParam(String operParam) + { + this.operParam = operParam; + } + + public String getJsonResult() + { + return jsonResult; + } + + public void setJsonResult(String jsonResult) + { + this.jsonResult = jsonResult; + } + + public Integer getStatus() + { + return status; + } + + public void setStatus(Integer status) + { + this.status = status; + } + + public String getErrorMsg() + { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) + { + this.errorMsg = errorMsg; + } + + public Date getOperTime() + { + return operTime; + } + + public void setOperTime(Date operTime) + { + this.operTime = operTime; + } +} diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysRole.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysRole.java new file mode 100644 index 0000000..fa51e6e --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysRole.java @@ -0,0 +1,225 @@ +package com.zhentao.system.api.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.zhentao.common.core.annotation.Excel; +import com.zhentao.common.core.annotation.Excel.ColumnType; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 瑙掕壊琛 sys_role + * + * @author ruoyi + */ +public class SysRole extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 瑙掕壊ID */ + @Excel(name = "瑙掕壊搴忓彿", cellType = ColumnType.NUMERIC) + private Long roleId; + + /** 瑙掕壊鍚嶇О */ + @Excel(name = "瑙掕壊鍚嶇О") + private String roleName; + + /** 瑙掕壊鏉冮檺 */ + @Excel(name = "瑙掕壊鏉冮檺") + private String roleKey; + + /** 瑙掕壊鎺掑簭 */ + @Excel(name = "瑙掕壊鎺掑簭") + private String roleSort; + + /** 鏁版嵁鑼冨洿锛1锛氭墍鏈夋暟鎹潈闄愶紱2锛氳嚜瀹氫箟鏁版嵁鏉冮檺锛3锛氭湰閮ㄩ棬鏁版嵁鏉冮檺锛4锛氭湰閮ㄩ棬鍙婁互涓嬫暟鎹潈闄愶級 */ + @Excel(name = "鏁版嵁鑼冨洿", readConverterExp = "1=鎵鏈夋暟鎹潈闄,2=鑷畾涔夋暟鎹潈闄,3=鏈儴闂ㄦ暟鎹潈闄,4=鏈儴闂ㄥ強浠ヤ笅鏁版嵁鏉冮檺") + private String dataScope; + + /** 鑿滃崟鏍戦夋嫨椤规槸鍚﹀叧鑱旀樉绀猴紙 0锛氱埗瀛愪笉浜掔浉鍏宠仈鏄剧ず 1锛氱埗瀛愪簰鐩稿叧鑱旀樉绀猴級 */ + private boolean menuCheckStrictly; + + /** 閮ㄩ棬鏍戦夋嫨椤规槸鍚﹀叧鑱旀樉绀猴紙0锛氱埗瀛愪笉浜掔浉鍏宠仈鏄剧ず 1锛氱埗瀛愪簰鐩稿叧鑱旀樉绀 锛 */ + private boolean deptCheckStrictly; + + /** 瑙掕壊鐘舵侊紙0姝e父 1鍋滅敤锛 */ + @Excel(name = "瑙掕壊鐘舵", readConverterExp = "0=姝e父,1=鍋滅敤") + private String status; + + /** 鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛 */ + private String delFlag; + + /** 鐢ㄦ埛鏄惁瀛樺湪姝よ鑹叉爣璇 榛樿涓嶅瓨鍦 */ + private boolean flag = false; + + /** 鑿滃崟缁 */ + private Long[] menuIds; + + /** 閮ㄩ棬缁勶紙鏁版嵁鏉冮檺锛 */ + private Long[] deptIds; + + public SysRole() + { + + } + + public SysRole(Long roleId) + { + this.roleId = roleId; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public boolean isAdmin() + { + return isAdmin(this.roleId); + } + + public static boolean isAdmin(Long roleId) + { + return roleId != null && 1L == roleId; + } + + @NotBlank(message = "瑙掕壊鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 30, message = "瑙掕壊鍚嶇О闀垮害涓嶈兘瓒呰繃30涓瓧绗") + public String getRoleName() + { + return roleName; + } + + public void setRoleName(String roleName) + { + this.roleName = roleName; + } + + @NotBlank(message = "鏉冮檺瀛楃涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "鏉冮檺瀛楃闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getRoleKey() + { + return roleKey; + } + + public void setRoleKey(String roleKey) + { + this.roleKey = roleKey; + } + + @NotBlank(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖") + public String getRoleSort() + { + return roleSort; + } + + public void setRoleSort(String roleSort) + { + this.roleSort = roleSort; + } + + public String getDataScope() + { + return dataScope; + } + + public void setDataScope(String dataScope) + { + this.dataScope = dataScope; + } + + public boolean isMenuCheckStrictly() + { + return menuCheckStrictly; + } + + public void setMenuCheckStrictly(boolean menuCheckStrictly) + { + this.menuCheckStrictly = menuCheckStrictly; + } + + public boolean isDeptCheckStrictly() + { + return deptCheckStrictly; + } + + public void setDeptCheckStrictly(boolean deptCheckStrictly) + { + this.deptCheckStrictly = deptCheckStrictly; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public boolean isFlag() + { + return flag; + } + + public void setFlag(boolean flag) + { + this.flag = flag; + } + + public Long[] getMenuIds() + { + return menuIds; + } + + public void setMenuIds(Long[] menuIds) + { + this.menuIds = menuIds; + } + + public Long[] getDeptIds() + { + return deptIds; + } + + public void setDeptIds(Long[] deptIds) + { + this.deptIds = deptIds; + } + + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("roleName", getRoleName()) + .append("roleKey", getRoleKey()) + .append("roleSort", getRoleSort()) + .append("dataScope", getDataScope()) + .append("menuCheckStrictly", isMenuCheckStrictly()) + .append("deptCheckStrictly", isDeptCheckStrictly()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysUser.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysUser.java new file mode 100644 index 0000000..ee837bf --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/domain/SysUser.java @@ -0,0 +1,326 @@ +package com.zhentao.system.api.domain; + +import java.util.Date; +import java.util.List; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.zhentao.common.core.annotation.Excel; +import com.zhentao.common.core.annotation.Excel.ColumnType; +import com.zhentao.common.core.annotation.Excel.Type; +import com.zhentao.common.core.annotation.Excels; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 鐢ㄦ埛瀵硅薄 sys_user + * + * @author ruoyi + */ +public class SysUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 鐢ㄦ埛ID */ + @Excel(name = "鐢ㄦ埛搴忓彿", cellType = ColumnType.NUMERIC, prompt = "鐢ㄦ埛缂栧彿") + private Long userId; + + /** 閮ㄩ棬ID */ + @Excel(name = "閮ㄩ棬缂栧彿", type = Type.IMPORT) + private Long deptId; + + /** 鐢ㄦ埛璐﹀彿 */ + @Excel(name = "鐧诲綍鍚嶇О") + private String userName; + + /** 鐢ㄦ埛鏄电О */ + @Excel(name = "鐢ㄦ埛鍚嶇О") + private String nickName; + + /** 鐢ㄦ埛閭 */ + @Excel(name = "鐢ㄦ埛閭") + private String email; + + /** 鎵嬫満鍙风爜 */ + @Excel(name = "鎵嬫満鍙风爜") + private String phonenumber; + + /** 鐢ㄦ埛鎬у埆 */ + @Excel(name = "鐢ㄦ埛鎬у埆", readConverterExp = "0=鐢,1=濂,2=鏈煡") + private String sex; + + /** 鐢ㄦ埛澶村儚 */ + private String avatar; + + /** 瀵嗙爜 */ + private String password; + + /** 鐩愬姞瀵 */ + private String salt; + + /** 甯愬彿鐘舵侊紙0姝e父 1鍋滅敤锛 */ + @Excel(name = "甯愬彿鐘舵", readConverterExp = "0=姝e父,1=鍋滅敤") + private String status; + + /** 鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛 */ + private String delFlag; + + /** 鏈鍚庣櫥褰旾P */ + @Excel(name = "鏈鍚庣櫥褰旾P", type = Type.EXPORT) + private String loginIp; + + /** 鏈鍚庣櫥褰曟椂闂 */ + @Excel(name = "鏈鍚庣櫥褰曟椂闂", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) + private Date loginDate; + + /** 閮ㄩ棬瀵硅薄 */ + @Excels({ + @Excel(name = "閮ㄩ棬鍚嶇О", targetAttr = "deptName", type = Type.EXPORT), + @Excel(name = "閮ㄩ棬璐熻矗浜", targetAttr = "leader", type = Type.EXPORT) + }) + private SysDept dept; + + /** 瑙掕壊瀵硅薄 */ + private List roles; + + /** 瑙掕壊缁 */ + private Long[] roleIds; + + /** 宀椾綅缁 */ + private Long[] postIds; + + public SysUser() + { + + } + + public SysUser(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public boolean isAdmin() + { + return isAdmin(this.userId); + } + + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + @Size(min = 0, max = 30, message = "鐢ㄦ埛鏄电О闀垮害涓嶈兘瓒呰繃30涓瓧绗") + public String getNickName() + { + return nickName; + } + + public void setNickName(String nickName) + { + this.nickName = nickName; + } + + @NotBlank(message = "鐢ㄦ埛璐﹀彿涓嶈兘涓虹┖") + @Size(min = 0, max = 30, message = "鐢ㄦ埛璐﹀彿闀垮害涓嶈兘瓒呰繃30涓瓧绗") + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + @Email(message = "閭鏍煎紡涓嶆纭") + @Size(min = 0, max = 50, message = "閭闀垮害涓嶈兘瓒呰繃50涓瓧绗") + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + + @Size(min = 0, max = 11, message = "鎵嬫満鍙风爜闀垮害涓嶈兘瓒呰繃11涓瓧绗") + public String getPhonenumber() + { + return phonenumber; + } + + public void setPhonenumber(String phonenumber) + { + this.phonenumber = phonenumber; + } + + public String getSex() + { + return sex; + } + + public void setSex(String sex) + { + this.sex = sex; + } + + public String getAvatar() + { + return avatar; + } + + public void setAvatar(String avatar) + { + this.avatar = avatar; + } + + @JsonProperty + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getSalt() + { + return salt; + } + + public void setSalt(String salt) + { + this.salt = salt; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getLoginIp() + { + return loginIp; + } + + public void setLoginIp(String loginIp) + { + this.loginIp = loginIp; + } + + public Date getLoginDate() + { + return loginDate; + } + + public void setLoginDate(Date loginDate) + { + this.loginDate = loginDate; + } + + public SysDept getDept() + { + return dept; + } + + public void setDept(SysDept dept) + { + this.dept = dept; + } + + public List getRoles() + { + return roles; + } + + public void setRoles(List roles) + { + this.roles = roles; + } + + public Long[] getRoleIds() + { + return roleIds; + } + + public void setRoleIds(Long[] roleIds) + { + this.roleIds = roleIds; + } + + public Long[] getPostIds() + { + return postIds; + } + + public void setPostIds(Long[] postIds) + { + this.postIds = postIds; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("deptId", getDeptId()) + .append("userName", getUserName()) + .append("nickName", getNickName()) + .append("email", getEmail()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("avatar", getAvatar()) + .append("password", getPassword()) + .append("salt", getSalt()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("loginIp", getLoginIp()) + .append("loginDate", getLoginDate()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("dept", getDept()) + .toString(); + } +} diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteFileFallbackFactory.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteFileFallbackFactory.java new file mode 100644 index 0000000..daff037 --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteFileFallbackFactory.java @@ -0,0 +1,35 @@ +package com.zhentao.system.api.factory; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; +import com.zhentao.common.core.domain.R; +import com.zhentao.system.api.RemoteFileService; +import com.zhentao.system.api.domain.SysFile; +import feign.hystrix.FallbackFactory; + +/** + * 鏂囦欢鏈嶅姟闄嶇骇澶勭悊 + * + * @author ruoyi + */ +@Component +public class RemoteFileFallbackFactory implements FallbackFactory +{ + private static final Logger log = LoggerFactory.getLogger(RemoteFileFallbackFactory.class); + + @Override + public RemoteFileService create(Throwable throwable) + { + log.error("鏂囦欢鏈嶅姟璋冪敤澶辫触:{}", throwable.getMessage()); + return new RemoteFileService() + { + @Override + public R upload(MultipartFile file) + { + return R.fail("涓婁紶鏂囦欢澶辫触:" + throwable.getMessage()); + } + }; + } +} diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteLogFallbackFactory.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteLogFallbackFactory.java new file mode 100644 index 0000000..0626f69 --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteLogFallbackFactory.java @@ -0,0 +1,41 @@ +package com.zhentao.system.api.factory; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import com.zhentao.common.core.domain.R; +import com.zhentao.system.api.RemoteLogService; +import com.zhentao.system.api.domain.SysOperLog; +import feign.hystrix.FallbackFactory; + +/** + * 鏃ュ織鏈嶅姟闄嶇骇澶勭悊 + * + * @author ruoyi + */ +@Component +public class RemoteLogFallbackFactory implements FallbackFactory +{ + private static final Logger log = LoggerFactory.getLogger(RemoteLogFallbackFactory.class); + + @Override + public RemoteLogService create(Throwable throwable) + { + log.error("鏃ュ織鏈嶅姟璋冪敤澶辫触:{}", throwable.getMessage()); + return new RemoteLogService() + { + @Override + public R saveLog(SysOperLog sysOperLog) + { + return null; + } + + @Override + public R saveLogininfor(String username, String status, String message) + { + return null; + } + }; + + } +} diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteUserFallbackFactory.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteUserFallbackFactory.java new file mode 100644 index 0000000..76c658a --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/factory/RemoteUserFallbackFactory.java @@ -0,0 +1,34 @@ +package com.zhentao.system.api.factory; + +import com.zhentao.system.api.RemoteUserService; +import com.zhentao.system.api.model.LoginUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import com.zhentao.common.core.domain.R; +import feign.hystrix.FallbackFactory; + +/** + * 鐢ㄦ埛鏈嶅姟闄嶇骇澶勭悊 + * + * @author ruoyi + */ +@Component +public class RemoteUserFallbackFactory implements FallbackFactory +{ + private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class); + + @Override + public RemoteUserService create(Throwable throwable) + { + log.error("鐢ㄦ埛鏈嶅姟璋冪敤澶辫触:{}", throwable.getMessage()); + return new RemoteUserService() + { + @Override + public R getUserInfo(String username) + { + return R.fail("鑾峰彇鐢ㄦ埛澶辫触:" + throwable.getMessage()); + } + }; + } +} diff --git a/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/model/LoginUser.java b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/model/LoginUser.java new file mode 100644 index 0000000..1cddf7d --- /dev/null +++ b/smart-api/smart-api-system/src/main/java/com/zhentao/system/api/model/LoginUser.java @@ -0,0 +1,150 @@ +package com.zhentao.system.api.model; + +import java.io.Serializable; +import java.util.Set; +import com.zhentao.system.api.domain.SysUser; + +/** + * 鐢ㄦ埛淇℃伅 + * + * @author ruoyi + */ +public class LoginUser implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** + * 鐢ㄦ埛鍞竴鏍囪瘑 + */ + private String token; + + /** + * 鐢ㄦ埛鍚峣d + */ + private Long userid; + + /** + * 鐢ㄦ埛鍚 + */ + private String username; + + /** + * 鐧诲綍鏃堕棿 + */ + private Long loginTime; + + /** + * 杩囨湡鏃堕棿 + */ + private Long expireTime; + + /** + * 鐧诲綍IP鍦板潃 + */ + private String ipaddr; + + /** + * 鏉冮檺鍒楄〃 + */ + private Set permissions; + + /** + * 瑙掕壊鍒楄〃 + */ + private Set roles; + + /** + * 鐢ㄦ埛淇℃伅 + */ + private SysUser sysUser; + + public String getToken() + { + return token; + } + + public void setToken(String token) + { + this.token = token; + } + + public Long getUserid() + { + return userid; + } + + public void setUserid(Long userid) + { + this.userid = userid; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public Long getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Long loginTime) + { + this.loginTime = loginTime; + } + + public Long getExpireTime() + { + return expireTime; + } + + public void setExpireTime(Long expireTime) + { + this.expireTime = expireTime; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + + public Set getRoles() + { + return roles; + } + + public void setRoles(Set roles) + { + this.roles = roles; + } + + public SysUser getSysUser() + { + return sysUser; + } + + public void setSysUser(SysUser sysUser) + { + this.sysUser = sysUser; + } +} diff --git a/smart-api/smart-api-system/src/main/resources/META-INF/spring.factories b/smart-api/smart-api-system/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..b8bceae --- /dev/null +++ b/smart-api/smart-api-system/src/main/resources/META-INF/spring.factories @@ -0,0 +1,4 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.zhentao.system.api.factory.RemoteUserFallbackFactory,\ + com.zhentao.system.api.factory.RemoteLogFallbackFactory, \ + com.zhentao.system.api.factory.RemoteFileFallbackFactory diff --git a/smart-auth/pom.xml b/smart-auth/pom.xml new file mode 100644 index 0000000..ebc20c7 --- /dev/null +++ b/smart-auth/pom.xml @@ -0,0 +1,80 @@ + + + com.ruoyi + CloudParking + 2.5.0 + + 4.0.0 + + smart-auth + + + ruoyi-auth璁よ瘉鎺堟潈涓績 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + mysql + mysql-connector-java + + + + + com.ruoyi + smart-common-security + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/smart-auth/src/main/java/com/zhentao/auth/RuoYiAuthApplication.java b/smart-auth/src/main/java/com/zhentao/auth/RuoYiAuthApplication.java new file mode 100644 index 0000000..94692a2 --- /dev/null +++ b/smart-auth/src/main/java/com/zhentao/auth/RuoYiAuthApplication.java @@ -0,0 +1,30 @@ +package com.zhentao.auth; + +import org.springframework.boot.SpringApplication; +import org.springframework.cloud.client.SpringCloudApplication; +import com.zhentao.common.security.annotation.EnableRyFeignClients; + +/** + * 璁よ瘉鎺堟潈涓績 + * + * @author ruoyi + */ +@EnableRyFeignClients +@SpringCloudApplication +public class RuoYiAuthApplication +{ + public static void main(String[] args) + { + SpringApplication.run(RuoYiAuthApplication.class, args); + System.out.println("(鈾モ棤鈥库棤)锞夛緸 璁よ瘉鎺堟潈涓績鍚姩鎴愬姛 醿(麓凇`醿)锞 \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} diff --git a/smart-auth/src/main/java/com/zhentao/auth/controller/TokenController.java b/smart-auth/src/main/java/com/zhentao/auth/controller/TokenController.java new file mode 100644 index 0000000..2f55f55 --- /dev/null +++ b/smart-auth/src/main/java/com/zhentao/auth/controller/TokenController.java @@ -0,0 +1,67 @@ +package com.zhentao.auth.controller; + +import javax.servlet.http.HttpServletRequest; + +import com.zhentao.auth.form.LoginBody; +import com.zhentao.auth.service.SysLoginService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.domain.R; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.security.service.TokenService; +import com.zhentao.system.api.model.LoginUser; + +/** + * token 鎺у埗 + * + * @author ruoyi + */ +@RestController +public class TokenController +{ + @Autowired + private TokenService tokenService; + + @Autowired + private SysLoginService sysLoginService; + + @PostMapping("login") + public R login(@RequestBody LoginBody form) + { + // 鐢ㄦ埛鐧诲綍 + LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword()); + // 鑾峰彇鐧诲綍token + return R.ok(tokenService.createToken(userInfo)); + } + + @DeleteMapping("logout") + public R logout(HttpServletRequest request) + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser)) + { + String username = loginUser.getUsername(); + // 鍒犻櫎鐢ㄦ埛缂撳瓨璁板綍 + tokenService.delLoginUser(loginUser.getToken()); + // 璁板綍鐢ㄦ埛閫鍑烘棩蹇 + sysLoginService.logout(username); + } + return R.ok(); + } + + @PostMapping("refresh") + public R refresh(HttpServletRequest request) + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser)) + { + // 鍒锋柊浠ょ墝鏈夋晥鏈 + tokenService.refreshToken(loginUser); + return R.ok(); + } + return R.ok(); + } +} diff --git a/smart-auth/src/main/java/com/zhentao/auth/form/LoginBody.java b/smart-auth/src/main/java/com/zhentao/auth/form/LoginBody.java new file mode 100644 index 0000000..8795d9d --- /dev/null +++ b/smart-auth/src/main/java/com/zhentao/auth/form/LoginBody.java @@ -0,0 +1,39 @@ +package com.zhentao.auth.form; + +/** + * 鐢ㄦ埛鐧诲綍瀵硅薄 + * + * @author ruoyi + */ +public class LoginBody +{ + /** + * 鐢ㄦ埛鍚 + */ + private String username; + + /** + * 鐢ㄦ埛瀵嗙爜 + */ + private String password; + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } +} diff --git a/smart-auth/src/main/java/com/zhentao/auth/service/SysLoginService.java b/smart-auth/src/main/java/com/zhentao/auth/service/SysLoginService.java new file mode 100644 index 0000000..5625cc6 --- /dev/null +++ b/smart-auth/src/main/java/com/zhentao/auth/service/SysLoginService.java @@ -0,0 +1,95 @@ +package com.zhentao.auth.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.zhentao.common.core.constant.Constants; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.domain.R; +import com.zhentao.common.core.enums.UserStatus; +import com.zhentao.common.core.exception.BaseException; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.system.api.RemoteLogService; +import com.zhentao.system.api.RemoteUserService; +import com.zhentao.system.api.domain.SysUser; +import com.zhentao.system.api.model.LoginUser; + +/** + * 鐧诲綍鏍¢獙鏂规硶 + * + * @author ruoyi + */ +@Component +public class SysLoginService +{ + @Autowired + private RemoteLogService remoteLogService; + + @Autowired + private RemoteUserService remoteUserService; + + /** + * 鐧诲綍 + */ + public LoginUser login(String username, String password) + { + // 鐢ㄦ埛鍚嶆垨瀵嗙爜涓虹┖ 閿欒 + if (StringUtils.isAnyBlank(username, password)) + { + remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "鐢ㄦ埛/瀵嗙爜蹇呴』濉啓"); + throw new BaseException("鐢ㄦ埛/瀵嗙爜蹇呴』濉啓"); + } + // 瀵嗙爜濡傛灉涓嶅湪鎸囧畾鑼冨洿鍐 閿欒 + if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "鐢ㄦ埛瀵嗙爜涓嶅湪鎸囧畾鑼冨洿"); + throw new BaseException("鐢ㄦ埛瀵嗙爜涓嶅湪鎸囧畾鑼冨洿"); + } + // 鐢ㄦ埛鍚嶄笉鍦ㄦ寚瀹氳寖鍥村唴 閿欒 + if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "鐢ㄦ埛鍚嶄笉鍦ㄦ寚瀹氳寖鍥"); + throw new BaseException("鐢ㄦ埛鍚嶄笉鍦ㄦ寚瀹氳寖鍥"); + } + // 鏌ヨ鐢ㄦ埛淇℃伅 + R userResult = remoteUserService.getUserInfo(username); + + if (R.FAIL == userResult.getCode()) + { + throw new BaseException(userResult.getMsg()); + } + + if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) + { + remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "鐧诲綍鐢ㄦ埛涓嶅瓨鍦"); + throw new BaseException("鐧诲綍鐢ㄦ埛锛" + username + " 涓嶅瓨鍦"); + } + LoginUser userInfo = userResult.getData(); + SysUser user = userResult.getData().getSysUser(); + if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) + { + remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿宸茶鍒犻櫎"); + + throw new BaseException("瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿锛" + username + " 宸茶鍒犻櫎"); + } + if (UserStatus.DISABLE.getCode().equals(user.getStatus())) + { + remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "鐢ㄦ埛宸插仠鐢紝璇疯仈绯荤鐞嗗憳"); + throw new BaseException("瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿锛" + username + " 宸插仠鐢"); + } + if (!SecurityUtils.matchesPassword(password, user.getPassword())) + { + remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "鐢ㄦ埛瀵嗙爜閿欒"); + throw new BaseException("鐢ㄦ埛涓嶅瓨鍦/瀵嗙爜閿欒"); + } + remoteLogService.saveLogininfor(username, Constants.LOGIN_SUCCESS, "鐧诲綍鎴愬姛"); + return userInfo; + } + + public void logout(String loginName) + { + remoteLogService.saveLogininfor(loginName, Constants.LOGOUT, "閫鍑烘垚鍔"); + } +} diff --git a/smart-auth/src/main/resources/banner.txt b/smart-auth/src/main/resources/banner.txt new file mode 100644 index 0000000..97c5c27 --- /dev/null +++ b/smart-auth/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ _ + (_) | | | | + _ __ _ _ ___ _ _ _ ______ __ _ _ _ | |_ | |__ +| '__|| | | | / _ \ | | | || ||______| / _` || | | || __|| '_ \ +| | | |_| || (_) || |_| || | | (_| || |_| || |_ | | | | +|_| \__,_| \___/ \__, ||_| \__,_| \__,_| \__||_| |_| + __/ | + |___/ \ No newline at end of file diff --git a/smart-auth/src/main/resources/bootstrap.yml b/smart-auth/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..a3d5fc3 --- /dev/null +++ b/smart-auth/src/main/resources/bootstrap.yml @@ -0,0 +1,30 @@ +# Tomcat +server: + port: 9200 + +# Spring +spring: + application: + # 搴旂敤鍚嶇О + name: ruoyi-auth + profiles: + # 鐜閰嶇疆 + active: dev + cloud: + nacos: + discovery: + # 鏈嶅姟娉ㄥ唽鍦板潃 + server-addr: 8.130.77.16:8848 + # 鍛藉悕绌洪棿 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + + config: + # 閰嶇疆涓績鍦板潃 + server-addr: 8.130.77.16:8848 + # 鍛藉悕绌洪棿 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + # 閰嶇疆鏂囦欢鏍煎紡 + file-extension: yml + # 鍏变韩閰嶇疆 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} diff --git a/smart-auth/src/main/resources/logback.xml b/smart-auth/src/main/resources/logback.xml new file mode 100644 index 0000000..098a610 --- /dev/null +++ b/smart-auth/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/smart-common/pom.xml b/smart-common/pom.xml new file mode 100644 index 0000000..166c85c --- /dev/null +++ b/smart-common/pom.xml @@ -0,0 +1,28 @@ + + + + com.ruoyi + CloudParking + 2.5.0 + + 4.0.0 + + + smart-common-log + smart-common-core + smart-common-redis + smart-common-swagger + smart-common-security + smart-common-datascope + smart-common-datasource + + + smart-common + pom + + + ruoyi-common閫氱敤妯″潡 + + + diff --git a/smart-common/smart-common-core/pom.xml b/smart-common/smart-common-core/pom.xml new file mode 100644 index 0000000..13777f4 --- /dev/null +++ b/smart-common/smart-common-core/pom.xml @@ -0,0 +1,111 @@ + + + + com.ruoyi + smart-common + 2.5.0 + + 4.0.0 + + smart-common-core + + + smart-common-core鏍稿績妯″潡 + + + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + + org.springframework + spring-context-support + + + + + org.springframework + spring-web + + + + + org.apache.commons + commons-pool2 + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.alibaba + fastjson + + + + + org.apache.commons + commons-lang3 + + + + + commons-io + commons-io + + + + + commons-fileupload + commons-fileupload + + + + + org.apache.poi + poi-ooxml + + + + + javax.servlet + javax.servlet-api + + + + + io.swagger + swagger-annotations + + + + + com.baomidou + mybatis-plus-boot-starter + + + + diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/annotation/Excel.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/annotation/Excel.java new file mode 100644 index 0000000..52e50bf --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/annotation/Excel.java @@ -0,0 +1,160 @@ +package com.zhentao.common.core.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.math.BigDecimal; + +/** + * 鑷畾涔夊鍑篍xcel鏁版嵁娉ㄨВ + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 瀵煎嚭鏃跺湪excel涓帓搴 + */ + public int sort() default Integer.MAX_VALUE; + + /** + * 瀵煎嚭鍒癊xcel涓殑鍚嶅瓧. + */ + public String name() default ""; + + /** + * 鏃ユ湡鏍煎紡, 濡: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 璇诲彇鍐呭杞〃杈惧紡 (濡: 0=鐢,1=濂,2=鏈煡) + */ + public String readConverterExp() default ""; + + /** + * 鍒嗛殧绗︼紝璇诲彇瀛楃涓茬粍鍐呭 + */ + public String separator() default ","; + + /** + * BigDecimal 绮惧害 榛樿:-1(榛樿涓嶅紑鍚疊igDecimal鏍煎紡鍖) + */ + public int scale() default -1; + + /** + * BigDecimal 鑸嶅叆瑙勫垯 榛樿:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; + + /** + * 瀵煎嚭绫诲瀷锛0鏁板瓧 1瀛楃涓诧級 + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 瀵煎嚭鏃跺湪excel涓瘡涓垪鐨勯珮搴 鍗曚綅涓哄瓧绗 + */ + public double height() default 14; + + /** + * 瀵煎嚭鏃跺湪excel涓瘡涓垪鐨勫 鍗曚綅涓哄瓧绗 + */ + public double width() default 16; + + /** + * 鏂囧瓧鍚庣紑,濡% 90 鍙樻垚90% + */ + public String suffix() default ""; + + /** + * 褰撳间负绌烘椂,瀛楁鐨勯粯璁ゅ + */ + public String defaultValue() default ""; + + /** + * 鎻愮ず淇℃伅 + */ + public String prompt() default ""; + + /** + * 璁剧疆鍙兘閫夋嫨涓嶈兘杈撳叆鐨勫垪鍐呭. + */ + public String[] combo() default {}; + + /** + * 鏄惁瀵煎嚭鏁版嵁,搴斿闇姹:鏈夋椂鎴戜滑闇瑕佸鍑轰竴浠芥ā鏉,杩欐槸鏍囬闇瑕佷絾鍐呭闇瑕佺敤鎴锋墜宸ュ~鍐. + */ + public boolean isExport() default true; + + /** + * 鍙︿竴涓被涓殑灞炴у悕绉,鏀寔澶氱骇鑾峰彇,浠ュ皬鏁扮偣闅斿紑 + */ + public String targetAttr() default ""; + + /** + * 鏄惁鑷姩缁熻鏁版嵁,鍦ㄦ渶鍚庤拷鍔犱竴琛岀粺璁℃暟鎹诲拰 + */ + public boolean isStatistics() default false; + + /** + * 瀵煎嚭瀛楁瀵归綈鏂瑰紡锛0锛氶粯璁わ紱1锛氶潬宸︼紱2锛氬眳涓紱3锛氶潬鍙筹級 + */ + Align align() default Align.AUTO; + + public enum Align + { + AUTO(0), LEFT(1), CENTER(2), RIGHT(3); + private final int value; + + Align(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + /** + * 瀛楁绫诲瀷锛0锛氬鍑哄鍏ワ紱1锛氫粎瀵煎嚭锛2锛氫粎瀵煎叆锛 + */ + Type type() default Type.ALL; + + public enum Type + { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + public enum ColumnType + { + NUMERIC(0), STRING(1), IMAGE(2); + private final int value; + + ColumnType(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/annotation/Excels.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/annotation/Excels.java new file mode 100644 index 0000000..35628e2 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/annotation/Excels.java @@ -0,0 +1,18 @@ +package com.zhentao.common.core.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel娉ㄨВ闆 + * + * @author ruoyi + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels +{ + Excel[] value(); +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/config/MybatisPlusConfig.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/config/MybatisPlusConfig.java new file mode 100644 index 0000000..14a039b --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/config/MybatisPlusConfig.java @@ -0,0 +1,57 @@ +package com.zhentao.common.core.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * Mybatis Plus 閰嶇疆 + * + * @author ruoyi + */ +@EnableTransactionManagement(proxyTargetClass = true) +@Configuration +public class MybatisPlusConfig { + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 鍒嗛〉鎻掍欢 + interceptor.addInnerInterceptor(paginationInnerInterceptor()); + // 涔愯閿佹彃浠 + interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); + // 闃绘柇鎻掍欢 + interceptor.addInnerInterceptor(blockAttackInnerInterceptor()); + return interceptor; + } + + /** + * 鍒嗛〉鎻掍欢锛岃嚜鍔ㄨ瘑鍒暟鎹簱绫诲瀷 https://baomidou.com/guide/interceptor-pagination.html + */ + public PaginationInnerInterceptor paginationInnerInterceptor() { + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); + // 璁剧疆鏁版嵁搴撶被鍨嬩负mysql + paginationInnerInterceptor.setDbType(DbType.MYSQL); + // 璁剧疆鏈澶у崟椤甸檺鍒舵暟閲忥紝榛樿 500 鏉★紝-1 涓嶅彈闄愬埗 + paginationInnerInterceptor.setMaxLimit(-1L); + return paginationInnerInterceptor; + } + + /** + * 涔愯閿佹彃浠 https://baomidou.com/guide/interceptor-optimistic-locker.html + */ + public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { + return new OptimisticLockerInnerInterceptor(); + } + + /** + * 濡傛灉鏄鍏ㄨ〃鐨勫垹闄ゆ垨鏇存柊鎿嶄綔锛屽氨浼氱粓姝㈣鎿嶄綔 https://baomidou.com/guide/interceptor-block-attack.html + */ + public BlockAttackInnerInterceptor blockAttackInnerInterceptor() { + return new BlockAttackInnerInterceptor(); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/CacheConstants.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/CacheConstants.java new file mode 100644 index 0000000..bc74cb3 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/CacheConstants.java @@ -0,0 +1,39 @@ +package com.zhentao.common.core.constant; + +/** + * 缂撳瓨鐨刱ey 甯搁噺 + * + * @author ruoyi + */ +public class CacheConstants +{ + /** + * 浠ょ墝鑷畾涔夋爣璇 + */ + public static final String HEADER = "Authorization"; + + /** + * 浠ょ墝鍓嶇紑 + */ + public static final String TOKEN_PREFIX = "Bearer "; + + /** + * 鏉冮檺缂撳瓨鍓嶇紑 + */ + public final static String LOGIN_TOKEN_KEY = "login_tokens:"; + + /** + * 鐢ㄦ埛ID瀛楁 + */ + public static final String DETAILS_USER_ID = "user_id"; + + /** + * 鐢ㄦ埛鍚嶅瓧娈 + */ + public static final String DETAILS_USERNAME = "username"; + + /** + * 鎺堟潈淇℃伅瀛楁 + */ + public static final String AUTHORIZATION_HEADER = "authorization"; +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/Constants.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/Constants.java new file mode 100644 index 0000000..ea3764e --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/Constants.java @@ -0,0 +1,109 @@ +package com.zhentao.common.core.constant; + +/** + * 閫氱敤甯搁噺淇℃伅 + * + * @author ruoyi + */ +public class Constants +{ + /** + * UTF-8 瀛楃闆 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 瀛楃闆 + */ + public static final String GBK = "GBK"; + + /** + * http璇锋眰 + */ + public static final String HTTP = "http://"; + + /** + * https璇锋眰 + */ + public static final String HTTPS = "https://"; + + /** + * 鎴愬姛鏍囪 + */ + public static final Integer SUCCESS = 200; + + /** + * 澶辫触鏍囪 + */ + public static final Integer FAIL = 500; + + /** + * 鐧诲綍鎴愬姛 + */ + public static final String LOGIN_SUCCESS = "Success"; + + /** + * 娉ㄩ攢 + */ + public static final String LOGOUT = "Logout"; + + /** + * 娉ㄥ唽 + */ + public static final String REGISTER = "Register"; + + /** + * 鐧诲綍澶辫触 + */ + public static final String LOGIN_FAIL = "Error"; + + /** + * 褰撳墠璁板綍璧峰绱㈠紩 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 姣忛〉鏄剧ず璁板綍鏁 + */ + public static final String PAGE_SIZE = "pageSize"; + + /** + * 鎺掑簭鍒 + */ + public static final String ORDER_BY_COLUMN = "orderByColumn"; + + /** + * 鎺掑簭鐨勬柟鍚 "desc" 鎴栬 "asc". + */ + public static final String IS_ASC = "isAsc"; + + /** + * 楠岃瘉鐮 redis key + */ + public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; + + /** + * 楠岃瘉鐮佹湁鏁堟湡锛堝垎閽燂級 + */ + public static final long CAPTCHA_EXPIRATION = 2; + + /** + * 浠ょ墝鏈夋晥鏈燂紙鍒嗛挓锛 + */ + public final static long TOKEN_EXPIRE = 720; + + /** + * 鍙傛暟绠$悊 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 瀛楀吀绠$悊 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 璧勬簮鏄犲皠璺緞 鍓嶇紑 + */ + public static final String RESOURCE_PREFIX = "/profile"; +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/GenConstants.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/GenConstants.java new file mode 100644 index 0000000..212ac41 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/GenConstants.java @@ -0,0 +1,114 @@ +package com.zhentao.common.core.constant; + +/** + * 浠g爜鐢熸垚閫氱敤甯搁噺 + * + * @author ruoyi + */ +public class GenConstants +{ + /** 鍗曡〃锛堝鍒犳敼鏌ワ級 */ + public static final String TPL_CRUD = "crud"; + + /** 鏍戣〃锛堝鍒犳敼鏌ワ級 */ + public static final String TPL_TREE = "tree"; + + /** 涓诲瓙琛紙澧炲垹鏀规煡锛 */ + public static final String TPL_SUB = "sub"; + + /** 鏍戠紪鐮佸瓧娈 */ + public static final String TREE_CODE = "treeCode"; + + /** 鏍戠埗缂栫爜瀛楁 */ + public static final String TREE_PARENT_CODE = "treeParentCode"; + + /** 鏍戝悕绉板瓧娈 */ + public static final String TREE_NAME = "treeName"; + + /** 涓婄骇鑿滃崟ID瀛楁 */ + public static final String PARENT_MENU_ID = "parentMenuId"; + + /** 涓婄骇鑿滃崟鍚嶇О瀛楁 */ + public static final String PARENT_MENU_NAME = "parentMenuName"; + + /** 鏁版嵁搴撳瓧绗︿覆绫诲瀷 */ + public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; + + /** 鏁版嵁搴撴枃鏈被鍨 */ + public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; + + /** 鏁版嵁搴撴椂闂寸被鍨 */ + public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; + + /** 鏁版嵁搴撴暟瀛楃被鍨 */ + public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", + "bigint", "float", "double", "decimal" }; + + /** 椤甸潰涓嶉渶瑕佺紪杈戝瓧娈 */ + public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; + + /** 椤甸潰涓嶉渶瑕佹樉绀虹殑鍒楄〃瀛楁 */ + public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time" }; + + /** 椤甸潰涓嶉渶瑕佹煡璇㈠瓧娈 */ + public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark" }; + + /** Entity鍩虹被瀛楁 */ + public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" }; + + /** Tree鍩虹被瀛楁 */ + public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors" }; + + /** 鏂囨湰妗 */ + public static final String HTML_INPUT = "input"; + + /** 鏂囨湰鍩 */ + public static final String HTML_TEXTAREA = "textarea"; + + /** 涓嬫媺妗 */ + public static final String HTML_SELECT = "select"; + + /** 鍗曢夋 */ + public static final String HTML_RADIO = "radio"; + + /** 澶嶉夋 */ + public static final String HTML_CHECKBOX = "checkbox"; + + /** 鏃ユ湡鎺т欢 */ + public static final String HTML_DATETIME = "datetime"; + + /** 鍥剧墖涓婁紶鎺т欢 */ + public static final String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** 鏂囦欢涓婁紶鎺т欢 */ + public static final String HTML_FILE_UPLOAD = "fileUpload"; + + /** 瀵屾枃鏈帶浠 */ + public static final String HTML_EDITOR = "editor"; + + /** 瀛楃涓茬被鍨 */ + public static final String TYPE_STRING = "String"; + + /** 鏁村瀷 */ + public static final String TYPE_INTEGER = "Integer"; + + /** 闀挎暣鍨 */ + public static final String TYPE_LONG = "Long"; + + /** 娴偣鍨 */ + public static final String TYPE_DOUBLE = "Double"; + + /** 楂樼簿搴﹁绠楃被鍨 */ + public static final String TYPE_BIGDECIMAL = "BigDecimal"; + + /** 鏃堕棿绫诲瀷 */ + public static final String TYPE_DATE = "Date"; + + /** 妯$硦鏌ヨ */ + public static final String QUERY_LIKE = "LIKE"; + + /** 闇瑕 */ + public static final String REQUIRE = "1"; +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/HttpStatus.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/HttpStatus.java new file mode 100644 index 0000000..71c014f --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/HttpStatus.java @@ -0,0 +1,89 @@ +package com.zhentao.common.core.constant; + +/** + * 杩斿洖鐘舵佺爜 + * + * @author ruoyi + */ +public class HttpStatus +{ + /** + * 鎿嶄綔鎴愬姛 + */ + public static final int SUCCESS = 200; + + /** + * 瀵硅薄鍒涘缓鎴愬姛 + */ + public static final int CREATED = 201; + + /** + * 璇锋眰宸茬粡琚帴鍙 + */ + public static final int ACCEPTED = 202; + + /** + * 鎿嶄綔宸茬粡鎵ц鎴愬姛锛屼絾鏄病鏈夎繑鍥炴暟鎹 + */ + public static final int NO_CONTENT = 204; + + /** + * 璧勬簮宸茶绉婚櫎 + */ + public static final int MOVED_PERM = 301; + + /** + * 閲嶅畾鍚 + */ + public static final int SEE_OTHER = 303; + + /** + * 璧勬簮娌℃湁琚慨鏀 + */ + public static final int NOT_MODIFIED = 304; + + /** + * 鍙傛暟鍒楄〃閿欒锛堢己灏戯紝鏍煎紡涓嶅尮閰嶏級 + */ + public static final int BAD_REQUEST = 400; + + /** + * 鏈巿鏉 + */ + public static final int UNAUTHORIZED = 401; + + /** + * 璁块棶鍙楅檺锛屾巿鏉冭繃鏈 + */ + public static final int FORBIDDEN = 403; + + /** + * 璧勬簮锛屾湇鍔℃湭鎵惧埌 + */ + public static final int NOT_FOUND = 404; + + /** + * 涓嶅厑璁哥殑http鏂规硶 + */ + public static final int BAD_METHOD = 405; + + /** + * 璧勬簮鍐茬獊锛屾垨鑰呰祫婧愯閿 + */ + public static final int CONFLICT = 409; + + /** + * 涓嶆敮鎸佺殑鏁版嵁锛屽獟浣撶被鍨 + */ + public static final int UNSUPPORTED_TYPE = 415; + + /** + * 绯荤粺鍐呴儴閿欒 + */ + public static final int ERROR = 500; + + /** + * 鎺ュ彛鏈疄鐜 + */ + public static final int NOT_IMPLEMENTED = 501; +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/ScheduleConstants.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/ScheduleConstants.java new file mode 100644 index 0000000..ae253da --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/ScheduleConstants.java @@ -0,0 +1,50 @@ +package com.zhentao.common.core.constant; + +/** + * 浠诲姟璋冨害閫氱敤甯搁噺 + * + * @author ruoyi + */ +public class ScheduleConstants +{ + public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; + + /** 鎵ц鐩爣key */ + public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; + + /** 榛樿 */ + public static final String MISFIRE_DEFAULT = "0"; + + /** 绔嬪嵆瑙﹀彂鎵ц */ + public static final String MISFIRE_IGNORE_MISFIRES = "1"; + + /** 瑙﹀彂涓娆℃墽琛 */ + public static final String MISFIRE_FIRE_AND_PROCEED = "2"; + + /** 涓嶈Е鍙戠珛鍗虫墽琛 */ + public static final String MISFIRE_DO_NOTHING = "3"; + + public enum Status + { + /** + * 姝e父 + */ + NORMAL("0"), + /** + * 鏆傚仠 + */ + PAUSE("1"); + + private String value; + + private Status(String value) + { + this.value = value; + } + + public String getValue() + { + return value; + } + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/ServiceNameConstants.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/ServiceNameConstants.java new file mode 100644 index 0000000..a1b5ec6 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/ServiceNameConstants.java @@ -0,0 +1,24 @@ +package com.zhentao.common.core.constant; + +/** + * 鏈嶅姟鍚嶇О + * + * @author ruoyi + */ +public class ServiceNameConstants +{ + /** + * 璁よ瘉鏈嶅姟鐨剆erviceid + */ + public static final String AUTH_SERVICE = "ruoyi-auth"; + + /** + * 绯荤粺妯″潡鐨剆erviceid + */ + public static final String SYSTEM_SERVICE = "ruoyi-system"; + + /** + * 鏂囦欢鏈嶅姟鐨剆erviceid + */ + public static final String FILE_SERVICE = "ruoyi-file"; +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/UserConstants.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/UserConstants.java new file mode 100644 index 0000000..a510e54 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/constant/UserConstants.java @@ -0,0 +1,78 @@ +package com.zhentao.common.core.constant; + +/** + * 鐢ㄦ埛甯搁噺淇℃伅 + * + * @author ruoyi + */ +public class UserConstants +{ + /** + * 骞冲彴鍐呯郴缁熺敤鎴风殑鍞竴鏍囧織 + */ + public static final String SYS_USER = "SYS_USER"; + + /** 姝e父鐘舵 */ + public static final String NORMAL = "0"; + + /** 寮傚父鐘舵 */ + public static final String EXCEPTION = "1"; + + /** 鐢ㄦ埛灏佺鐘舵 */ + public static final String USER_DISABLE = "1"; + + /** 瑙掕壊灏佺鐘舵 */ + public static final String ROLE_DISABLE = "1"; + + /** 閮ㄩ棬姝e父鐘舵 */ + public static final String DEPT_NORMAL = "0"; + + /** 閮ㄩ棬鍋滅敤鐘舵 */ + public static final String DEPT_DISABLE = "1"; + + /** 瀛楀吀姝e父鐘舵 */ + public static final String DICT_NORMAL = "0"; + + /** 鏄惁涓虹郴缁熼粯璁わ紙鏄級 */ + public static final String YES = "Y"; + + /** 鏄惁鑿滃崟澶栭摼锛堟槸锛 */ + public static final String YES_FRAME = "0"; + + /** 鏄惁鑿滃崟澶栭摼锛堝惁锛 */ + public static final String NO_FRAME = "1"; + + /** 鑿滃崟绫诲瀷锛堢洰褰曪級 */ + public static final String TYPE_DIR = "M"; + + /** 鑿滃崟绫诲瀷锛堣彍鍗曪級 */ + public static final String TYPE_MENU = "C"; + + /** 鑿滃崟绫诲瀷锛堟寜閽級 */ + public static final String TYPE_BUTTON = "F"; + + /** Layout缁勪欢鏍囪瘑 */ + public final static String LAYOUT = "Layout"; + + /** ParentView缁勪欢鏍囪瘑 */ + public final static String PARENT_VIEW = "ParentView"; + + /** 鏍¢獙杩斿洖缁撴灉鐮 */ + public final static String UNIQUE = "0"; + + public final static String NOT_UNIQUE = "1"; + + /** + * 鐢ㄦ埛鍚嶉暱搴﹂檺鍒 + */ + public static final int USERNAME_MIN_LENGTH = 2; + + public static final int USERNAME_MAX_LENGTH = 20; + + /** + * 瀵嗙爜闀垮害闄愬埗 + */ + public static final int PASSWORD_MIN_LENGTH = 5; + + public static final int PASSWORD_MAX_LENGTH = 20; +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/domain/R.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/domain/R.java new file mode 100644 index 0000000..bf0a99f --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/domain/R.java @@ -0,0 +1,105 @@ +package com.zhentao.common.core.domain; + +import java.io.Serializable; +import com.zhentao.common.core.constant.Constants; + +/** + * 鍝嶅簲淇℃伅涓讳綋 + * + * @author ruoyi + */ +public class R implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 鎴愬姛 */ + public static final int SUCCESS = Constants.SUCCESS; + + /** 澶辫触 */ + public static final int FAIL = Constants.FAIL; + + private int code; + + private String msg; + + private T data; + + public static R ok() + { + return restResult(null, SUCCESS, null); + } + + public static R ok(T data) + { + return restResult(data, SUCCESS, null); + } + + public static R ok(T data, String msg) + { + return restResult(data, SUCCESS, msg); + } + + public static R fail() + { + return restResult(null, FAIL, null); + } + + public static R fail(String msg) + { + return restResult(null, FAIL, msg); + } + + public static R fail(T data) + { + return restResult(data, FAIL, null); + } + + public static R fail(T data, String msg) + { + return restResult(data, FAIL, msg); + } + + public static R fail(int code, String msg) + { + return restResult(null, code, msg); + } + + private static R restResult(T data, int code, String msg) + { + R apiResult = new R<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public T getData() + { + return data; + } + + public void setData(T data) + { + this.data = data; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/enums/UserStatus.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/enums/UserStatus.java new file mode 100644 index 0000000..3034216 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/enums/UserStatus.java @@ -0,0 +1,30 @@ +package com.zhentao.common.core.enums; + +/** + * 鐢ㄦ埛鐘舵 + * + * @author ruoyi + */ +public enum UserStatus +{ + OK("0", "姝e父"), DISABLE("1", "鍋滅敤"), DELETED("2", "鍒犻櫎"); + + private final String code; + private final String info; + + UserStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/BaseException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/BaseException.java new file mode 100644 index 0000000..62ea3a1 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/BaseException.java @@ -0,0 +1,79 @@ +package com.zhentao.common.core.exception; + +/** + * 鍩虹寮傚父 + * + * @author ruoyi + */ +public class BaseException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 鎵灞炴ā鍧 + */ + private String module; + + /** + * 閿欒鐮 + */ + private String code; + + /** + * 閿欒鐮佸搴旂殑鍙傛暟 + */ + private Object[] args; + + /** + * 閿欒娑堟伅 + */ + private String defaultMessage; + + public BaseException(String module, String code, Object[] args, String defaultMessage) + { + this.module = module; + this.code = code; + this.args = args; + this.defaultMessage = defaultMessage; + } + + public BaseException(String module, String code, Object[] args) + { + this(module, code, args, null); + } + + public BaseException(String module, String defaultMessage) + { + this(module, null, null, defaultMessage); + } + + public BaseException(String code, Object[] args) + { + this(null, code, args, null); + } + + public BaseException(String defaultMessage) + { + this(null, null, null, defaultMessage); + } + + public String getModule() + { + return module; + } + + public String getCode() + { + return code; + } + + public Object[] getArgs() + { + return args; + } + + public String getDefaultMessage() + { + return defaultMessage; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CaptchaException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CaptchaException.java new file mode 100644 index 0000000..f6fffaa --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CaptchaException.java @@ -0,0 +1,16 @@ +package com.zhentao.common.core.exception; + +/** + * 楠岃瘉鐮侀敊璇紓甯哥被 + * + * @author ruoyi + */ +public class CaptchaException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public CaptchaException(String msg) + { + super(msg); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CheckedException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CheckedException.java new file mode 100644 index 0000000..c1213a8 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CheckedException.java @@ -0,0 +1,31 @@ +package com.zhentao.common.core.exception; + +/** + * 妫鏌ュ紓甯 + * + * @author ruoyi + */ +public class CheckedException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public CheckedException(String message) + { + super(message); + } + + public CheckedException(Throwable cause) + { + super(cause); + } + + public CheckedException(String message, Throwable cause) + { + super(message, cause); + } + + public CheckedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) + { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CustomException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CustomException.java new file mode 100644 index 0000000..cbdb7e4 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/CustomException.java @@ -0,0 +1,43 @@ +package com.zhentao.common.core.exception; + +/** + * 鑷畾涔夊紓甯 + * + * @author ruoyi + */ +public class CustomException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + private Integer code; + + private String message; + + public CustomException(String message) + { + this.message = message; + } + + public CustomException(String message, Integer code) + { + this.message = message; + this.code = code; + } + + public CustomException(String message, Throwable e) + { + super(message, e); + this.message = message; + } + + @Override + public String getMessage() + { + return message; + } + + public Integer getCode() + { + return code; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/DemoModeException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/DemoModeException.java new file mode 100644 index 0000000..8c2f270 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/DemoModeException.java @@ -0,0 +1,15 @@ +package com.zhentao.common.core.exception; + +/** + * 婕旂ず妯″紡寮傚父 + * + * @author ruoyi + */ +public class DemoModeException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public DemoModeException() + { + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/PreAuthorizeException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/PreAuthorizeException.java new file mode 100644 index 0000000..870672d --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/PreAuthorizeException.java @@ -0,0 +1,15 @@ +package com.zhentao.common.core.exception; + +/** + * 鏉冮檺寮傚父 + * + * @author ruoyi + */ +public class PreAuthorizeException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public PreAuthorizeException() + { + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/UtilException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/UtilException.java new file mode 100644 index 0000000..c2c89cb --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/UtilException.java @@ -0,0 +1,26 @@ +package com.zhentao.common.core.exception; + +/** + * 宸ュ叿绫诲紓甯 + * + * @author ruoyi + */ +public class UtilException extends RuntimeException +{ + private static final long serialVersionUID = 8247610319171014183L; + + public UtilException(Throwable e) + { + super(e.getMessage(), e); + } + + public UtilException(String message) + { + super(message); + } + + public UtilException(String message, Throwable throwable) + { + super(message, throwable); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileException.java new file mode 100644 index 0000000..a54ae81 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileException.java @@ -0,0 +1,19 @@ +package com.zhentao.common.core.exception.file; + +import com.zhentao.common.core.exception.BaseException; + +/** + * 鏂囦欢淇℃伅寮傚父绫 + * + * @author ruoyi + */ +public class FileException extends BaseException +{ + private static final long serialVersionUID = 1L; + + public FileException(String code, Object[] args) + { + super("file", code, args, null); + } + +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileNameLengthLimitExceededException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileNameLengthLimitExceededException.java new file mode 100644 index 0000000..5da3559 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileNameLengthLimitExceededException.java @@ -0,0 +1,16 @@ +package com.zhentao.common.core.exception.file; + +/** + * 鏂囦欢鍚嶇О瓒呴暱闄愬埗寮傚父绫 + * + * @author ruoyi + */ +public class FileNameLengthLimitExceededException extends FileException +{ + private static final long serialVersionUID = 1L; + + public FileNameLengthLimitExceededException(int defaultFileNameLength) + { + super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileSizeLimitExceededException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileSizeLimitExceededException.java new file mode 100644 index 0000000..132572f --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/FileSizeLimitExceededException.java @@ -0,0 +1,16 @@ +package com.zhentao.common.core.exception.file; + +/** + * 鏂囦欢鍚嶅ぇ灏忛檺鍒跺紓甯哥被 + * + * @author ruoyi + */ +public class FileSizeLimitExceededException extends FileException +{ + private static final long serialVersionUID = 1L; + + public FileSizeLimitExceededException(long defaultMaxSize) + { + super("upload.exceed.maxSize", new Object[] { defaultMaxSize }); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/InvalidExtensionException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/InvalidExtensionException.java new file mode 100644 index 0000000..f7e5456 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/file/InvalidExtensionException.java @@ -0,0 +1,81 @@ +package com.zhentao.common.core.exception.file; + +import java.util.Arrays; +import org.apache.commons.fileupload.FileUploadException; + +/** + * 鏂囦欢涓婁紶 璇紓甯哥被 + * + * @author ruoyi + */ +public class InvalidExtensionException extends FileUploadException +{ + private static final long serialVersionUID = 1L; + + private String[] allowedExtension; + private String extension; + private String filename; + + public InvalidExtensionException(String[] allowedExtension, String extension, String filename) + { + super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]"); + this.allowedExtension = allowedExtension; + this.extension = extension; + this.filename = filename; + } + + public String[] getAllowedExtension() + { + return allowedExtension; + } + + public String getExtension() + { + return extension; + } + + public String getFilename() + { + return filename; + } + + public static class InvalidImageExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidFlashExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidMediaExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidVideoExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/job/TaskException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/job/TaskException.java new file mode 100644 index 0000000..9088b2b --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/job/TaskException.java @@ -0,0 +1,34 @@ +package com.zhentao.common.core.exception.job; + +/** + * 璁″垝绛栫暐寮傚父 + * + * @author ruoyi + */ +public class TaskException extends Exception +{ + private static final long serialVersionUID = 1L; + + private Code code; + + public TaskException(String msg, Code code) + { + this(msg, code, null); + } + + public TaskException(String msg, Code code, Exception nestedEx) + { + super(msg, nestedEx); + this.code = code; + } + + public Code getCode() + { + return code; + } + + public enum Code + { + TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/CaptchaExpireException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/CaptchaExpireException.java new file mode 100644 index 0000000..cd44d5b --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/CaptchaExpireException.java @@ -0,0 +1,16 @@ +package com.zhentao.common.core.exception.user; + +/** + * 楠岃瘉鐮佸け鏁堝紓甯哥被 + * + * @author ruoyi + */ +public class CaptchaExpireException extends UserException +{ + private static final long serialVersionUID = 1L; + + public CaptchaExpireException() + { + super("user.jcaptcha.expire", null); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/UserException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/UserException.java new file mode 100644 index 0000000..5635dd8 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/UserException.java @@ -0,0 +1,18 @@ +package com.zhentao.common.core.exception.user; + +import com.zhentao.common.core.exception.BaseException; + +/** + * 鐢ㄦ埛淇℃伅寮傚父绫 + * + * @author ruoyi + */ +public class UserException extends BaseException +{ + private static final long serialVersionUID = 1L; + + public UserException(String code, Object[] args) + { + super("user", code, args, null); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/UserPasswordNotMatchException.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/UserPasswordNotMatchException.java new file mode 100644 index 0000000..f275167 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/exception/user/UserPasswordNotMatchException.java @@ -0,0 +1,16 @@ +package com.zhentao.common.core.exception.user; + +/** + * 鐢ㄦ埛瀵嗙爜涓嶆纭垨涓嶇鍚堣鑼冨紓甯哥被 + * + * @author ruoyi + */ +public class UserPasswordNotMatchException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordNotMatchException() + { + super("user.password.not.match", null); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/CharsetKit.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/CharsetKit.java new file mode 100644 index 0000000..7eae85f --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/CharsetKit.java @@ -0,0 +1,86 @@ +package com.zhentao.common.core.text; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import com.zhentao.common.core.utils.StringUtils; + +/** + * 瀛楃闆嗗伐鍏风被 + * + * @author ruoyi + */ +public class CharsetKit +{ + /** ISO-8859-1 */ + public static final String ISO_8859_1 = "ISO-8859-1"; + /** UTF-8 */ + public static final String UTF_8 = "UTF-8"; + /** GBK */ + public static final String GBK = "GBK"; + + /** ISO-8859-1 */ + public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); + /** UTF-8 */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** GBK */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 杞崲涓篊harset瀵硅薄 + * + * @param charset 瀛楃闆嗭紝涓虹┖鍒欒繑鍥為粯璁ゅ瓧绗﹂泦 + * @return Charset + */ + public static Charset charset(String charset) + { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 杞崲瀛楃涓茬殑瀛楃闆嗙紪鐮 + * + * @param source 瀛楃涓 + * @param srcCharset 婧愬瓧绗﹂泦锛岄粯璁SO-8859-1 + * @param destCharset 鐩爣瀛楃闆嗭紝榛樿UTF-8 + * @return 杞崲鍚庣殑瀛楃闆 + */ + public static String convert(String source, String srcCharset, String destCharset) + { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 杞崲瀛楃涓茬殑瀛楃闆嗙紪鐮 + * + * @param source 瀛楃涓 + * @param srcCharset 婧愬瓧绗﹂泦锛岄粯璁SO-8859-1 + * @param destCharset 鐩爣瀛楃闆嗭紝榛樿UTF-8 + * @return 杞崲鍚庣殑瀛楃闆 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) + { + if (null == srcCharset) + { + srcCharset = StandardCharsets.ISO_8859_1; + } + + if (null == destCharset) + { + destCharset = StandardCharsets.UTF_8; + } + + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) + { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } + + /** + * @return 绯荤粺瀛楃闆嗙紪鐮 + */ + public static String systemCharset() + { + return Charset.defaultCharset().name(); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/Convert.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/Convert.java new file mode 100644 index 0000000..87b980a --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/Convert.java @@ -0,0 +1,999 @@ +package com.zhentao.common.core.text; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; +import com.zhentao.common.core.utils.StringUtils; + +/** + * 绫诲瀷杞崲鍣 + * + * @author ruoyi + */ +public class Convert +{ + /** + * 杞崲涓哄瓧绗︿覆
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static String toStr(Object value, String defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof String) + { + return (String) value; + } + return value.toString(); + } + + /** + * 杞崲涓哄瓧绗︿覆
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static String toStr(Object value) + { + return toStr(value, null); + } + + /** + * 杞崲涓哄瓧绗
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Character toChar(Object value, Character defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof Character) + { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 杞崲涓哄瓧绗
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Character toChar(Object value) + { + return toChar(value, null); + } + + /** + * 杞崲涓篵yte
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Byte toByte(Object value, Byte defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Byte) + { + return (Byte) value; + } + if (value instanceof Number) + { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Byte.parseByte(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篵yte
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Byte toByte(Object value) + { + return toByte(value, null); + } + + /** + * 杞崲涓篠hort
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Short toShort(Object value, Short defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Short) + { + return (Short) value; + } + if (value instanceof Number) + { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Short.parseShort(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篠hort
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Short toShort(Object value) + { + return toShort(value, null); + } + + /** + * 杞崲涓篘umber
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Number toNumber(Object value, Number defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Number) + { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return NumberFormat.getInstance().parse(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篘umber
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Number toNumber(Object value) + { + return toNumber(value, null); + } + + /** + * 杞崲涓篿nt
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Integer toInt(Object value, Integer defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Integer) + { + return (Integer) value; + } + if (value instanceof Number) + { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Integer.parseInt(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篿nt
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Integer toInt(Object value) + { + return toInt(value, null); + } + + /** + * 杞崲涓篒nteger鏁扮粍
+ * + * @param str 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Integer[] toIntArray(String str) + { + return toIntArray(",", str); + } + + /** + * 杞崲涓篖ong鏁扮粍
+ * + * @param str 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Long[] toLongArray(String str) + { + return toLongArray(",", str); + } + + /** + * 杞崲涓篒nteger鏁扮粍
+ * + * @param split 鍒嗛殧绗 + * @param split 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Integer[] toIntArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Integer[] {}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 杞崲涓篖ong鏁扮粍
+ * + * @param split 鍒嗛殧绗 + * @param str 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Long[] toLongArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Long[] {}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 杞崲涓篠tring鏁扮粍
+ * + * @param str 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static String[] toStrArray(String str) + { + return toStrArray(",", str); + } + + /** + * 杞崲涓篠tring鏁扮粍
+ * + * @param split 鍒嗛殧绗 + * @param split 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static String[] toStrArray(String split, String str) + { + return str.split(split); + } + + /** + * 杞崲涓簂ong
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Long toLong(Object value, Long defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Long) + { + return (Long) value; + } + if (value instanceof Number) + { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 鏀寔绉戝璁℃暟娉 + return new BigDecimal(valueStr.trim()).longValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓簂ong
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Long toLong(Object value) + { + return toLong(value, null); + } + + /** + * 杞崲涓篸ouble
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Double toDouble(Object value, Double defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Double) + { + return (Double) value; + } + if (value instanceof Number) + { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 鏀寔绉戝璁℃暟娉 + return new BigDecimal(valueStr.trim()).doubleValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篸ouble
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Double toDouble(Object value) + { + return toDouble(value, null); + } + + /** + * 杞崲涓篎loat
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Float toFloat(Object value, Float defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Float) + { + return (Float) value; + } + if (value instanceof Number) + { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Float.parseFloat(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篎loat
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Float toFloat(Object value) + { + return toFloat(value, null); + } + + /** + * 杞崲涓篵oolean
+ * String鏀寔鐨勫间负锛歵rue銆乫alse銆亂es銆乷k銆乶o锛1,0 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Boolean toBool(Object value, Boolean defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Boolean) + { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) + { + case "true": + return true; + case "false": + return false; + case "yes": + return true; + case "ok": + return true; + case "no": + return false; + case "1": + return true; + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 杞崲涓篵oolean
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Boolean toBool(Object value) + { + return toBool(value, null); + } + + /** + * 杞崲涓篍num瀵硅薄
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * + * @param clazz Enum鐨凜lass + * @param value 鍊 + * @param defaultValue 榛樿鍊 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) + { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Enum.valueOf(clazz, valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篍num瀵硅薄
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * + * @param clazz Enum鐨凜lass + * @param value 鍊 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) + { + return toEnum(clazz, value, null); + } + + /** + * 杞崲涓築igInteger
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigInteger) + { + return (BigInteger) value; + } + if (value instanceof Long) + { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigInteger(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓築igInteger
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static BigInteger toBigInteger(Object value) + { + return toBigInteger(value, null); + } + + /** + * 杞崲涓築igDecimal
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigDecimal) + { + return (BigDecimal) value; + } + if (value instanceof Long) + { + return new BigDecimal((Long) value); + } + if (value instanceof Double) + { + return new BigDecimal((Double) value); + } + if (value instanceof Integer) + { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigDecimal(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓築igDecimal
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static BigDecimal toBigDecimal(Object value) + { + return toBigDecimal(value, null); + } + + /** + * 灏嗗璞¤浆涓哄瓧绗︿覆
+ * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶 + * + * @param obj 瀵硅薄 + * @return 瀛楃涓 + */ + public static String utf8Str(Object obj) + { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 灏嗗璞¤浆涓哄瓧绗︿覆
+ * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶 + * + * @param obj 瀵硅薄 + * @param charsetName 瀛楃闆 + * @return 瀛楃涓 + */ + public static String str(Object obj, String charsetName) + { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 灏嗗璞¤浆涓哄瓧绗︿覆
+ * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶 + * + * @param obj 瀵硅薄 + * @param charset 瀛楃闆 + * @return 瀛楃涓 + */ + public static String str(Object obj, Charset charset) + { + if (null == obj) + { + return null; + } + + if (obj instanceof String) + { + return (String) obj; + } + else if (obj instanceof byte[] || obj instanceof Byte[]) + { + return str((Byte[]) obj, charset); + } + else if (obj instanceof ByteBuffer) + { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 灏哹yte鏁扮粍杞负瀛楃涓 + * + * @param bytes byte鏁扮粍 + * @param charset 瀛楃闆 + * @return 瀛楃涓 + */ + public static String str(byte[] bytes, String charset) + { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 瑙g爜瀛楄妭鐮 + * + * @param data 瀛楃涓 + * @param charset 瀛楃闆嗭紝濡傛灉姝ゅ瓧娈典负绌猴紝鍒欒В鐮佺殑缁撴灉鍙栧喅浜庡钩鍙 + * @return 瑙g爜鍚庣殑瀛楃涓 + */ + public static String str(byte[] data, Charset charset) + { + if (data == null) + { + return null; + } + + if (null == charset) + { + return new String(data); + } + return new String(data, charset); + } + + /** + * 灏嗙紪鐮佺殑byteBuffer鏁版嵁杞崲涓哄瓧绗︿覆 + * + * @param data 鏁版嵁 + * @param charset 瀛楃闆嗭紝濡傛灉涓虹┖浣跨敤褰撳墠绯荤粺瀛楃闆 + * @return 瀛楃涓 + */ + public static String str(ByteBuffer data, String charset) + { + if (data == null) + { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 灏嗙紪鐮佺殑byteBuffer鏁版嵁杞崲涓哄瓧绗︿覆 + * + * @param data 鏁版嵁 + * @param charset 瀛楃闆嗭紝濡傛灉涓虹┖浣跨敤褰撳墠绯荤粺瀛楃闆 + * @return 瀛楃涓 + */ + public static String str(ByteBuffer data, Charset charset) + { + if (null == charset) + { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 鍏ㄨ鍗婅杞崲 + /** + * 鍗婅杞叏瑙 + * + * @param input String. + * @return 鍏ㄨ瀛楃涓. + */ + public static String toSBC(String input) + { + return toSBC(input, null); + } + + /** + * 鍗婅杞叏瑙 + * + * @param input String + * @param notConvertSet 涓嶆浛鎹㈢殑瀛楃闆嗗悎 + * @return 鍏ㄨ瀛楃涓. + */ + public static String toSBC(String input, Set notConvertSet) + { + char c[] = input.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 璺宠繃涓嶆浛鎹㈢殑瀛楃 + continue; + } + + if (c[i] == ' ') + { + c[i] = '\u3000'; + } + else if (c[i] < '\177') + { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 鍏ㄨ杞崐瑙 + * + * @param input String. + * @return 鍗婅瀛楃涓 + */ + public static String toDBC(String input) + { + return toDBC(input, null); + } + + /** + * 鏇挎崲鍏ㄨ涓哄崐瑙 + * + * @param text 鏂囨湰 + * @param notConvertSet 涓嶆浛鎹㈢殑瀛楃闆嗗悎 + * @return 鏇挎崲鍚庣殑瀛楃 + */ + public static String toDBC(String text, Set notConvertSet) + { + char c[] = text.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 璺宠繃涓嶆浛鎹㈢殑瀛楃 + continue; + } + + if (c[i] == '\u3000') + { + c[i] = ' '; + } + else if (c[i] > '\uFF00' && c[i] < '\uFF5F') + { + c[i] = (char) (c[i] - 65248); + } + } + String returnString = new String(c); + + return returnString; + } + + /** + * 鏁板瓧閲戦澶у啓杞崲 鍏堝啓涓畬鏁寸殑鐒跺悗灏嗗闆舵嬀鏇挎崲鎴愰浂 + * + * @param n 鏁板瓧 + * @return 涓枃澶у啓鏁板瓧 + */ + public static String digitUppercase(double n) + { + String[] fraction = { "瑙", "鍒" }; + String[] digit = { "闆", "澹", "璐", "鍙", "鑲", "浼", "闄", "鏌", "鎹", "鐜" }; + String[][] unit = { { "鍏", "涓", "浜" }, { "", "鎷", "浣", "浠" } }; + + String head = n < 0 ? "璐" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) + { + s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(闆.)+", ""); + } + if (s.length() < 1) + { + s = "鏁"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) + { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) + { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(闆.)*闆$", "").replaceAll("^$", "闆") + unit[0][i] + s; + } + return head + s.replaceAll("(闆.)*闆跺厓", "鍏").replaceFirst("(闆.)+", "").replaceAll("(闆.)+", "闆").replaceAll("^鏁$", "闆跺厓鏁"); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/StrFormatter.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/StrFormatter.java new file mode 100644 index 0000000..e9b5d63 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/StrFormatter.java @@ -0,0 +1,92 @@ +package com.zhentao.common.core.text; + +import com.zhentao.common.core.utils.StringUtils; + +/** + * 瀛楃涓叉牸寮忓寲 + * + * @author ruoyi + */ +public class StrFormatter +{ + public static final String EMPTY_JSON = "{}"; + public static final char C_BACKSLASH = '\\'; + public static final char C_DELIM_START = '{'; + public static final char C_DELIM_END = '}'; + + /** + * 鏍煎紡鍖栧瓧绗︿覆
+ * 姝ゆ柟娉曞彧鏄畝鍗曞皢鍗犱綅绗 {} 鎸夌収椤哄簭鏇挎崲涓哄弬鏁
+ * 濡傛灉鎯宠緭鍑 {} 浣跨敤 \\杞箟 { 鍗冲彲锛屽鏋滄兂杈撳嚭 {} 涔嬪墠鐨 \ 浣跨敤鍙岃浆涔夌 \\\\ 鍗冲彲
+ * 渚嬶細
+ * 閫氬父浣跨敤锛歠ormat("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 strPattern 瀛楃涓叉ā鏉 + * @param argArray 鍙傛暟鍒楄〃 + * @return 缁撴灉 + */ + public static String format(final String strPattern, final Object... argArray) + { + if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) + { + return strPattern; + } + final int strPatternLength = strPattern.length(); + + // 鍒濆鍖栧畾涔夊ソ鐨勯暱搴︿互鑾峰緱鏇村ソ鐨勬ц兘 + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + + int handledPosition = 0; + int delimIndex;// 鍗犱綅绗︽墍鍦ㄤ綅缃 + for (int argIndex = 0; argIndex < argArray.length; argIndex++) + { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) + { + if (handledPosition == 0) + { + return strPattern; + } + else + { // 瀛楃涓叉ā鏉垮墿浣欓儴鍒嗕笉鍐嶅寘鍚崰浣嶇锛屽姞鍏ュ墿浣欓儴鍒嗗悗杩斿洖缁撴灉 + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } + else + { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) + { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) + { + // 杞箟绗︿箣鍓嶈繕鏈変竴涓浆涔夌锛屽崰浣嶇渚濇棫鏈夋晥 + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + else + { + // 鍗犱綅绗﹁杞箟 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } + else + { + // 姝e父鍗犱綅绗 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + } + } + // 鍔犲叆鏈鍚庝竴涓崰浣嶇鍚庢墍鏈夌殑瀛楃 + sbuf.append(strPattern, handledPosition, strPattern.length()); + + return sbuf.toString(); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/UUID.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/UUID.java new file mode 100644 index 0000000..7a2d863 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/text/UUID.java @@ -0,0 +1,484 @@ +package com.zhentao.common.core.text; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import com.zhentao.common.core.exception.UtilException; + +/** + * 鎻愪緵閫氱敤鍞竴璇嗗埆鐮侊紙universally unique identifier锛夛紙UUID锛夊疄鐜 + * + * @author ruoyi + */ +public final class UUID implements java.io.Serializable, Comparable +{ + private static final long serialVersionUID = -1185015143654744140L; + + /** + * SecureRandom 鐨勫崟渚 + * + */ + private static class Holder + { + static final SecureRandom numberGenerator = getSecureRandom(); + } + + /** 姝UID鐨勬渶楂64鏈夋晥浣 */ + private final long mostSigBits; + + /** 姝UID鐨勬渶浣64鏈夋晥浣 */ + private final long leastSigBits; + + /** + * 绉佹湁鏋勯 + * + * @param data 鏁版嵁 + */ + private UUID(byte[] data) + { + long msb = 0; + long lsb = 0; + assert data.length == 16 : "data must be 16 bytes in length"; + for (int i = 0; i < 8; i++) + { + msb = (msb << 8) | (data[i] & 0xff); + } + for (int i = 8; i < 16; i++) + { + lsb = (lsb << 8) | (data[i] & 0xff); + } + this.mostSigBits = msb; + this.leastSigBits = lsb; + } + + /** + * 浣跨敤鎸囧畾鐨勬暟鎹瀯閫犳柊鐨 UUID銆 + * + * @param mostSigBits 鐢ㄤ簬 {@code UUID} 鐨勬渶楂樻湁鏁 64 浣 + * @param leastSigBits 鐢ㄤ簬 {@code UUID} 鐨勬渶浣庢湁鏁 64 浣 + */ + public UUID(long mostSigBits, long leastSigBits) + { + this.mostSigBits = mostSigBits; + this.leastSigBits = leastSigBits; + } + + /** + * 鑾峰彇绫诲瀷 4锛堜吉闅忔満鐢熸垚鐨勶級UUID 鐨勯潤鎬佸伐鍘傘 浣跨敤鍔犲瘑鐨勬湰鍦扮嚎绋嬩吉闅忔満鏁扮敓鎴愬櫒鐢熸垚璇 UUID銆 + * + * @return 闅忔満鐢熸垚鐨 {@code UUID} + */ + public static UUID fastUUID() + { + return randomUUID(false); + } + + /** + * 鑾峰彇绫诲瀷 4锛堜吉闅忔満鐢熸垚鐨勶級UUID 鐨勯潤鎬佸伐鍘傘 浣跨敤鍔犲瘑鐨勫己浼殢鏈烘暟鐢熸垚鍣ㄧ敓鎴愯 UUID銆 + * + * @return 闅忔満鐢熸垚鐨 {@code UUID} + */ + public static UUID randomUUID() + { + return randomUUID(true); + } + + /** + * 鑾峰彇绫诲瀷 4锛堜吉闅忔満鐢熸垚鐨勶級UUID 鐨勯潤鎬佸伐鍘傘 浣跨敤鍔犲瘑鐨勫己浼殢鏈烘暟鐢熸垚鍣ㄧ敓鎴愯 UUID銆 + * + * @param isSecure 鏄惁浣跨敤{@link SecureRandom}濡傛灉鏄彲浠ヨ幏寰楁洿瀹夊叏鐨勯殢鏈虹爜锛屽惁鍒欏彲浠ュ緱鍒版洿濂界殑鎬ц兘 + * @return 闅忔満鐢熸垚鐨 {@code UUID} + */ + public static UUID randomUUID(boolean isSecure) + { + final Random ng = isSecure ? Holder.numberGenerator : getRandom(); + + byte[] randomBytes = new byte[16]; + ng.nextBytes(randomBytes); + randomBytes[6] &= 0x0f; /* clear version */ + randomBytes[6] |= 0x40; /* set to version 4 */ + randomBytes[8] &= 0x3f; /* clear variant */ + randomBytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(randomBytes); + } + + /** + * 鏍规嵁鎸囧畾鐨勫瓧鑺傛暟缁勮幏鍙栫被鍨 3锛堝熀浜庡悕绉扮殑锛塙UID 鐨勯潤鎬佸伐鍘傘 + * + * @param name 鐢ㄤ簬鏋勯 UUID 鐨勫瓧鑺傛暟缁勩 + * + * @return 鏍规嵁鎸囧畾鏁扮粍鐢熸垚鐨 {@code UUID} + */ + public static UUID nameUUIDFromBytes(byte[] name) + { + MessageDigest md; + try + { + md = MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException nsae) + { + throw new InternalError("MD5 not supported"); + } + byte[] md5Bytes = md.digest(name); + md5Bytes[6] &= 0x0f; /* clear version */ + md5Bytes[6] |= 0x30; /* set to version 3 */ + md5Bytes[8] &= 0x3f; /* clear variant */ + md5Bytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(md5Bytes); + } + + /** + * 鏍规嵁 {@link #toString()} 鏂规硶涓弿杩扮殑瀛楃涓叉爣鍑嗚〃绀哄舰寮忓垱寤簕@code UUID}銆 + * + * @param name 鎸囧畾 {@code UUID} 瀛楃涓 + * @return 鍏锋湁鎸囧畾鍊肩殑 {@code UUID} + * @throws IllegalArgumentException 濡傛灉 name 涓 {@link #toString} 涓弿杩扮殑瀛楃涓茶〃绀哄舰寮忎笉绗︽姏鍑烘寮傚父 + * + */ + public static UUID fromString(String name) + { + String[] components = name.split("-"); + if (components.length != 5) + { + throw new IllegalArgumentException("Invalid UUID string: " + name); + } + for (int i = 0; i < 5; i++) + { + components[i] = "0x" + components[i]; + } + + long mostSigBits = Long.decode(components[0]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[2]).longValue(); + + long leastSigBits = Long.decode(components[3]).longValue(); + leastSigBits <<= 48; + leastSigBits |= Long.decode(components[4]).longValue(); + + return new UUID(mostSigBits, leastSigBits); + } + + /** + * 杩斿洖姝 UUID 鐨 128 浣嶅间腑鐨勬渶浣庢湁鏁 64 浣嶃 + * + * @return 姝 UUID 鐨 128 浣嶅间腑鐨勬渶浣庢湁鏁 64 浣嶃 + */ + public long getLeastSignificantBits() + { + return leastSigBits; + } + + /** + * 杩斿洖姝 UUID 鐨 128 浣嶅间腑鐨勬渶楂樻湁鏁 64 浣嶃 + * + * @return 姝 UUID 鐨 128 浣嶅间腑鏈楂樻湁鏁 64 浣嶃 + */ + public long getMostSignificantBits() + { + return mostSigBits; + } + + /** + * 涓庢 {@code UUID} 鐩稿叧鑱旂殑鐗堟湰鍙. 鐗堟湰鍙锋弿杩版 {@code UUID} 鏄浣曠敓鎴愮殑銆 + *

+ * 鐗堟湰鍙峰叿鏈変互涓嬪惈鎰: + *

    + *
  • 1 鍩轰簬鏃堕棿鐨 UUID + *
  • 2 DCE 瀹夊叏 UUID + *
  • 3 鍩轰簬鍚嶇О鐨 UUID + *
  • 4 闅忔満鐢熸垚鐨 UUID + *
+ * + * @return 姝 {@code UUID} 鐨勭増鏈彿 + */ + public int version() + { + // Version is bits masked by 0x000000000000F000 in MS long + return (int) ((mostSigBits >> 12) & 0x0f); + } + + /** + * 涓庢 {@code UUID} 鐩稿叧鑱旂殑鍙樹綋鍙枫傚彉浣撳彿鎻忚堪 {@code UUID} 鐨勫竷灞銆 + *

+ * 鍙樹綋鍙峰叿鏈変互涓嬪惈鎰忥細 + *

    + *
  • 0 涓 NCS 鍚戝悗鍏煎淇濈暀 + *
  • 2 IETF RFC 4122(Leach-Salz), 鐢ㄤ簬姝ょ被 + *
  • 6 淇濈暀锛屽井杞悜鍚庡吋瀹 + *
  • 7 淇濈暀渚涗互鍚庡畾涔変娇鐢 + *
+ * + * @return 姝 {@code UUID} 鐩稿叧鑱旂殑鍙樹綋鍙 + */ + public int variant() + { + // This field is composed of a varying number of bits. + // 0 - - Reserved for NCS backward compatibility + // 1 0 - The IETF aka Leach-Salz variant (used by this class) + // 1 1 0 Reserved, Microsoft backward compatibility + // 1 1 1 Reserved for future definition. + return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63)); + } + + /** + * 涓庢 UUID 鐩稿叧鑱旂殑鏃堕棿鎴冲笺 + * + *

+ * 60 浣嶇殑鏃堕棿鎴冲兼牴鎹 {@code UUID} 鐨 time_low銆乼ime_mid 鍜 time_hi 瀛楁鏋勯犮
+ * 鎵寰楀埌鐨勬椂闂存埑浠 100 姣井绉掍负鍗曚綅锛屼粠 UTC锛堥氱敤鍗忚皟鏃堕棿锛 1582 骞 10 鏈 15 鏃ラ浂鏃跺紑濮嬨 + * + *

+ * 鏃堕棿鎴冲间粎鍦ㄥ湪鍩轰簬鏃堕棿鐨 UUID锛堝叾 version 绫诲瀷涓 1锛変腑鎵嶆湁鎰忎箟銆
+ * 濡傛灉姝 {@code UUID} 涓嶆槸鍩轰簬鏃堕棿鐨 UUID锛屽垯姝ゆ柟娉曟姏鍑 UnsupportedOperationException銆 + * + * @throws UnsupportedOperationException 濡傛灉姝 {@code UUID} 涓嶆槸 version 涓 1 鐨 UUID銆 + */ + public long timestamp() throws UnsupportedOperationException + { + checkTimeBase(); + return (mostSigBits & 0x0FFFL) << 48// + | ((mostSigBits >> 16) & 0x0FFFFL) << 32// + | mostSigBits >>> 32; + } + + /** + * 涓庢 UUID 鐩稿叧鑱旂殑鏃堕挓搴忓垪鍊笺 + * + *

+ * 14 浣嶇殑鏃堕挓搴忓垪鍊兼牴鎹 UUID 鐨 clock_seq 瀛楁鏋勯犮俢lock_seq 瀛楁鐢ㄤ簬淇濊瘉鍦ㄥ熀浜庢椂闂寸殑 UUID 涓殑鏃堕棿鍞竴鎬с + *

+ * {@code clockSequence} 鍊间粎鍦ㄥ熀浜庢椂闂寸殑 UUID锛堝叾 version 绫诲瀷涓 1锛変腑鎵嶆湁鎰忎箟銆 濡傛灉姝 UUID 涓嶆槸鍩轰簬鏃堕棿鐨 UUID锛屽垯姝ゆ柟娉曟姏鍑 + * UnsupportedOperationException銆 + * + * @return 姝 {@code UUID} 鐨勬椂閽熷簭鍒 + * + * @throws UnsupportedOperationException 濡傛灉姝 UUID 鐨 version 涓嶄负 1 + */ + public int clockSequence() throws UnsupportedOperationException + { + checkTimeBase(); + return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); + } + + /** + * 涓庢 UUID 鐩稿叧鐨勮妭鐐瑰笺 + * + *

+ * 48 浣嶇殑鑺傜偣鍊兼牴鎹 UUID 鐨 node 瀛楁鏋勯犮傛瀛楁鏃ㄥ湪鐢ㄤ簬淇濆瓨鏈哄櫒鐨 IEEE 802 鍦板潃锛岃鍦板潃鐢ㄤ簬鐢熸垚姝 UUID 浠ヤ繚璇佺┖闂村敮涓鎬с + *

+ * 鑺傜偣鍊间粎鍦ㄥ熀浜庢椂闂寸殑 UUID锛堝叾 version 绫诲瀷涓 1锛変腑鎵嶆湁鎰忎箟銆
+ * 濡傛灉姝 UUID 涓嶆槸鍩轰簬鏃堕棿鐨 UUID锛屽垯姝ゆ柟娉曟姏鍑 UnsupportedOperationException銆 + * + * @return 姝 {@code UUID} 鐨勮妭鐐瑰 + * + * @throws UnsupportedOperationException 濡傛灉姝 UUID 鐨 version 涓嶄负 1 + */ + public long node() throws UnsupportedOperationException + { + checkTimeBase(); + return leastSigBits & 0x0000FFFFFFFFFFFFL; + } + + /** + * 杩斿洖姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡銆 + * + *

+ * UUID 鐨勫瓧绗︿覆琛ㄧず褰㈠紡鐢辨 BNF 鎻忚堪锛 + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @return 姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡 + * @see #toString(boolean) + */ + @Override + public String toString() + { + return toString(false); + } + + /** + * 杩斿洖姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡銆 + * + *

+ * UUID 鐨勫瓧绗︿覆琛ㄧず褰㈠紡鐢辨 BNF 鎻忚堪锛 + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @param isSimple 鏄惁绠鍗曟ā寮忥紝绠鍗曟ā寮忎负涓嶅甫'-'鐨刄UID瀛楃涓 + * @return 姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡 + */ + public String toString(boolean isSimple) + { + final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); + // time_low + builder.append(digits(mostSigBits >> 32, 8)); + if (false == isSimple) + { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // node + builder.append(digits(leastSigBits, 12)); + + return builder.toString(); + } + + /** + * 杩斿洖姝 UUID 鐨勫搱甯岀爜銆 + * + * @return UUID 鐨勫搱甯岀爜鍊笺 + */ + @Override + public int hashCode() + { + long hilo = mostSigBits ^ leastSigBits; + return ((int) (hilo >> 32)) ^ (int) hilo; + } + + /** + * 灏嗘瀵硅薄涓庢寚瀹氬璞℃瘮杈冦 + *

+ * 褰撲笖浠呭綋鍙傛暟涓嶄负 {@code null}銆佽屾槸涓涓 UUID 瀵硅薄銆佸叿鏈変笌姝 UUID 鐩稿悓鐨 varriant銆佸寘鍚浉鍚岀殑鍊硷紙姣忎竴浣嶅潎鐩稿悓锛夋椂锛岀粨鏋滄墠涓 {@code true}銆 + * + * @param obj 瑕佷笌涔嬫瘮杈冪殑瀵硅薄 + * + * @return 濡傛灉瀵硅薄鐩稿悓锛屽垯杩斿洖 {@code true}锛涘惁鍒欒繑鍥 {@code false} + */ + @Override + public boolean equals(Object obj) + { + if ((null == obj) || (obj.getClass() != UUID.class)) + { + return false; + } + UUID id = (UUID) obj; + return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); + } + + // Comparison Operations + + /** + * 灏嗘 UUID 涓庢寚瀹氱殑 UUID 姣旇緝銆 + * + *

+ * 濡傛灉涓や釜 UUID 涓嶅悓锛屼笖绗竴涓 UUID 鐨勬渶楂樻湁鏁堝瓧娈靛ぇ浜庣浜屼釜 UUID 鐨勫搴斿瓧娈碉紝鍒欑涓涓 UUID 澶т簬绗簩涓 UUID銆 + * + * @param val 涓庢 UUID 姣旇緝鐨 UUID + * + * @return 鍦ㄦ UUID 灏忎簬銆佺瓑浜庢垨澶т簬 val 鏃讹紝鍒嗗埆杩斿洖 -1銆0 鎴 1銆 + * + */ + @Override + public int compareTo(UUID val) + { + // The ordering is intentionally set up so that the UUIDs + // can simply be numerically compared as two numbers + return (this.mostSigBits < val.mostSigBits ? -1 : // + (this.mostSigBits > val.mostSigBits ? 1 : // + (this.leastSigBits < val.leastSigBits ? -1 : // + (this.leastSigBits > val.leastSigBits ? 1 : // + 0)))); + } + + // ------------------------------------------------------------------------------------------------------------------- + // Private method start + /** + * 杩斿洖鎸囧畾鏁板瓧瀵瑰簲鐨刪ex鍊 + * + * @param val 鍊 + * @param digits 浣 + * @return 鍊 + */ + private static String digits(long val, int digits) + { + long hi = 1L << (digits * 4); + return Long.toHexString(hi | (val & (hi - 1))).substring(1); + } + + /** + * 妫鏌ユ槸鍚︿负time-based鐗堟湰UUID + */ + private void checkTimeBase() + { + if (version() != 1) + { + throw new UnsupportedOperationException("Not a time-based UUID"); + } + } + + /** + * 鑾峰彇{@link SecureRandom}锛岀被鎻愪緵鍔犲瘑鐨勫己闅忔満鏁扮敓鎴愬櫒 (RNG) + * + * @return {@link SecureRandom} + */ + public static SecureRandom getSecureRandom() + { + try + { + return SecureRandom.getInstance("SHA1PRNG"); + } + catch (NoSuchAlgorithmException e) + { + throw new UtilException(e); + } + } + + /** + * 鑾峰彇闅忔満鏁扮敓鎴愬櫒瀵硅薄
+ * ThreadLocalRandom鏄疛DK 7涔嬪悗鎻愪緵骞跺彂浜х敓闅忔満鏁帮紝鑳藉瑙e喅澶氫釜绾跨▼鍙戠敓鐨勭珵浜変簤澶恒 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/DateUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/DateUtils.java new file mode 100644 index 0000000..6f25dcf --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/DateUtils.java @@ -0,0 +1,155 @@ +package com.zhentao.common.core.utils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import org.apache.commons.lang3.time.DateFormatUtils; + +/** + * 鏃堕棿宸ュ叿绫 + * + * @author ruoyi + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils +{ + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + private static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 鑾峰彇褰撳墠Date鍨嬫棩鏈 + * + * @return Date() 褰撳墠鏃ユ湡 + */ + public static Date getNowDate() + { + return new Date(); + } + + /** + * 鑾峰彇褰撳墠鏃ユ湡, 榛樿鏍煎紡涓簓yyy-MM-dd + * + * @return String + */ + public static String getDate() + { + return dateTimeNow(YYYY_MM_DD); + } + + public static final String getTime() + { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() + { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) + { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) + { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) + { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) + { + try + { + return new SimpleDateFormat(format).parse(ts); + } + catch (ParseException e) + { + throw new RuntimeException(e); + } + } + + /** + * 鏃ユ湡璺緞 鍗冲勾/鏈/鏃 濡2018/08/08 + */ + public static final String datePath() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } + + /** + * 鏃ユ湡璺緞 鍗冲勾/鏈/鏃 濡20180808 + */ + public static final String dateTime() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + /** + * 鏃ユ湡鍨嬪瓧绗︿覆杞寲涓烘棩鏈 鏍煎紡 + */ + public static Date parseDate(Object str) + { + if (str == null) + { + return null; + } + try + { + return parseDate(str.toString(), parsePatterns); + } + catch (ParseException e) + { + return null; + } + } + + /** + * 鑾峰彇鏈嶅姟鍣ㄥ惎鍔ㄦ椂闂 + */ + public static Date getServerStartDate() + { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 璁$畻涓や釜鏃堕棿宸 + */ + public static String getDatePoor(Date endDate, Date nowDate) + { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 鑾峰緱涓や釜鏃堕棿鐨勬绉掓椂闂村樊寮 + long diff = endDate.getTime() - nowDate.getTime(); + // 璁$畻宸灏戝ぉ + long day = diff / nd; + // 璁$畻宸灏戝皬鏃 + long hour = diff % nd / nh; + // 璁$畻宸灏戝垎閽 + long min = diff % nd % nh / nm; + // 璁$畻宸灏戠//杈撳嚭缁撴灉 + // long sec = diff % nd % nh % nm / ns; + return day + "澶" + hour + "灏忔椂" + min + "鍒嗛挓"; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ExceptionUtil.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ExceptionUtil.java new file mode 100644 index 0000000..faff3a1 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ExceptionUtil.java @@ -0,0 +1,40 @@ +package com.zhentao.common.core.utils; + +import java.io.PrintWriter; +import java.io.StringWriter; +import org.apache.commons.lang3.exception.ExceptionUtils; + +/** + * 閿欒淇℃伅澶勭悊绫汇 + * + * @author ruoyi + */ +public class ExceptionUtil +{ + /** + * 鑾峰彇exception鐨勮缁嗛敊璇俊鎭 + */ + public static String getExceptionMessage(Throwable e) + { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw, true)); + String str = sw.toString(); + return str; + } + + public static String getRootErrorMseeage(Exception e) + { + Throwable root = ExceptionUtils.getRootCause(e); + root = (root == null ? e : root); + if (root == null) + { + return ""; + } + String msg = root.getMessage(); + if (msg == null) + { + return "null"; + } + return StringUtils.defaultString(msg); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/IdUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/IdUtils.java new file mode 100644 index 0000000..1ff1c23 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/IdUtils.java @@ -0,0 +1,51 @@ +package com.zhentao.common.core.utils; + +import com.zhentao.common.core.text.UUID; + +/** + * ID鐢熸垚鍣ㄥ伐鍏风被 + * + * @author ruoyi + */ +public class IdUtils +{ + /** + * 鑾峰彇闅忔満UUID + * + * @return 闅忔満UUID + */ + public static String randomUUID() + { + return UUID.randomUUID().toString(); + } + + /** + * 绠鍖栫殑UUID锛屽幓鎺変簡妯嚎 + * + * @return 绠鍖栫殑UUID锛屽幓鎺変簡妯嚎 + */ + public static String simpleUUID() + { + return UUID.randomUUID().toString(true); + } + + /** + * 鑾峰彇闅忔満UUID锛屼娇鐢ㄦц兘鏇村ソ鐨凾hreadLocalRandom鐢熸垚UUID + * + * @return 闅忔満UUID + */ + public static String fastUUID() + { + return UUID.fastUUID().toString(); + } + + /** + * 绠鍖栫殑UUID锛屽幓鎺変簡妯嚎锛屼娇鐢ㄦц兘鏇村ソ鐨凾hreadLocalRandom鐢熸垚UUID + * + * @return 绠鍖栫殑UUID锛屽幓鎺変簡妯嚎 + */ + public static String fastSimpleUUID() + { + return UUID.fastUUID().toString(true); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ReUtil.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ReUtil.java new file mode 100644 index 0000000..19c9734 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ReUtil.java @@ -0,0 +1,163 @@ +package com.zhentao.common.core.utils; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.zhentao.common.core.text.Convert; + +public class ReUtil +{ + public final static Pattern GROUP_VAR = Pattern.compile("\\$(\\d+)"); + + /** + * 姝e垯涓渶瑕佽杞箟鐨勫叧閿瓧 + */ + public final static Set RE_KEYS = new HashSet<>( + Arrays.asList('$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'));; + + /** + * 姝e垯鏇挎崲鎸囧畾鍊
+ * 閫氳繃姝e垯鏌ユ壘鍒板瓧绗︿覆锛岀劧鍚庢妸鍖归厤鍒扮殑瀛楃涓插姞鍏ュ埌replacementTemplate涓紝$1琛ㄧず鍒嗙粍1鐨勫瓧绗︿覆 + * + *

+ * 渚嬪锛氬師瀛楃涓叉槸锛氫腑鏂1234锛屾垜鎯虫妸1234鎹㈡垚(1234)锛屽垯鍙互锛 + * + *

+     * ReUtil.replaceAll("涓枃1234", "(\\d+)", "($1)"))
+     *
+     * 缁撴灉锛氫腑鏂(1234)
+     * 
+ * + * @param content 鏂囨湰 + * @param regex 姝e垯 + * @param replacementTemplate 鏇挎崲鐨勬枃鏈ā鏉匡紝鍙互浣跨敤$1绫讳技鐨勫彉閲忔彁鍙栨鍒欏尮閰嶅嚭鐨勫唴瀹 + * @return 澶勭悊鍚庣殑鏂囨湰 + */ + public static String replaceAll(CharSequence content, String regex, String replacementTemplate) + { + final Pattern pattern = Pattern.compile(regex, Pattern.DOTALL); + return replaceAll(content, pattern, replacementTemplate); + } + + /** + * 姝e垯鏇挎崲鎸囧畾鍊
+ * 閫氳繃姝e垯鏌ユ壘鍒板瓧绗︿覆锛岀劧鍚庢妸鍖归厤鍒扮殑瀛楃涓插姞鍏ュ埌replacementTemplate涓紝$1琛ㄧず鍒嗙粍1鐨勫瓧绗︿覆 + * + * @param content 鏂囨湰 + * @param pattern {@link Pattern} + * @param replacementTemplate 鏇挎崲鐨勬枃鏈ā鏉匡紝鍙互浣跨敤$1绫讳技鐨勫彉閲忔彁鍙栨鍒欏尮閰嶅嚭鐨勫唴瀹 + * @return 澶勭悊鍚庣殑鏂囨湰 + * @since 3.0.4 + */ + public static String replaceAll(CharSequence content, Pattern pattern, String replacementTemplate) + { + if (StringUtils.isEmpty(content)) + { + return StringUtils.EMPTY; + } + + final Matcher matcher = pattern.matcher(content); + boolean result = matcher.find(); + if (result) + { + final Set varNums = findAll(GROUP_VAR, replacementTemplate, 1, new HashSet<>()); + final StringBuffer sb = new StringBuffer(); + do + { + String replacement = replacementTemplate; + for (String var : varNums) + { + int group = Integer.parseInt(var); + replacement = replacement.replace("$" + var, matcher.group(group)); + } + matcher.appendReplacement(sb, escape(replacement)); + result = matcher.find(); + } + while (result); + matcher.appendTail(sb); + return sb.toString(); + } + return Convert.toStr(content); + } + + /** + * 鍙栧緱鍐呭涓尮閰嶇殑鎵鏈夌粨鏋 + * + * @param 闆嗗悎绫诲瀷 + * @param pattern 缂栬瘧鍚庣殑姝e垯妯″紡 + * @param content 琚煡鎵剧殑鍐呭 + * @param group 姝e垯鐨勫垎缁 + * @param collection 杩斿洖鐨勯泦鍚堢被鍨 + * @return 缁撴灉闆 + */ + public static > T findAll(Pattern pattern, CharSequence content, int group, + T collection) + { + if (null == pattern || null == content) + { + return null; + } + + if (null == collection) + { + throw new NullPointerException("Null collection param provided!"); + } + + final Matcher matcher = pattern.matcher(content); + while (matcher.find()) + { + collection.add(matcher.group(group)); + } + return collection; + } + + /** + * 杞箟瀛楃锛屽皢姝e垯鐨勫叧閿瓧杞箟 + * + * @param c 瀛楃 + * @return 杞箟鍚庣殑鏂囨湰 + */ + public static String escape(char c) + { + final StringBuilder builder = new StringBuilder(); + if (RE_KEYS.contains(c)) + { + builder.append('\\'); + } + builder.append(c); + return builder.toString(); + } + + /** + * 杞箟瀛楃涓诧紝灏嗘鍒欑殑鍏抽敭瀛楄浆涔 + * + * @param content 鏂囨湰 + * @return 杞箟鍚庣殑鏂囨湰 + */ + public static String escape(CharSequence content) + { + if (StringUtils.isBlank(content)) + { + return StringUtils.EMPTY; + } + + final StringBuilder builder = new StringBuilder(); + int len = content.length(); + char current; + for (int i = 0; i < len; i++) + { + current = content.charAt(i); + if (RE_KEYS.contains(current)) + { + builder.append('\\'); + } + builder.append(current); + } + return builder.toString(); + } + +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/SecurityUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/SecurityUtils.java new file mode 100644 index 0000000..92c8b23 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/SecurityUtils.java @@ -0,0 +1,89 @@ +package com.zhentao.common.core.utils; + +import javax.servlet.http.HttpServletRequest; + +import com.zhentao.common.core.constant.CacheConstants; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import com.zhentao.common.core.text.Convert; + +/** + * 鏉冮檺鑾峰彇宸ュ叿绫 + * + * @author ruoyi + */ +public class SecurityUtils +{ + /** + * 鑾峰彇鐢ㄦ埛 + */ + public static String getUsername() + { + String username = ServletUtils.getRequest().getHeader(CacheConstants.DETAILS_USERNAME); + return ServletUtils.urlDecode(username); + } + + /** + * 鑾峰彇鐢ㄦ埛ID + */ + public static Long getUserId() + { + return Convert.toLong(ServletUtils.getRequest().getHeader(CacheConstants.DETAILS_USER_ID)); + } + + /** + * 鑾峰彇璇锋眰token + */ + public static String getToken() + { + return getToken(ServletUtils.getRequest()); + } + + /** + * 鏍规嵁request鑾峰彇璇锋眰token + */ + public static String getToken(HttpServletRequest request) + { + String token = ServletUtils.getRequest().getHeader(CacheConstants.HEADER); + if (StringUtils.isNotEmpty(token) && token.startsWith(CacheConstants.TOKEN_PREFIX)) + { + token = token.replace(CacheConstants.TOKEN_PREFIX, ""); + } + return token; + } + + /** + * 鏄惁涓虹鐞嗗憳 + * + * @param userId 鐢ㄦ埛ID + * @return 缁撴灉 + */ + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } + + /** + * 鐢熸垚BCryptPasswordEncoder瀵嗙爜 + * + * @param password 瀵嗙爜 + * @return 鍔犲瘑瀛楃涓 + */ + public static String encryptPassword(String password) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.encode(password); + } + + /** + * 鍒ゆ柇瀵嗙爜鏄惁鐩稿悓 + * + * @param rawPassword 鐪熷疄瀵嗙爜 + * @param encodedPassword 鍔犲瘑鍚庡瓧绗 + * @return 缁撴灉 + */ + public static boolean matchesPassword(String rawPassword, String encodedPassword) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.matches(rawPassword, encodedPassword); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ServletUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ServletUtils.java new file mode 100644 index 0000000..bd09a1c --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ServletUtils.java @@ -0,0 +1,217 @@ +package com.zhentao.common.core.utils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.Enumeration; +import java.util.LinkedHashMap; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import com.zhentao.common.core.constant.Constants; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import com.zhentao.common.core.text.Convert; + +/** + * 瀹㈡埛绔伐鍏风被 + * + * @author ruoyi + */ +public class ServletUtils +{ + /** + * 鑾峰彇String鍙傛暟 + */ + public static String getParameter(String name) + { + return getRequest().getParameter(name); + } + + /** + * 鑾峰彇String鍙傛暟 + */ + public static String getParameter(String name, String defaultValue) + { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 鑾峰彇Integer鍙傛暟 + */ + public static Integer getParameterToInt(String name) + { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 鑾峰彇Integer鍙傛暟 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) + { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 鑾峰彇request + */ + public static HttpServletRequest getRequest() + { + try + { + return getRequestAttributes().getRequest(); + } + catch (Exception e) + { + return null; + } + } + + /** + * 鑾峰彇response + */ + public static HttpServletResponse getResponse() + { + try + { + return getRequestAttributes().getResponse(); + } + catch (Exception e) + { + return null; + } + } + + /** + * 鑾峰彇session + */ + public static HttpSession getSession() + { + return getRequest().getSession(); + } + + public static ServletRequestAttributes getRequestAttributes() + { + try + { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + catch (Exception e) + { + return null; + } + } + + public static Map getHeaders(HttpServletRequest request) + { + Map map = new LinkedHashMap<>(); + Enumeration enumeration = request.getHeaderNames(); + if (enumeration != null) + { + while (enumeration.hasMoreElements()) + { + String key = enumeration.nextElement(); + String value = request.getHeader(key); + map.put(key, value); + } + } + return map; + } + + /** + * 灏嗗瓧绗︿覆娓叉煋鍒板鎴风 + * + * @param response 娓叉煋瀵硅薄 + * @param string 寰呮覆鏌撶殑瀛楃涓 + * @return null + */ + public static String renderString(HttpServletResponse response, String string) + { + try + { + response.setStatus(200); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } + catch (IOException e) + { + e.printStackTrace(); + } + return null; + } + + /** + * 鏄惁鏄疉jax寮傛璇锋眰 + * + * @param request + */ + public static boolean isAjaxRequest(HttpServletRequest request) + { + String accept = request.getHeader("accept"); + if (accept != null && accept.indexOf("application/json") != -1) + { + return true; + } + + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) + { + return true; + } + + String uri = request.getRequestURI(); + if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) + { + return true; + } + + String ajax = request.getParameter("__ajax"); + if (StringUtils.inStringIgnoreCase(ajax, "json", "xml")) + { + return true; + } + return false; + } + + /** + * 鍐呭缂栫爜 + * + * @param str 鍐呭 + * @return 缂栫爜鍚庣殑鍐呭 + */ + public static String urlEncode(String str) + { + try + { + return URLEncoder.encode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return ""; + } + } + + /** + * 鍐呭瑙g爜 + * + * @param str 鍐呭 + * @return 瑙g爜鍚庣殑鍐呭 + */ + public static String urlDecode(String str) + { + try + { + return URLDecoder.decode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return ""; + } + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/SpringUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/SpringUtils.java new file mode 100644 index 0000000..a9558a7 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/SpringUtils.java @@ -0,0 +1,114 @@ +package com.zhentao.common.core.utils; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.stereotype.Component; + +/** + * spring宸ュ叿绫 鏂逛究鍦ㄩ潪spring绠$悊鐜涓幏鍙朾ean + * + * @author ruoyi + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor +{ + /** Spring搴旂敤涓婁笅鏂囩幆澧 */ + private static ConfigurableListableBeanFactory beanFactory; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + /** + * 鑾峰彇瀵硅薄 + * + * @param name + * @return Object 涓涓互鎵缁欏悕瀛楁敞鍐岀殑bean鐨勫疄渚 + * @throws org.springframework.beans.BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 鑾峰彇绫诲瀷涓簉equiredType鐨勫璞 + * + * @param clz + * @return + * @throws org.springframework.beans.BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 濡傛灉BeanFactory鍖呭惈涓涓笌鎵缁欏悕绉板尮閰嶇殑bean瀹氫箟锛屽垯杩斿洖true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 鍒ゆ柇浠ョ粰瀹氬悕瀛楁敞鍐岀殑bean瀹氫箟鏄竴涓猻ingleton杩樻槸涓涓猵rototype銆 濡傛灉涓庣粰瀹氬悕瀛楃浉搴旂殑bean瀹氫箟娌℃湁琚壘鍒帮紝灏嗕細鎶涘嚭涓涓紓甯革紙NoSuchBeanDefinitionException锛 + * + * @param name + * @return boolean + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 娉ㄥ唽瀵硅薄鐨勭被鍨 + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 濡傛灉缁欏畾鐨刡ean鍚嶅瓧鍦╞ean瀹氫箟涓湁鍒悕锛屽垯杩斿洖杩欎簺鍒悕 + * + * @param name + * @return + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 鑾峰彇aop浠g悊瀵硅薄 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/StringUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/StringUtils.java new file mode 100644 index 0000000..63a4a79 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/StringUtils.java @@ -0,0 +1,523 @@ +package com.zhentao.common.core.utils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import com.zhentao.common.core.text.StrFormatter; + +/** + * 瀛楃涓插伐鍏风被 + * + * @author ruoyi + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils +{ + /** 绌哄瓧绗︿覆 */ + private static final String NULLSTR = ""; + + /** 涓嬪垝绾 */ + private static final char SEPARATOR = '_'; + + /** 鏄熷彿 */ + private static final String START = "*"; + + /** + * 鑾峰彇鍙傛暟涓嶄负绌哄 + * + * @param value defaultValue 瑕佸垽鏂殑value + * @return value 杩斿洖鍊 + */ + public static T nvl(T value, T defaultValue) + { + return value != null ? value : defaultValue; + } + + /** + * * 鍒ゆ柇涓涓狢ollection鏄惁涓虹┖锛 鍖呭惈List锛孲et锛孮ueue + * + * @param coll 瑕佸垽鏂殑Collection + * @return true锛氫负绌 false锛氶潪绌 + */ + public static boolean isEmpty(Collection coll) + { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 鍒ゆ柇涓涓狢ollection鏄惁闈炵┖锛屽寘鍚獿ist锛孲et锛孮ueue + * + * @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 isNull(objects) || (objects.length == 0); + } + + /** + * * 鍒ゆ柇涓涓璞℃暟缁勬槸鍚﹂潪绌 + * + * @param objects 瑕佸垽鏂殑瀵硅薄鏁扮粍 + * @return true锛氶潪绌 false锛氱┖ + */ + public static boolean isNotEmpty(Object[] objects) + { + return !isEmpty(objects); + } + + /** + * * 鍒ゆ柇涓涓狹ap鏄惁涓虹┖ + * + * @param map 瑕佸垽鏂殑Map + * @return true锛氫负绌 false锛氶潪绌 + */ + public static boolean isEmpty(Map map) + { + return isNull(map) || map.isEmpty(); + } + + /** + * * 鍒ゆ柇涓涓狹ap鏄惁涓虹┖ + * + * @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 isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 鍒ゆ柇涓涓瓧绗︿覆鏄惁涓洪潪绌轰覆 + * + * @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 object == null; + } + + /** + * * 鍒ゆ柇涓涓璞℃槸鍚﹂潪绌 + * + * @param object Object + * @return true锛氶潪绌 false锛氱┖ + */ + public static boolean isNotNull(Object object) + { + return !isNull(object); + } + + /** + * * 鍒ゆ柇涓涓璞℃槸鍚︽槸鏁扮粍绫诲瀷锛圝ava鍩烘湰鍨嬪埆鐨勬暟缁勶級 + * + * @param object 瀵硅薄 + * @return true锛氭槸鏁扮粍 false锛氫笉鏄暟缁 + */ + public static boolean isArray(Object object) + { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 鍘荤┖鏍 + */ + public static String trim(String str) + { + return (str == null ? "" : str.trim()); + } + + /** + * 鎴彇瀛楃涓 + * + * @param str 瀛楃涓 + * @param start 寮濮 + * @return 缁撴灉 + */ + public static String substring(final String str, int start) + { + if (str == null) + { + return NULLSTR; + } + + if (start < 0) + { + start = str.length() + start; + } + + if (start < 0) + { + start = 0; + } + if (start > str.length()) + { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 鎴彇瀛楃涓 + * + * @param str 瀛楃涓 + * @param start 寮濮 + * @param end 缁撴潫 + * @return 缁撴灉 + */ + public static String substring(final String str, int start, int end) + { + if (str == null) + { + return NULLSTR; + } + + if (end < 0) + { + end = str.length() + end; + } + if (start < 0) + { + start = str.length() + start; + } + + if (end > str.length()) + { + end = str.length(); + } + + if (start > end) + { + return NULLSTR; + } + + if (start < 0) + { + start = 0; + } + if (end < 0) + { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 鏍煎紡鍖栨枃鏈, {} 琛ㄧず鍗犱綅绗
+ * 姝ゆ柟娉曞彧鏄畝鍗曞皢鍗犱綅绗 {} 鎸夌収椤哄簭鏇挎崲涓哄弬鏁
+ * 濡傛灉鎯宠緭鍑 {} 浣跨敤 \\杞箟 { 鍗冲彲锛屽鏋滄兂杈撳嚭 {} 涔嬪墠鐨 \ 浣跨敤鍙岃浆涔夌 \\\\ 鍗冲彲
+ * 渚嬶細
+ * 閫氬父浣跨敤锛歠ormat("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) + { + if (isEmpty(params) || isEmpty(template)) + { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 涓嬪垝绾胯浆椹煎嘲鍛藉悕 + */ + public static String toUnderScoreCase(String str) + { + if (str == null) + { + return null; + } + StringBuilder sb = new StringBuilder(); + // 鍓嶇疆瀛楃鏄惁澶у啓 + boolean preCharIsUpperCase = true; + // 褰撳墠瀛楃鏄惁澶у啓 + boolean curreCharIsUpperCase = true; + // 涓嬩竴瀛楃鏄惁澶у啓 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) + { + char c = str.charAt(i); + if (i > 0) + { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } + else + { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) + { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) + { + sb.append(SEPARATOR); + } + else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) + { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 鏄惁鍖呭惈瀛楃涓 + * + * @param str 楠岃瘉瀛楃涓 + * @param strs 瀛楃涓茬粍 + * @return 鍖呭惈杩斿洖true + */ + public static boolean inStringIgnoreCase(String str, String... strs) + { + if (str != null && strs != null) + { + for (String s : strs) + { + if (str.equalsIgnoreCase(trim(s))) + { + return true; + } + } + } + return false; + } + + /** + * 灏嗕笅鍒掔嚎澶у啓鏂瑰紡鍛藉悕鐨勫瓧绗︿覆杞崲涓洪┘宄板紡銆傚鏋滆浆鎹㈠墠鐨勪笅鍒掔嚎澶у啓鏂瑰紡鍛藉悕鐨勫瓧绗︿覆涓虹┖锛屽垯杩斿洖绌哄瓧绗︿覆銆 渚嬪锛欻ELLO_WORLD->HelloWorld + * + * @param name 杞崲鍓嶇殑涓嬪垝绾垮ぇ鍐欐柟寮忓懡鍚嶇殑瀛楃涓 + * @return 杞崲鍚庣殑椹煎嘲寮忓懡鍚嶇殑瀛楃涓 + */ + public static String convertToCamelCase(String name) + { + StringBuilder result = new StringBuilder(); + // 蹇熸鏌 + if (name == null || name.isEmpty()) + { + // 娌″繀瑕佽浆鎹 + return ""; + } + else if (!name.contains("_")) + { + // 涓嶅惈涓嬪垝绾匡紝浠呭皢棣栧瓧姣嶅ぇ鍐 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 鐢ㄤ笅鍒掔嚎灏嗗師濮嬪瓧绗︿覆鍒嗗壊 + String[] camels = name.split("_"); + for (String camel : camels) + { + // 璺宠繃鍘熷瀛楃涓蹭腑寮澶淬佺粨灏剧殑涓嬫崲绾挎垨鍙岄噸涓嬪垝绾 + if (camel.isEmpty()) + { + continue; + } + // 棣栧瓧姣嶅ぇ鍐 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 椹煎嘲寮忓懡鍚嶆硶 渚嬪锛歶ser_name->userName + */ + public static String toCamelCase(String s) + { + if (s == null) + { + return null; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) + { + char c = s.charAt(i); + + if (c == SEPARATOR) + { + upperCase = true; + } + else if (upperCase) + { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } + else + { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 鏌ユ壘鎸囧畾瀛楃涓叉槸鍚﹀尮閰嶆寚瀹氬瓧绗︿覆鍒楄〃涓殑浠绘剰涓涓瓧绗︿覆 + * + * @param str 鎸囧畾瀛楃涓 + * @param strs 闇瑕佹鏌ョ殑瀛楃涓叉暟缁 + * @return 鏄惁鍖归厤 + */ + public static boolean matches(String str, List strs) + { + if (isEmpty(str) || isEmpty(strs)) + { + return false; + } + for (String testStr : strs) + { + if (matches(str, testStr)) + { + return true; + } + } + return false; + } + + /** + * 鏌ユ壘鎸囧畾瀛楃涓叉槸鍚﹀尮閰嶆寚瀹氬瓧绗︿覆鏁扮粍涓殑浠绘剰涓涓瓧绗︿覆 + * + * @param str 鎸囧畾瀛楃涓 + * @param strs 闇瑕佹鏌ョ殑瀛楃涓叉暟缁 + * @return 鏄惁鍖归厤 + */ + public static boolean matches(String str, String... strs) + { + if (isEmpty(str) || isEmpty(strs)) + { + return false; + } + for (String testStr : strs) + { + if (matches(str, testStr)) + { + return true; + } + } + return false; + } + + /** + * 鏌ユ壘鎸囧畾瀛楃涓叉槸鍚﹀尮閰 + * + * @param str 鎸囧畾瀛楃涓 + * @param pattern 闇瑕佹鏌ョ殑瀛楃涓 + * @return 鏄惁鍖归厤 + */ + public static boolean matches(String str, String pattern) + { + if (isEmpty(pattern) || isEmpty(str)) + { + return false; + } + + pattern = pattern.replaceAll("\\s*", ""); // 鏇挎崲绌烘牸 + int beginOffset = 0; // pattern鎴彇寮濮嬩綅缃 + int formerStarOffset = -1; // 鍓嶆槦鍙风殑鍋忕Щ浣嶇疆 + int latterStarOffset = -1; // 鍚庢槦鍙风殑鍋忕Щ浣嶇疆 + + String remainingURI = str; + String prefixPattern = ""; + String suffixPattern = ""; + + boolean result = false; + do + { + formerStarOffset = indexOf(pattern, START, beginOffset); + prefixPattern = substring(pattern, beginOffset, formerStarOffset > -1 ? formerStarOffset : pattern.length()); + + // 鍖归厤鍓嶇紑Pattern + result = remainingURI.contains(prefixPattern); + // 宸茬粡娌℃湁鏄熷彿锛岀洿鎺ヨ繑鍥 + if (formerStarOffset == -1) + { + return result; + } + + // 鍖归厤澶辫触锛岀洿鎺ヨ繑鍥 + if (!result) + return false; + + if (!isEmpty(prefixPattern)) + { + remainingURI = substringAfter(str, prefixPattern); + } + + // 鍖归厤鍚庣紑Pattern + latterStarOffset = indexOf(pattern, START, formerStarOffset + 1); + suffixPattern = substring(pattern, formerStarOffset + 1, latterStarOffset > -1 ? latterStarOffset : pattern.length()); + + result = remainingURI.contains(suffixPattern); + // 鍖归厤澶辫触锛岀洿鎺ヨ繑鍥 + if (!result) + return false; + + if (!isEmpty(suffixPattern)) + { + remainingURI = substringAfter(str, suffixPattern); + } + + // 绉诲姩鎸囬拡 + beginOffset = latterStarOffset + 1; + + } + while (!isEmpty(suffixPattern) && !isEmpty(remainingURI)); + + return true; + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) + { + return (T) obj; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/bean/BeanUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/bean/BeanUtils.java new file mode 100644 index 0000000..ceceff2 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/bean/BeanUtils.java @@ -0,0 +1,110 @@ +package com.zhentao.common.core.utils.bean; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Bean 宸ュ叿绫 + * + * @author ruoyi + */ +public class BeanUtils extends org.springframework.beans.BeanUtils +{ + /** Bean鏂规硶鍚嶄腑灞炴у悕寮濮嬬殑涓嬫爣 */ + private static final int BEAN_METHOD_PROP_INDEX = 3; + + /** * 鍖归厤getter鏂规硶鐨勬鍒欒〃杈惧紡 */ + private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); + + /** * 鍖归厤setter鏂规硶鐨勬鍒欒〃杈惧紡 */ + private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); + + /** + * Bean灞炴у鍒跺伐鍏锋柟娉曘 + * + * @param dest 鐩爣瀵硅薄 + * @param src 婧愬璞 + */ + public static void copyBeanProp(Object dest, Object src) + { + try + { + copyProperties(src, dest); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + /** + * 鑾峰彇瀵硅薄鐨剆etter鏂规硶銆 + * + * @param obj 瀵硅薄 + * @return 瀵硅薄鐨剆etter鏂规硶鍒楄〃 + */ + public static List getSetterMethods(Object obj) + { + // setter鏂规硶鍒楄〃 + List setterMethods = new ArrayList(); + + // 鑾峰彇鎵鏈夋柟娉 + Method[] methods = obj.getClass().getMethods(); + + // 鏌ユ壘setter鏂规硶 + + for (Method method : methods) + { + Matcher m = SET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 1)) + { + setterMethods.add(method); + } + } + // 杩斿洖setter鏂规硶鍒楄〃 + return setterMethods; + } + + /** + * 鑾峰彇瀵硅薄鐨刧etter鏂规硶銆 + * + * @param obj 瀵硅薄 + * @return 瀵硅薄鐨刧etter鏂规硶鍒楄〃 + */ + + public static List getGetterMethods(Object obj) + { + // getter鏂规硶鍒楄〃 + List getterMethods = new ArrayList(); + // 鑾峰彇鎵鏈夋柟娉 + Method[] methods = obj.getClass().getMethods(); + // 鏌ユ壘getter鏂规硶 + for (Method method : methods) + { + Matcher m = GET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 0)) + { + getterMethods.add(method); + } + } + // 杩斿洖getter鏂规硶鍒楄〃 + return getterMethods; + } + + /** + * 妫鏌ean鏂规硶鍚嶄腑鐨勫睘鎬у悕鏄惁鐩哥瓑銆
+ * 濡俫etName()鍜宻etName()灞炴у悕涓鏍凤紝getName()鍜宻etAge()灞炴у悕涓嶄竴鏍枫 + * + * @param m1 鏂规硶鍚1 + * @param m2 鏂规硶鍚2 + * @return 灞炴у悕涓鏍疯繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse + */ + + public static boolean isMethodPropEquals(String m1, String m2) + { + return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/FileTypeUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/FileTypeUtils.java new file mode 100644 index 0000000..3250bb6 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/FileTypeUtils.java @@ -0,0 +1,76 @@ +package com.zhentao.common.core.utils.file; + +import java.io.File; +import org.apache.commons.lang3.StringUtils; + +/** + * 鏂囦欢绫诲瀷宸ュ叿绫 + * + * @author ruoyi + */ +public class FileTypeUtils +{ + /** + * 鑾峰彇鏂囦欢绫诲瀷 + *

+ * 渚嬪: ruoyi.txt, 杩斿洖: txt + * + * @param file 鏂囦欢鍚 + * @return 鍚庣紑锛堜笉鍚".") + */ + public static String getFileType(File file) + { + if (null == file) + { + return StringUtils.EMPTY; + } + return getFileType(file.getName()); + } + + /** + * 鑾峰彇鏂囦欢绫诲瀷 + *

+ * 渚嬪: ruoyi.txt, 杩斿洖: txt + * + * @param fileName 鏂囦欢鍚 + * @return 鍚庣紑锛堜笉鍚".") + */ + public static String getFileType(String fileName) + { + int separatorIndex = fileName.lastIndexOf("."); + if (separatorIndex < 0) + { + return ""; + } + return fileName.substring(separatorIndex + 1).toLowerCase(); + } + + /** + * 鑾峰彇鏂囦欢绫诲瀷 + * + * @param photoByte 鏂囦欢瀛楄妭鐮 + * @return 鍚庣紑锛堜笉鍚".") + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "JPG"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "GIF"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "JPG"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "BMP"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "PNG"; + } + return strFileExtendName; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/FileUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/FileUtils.java new file mode 100644 index 0000000..f287277 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/FileUtils.java @@ -0,0 +1,260 @@ +package com.zhentao.common.core.utils.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.ArrayUtils; +import com.zhentao.common.core.utils.StringUtils; + +/** + * 鏂囦欢澶勭悊宸ュ叿绫 + * + * @author ruoyi + */ +public class FileUtils extends org.apache.commons.io.FileUtils +{ + /** 瀛楃甯搁噺锛氭枩鏉 {@code '/'} */ + public static final char SLASH = '/'; + + /** 瀛楃甯搁噺锛氬弽鏂滄潬 {@code '\\'} */ + public static final char BACKSLASH = '\\'; + + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; + + /** + * 杈撳嚭鎸囧畾鏂囦欢鐨刡yte鏁扮粍 + * + * @param filePath 鏂囦欢璺緞 + * @param os 杈撳嚭娴 + * @return + */ + public static void writeBytes(String filePath, OutputStream os) throws IOException + { + FileInputStream fis = null; + try + { + File file = new File(filePath); + if (!file.exists()) + { + throw new FileNotFoundException(filePath); + } + fis = new FileInputStream(file); + byte[] b = new byte[1024]; + int length; + while ((length = fis.read(b)) > 0) + { + os.write(b, 0, length); + } + } + catch (IOException e) + { + throw e; + } + finally + { + if (os != null) + { + try + { + os.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + if (fis != null) + { + try + { + fis.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + } + } + + /** + * 鍒犻櫎鏂囦欢 + * + * @param filePath 鏂囦欢 + * @return + */ + public static boolean deleteFile(String filePath) + { + boolean flag = false; + File file = new File(filePath); + // 璺緞涓烘枃浠朵笖涓嶄负绌哄垯杩涜鍒犻櫎 + if (file.isFile() && file.exists()) + { + file.delete(); + flag = true; + } + return flag; + } + + /** + * 鏂囦欢鍚嶇О楠岃瘉 + * + * @param filename 鏂囦欢鍚嶇О + * @return true 姝e父 false 闈炴硶 + */ + public static boolean isValidFilename(String filename) + { + return filename.matches(FILENAME_PATTERN); + } + + /** + * 妫鏌ユ枃浠舵槸鍚﹀彲涓嬭浇 + * + * @param resource 闇瑕佷笅杞界殑鏂囦欢 + * @return true 姝e父 false 闈炴硶 + */ + public static boolean checkAllowDownload(String resource) + { + // 绂佹鐩綍涓婅烦绾у埆 + if (StringUtils.contains(resource, "..")) + { + return false; + } + + // 妫鏌ュ厑璁镐笅杞界殑鏂囦欢瑙勫垯 + if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) + { + return true; + } + + // 涓嶅湪鍏佽涓嬭浇鐨勬枃浠惰鍒 + return false; + } + + /** + * 涓嬭浇鏂囦欢鍚嶉噸鏂扮紪鐮 + * + * @param request 璇锋眰瀵硅薄 + * @param fileName 鏂囦欢鍚 + * @return 缂栫爜鍚庣殑鏂囦欢鍚 + */ + public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException + { + final String agent = request.getHeader("USER-AGENT"); + String filename = fileName; + if (agent.contains("MSIE")) + { + // IE娴忚鍣 + filename = URLEncoder.encode(filename, "utf-8"); + filename = filename.replace("+", " "); + } + else if (agent.contains("Firefox")) + { + // 鐏嫄娴忚鍣 + filename = new String(fileName.getBytes(), "ISO8859-1"); + } + else if (agent.contains("Chrome")) + { + // google娴忚鍣 + filename = URLEncoder.encode(filename, "utf-8"); + } + else + { + // 鍏跺畠娴忚鍣 + filename = URLEncoder.encode(filename, "utf-8"); + } + return filename; + } + + /** + * 杩斿洖鏂囦欢鍚 + * + * @param filePath 鏂囦欢 + * @return 鏂囦欢鍚 + */ + public static String getName(String filePath) + { + if (null == filePath) + { + return null; + } + int len = filePath.length(); + if (0 == len) + { + return filePath; + } + if (isFileSeparator(filePath.charAt(len - 1))) + { + // 浠ュ垎闅旂缁撳熬鐨勫幓鎺夌粨灏惧垎闅旂 + len--; + } + + int begin = 0; + char c; + for (int i = len - 1; i > -1; i--) + { + c = filePath.charAt(i); + if (isFileSeparator(c)) + { + // 鏌ユ壘鏈鍚庝竴涓矾寰勫垎闅旂锛/鎴栬匼锛 + begin = i + 1; + break; + } + } + + return filePath.substring(begin, len); + } + + /** + * 鏄惁涓篧indows鎴栬匧inux锛圲nix锛夋枃浠跺垎闅旂
+ * Windows骞冲彴涓嬪垎闅旂涓篭锛孡inux锛圲nix锛変负/ + * + * @param c 瀛楃 + * @return 鏄惁涓篧indows鎴栬匧inux锛圲nix锛夋枃浠跺垎闅旂 + */ + public static boolean isFileSeparator(char c) + { + return SLASH == c || BACKSLASH == c; + } + + /** + * 涓嬭浇鏂囦欢鍚嶉噸鏂扮紪鐮 + * + * @param response 鍝嶅簲瀵硅薄 + * @param realFileName 鐪熷疄鏂囦欢鍚 + * @return + */ + public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException + { + String percentEncodedFileName = percentEncode(realFileName); + + StringBuilder contentDispositionValue = new StringBuilder(); + contentDispositionValue.append("attachment; filename=") + .append(percentEncodedFileName) + .append(";") + .append("filename*=") + .append("utf-8''") + .append(percentEncodedFileName); + + response.setHeader("Content-disposition", contentDispositionValue.toString()); + } + + /** + * 鐧惧垎鍙风紪鐮佸伐鍏锋柟娉 + * + * @param s 闇瑕佺櫨鍒嗗彿缂栫爜鐨勫瓧绗︿覆 + * @return 鐧惧垎鍙风紪鐮佸悗鐨勫瓧绗︿覆 + */ + public static String percentEncode(String s) throws UnsupportedEncodingException + { + String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); + return encode.replaceAll("\\+", "%20"); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/ImageUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/ImageUtils.java new file mode 100644 index 0000000..82e0adb --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/ImageUtils.java @@ -0,0 +1,86 @@ +package com.zhentao.common.core.utils.file; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 鍥剧墖澶勭悊宸ュ叿绫 + * + * @author ruoyi + */ +public class ImageUtils +{ + private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); + + public static byte[] getImage(String imagePath) + { + InputStream is = getFile(imagePath); + try + { + return IOUtils.toByteArray(is); + } + catch (Exception e) + { + log.error("鍥剧墖鍔犺浇寮傚父 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(is); + } + } + + public static InputStream getFile(String imagePath) + { + try + { + byte[] result = readFile(imagePath); + result = Arrays.copyOf(result, result.length); + return new ByteArrayInputStream(result); + } + catch (Exception e) + { + log.error("鑾峰彇鍥剧墖寮傚父 {}", e); + } + return null; + } + + /** + * 璇诲彇鏂囦欢涓哄瓧鑺傛暟鎹 + * + * @param key 鍦板潃 + * @return 瀛楄妭鏁版嵁 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + ByteArrayOutputStream baos = null; + try + { + // 缃戠粶鍦板潃 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("璁块棶鏂囦欢寮傚父 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(baos); + } + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/MimeTypeUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/MimeTypeUtils.java new file mode 100644 index 0000000..8cff3db --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/file/MimeTypeUtils.java @@ -0,0 +1,59 @@ +package com.zhentao.common.core.utils.file; + +/** + * 濯掍綋绫诲瀷宸ュ叿绫 + * + * @author ruoyi + */ +public class MimeTypeUtils +{ + public static final String IMAGE_PNG = "image/png"; + + public static final String IMAGE_JPG = "image/jpg"; + + public static final String IMAGE_JPEG = "image/jpeg"; + + public static final String IMAGE_BMP = "image/bmp"; + + public static final String IMAGE_GIF = "image/gif"; + + public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; + + public static final String[] FLASH_EXTENSION = { "swf", "flv" }; + + public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb" }; + + public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; + + public static final String[] DEFAULT_ALLOWED_EXTENSION = { + // 鍥剧墖 + "bmp", "gif", "jpg", "jpeg", "png", + // word excel powerpoint + "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", + // 鍘嬬缉鏂囦欢 + "rar", "zip", "gz", "bz2", + // 瑙嗛鏍煎紡 + "mp4", "avi", "rmvb", + // pdf + "pdf" }; + + public static String getExtension(String prefix) + { + switch (prefix) + { + case IMAGE_PNG: + return "png"; + case IMAGE_JPG: + return "jpg"; + case IMAGE_JPEG: + return "jpeg"; + case IMAGE_BMP: + return "bmp"; + case IMAGE_GIF: + return "gif"; + default: + return ""; + } + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ip/IpUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ip/IpUtils.java new file mode 100644 index 0000000..431b925 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/ip/IpUtils.java @@ -0,0 +1,204 @@ +package com.zhentao.common.core.utils.ip; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import javax.servlet.http.HttpServletRequest; +import com.zhentao.common.core.utils.StringUtils; + +/** + * 鑾峰彇IP鏂规硶 + * + * @author ruoyi + */ +public class IpUtils +{ + public static String getIpAddr(HttpServletRequest request) + { + String ip = null; + + // X-Forwarded-For锛歋quid 鏈嶅姟浠g悊 + String ipAddresses = request.getHeader("X-Forwarded-For"); + if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) + { + // Proxy-Client-IP锛歛pache 鏈嶅姟浠g悊 + ipAddresses = request.getHeader("Proxy-Client-IP"); + } + if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) + { + // WL-Proxy-Client-IP锛歸eblogic 鏈嶅姟浠g悊 + ipAddresses = request.getHeader("WL-Proxy-Client-IP"); + } + if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) + { + // HTTP_CLIENT_IP锛氭湁浜涗唬鐞嗘湇鍔″櫒 + ipAddresses = request.getHeader("HTTP_CLIENT_IP"); + } + if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) + { + // X-Real-IP锛歯ginx鏈嶅姟浠g悊 + ipAddresses = request.getHeader("X-Real-IP"); + } + + // 鏈変簺缃戠粶閫氳繃澶氬眰浠g悊锛岄偅涔堣幏鍙栧埌鐨刬p灏变細鏈夊涓紝涓鑸兘鏄氳繃閫楀彿锛,锛夊垎鍓插紑鏉ワ紝骞朵笖绗竴涓猧p涓哄鎴风鐨勭湡瀹濱P + if (ipAddresses != null && ipAddresses.length() != 0) + { + ip = ipAddresses.split(",")[0]; + } + + // 杩樻槸涓嶈兘鑾峰彇鍒帮紝鏈鍚庡啀閫氳繃request.getRemoteAddr();鑾峰彇 + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) + { + ip = request.getRemoteAddr(); + } + return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip; + } + + public static boolean internalIp(String ip) + { + byte[] addr = textToNumericFormatV4(ip); + return internalIp(addr) || "127.0.0.1".equals(ip); + } + + private static boolean internalIp(byte[] addr) + { + if (StringUtils.isNull(addr) || addr.length < 2) + { + return true; + } + final byte b0 = addr[0]; + final byte b1 = addr[1]; + // 10.x.x.x/8 + final byte SECTION_1 = 0x0A; + // 172.16.x.x/12 + final byte SECTION_2 = (byte) 0xAC; + final byte SECTION_3 = (byte) 0x10; + final byte SECTION_4 = (byte) 0x1F; + // 192.168.x.x/16 + final byte SECTION_5 = (byte) 0xC0; + final byte SECTION_6 = (byte) 0xA8; + switch (b0) + { + case SECTION_1: + return true; + case SECTION_2: + if (b1 >= SECTION_3 && b1 <= SECTION_4) + { + return true; + } + case SECTION_5: + switch (b1) + { + case SECTION_6: + return true; + } + default: + return false; + } + } + + /** + * 灏咺Pv4鍦板潃杞崲鎴愬瓧鑺 + * + * @param text IPv4鍦板潃 + * @return byte 瀛楄妭 + */ + public static byte[] textToNumericFormatV4(String text) + { + if (text.length() == 0) + { + return null; + } + + byte[] bytes = new byte[4]; + String[] elements = text.split("\\.", -1); + try + { + long l; + int i; + switch (elements.length) + { + case 1: + l = Long.parseLong(elements[0]); + if ((l < 0L) || (l > 4294967295L)){ + return null; + } + bytes[0] = (byte) (int) (l >> 24 & 0xFF); + bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 2: + l = Integer.parseInt(elements[0]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[0] = (byte) (int) (l & 0xFF); + l = Integer.parseInt(elements[1]); + if ((l < 0L) || (l > 16777215L)) { + return null; + } + bytes[1] = (byte) (int) (l >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 3: + for (i = 0; i < 2; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + l = Integer.parseInt(elements[2]); + if ((l < 0L) || (l > 65535L)) { + return null; + } + bytes[2] = (byte) (int) (l >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 4: + for (i = 0; i < 4; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + break; + default: + return null; + } + } + catch (NumberFormatException e) + { + return null; + } + return bytes; + } + + public static String getHostIp() + { + try + { + return InetAddress.getLocalHost().getHostAddress(); + } + catch (UnknownHostException e) + { + } + return "127.0.0.1"; + } + + public static String getHostName() + { + try + { + return InetAddress.getLocalHost().getHostName(); + } + catch (UnknownHostException e) + { + } + return "鏈煡"; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/poi/ExcelUtil.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/poi/ExcelUtil.java new file mode 100644 index 0000000..488200f --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/poi/ExcelUtil.java @@ -0,0 +1,1027 @@ +package com.zhentao.common.core.utils.poi; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.common.core.annotation.Excel; +import com.zhentao.common.core.annotation.Excels; +import com.zhentao.common.core.utils.reflect.ReflectUtils; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.ClientAnchor; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.zhentao.common.core.text.Convert; +import com.zhentao.common.core.utils.DateUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.utils.file.FileTypeUtils; +import com.zhentao.common.core.utils.file.ImageUtils; + +/** + * Excel鐩稿叧澶勭悊 + * + * @author ruoyi + */ +public class ExcelUtil +{ + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + /** + * Excel sheet鏈澶ц鏁帮紝榛樿65536 + */ + public static final int sheetSize = 65536; + + /** + * 宸ヤ綔琛ㄥ悕绉 + */ + private String sheetName; + + /** + * 瀵煎嚭绫诲瀷锛圗XPORT:瀵煎嚭鏁版嵁锛汭MPORT锛氬鍏ユā鏉匡級 + */ + private Excel.Type type; + + /** + * 宸ヤ綔钖勫璞 + */ + private Workbook wb; + + /** + * 宸ヤ綔琛ㄥ璞 + */ + private Sheet sheet; + + /** + * 鏍峰紡鍒楄〃 + */ + private Map styles; + + /** + * 瀵煎叆瀵煎嚭鏁版嵁鍒楄〃 + */ + private List list; + + /** + * 娉ㄨВ鍒楄〃 + */ + private List fields; + + /** + * 鏈澶ч珮搴 + */ + private short maxHeight; + + /** + * 缁熻鍒楄〃 + */ + private Map statistics = new HashMap(); + + /** + * 鏁板瓧鏍煎紡 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + + /** + * 瀹炰綋瀵硅薄 + */ + public Class clazz; + + public ExcelUtil(Class clazz) + { + this.clazz = clazz; + } + + public void init(List list, String sheetName, Excel.Type type) + { + if (list == null) + { + list = new ArrayList(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + createExcelField(); + createWorkbook(); + } + + /** + * 瀵筫xcel琛ㄥ崟榛樿绗竴涓储寮曞悕杞崲鎴恖ist + * + * @param is 杈撳叆娴 + * @return 杞崲鍚庨泦鍚 + */ + public List importExcel(InputStream is) throws Exception + { + return importExcel(StringUtils.EMPTY, is); + } + + /** + * 瀵筫xcel琛ㄥ崟鎸囧畾琛ㄦ牸绱㈠紩鍚嶈浆鎹㈡垚list + * + * @param sheetName 琛ㄦ牸绱㈠紩鍚 + * @param is 杈撳叆娴 + * @return 杞崲鍚庨泦鍚 + */ + public List importExcel(String sheetName, InputStream is) throws Exception + { + this.type = Excel.Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + Sheet sheet = null; + if (StringUtils.isNotEmpty(sheetName)) + { + // 濡傛灉鎸囧畾sheet鍚,鍒欏彇鎸囧畾sheet涓殑鍐呭. + sheet = wb.getSheet(sheetName); + } + else + { + // 濡傛灉浼犲叆鐨剆heet鍚嶄笉瀛樺湪鍒欓粯璁ゆ寚鍚戠1涓猻heet. + sheet = wb.getSheetAt(0); + } + + if (sheet == null) + { + throw new IOException("鏂囦欢sheet涓嶅瓨鍦"); + } + + int rows = sheet.getPhysicalNumberOfRows(); + + if (rows > 0) + { + // 瀹氫箟涓涓猰ap鐢ㄤ簬瀛樻斁excel鍒楃殑搴忓彿鍜宖ield. + Map cellMap = new HashMap(); + // 鑾峰彇琛ㄥご + Row heard = sheet.getRow(0); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) + { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) + { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } + else + { + cellMap.put(null, i); + } + } + // 鏈夋暟鎹椂鎵嶅鐞 寰楀埌绫荤殑鎵鏈塮ield. + Field[] allFields = clazz.getDeclaredFields(); + // 瀹氫箟涓涓猰ap鐢ㄤ簬瀛樻斁鍒楃殑搴忓彿鍜宖ield. + Map fieldsMap = new HashMap(); + for (int col = 0; col < allFields.length; col++) + { + Field field = allFields[col]; + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) + { + // 璁剧疆绫荤殑绉佹湁瀛楁灞炴у彲璁块棶. + field.setAccessible(true); + Integer column = cellMap.get(attr.name()); + if (column != null) + { + fieldsMap.put(column, field); + } + } + } + for (int i = 1; i < rows; i++) + { + // 浠庣2琛屽紑濮嬪彇鏁版嵁,榛樿绗竴琛屾槸琛ㄥご. + Row row = sheet.getRow(i); + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) + { + Object val = this.getCellValue(row, entry.getKey()); + + // 濡傛灉涓嶅瓨鍦ㄥ疄渚嬪垯鏂板缓. + entity = (entity == null ? clazz.newInstance() : entity); + // 浠巑ap涓緱鍒板搴斿垪鐨刦ield. + Field field = fieldsMap.get(entry.getKey()); + // 鍙栧緱绫诲瀷,骞舵牴鎹璞$被鍨嬭缃. + Class fieldType = field.getType(); + if (String.class == fieldType) + { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) + { + val = StringUtils.substringBefore(s, ".0"); + } + else + { + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) + { + val = DateUtils.parseDateToStr(dateFormat, (Date) val); + } + else + { + val = Convert.toStr(val); + } + } + } + else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toInt(val); + } + else if (Long.TYPE == fieldType || Long.class == fieldType) + { + val = Convert.toLong(val); + } + else if (Double.TYPE == fieldType || Double.class == fieldType) + { + val = Convert.toDouble(val); + } + else if (Float.TYPE == fieldType || Float.class == fieldType) + { + val = Convert.toFloat(val); + } + else if (BigDecimal.class == fieldType) + { + val = Convert.toBigDecimal(val); + } + else if (Date.class == fieldType) + { + if (val instanceof String) + { + val = DateUtils.parseDate(val); + } + else if (val instanceof Double) + { + val = DateUtil.getJavaDate((Double) val); + } + } + else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) + { + val = Convert.toBool(val, false); + } + if (StringUtils.isNotNull(fieldType)) + { + Excel attr = field.getAnnotation(Excel.class); + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) + { + propertyName = field.getName() + "." + attr.targetAttr(); + } + else if (StringUtils.isNotEmpty(attr.readConverterExp())) + { + val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @param response 杩斿洖鏁版嵁 + * @param list 瀵煎嚭鏁版嵁闆嗗悎 + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @return 缁撴灉 + * @throws IOException + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName) throws IOException + { + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + this.init(list, sheetName, Excel.Type.EXPORT); + exportExcel(response.getOutputStream()); + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @return 缁撴灉 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName) throws IOException + { + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + this.init(null, sheetName, Excel.Type.IMPORT); + exportExcel(response.getOutputStream()); + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @return 缁撴灉 + */ + public void exportExcel(OutputStream outputStream) + { + try + { + // 鍙栧嚭涓鍏辨湁澶氬皯涓猻heet. + double sheetNo = Math.ceil(list.size() / sheetSize); + for (int index = 0; index <= sheetNo; index++) + { + createSheet(sheetNo, index); + + // 浜х敓涓琛 + Row row = sheet.createRow(0); + int column = 0; + // 鍐欏叆鍚勪釜瀛楁鐨勫垪澶村悕绉 + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + this.createCell(excel, row, column++); + } + if (Excel.Type.EXPORT.equals(type)) + { + fillExcelData(index, row); + addStatisticsRow(); + } + } + wb.write(outputStream); + } + catch (Exception e) + { + log.error("瀵煎嚭Excel寮傚父{}", e.getMessage()); + } + finally + { + if (wb != null) + { + try + { + wb.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + if (outputStream != null) + { + try + { + outputStream.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + } + } + + /** + * 濉厖excel鏁版嵁 + * + * @param index 搴忓彿 + * @param row 鍗曞厓鏍艰 + */ + public void fillExcelData(int index, Row row) + { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + for (int i = startNo; i < endNo; i++) + { + row = sheet.createRow(i + 1 - startNo); + // 寰楀埌瀵煎嚭瀵硅薄. + T vo = (T) list.get(i); + int column = 0; + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + // 璁剧疆瀹炰綋绫荤鏈夊睘鎬у彲璁块棶 + field.setAccessible(true); + this.addCell(excel, row, vo, field, column++); + } + } + } + + /** + * 鍒涘缓琛ㄦ牸鏍峰紡 + * + * @param wb 宸ヤ綔钖勫璞 + * @return 鏍峰紡鍒楄〃 + */ + private Map createStyles(Workbook wb) + { + // 鍐欏叆鍚勬潯璁板綍,姣忔潯璁板綍瀵瑰簲excel琛ㄤ腑鐨勪竴琛 + Map styles = new HashMap(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(IndexedColors.WHITE.getIndex()); + style.setFont(headerFont); + styles.put("header", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short) 10); + style.setFont(totalFont); + styles.put("total", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.LEFT); + styles.put("data1", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + styles.put("data2", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.RIGHT); + styles.put("data3", style); + + return styles; + } + + /** + * 鍒涘缓鍗曞厓鏍 + */ + public Cell createCell(Excel attr, Row row, int column) + { + // 鍒涘缓鍒 + Cell cell = row.createCell(column); + // 鍐欏叆鍒椾俊鎭 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get("header")); + return cell; + } + + /** + * 璁剧疆鍗曞厓鏍间俊鎭 + * + * @param value 鍗曞厓鏍煎 + * @param attr 娉ㄨВ鐩稿叧 + * @param cell 鍗曞厓鏍间俊鎭 + */ + public void setCellVo(Object value, Excel attr, Cell cell) + { + if (Excel.ColumnType.STRING == attr.cellType()) + { + cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix()); + } + else if (Excel.ColumnType.NUMERIC == attr.cellType()) + { + cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + } + else if (Excel.ColumnType.IMAGE == attr.cellType()) + { + ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), + cell.getRow().getRowNum() + 1); + String imagePath = Convert.toStr(value); + if (StringUtils.isNotEmpty(imagePath)) + { + byte[] data = ImageUtils.getImage(imagePath); + getDrawingPatriarch(cell.getSheet()).createPicture(anchor, + cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + } + } + } + + /** + * 鑾峰彇鐢诲竷 + */ + public static Drawing getDrawingPatriarch(Sheet sheet) + { + if (sheet.getDrawingPatriarch() == null) + { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } + + /** + * 鑾峰彇鍥剧墖绫诲瀷,璁剧疆鍥剧墖鎻掑叆绫诲瀷 + */ + public int getImageType(byte[] value) + { + String type = FileTypeUtils.getFileExtendName(value); + if ("JPG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_JPEG; + } + else if ("PNG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_PNG; + } + return Workbook.PICTURE_TYPE_JPEG; + } + + /** + * 鍒涘缓琛ㄦ牸鏍峰紡 + */ + public void setDataValidation(Excel attr, Row row, int column) + { + if (attr.name().indexOf("娉細") >= 0) + { + sheet.setColumnWidth(column, 6000); + } + else + { + // 璁剧疆鍒楀 + sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); + } + // 濡傛灉璁剧疆浜嗘彁绀轰俊鎭垯榧犳爣鏀句笂鍘绘彁绀. + if (StringUtils.isNotEmpty(attr.prompt())) + { + // 杩欓噷榛樿璁句簡2-101鍒楁彁绀. + setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column); + } + // 濡傛灉璁剧疆浜哻ombo灞炴у垯鏈垪鍙兘閫夋嫨涓嶈兘杈撳叆 + if (attr.combo().length > 0) + { + // 杩欓噷榛樿璁句簡2-101鍒楀彧鑳介夋嫨涓嶈兘杈撳叆. + setXSSFValidation(sheet, attr.combo(), 1, 100, column, column); + } + } + + /** + * 娣诲姞鍗曞厓鏍 + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) + { + Cell cell = null; + try + { + // 璁剧疆琛岄珮 + row.setHeight(maxHeight); + // 鏍规嵁Excel涓缃儏鍐靛喅瀹氭槸鍚﹀鍑,鏈変簺鎯呭喌闇瑕佷繚鎸佷负绌,甯屾湜鐢ㄦ埛濉啓杩欎竴鍒. + if (attr.isExport()) + { + // 鍒涘缓cell + cell = row.createCell(column); + int align = attr.align().value(); + cell.setCellStyle(styles.get("data" + (align >= 1 && align <= 3 ? align : ""))); + + // 鐢ㄤ簬璇诲彇瀵硅薄涓殑灞炴 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + String separator = attr.separator(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) + { + cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value)); + } + else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) + { + cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); + } + else if (value instanceof BigDecimal && -1 != attr.scale()) + { + cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).toString()); + } + else + { + // 璁剧疆鍒楃被鍨 + setCellVo(value, attr, cell); + } + addStatisticsData(column, Convert.toStr(value), attr); + } + } + catch (Exception e) + { + log.error("瀵煎嚭Excel澶辫触{}", e); + } + return cell; + } + + /** + * 璁剧疆 POI XSSFSheet 鍗曞厓鏍兼彁绀 + * + * @param sheet 琛ㄥ崟 + * @param promptTitle 鎻愮ず鏍囬 + * @param promptContent 鎻愮ず鍐呭 + * @param firstRow 寮濮嬭 + * @param endRow 缁撴潫琛 + * @param firstCol 寮濮嬪垪 + * @param endCol 缁撴潫鍒 + */ + public void setXSSFPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + dataValidation.createPromptBox(promptTitle, promptContent); + dataValidation.setShowPromptBox(true); + sheet.addValidationData(dataValidation); + } + + /** + * 璁剧疆鏌愪簺鍒楃殑鍊煎彧鑳借緭鍏ラ鍒剁殑鏁版嵁,鏄剧ず涓嬫媺妗. + * + * @param sheet 瑕佽缃殑sheet. + * @param textlist 涓嬫媺妗嗘樉绀虹殑鍐呭 + * @param firstRow 寮濮嬭 + * @param endRow 缁撴潫琛 + * @param firstCol 寮濮嬪垪 + * @param endCol 缁撴潫鍒 + * @return 璁剧疆濂界殑sheet. + */ + public void setXSSFValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 鍔犺浇涓嬫媺鍒楄〃鍐呭 + DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist); + // 璁剧疆鏁版嵁鏈夋晥鎬у姞杞藉湪鍝釜鍗曞厓鏍间笂,鍥涗釜鍙傛暟鍒嗗埆鏄細璧峰琛屻佺粓姝㈣銆佽捣濮嬪垪銆佺粓姝㈠垪 + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // 鏁版嵁鏈夋晥鎬у璞 + DataValidation dataValidation = helper.createValidation(constraint, regions); + // 澶勭悊Excel鍏煎鎬ч棶棰 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + } + + /** + * 瑙f瀽瀵煎嚭鍊 0=鐢,1=濂,2=鏈煡 + * + * @param propertyValue 鍙傛暟鍊 + * @param converterExp 缈昏瘧娉ㄨВ + * @param separator 鍒嗛殧绗 + * @return 瑙f瀽鍚庡 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(separator, propertyValue)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[0].equals(value)) + { + propertyString.append(itemArray[1] + separator); + break; + } + } + } + else + { + if (itemArray[0].equals(propertyValue)) + { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 鍙嶅悜瑙f瀽鍊 鐢=0,濂=1,鏈煡=2 + * + * @param propertyValue 鍙傛暟鍊 + * @param converterExp 缈昏瘧娉ㄨВ + * @param separator 鍒嗛殧绗 + * @return 瑙f瀽鍚庡 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(separator, propertyValue)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[1].equals(value)) + { + propertyString.append(itemArray[0] + separator); + break; + } + } + } + else + { + if (itemArray[1].equals(propertyValue)) + { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 鍚堣缁熻淇℃伅 + */ + private void addStatisticsData(Integer index, String text, Excel entity) + { + if (entity != null && entity.isStatistics()) + { + Double temp = 0D; + if (!statistics.containsKey(index)) + { + statistics.put(index, temp); + } + try + { + temp = Double.valueOf(text); + } + catch (NumberFormatException e) + { + } + statistics.put(index, statistics.get(index) + temp); + } + } + + /** + * 鍒涘缓缁熻琛 + */ + public void addStatisticsRow() + { + if (statistics.size() > 0) + { + Cell cell = null; + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + cell = row.createCell(0); + cell.setCellStyle(styles.get("total")); + cell.setCellValue("鍚堣"); + + for (Integer key : keys) + { + cell = row.createCell(key); + cell.setCellStyle(styles.get("total")); + cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); + } + statistics.clear(); + } + } + + /** + * 鑾峰彇bean涓殑灞炴у + * + * @param vo 瀹炰綋瀵硅薄 + * @param field 瀛楁 + * @param excel 娉ㄨВ + * @return 鏈缁堢殑灞炴у + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception + { + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) + { + String target = excel.targetAttr(); + if (target.indexOf(".") > -1) + { + String[] targets = target.split("[.]"); + for (String name : targets) + { + o = getValue(o, name); + } + } + else + { + o = getValue(o, target); + } + } + return o; + } + + /** + * 浠ョ被鐨勫睘鎬х殑get鏂规硶鏂规硶褰㈠紡鑾峰彇鍊 + * + * @param o + * @param name + * @return value + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception + { + if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) + { + Class clazz = o.getClass(); + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + o = field.get(o); + } + return o; + } + + /** + * 寰楀埌鎵鏈夊畾涔夊瓧娈 + */ + private void createExcelField() + { + this.fields = new ArrayList(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) + { + // 鍗曟敞瑙 + if (field.isAnnotationPresent(Excel.class)) + { + putToField(field, field.getAnnotation(Excel.class)); + } + + // 澶氭敞瑙 + if (field.isAnnotationPresent(Excels.class)) + { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel excel : excels) + { + putToField(field, excel); + } + } + } + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + this.maxHeight = getRowHeight(); + } + + /** + * 鏍规嵁娉ㄨВ鑾峰彇鏈澶ц楂 + */ + public short getRowHeight() + { + double maxHeight = 0; + for (Object[] os : this.fields) + { + Excel excel = (Excel) os[1]; + maxHeight = maxHeight > excel.height() ? maxHeight : excel.height(); + } + return (short) (maxHeight * 20); + } + + /** + * 鏀惧埌瀛楁闆嗗悎涓 + */ + private void putToField(Field field, Excel attr) + { + if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) + { + this.fields.add(new Object[] { field, attr }); + } + } + + /** + * 鍒涘缓涓涓伐浣滅翱 + */ + public void createWorkbook() + { + this.wb = new SXSSFWorkbook(500); + } + + /** + * 鍒涘缓宸ヤ綔琛 + * + * @param sheetNo sheet鏁伴噺 + * @param index 搴忓彿 + */ + public void createSheet(double sheetNo, int index) + { + this.sheet = wb.createSheet(); + this.styles = createStyles(wb); + // 璁剧疆宸ヤ綔琛ㄧ殑鍚嶇О. + if (sheetNo == 0) + { + wb.setSheetName(index, sheetName); + } + else + { + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 鑾峰彇鍗曞厓鏍煎 + * + * @param row 鑾峰彇鐨勮 + * @param column 鑾峰彇鍗曞厓鏍煎垪鍙 + * @return 鍗曞厓鏍煎 + */ + public Object getCellValue(Row row, int column) + { + if (row == null) + { + return row; + } + Object val = ""; + try + { + Cell cell = row.getCell(column); + if (StringUtils.isNotNull(cell)) + { + if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) + { + val = cell.getNumericCellValue(); + if (DateUtil.isCellDateFormatted(cell)) + { + val = DateUtil.getJavaDate((Double) val); // POI Excel 鏃ユ湡鏍煎紡杞崲 + } + else + { + if ((Double) val % 1 != 0) + { + val = new BigDecimal(val.toString()); + } + else + { + val = new DecimalFormat("0").format(val); + } + } + } + else if (cell.getCellType() == CellType.STRING) + { + val = cell.getStringCellValue(); + } + else if (cell.getCellType() == CellType.BOOLEAN) + { + val = cell.getBooleanCellValue(); + } + else if (cell.getCellType() == CellType.ERROR) + { + val = cell.getErrorCellValue(); + } + + } + } + catch (Exception e) + { + return val; + } + return val; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/reflect/ReflectUtils.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/reflect/ReflectUtils.java new file mode 100644 index 0000000..f7704fb --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/reflect/ReflectUtils.java @@ -0,0 +1,410 @@ +package com.zhentao.common.core.utils.reflect; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Date; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.zhentao.common.core.text.Convert; +import com.zhentao.common.core.utils.DateUtils; + +/** + * 鍙嶅皠宸ュ叿绫. 鎻愪緵璋冪敤getter/setter鏂规硶, 璁块棶绉佹湁鍙橀噺, 璋冪敤绉佹湁鏂规硶, 鑾峰彇娉涘瀷绫诲瀷Class, 琚獳OP杩囩殑鐪熷疄绫荤瓑宸ュ叿鍑芥暟. + * + * @author ruoyi + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils +{ + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 璋冪敤Getter鏂规硶. + * 鏀寔澶氱骇锛屽锛氬璞″悕.瀵硅薄鍚.鏂规硶 + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) + { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + return (E) object; + } + + /** + * 璋冪敤Setter鏂规硶, 浠呭尮閰嶆柟娉曞悕銆 + * 鏀寔澶氱骇锛屽锛氬璞″悕.瀵硅薄鍚.鏂规硶 + */ + public static void invokeSetter(Object obj, String propertyName, E value) + { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) + { + if (i < names.length - 1) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + else + { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[] { value }); + } + } + } + + /** + * 鐩存帴璇诲彇瀵硅薄灞炴у, 鏃犺private/protected淇グ绗, 涓嶇粡杩噂etter鍑芥暟. + */ + @SuppressWarnings("unchecked") + public static E getFieldValue(final Object obj, final String fieldName) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + logger.debug("鍦 [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + fieldName + "] 瀛楁 "); + return null; + } + E result = null; + try + { + result = (E) field.get(obj); + } + catch (IllegalAccessException e) + { + logger.error("涓嶅彲鑳芥姏鍑虹殑寮傚父{}", e.getMessage()); + } + return result; + } + + /** + * 鐩存帴璁剧疆瀵硅薄灞炴у, 鏃犺private/protected淇グ绗, 涓嶇粡杩噑etter鍑芥暟. + */ + public static void setFieldValue(final Object obj, final String fieldName, final E value) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + // throw new IllegalArgumentException("鍦 [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + fieldName + "] 瀛楁 "); + logger.debug("鍦 [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + fieldName + "] 瀛楁 "); + return; + } + try + { + field.set(obj, value); + } + catch (IllegalAccessException e) + { + logger.error("涓嶅彲鑳芥姏鍑虹殑寮傚父: {}", e.getMessage()); + } + } + + /** + * 鐩存帴璋冪敤瀵硅薄鏂规硶, 鏃犺private/protected淇グ绗. + * 鐢ㄤ簬涓娆℃ц皟鐢ㄧ殑鎯呭喌锛屽惁鍒欏簲浣跨敤getAccessibleMethod()鍑芥暟鑾峰緱Method鍚庡弽澶嶈皟鐢. + * 鍚屾椂鍖归厤鏂规硶鍚+鍙傛暟绫诲瀷锛 + */ + @SuppressWarnings("unchecked") + public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, + final Object[] args) + { + if (obj == null || methodName == null) + { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) + { + logger.debug("鍦 [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + methodName + "] 鏂规硶 "); + return null; + } + try + { + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 鐩存帴璋冪敤瀵硅薄鏂规硶, 鏃犺private/protected淇グ绗︼紝 + * 鐢ㄤ簬涓娆℃ц皟鐢ㄧ殑鎯呭喌锛屽惁鍒欏簲浣跨敤getAccessibleMethodByName()鍑芥暟鑾峰緱Method鍚庡弽澶嶈皟鐢. + * 鍙尮閰嶅嚱鏁板悕锛屽鏋滄湁澶氫釜鍚屽悕鍑芥暟璋冪敤绗竴涓 + */ + @SuppressWarnings("unchecked") + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) + { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) + { + // 濡傛灉涓虹┖涓嶆姤閿欙紝鐩存帴杩斿洖绌恒 + logger.debug("鍦 [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + methodName + "] 鏂规硶 "); + return null; + } + try + { + // 绫诲瀷杞崲锛堝皢鍙傛暟鏁版嵁绫诲瀷杞崲涓虹洰鏍囨柟娉曞弬鏁扮被鍨嬶級 + Class[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) + { + if (args[i] != null && !args[i].getClass().equals(cs[i])) + { + if (cs[i] == String.class) + { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) + { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } + else if (cs[i] == Integer.class) + { + args[i] = Convert.toInt(args[i]); + } + else if (cs[i] == Long.class) + { + args[i] = Convert.toLong(args[i]); + } + else if (cs[i] == Double.class) + { + args[i] = Convert.toDouble(args[i]); + } + else if (cs[i] == Float.class) + { + args[i] = Convert.toFloat(args[i]); + } + else if (cs[i] == Date.class) + { + if (args[i] instanceof String) + { + args[i] = DateUtils.parseDate(args[i]); + } + else + { + args[i] = DateUtil.getJavaDate((Double) args[i]); + } + } + else if (cs[i] == boolean.class || cs[i] == Boolean.class) + { + args[i] = Convert.toBool(args[i]); + } + } + } + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 寰幆鍚戜笂杞瀷, 鑾峰彇瀵硅薄鐨凞eclaredField, 骞跺己鍒惰缃负鍙闂. + * 濡傚悜涓婅浆鍨嬪埌Object浠嶆棤娉曟壘鍒, 杩斿洖null. + */ + public static Field getAccessibleField(final Object obj, final String fieldName) + { + // 涓虹┖涓嶆姤閿欍傜洿鎺ヨ繑鍥 null + if (obj == null) + { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) + { + try + { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } + catch (NoSuchFieldException e) + { + continue; + } + } + return null; + } + + /** + * 寰幆鍚戜笂杞瀷, 鑾峰彇瀵硅薄鐨凞eclaredMethod,骞跺己鍒惰缃负鍙闂. + * 濡傚悜涓婅浆鍨嬪埌Object浠嶆棤娉曟壘鍒, 杩斿洖null. + * 鍖归厤鍑芥暟鍚+鍙傛暟绫诲瀷銆 + * 鐢ㄤ簬鏂规硶闇瑕佽澶氭璋冪敤鐨勬儏鍐. 鍏堜娇鐢ㄦ湰鍑芥暟鍏堝彇寰桵ethod,鐒跺悗璋冪敤Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class... parameterTypes) + { + // 涓虹┖涓嶆姤閿欍傜洿鎺ヨ繑鍥 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + try + { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } + catch (NoSuchMethodException e) + { + continue; + } + } + return null; + } + + /** + * 寰幆鍚戜笂杞瀷, 鑾峰彇瀵硅薄鐨凞eclaredMethod,骞跺己鍒惰缃负鍙闂. + * 濡傚悜涓婅浆鍨嬪埌Object浠嶆棤娉曟壘鍒, 杩斿洖null. + * 鍙尮閰嶅嚱鏁板悕銆 + * 鐢ㄤ簬鏂规硶闇瑕佽澶氭璋冪敤鐨勬儏鍐. 鍏堜娇鐢ㄦ湰鍑芥暟鍏堝彇寰桵ethod,鐒跺悗璋冪敤Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) + { + // 涓虹┖涓嶆姤閿欍傜洿鎺ヨ繑鍥 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) + { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) + { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 鏀瑰彉private/protected鐨勬柟娉曚负public锛屽敖閲忎笉璋冪敤瀹為檯鏀瑰姩鐨勮鍙ワ紝閬垮厤JDK鐨凷ecurityManager鎶辨ㄣ + */ + public static void makeAccessible(Method method) + { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) + { + method.setAccessible(true); + } + } + + /** + * 鏀瑰彉private/protected鐨勬垚鍛樺彉閲忎负public锛屽敖閲忎笉璋冪敤瀹為檯鏀瑰姩鐨勮鍙ワ紝閬垮厤JDK鐨凷ecurityManager鎶辨ㄣ + */ + public static void makeAccessible(Field field) + { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) + { + field.setAccessible(true); + } + } + + /** + * 閫氳繃鍙嶅皠, 鑾峰緱Class瀹氫箟涓0鏄庣殑娉涘瀷鍙傛暟鐨勭被鍨, 娉ㄦ剰娉涘瀷蹇呴』瀹氫箟鍦ㄧ埗绫诲 + * 濡傛棤娉曟壘鍒, 杩斿洖Object.class. + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) + { + return getClassGenricType(clazz, 0); + } + + /** + * 閫氳繃鍙嶅皠, 鑾峰緱Class瀹氫箟涓0鏄庣殑鐖剁被鐨勬硾鍨嬪弬鏁扮殑绫诲瀷. + * 濡傛棤娉曟壘鍒, 杩斿洖Object.class. + */ + public static Class getClassGenricType(final Class clazz, final int index) + { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) + { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) + { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) + { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + public static Class getUserClass(Object instance) + { + if (instance == null) + { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) + { + Class superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) + { + return superClass; + } + } + return clazz; + + } + + /** + * 灏嗗弽灏勬椂鐨刢hecked exception杞崲涓簎nchecked exception. + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) + { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) + { + return new IllegalArgumentException(msg, e); + } + else if (e instanceof InvocationTargetException) + { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/sign/Base64.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/sign/Base64.java new file mode 100644 index 0000000..80e9a96 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/sign/Base64.java @@ -0,0 +1,291 @@ +package com.zhentao.common.core.utils.sign; + +/** + * Base64宸ュ叿绫 + * + * @author ruoyi + */ +public final class Base64 +{ + static private final int BASELENGTH = 128; + static private final int LOOKUPLENGTH = 64; + static private final int TWENTYFOURBITGROUP = 24; + static private final int EIGHTBIT = 8; + static private final int SIXTEENBIT = 16; + static private final int FOURBYTE = 4; + static private final int SIGN = -128; + static private final char PAD = '='; + static final private byte[] base64Alphabet = new byte[BASELENGTH]; + static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; + + static + { + for (int i = 0; i < BASELENGTH; ++i) + { + base64Alphabet[i] = -1; + } + for (int i = 'Z'; i >= 'A'; i--) + { + base64Alphabet[i] = (byte) (i - 'A'); + } + for (int i = 'z'; i >= 'a'; i--) + { + base64Alphabet[i] = (byte) (i - 'a' + 26); + } + + for (int i = '9'; i >= '0'; i--) + { + base64Alphabet[i] = (byte) (i - '0' + 52); + } + + base64Alphabet['+'] = 62; + base64Alphabet['/'] = 63; + + for (int i = 0; i <= 25; i++) + { + lookUpBase64Alphabet[i] = (char) ('A' + i); + } + + for (int i = 26, j = 0; i <= 51; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('a' + j); + } + + for (int i = 52, j = 0; i <= 61; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('0' + j); + } + lookUpBase64Alphabet[62] = (char) '+'; + lookUpBase64Alphabet[63] = (char) '/'; + } + + private static boolean isWhiteSpace(char octect) + { + return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); + } + + private static boolean isPad(char octect) + { + return (octect == PAD); + } + + private static boolean isData(char octect) + { + return (octect < BASELENGTH && base64Alphabet[octect] != -1); + } + + /** + * Encodes hex octects into Base64 + * + * @param binaryData Array containing binaryData + * @return Encoded Base64 array + */ + public static String encode(byte[] binaryData) + { + if (binaryData == null) + { + return null; + } + + int lengthDataBits = binaryData.length * EIGHTBIT; + if (lengthDataBits == 0) + { + return ""; + } + + int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; + int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; + int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets; + char encodedData[] = null; + + encodedData = new char[numberQuartet * 4]; + + byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; + + int encodedIndex = 0; + int dataIndex = 0; + + for (int i = 0; i < numberTriplets; i++) + { + b1 = binaryData[dataIndex++]; + b2 = binaryData[dataIndex++]; + b3 = binaryData[dataIndex++]; + + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; + } + + // form integral number of 6-bit groups + if (fewerThan24bits == EIGHTBIT) + { + b1 = binaryData[dataIndex]; + k = (byte) (b1 & 0x03); + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; + encodedData[encodedIndex++] = PAD; + encodedData[encodedIndex++] = PAD; + } + else if (fewerThan24bits == SIXTEENBIT) + { + b1 = binaryData[dataIndex]; + b2 = binaryData[dataIndex + 1]; + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; + encodedData[encodedIndex++] = PAD; + } + return new String(encodedData); + } + + /** + * Decodes Base64 data into octects + * + * @param encoded string containing Base64 data + * @return Array containind decoded data. + */ + public static byte[] decode(String encoded) + { + if (encoded == null) + { + return null; + } + + char[] base64Data = encoded.toCharArray(); + // remove white spaces + int len = removeWhiteSpace(base64Data); + + if (len % FOURBYTE != 0) + { + return null;// should be divisible by four + } + + int numberQuadruple = (len / FOURBYTE); + + if (numberQuadruple == 0) + { + return new byte[0]; + } + + byte decodedData[] = null; + byte b1 = 0, b2 = 0, b3 = 0, b4 = 0; + char d1 = 0, d2 = 0, d3 = 0, d4 = 0; + + int i = 0; + int encodedIndex = 0; + int dataIndex = 0; + decodedData = new byte[(numberQuadruple) * 3]; + + for (; i < numberQuadruple - 1; i++) + { + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])) + || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) + { + return null; + } // if found "no data" just return null + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + } + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) + { + return null;// if found "no data" just return null + } + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + + d3 = base64Data[dataIndex++]; + d4 = base64Data[dataIndex++]; + if (!isData((d3)) || !isData((d4))) + {// Check if they are PAD characters + if (isPad(d3) && isPad(d4)) + { + if ((b2 & 0xf) != 0)// last 4 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 1]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + return tmp; + } + else if (!isPad(d3) && isPad(d4)) + { + b3 = base64Alphabet[d3]; + if ((b3 & 0x3) != 0)// last 2 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 2]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + return tmp; + } + else + { + return null; + } + } + else + { // No PAD e.g 3cQl + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + + } + return decodedData; + } + + /** + * remove WhiteSpace from MIME containing encoded Base64 data. + * + * @param data the byte array of base64 data (with WS) + * @return the new length + */ + private static int removeWhiteSpace(char[] data) + { + if (data == null) + { + return 0; + } + + // count characters that's not whitespace + int newSize = 0; + int len = data.length; + for (int i = 0; i < len; i++) + { + if (!isWhiteSpace(data[i])) + { + data[newSize++] = data[i]; + } + } + return newSize; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/sql/SqlUtil.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/sql/SqlUtil.java new file mode 100644 index 0000000..785816a --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/utils/sql/SqlUtil.java @@ -0,0 +1,37 @@ +package com.zhentao.common.core.utils.sql; + +import com.zhentao.common.core.exception.BaseException; +import com.zhentao.common.core.utils.StringUtils; + +/** + * sql鎿嶄綔宸ュ叿绫 + * + * @author ruoyi + */ +public class SqlUtil +{ + /** + * 浠呮敮鎸佸瓧姣嶃佹暟瀛椼佷笅鍒掔嚎銆佺┖鏍笺侀楀彿銆佸皬鏁扮偣锛堟敮鎸佸涓瓧娈垫帓搴忥級 + */ + public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 妫鏌ュ瓧绗︼紝闃叉娉ㄥ叆缁曡繃 + */ + public static String escapeOrderBySql(String value) + { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) + { + throw new BaseException("鍙傛暟涓嶇鍚堣鑼冿紝涓嶈兘杩涜鏌ヨ"); + } + return value; + } + + /** + * 楠岃瘉 order by 璇硶鏄惁绗﹀悎瑙勮寖 + */ + public static boolean isValidOrderBySql(String value) + { + return value.matches(SQL_PATTERN); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/controller/BaseController.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/controller/BaseController.java new file mode 100644 index 0000000..51d7c21 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/controller/BaseController.java @@ -0,0 +1,88 @@ +package com.zhentao.common.core.web.controller; + +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; + +import com.zhentao.common.core.constant.HttpStatus; +import com.zhentao.common.core.utils.DateUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.utils.sql.SqlUtil; +import com.zhentao.common.core.web.domain.AjaxResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.zhentao.common.core.web.page.PageDomain; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.core.web.page.TableSupport; + +/** + * web灞傞氱敤鏁版嵁澶勭悊 + * + * @author ruoyi + */ +public class BaseController +{ + protected final Logger logger = LoggerFactory.getLogger(BaseController.class); + + /** + * 灏嗗墠鍙颁紶閫掕繃鏉ョ殑鏃ユ湡鏍煎紡鐨勫瓧绗︿覆锛岃嚜鍔ㄨ浆鍖栦负Date绫诲瀷 + */ + @InitBinder + public void initBinder(WebDataBinder binder) + { + // Date 绫诲瀷杞崲 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() + { + @Override + public void setAsText(String text) + { + setValue(DateUtils.parseDate(text)); + } + }); + } + + /** + * 璁剧疆璇锋眰鍒嗛〉鏁版嵁 + */ + protected void startPage() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) + { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + PageHelper.startPage(pageNum, pageSize, orderBy); + } + } + + /** + * 鍝嶅簲璇锋眰鍒嗛〉鏁版嵁 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTable(List list) + { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setRows(list); + rspData.setMsg("鏌ヨ鎴愬姛"); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + + /** + * 鍝嶅簲杩斿洖缁撴灉 + * + * @param rows 褰卞搷琛屾暟 + * @return 鎿嶄綔缁撴灉 + */ + protected AjaxResult toAjax(int rows) + { + return rows > 0 ? AjaxResult.success() : AjaxResult.error(); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/AjaxResult.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/AjaxResult.java new file mode 100644 index 0000000..03a0716 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/AjaxResult.java @@ -0,0 +1,162 @@ +package com.zhentao.common.core.web.domain; + +import java.util.HashMap; +import com.zhentao.common.core.constant.HttpStatus; +import com.zhentao.common.core.utils.StringUtils; + +/** + * 鎿嶄綔娑堟伅鎻愰啋 + * + * @author ruoyi + */ +public class AjaxResult extends HashMap +{ + private static final long serialVersionUID = 1L; + + /** 鐘舵佺爜 */ + public static final String CODE_TAG = "code"; + + /** 杩斿洖鍐呭 */ + public static final String MSG_TAG = "msg"; + + /** 鏁版嵁瀵硅薄 */ + public static final String DATA_TAG = "data"; + + /** + * 鍒濆鍖栦竴涓柊鍒涘缓鐨 AjaxResult 瀵硅薄锛屼娇鍏惰〃绀轰竴涓┖娑堟伅銆 + */ + public AjaxResult() + { + } + + /** + * 鍒濆鍖栦竴涓柊鍒涘缓鐨 AjaxResult 瀵硅薄 + * + * @param code 鐘舵佺爜 + * @param msg 杩斿洖鍐呭 + */ + public AjaxResult(int code, String msg) + { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + } + + /** + * 鍒濆鍖栦竴涓柊鍒涘缓鐨 AjaxResult 瀵硅薄 + * + * @param code 鐘舵佺爜 + * @param msg 杩斿洖鍐呭 + * @param data 鏁版嵁瀵硅薄 + */ + public AjaxResult(int code, String msg, Object data) + { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + if (StringUtils.isNotNull(data)) + { + super.put(DATA_TAG, data); + } + } + + /** + * 鏂逛究閾惧紡璋冪敤 + * + * @param key + * @param value + * @return + */ + @Override + public AjaxResult put(String key, Object value) + { + super.put(key, value); + return this; + } + + /** + * 杩斿洖鎴愬姛娑堟伅 + * + * @return 鎴愬姛娑堟伅 + */ + public static AjaxResult success() + { + return AjaxResult.success("鎿嶄綔鎴愬姛"); + } + + /** + * 杩斿洖鎴愬姛鏁版嵁 + * + * @return 鎴愬姛娑堟伅 + */ + public static AjaxResult success(Object data) + { + return AjaxResult.success("鎿嶄綔鎴愬姛", data); + } + + /** + * 杩斿洖鎴愬姛娑堟伅 + * + * @param msg 杩斿洖鍐呭 + * @return 鎴愬姛娑堟伅 + */ + public static AjaxResult success(String msg) + { + return AjaxResult.success(msg, null); + } + + /** + * 杩斿洖鎴愬姛娑堟伅 + * + * @param msg 杩斿洖鍐呭 + * @param data 鏁版嵁瀵硅薄 + * @return 鎴愬姛娑堟伅 + */ + public static AjaxResult success(String msg, Object data) + { + return new AjaxResult(HttpStatus.SUCCESS, msg, data); + } + + /** + * 杩斿洖閿欒娑堟伅 + * + * @return + */ + public static AjaxResult error() + { + return AjaxResult.error("鎿嶄綔澶辫触"); + } + + /** + * 杩斿洖閿欒娑堟伅 + * + * @param msg 杩斿洖鍐呭 + * @return 璀﹀憡娑堟伅 + */ + public static AjaxResult error(String msg) + { + return AjaxResult.error(msg, null); + } + + /** + * 杩斿洖閿欒娑堟伅 + * + * @param msg 杩斿洖鍐呭 + * @param data 鏁版嵁瀵硅薄 + * @return 璀﹀憡娑堟伅 + */ + public static AjaxResult error(String msg, Object data) + { + return new AjaxResult(HttpStatus.ERROR, msg, data); + } + + /** + * 杩斿洖閿欒娑堟伅 + * + * @param code 鐘舵佺爜 + * @param msg 杩斿洖鍐呭 + * @return 璀﹀憡娑堟伅 + */ + public static AjaxResult error(int code, String msg) + { + return new AjaxResult(code, msg, null); + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/BaseEntity.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/BaseEntity.java new file mode 100644 index 0000000..3bbe0f4 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/BaseEntity.java @@ -0,0 +1,114 @@ +package com.zhentao.common.core.web.domain; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * Entity鍩虹被 + * + * @author ruoyi + */ +public class BaseEntity implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 鎼滅储鍊 */ + private String searchValue; + + /** 鍒涘缓鑰 */ + private String createBy; + + /** 鍒涘缓鏃堕棿 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** 鏇存柊鑰 */ + private String updateBy; + + /** 鏇存柊鏃堕棿 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** 澶囨敞 */ + private String remark; + + /** 璇锋眰鍙傛暟 */ + private Map params; + + public String getSearchValue() + { + return searchValue; + } + + public void setSearchValue(String searchValue) + { + this.searchValue = searchValue; + } + + public String getCreateBy() + { + return createBy; + } + + public void setCreateBy(String createBy) + { + this.createBy = createBy; + } + + public Date getCreateTime() + { + return createTime; + } + + public void setCreateTime(Date createTime) + { + this.createTime = createTime; + } + + public String getUpdateBy() + { + return updateBy; + } + + public void setUpdateBy(String updateBy) + { + this.updateBy = updateBy; + } + + public Date getUpdateTime() + { + return updateTime; + } + + public void setUpdateTime(Date updateTime) + { + this.updateTime = updateTime; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } + + public Map getParams() + { + if (params == null) + { + params = new HashMap<>(); + } + return params; + } + + public void setParams(Map params) + { + this.params = params; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/TreeEntity.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/TreeEntity.java new file mode 100644 index 0000000..fd0c245 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/domain/TreeEntity.java @@ -0,0 +1,79 @@ +package com.zhentao.common.core.web.domain; + +import java.util.ArrayList; +import java.util.List; + +/** + * Tree鍩虹被 + * + * @author ruoyi + */ +public class TreeEntity extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 鐖惰彍鍗曞悕绉 */ + private String parentName; + + /** 鐖惰彍鍗旾D */ + private Long parentId; + + /** 鏄剧ず椤哄簭 */ + private Integer orderNum; + + /** 绁栫骇鍒楄〃 */ + private String ancestors; + + /** 瀛愰儴闂 */ + private List children = new ArrayList<>(); + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + public String getAncestors() + { + return ancestors; + } + + public void setAncestors(String ancestors) + { + this.ancestors = ancestors; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/PageDomain.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/PageDomain.java new file mode 100644 index 0000000..a01bac3 --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/PageDomain.java @@ -0,0 +1,72 @@ +package com.zhentao.common.core.web.page; + +import com.zhentao.common.core.utils.StringUtils; + +/** + * 鍒嗛〉鏁版嵁 + * + * @author ruoyi + */ +public class PageDomain +{ + /** 褰撳墠璁板綍璧峰绱㈠紩 */ + private Integer pageNum; + + /** 姣忛〉鏄剧ず璁板綍鏁 */ + private Integer pageSize; + + /** 鎺掑簭鍒 */ + private String orderByColumn; + + /** 鎺掑簭鐨勬柟鍚慸esc鎴栬卆sc */ + private String isAsc = "asc"; + + public String getOrderBy() + { + if (StringUtils.isEmpty(orderByColumn)) + { + return ""; + } + return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; + } + + public Integer getPageNum() + { + return pageNum; + } + + public void setPageNum(Integer pageNum) + { + this.pageNum = pageNum; + } + + public Integer getPageSize() + { + return pageSize; + } + + public void setPageSize(Integer pageSize) + { + this.pageSize = pageSize; + } + + public String getOrderByColumn() + { + return orderByColumn; + } + + public void setOrderByColumn(String orderByColumn) + { + this.orderByColumn = orderByColumn; + } + + public String getIsAsc() + { + return isAsc; + } + + public void setIsAsc(String isAsc) + { + this.isAsc = isAsc; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/TableDataInfo.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/TableDataInfo.java new file mode 100644 index 0000000..0cbc3bb --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/TableDataInfo.java @@ -0,0 +1,85 @@ +package com.zhentao.common.core.web.page; + +import java.io.Serializable; +import java.util.List; + +/** + * 琛ㄦ牸鍒嗛〉鏁版嵁瀵硅薄 + * + * @author ruoyi + */ +public class TableDataInfo implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 鎬昏褰曟暟 */ + private long total; + + /** 鍒楄〃鏁版嵁 */ + private List rows; + + /** 娑堟伅鐘舵佺爜 */ + private int code; + + /** 娑堟伅鍐呭 */ + private String msg; + + /** + * 琛ㄦ牸鏁版嵁瀵硅薄 + */ + public TableDataInfo() + { + } + + /** + * 鍒嗛〉 + * + * @param list 鍒楄〃鏁版嵁 + * @param total 鎬昏褰曟暟 + */ + public TableDataInfo(List list, int total) + { + this.rows = list; + this.total = total; + } + + public long getTotal() + { + return total; + } + + public void setTotal(long total) + { + this.total = total; + } + + public List getRows() + { + return rows; + } + + public void setRows(List rows) + { + this.rows = rows; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } +} diff --git a/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/TableSupport.java b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/TableSupport.java new file mode 100644 index 0000000..c63cc6e --- /dev/null +++ b/smart-common/smart-common-core/src/main/java/com/zhentao/common/core/web/page/TableSupport.java @@ -0,0 +1,49 @@ +package com.zhentao.common.core.web.page; + +import com.zhentao.common.core.utils.ServletUtils; + +/** + * 琛ㄦ牸鏁版嵁澶勭悊 + * + * @author ruoyi + */ +public class TableSupport +{ + /** + * 褰撳墠璁板綍璧峰绱㈠紩 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 姣忛〉鏄剧ず璁板綍鏁 + */ + public static final String PAGE_SIZE = "pageSize"; + + /** + * 鎺掑簭鍒 + */ + public static final String ORDER_BY_COLUMN = "orderByColumn"; + + /** + * 鎺掑簭鐨勬柟鍚 "desc" 鎴栬 "asc". + */ + public static final String IS_ASC = "isAsc"; + + /** + * 灏佽鍒嗛〉瀵硅薄 + */ + public static PageDomain getPageDomain() + { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM)); + pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE)); + pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); + pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); + return pageDomain; + } + + public static PageDomain buildPageRequest() + { + return getPageDomain(); + } +} diff --git a/smart-common/smart-common-core/src/main/resources/META-INF/spring.factories b/smart-common/smart-common-core/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..220da13 --- /dev/null +++ b/smart-common/smart-common-core/src/main/resources/META-INF/spring.factories @@ -0,0 +1,5 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.zhentao.common.core.utils.SpringUtils,\ + com.zhentao.common.core.config.MybatisPlusConfig + + diff --git a/smart-common/smart-common-datascope/pom.xml b/smart-common/smart-common-datascope/pom.xml new file mode 100644 index 0000000..5d13548 --- /dev/null +++ b/smart-common/smart-common-datascope/pom.xml @@ -0,0 +1,27 @@ + + + + com.ruoyi + smart-common + 2.5.0 + + 4.0.0 + + smart-common-datascope + + + smart-common-datascope鏉冮檺鑼冨洿 + + + + + + + com.ruoyi + smart-common-security + + + + diff --git a/smart-common/smart-common-datascope/src/main/java/com/zhentao/common/datascope/annotation/DataScope.java b/smart-common/smart-common-datascope/src/main/java/com/zhentao/common/datascope/annotation/DataScope.java new file mode 100644 index 0000000..ae63a35 --- /dev/null +++ b/smart-common/smart-common-datascope/src/main/java/com/zhentao/common/datascope/annotation/DataScope.java @@ -0,0 +1,28 @@ +package com.zhentao.common.datascope.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 鏁版嵁鏉冮檺杩囨护娉ㄨВ + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataScope +{ + /** + * 閮ㄩ棬琛ㄧ殑鍒悕 + */ + public String deptAlias() default ""; + + /** + * 鐢ㄦ埛琛ㄧ殑鍒悕 + */ + public String userAlias() default ""; +} diff --git a/smart-common/smart-common-datascope/src/main/java/com/zhentao/common/datascope/aspect/DataScopeAspect.java b/smart-common/smart-common-datascope/src/main/java/com/zhentao/common/datascope/aspect/DataScopeAspect.java new file mode 100644 index 0000000..777ee2c --- /dev/null +++ b/smart-common/smart-common-datascope/src/main/java/com/zhentao/common/datascope/aspect/DataScopeAspect.java @@ -0,0 +1,173 @@ +package com.zhentao.common.datascope.aspect; + +import java.lang.reflect.Method; + +import com.zhentao.common.datascope.annotation.DataScope; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.web.domain.BaseEntity; +import com.zhentao.common.security.service.TokenService; +import com.zhentao.system.api.domain.SysRole; +import com.zhentao.system.api.domain.SysUser; +import com.zhentao.system.api.model.LoginUser; + +/** + * 鏁版嵁杩囨护澶勭悊 + * + * @author ruoyi + */ +@Aspect +@Component +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"; + + @Autowired + private TokenService tokenService; + + // 閰嶇疆缁囧叆鐐 + @Pointcut("@annotation(com.zhentao.common.datascope.annotation.DataScope)") + public void dataScopePointCut() + { + } + + @Before("dataScopePointCut()") + public void doBefore(JoinPoint point) throws Throwable + { + handleDataScope(point); + } + + protected void handleDataScope(final JoinPoint joinPoint) + { + // 鑾峰緱娉ㄨВ + DataScope controllerDataScope = getAnnotationLog(joinPoint); + if (controllerDataScope == null) + { + return; + } + // 鑾峰彇褰撳墠鐨勭敤鎴 + LoginUser loginUser = tokenService.getLoginUser(); + if (StringUtils.isNotNull(loginUser)) + { + SysUser currentUser = loginUser.getSysUser(); + // 濡傛灉鏄秴绾х鐞嗗憳锛屽垯涓嶈繃婊ゆ暟鎹 + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) + { + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), + controllerDataScope.userAlias()); + } + } + } + + /** + * 鏁版嵁鑼冨洿杩囨护 + * + * @param joinPoint 鍒囩偣 + * @param user 鐢ㄦ埛 + * @param deptAlias 閮ㄩ棬鍒悕 + * @param userAlias 鐢ㄦ埛鍒悕 + */ + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias) + { + StringBuilder sqlString = new StringBuilder(); + + 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 (StringUtils.isNotBlank(userAlias)) + { + sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId())); + } + else + { + // 鏁版嵁鏉冮檺涓轰粎鏈汉涓旀病鏈塽serAlias鍒悕涓嶆煡璇换浣曟暟鎹 + sqlString.append(" OR 1=0 "); + } + } + } + + if (StringUtils.isNotBlank(sqlString.toString())) + { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) + { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); + } + } + } + + /** + * 鏄惁瀛樺湪娉ㄨВ锛屽鏋滃瓨鍦ㄥ氨鑾峰彇 + */ + private DataScope getAnnotationLog(JoinPoint joinPoint) + { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + + if (method != null) + { + return method.getAnnotation(DataScope.class); + } + return null; + } +} diff --git a/smart-common/smart-common-datascope/src/main/resources/META-INF/spring.factories b/smart-common/smart-common-datascope/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..4ac8a25 --- /dev/null +++ b/smart-common/smart-common-datascope/src/main/resources/META-INF/spring.factories @@ -0,0 +1,4 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.zhentao.common.datascope.aspect.DataScopeAspect + + diff --git a/smart-common/smart-common-datasource/pom.xml b/smart-common/smart-common-datasource/pom.xml new file mode 100644 index 0000000..0e2e9e8 --- /dev/null +++ b/smart-common/smart-common-datasource/pom.xml @@ -0,0 +1,41 @@ + + + + com.ruoyi + smart-common + 2.5.0 + + 4.0.0 + + smart-common-datasource + + + smart-common-datasource澶氭暟鎹簮 + + + + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + com.baomidou + dynamic-datasource-spring-boot-starter + ${dynamic-ds.version} + + + + + io.seata + seata-spring-boot-starter + + + + diff --git a/smart-common/smart-common-datasource/src/main/java/com/zhentao/common/datasource/annotation/Master.java b/smart-common/smart-common-datasource/src/main/java/com/zhentao/common/datasource/annotation/Master.java new file mode 100644 index 0000000..9d6e97a --- /dev/null +++ b/smart-common/smart-common-datasource/src/main/java/com/zhentao/common/datasource/annotation/Master.java @@ -0,0 +1,22 @@ +package com.zhentao.common.datasource.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.baomidou.dynamic.datasource.annotation.DS; + +/** + * 涓诲簱鏁版嵁婧 + * + * @author ruoyi + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@DS("master") +public @interface Master +{ + +} diff --git a/smart-common/smart-common-datasource/src/main/java/com/zhentao/common/datasource/annotation/Slave.java b/smart-common/smart-common-datasource/src/main/java/com/zhentao/common/datasource/annotation/Slave.java new file mode 100644 index 0000000..162d6ac --- /dev/null +++ b/smart-common/smart-common-datasource/src/main/java/com/zhentao/common/datasource/annotation/Slave.java @@ -0,0 +1,22 @@ +package com.zhentao.common.datasource.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.baomidou.dynamic.datasource.annotation.DS; + +/** + * 浠庡簱鏁版嵁婧 + * + * @author ruoyi + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@DS("slave") +public @interface Slave +{ + +} diff --git a/smart-common/smart-common-log/pom.xml b/smart-common/smart-common-log/pom.xml new file mode 100644 index 0000000..51495ca --- /dev/null +++ b/smart-common/smart-common-log/pom.xml @@ -0,0 +1,27 @@ + + + + com.ruoyi + smart-common + 2.5.0 + + 4.0.0 + + smart-common-log + + + smart-common-log鏃ュ織璁板綍 + + + + + + + com.ruoyi + smart-common-security + + + + diff --git a/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/annotation/Log.java b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/annotation/Log.java new file mode 100644 index 0000000..0b92ad6 --- /dev/null +++ b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/annotation/Log.java @@ -0,0 +1,41 @@ +package com.zhentao.common.log.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.log.enums.OperatorType; + +/** + * 鑷畾涔夋搷浣滄棩蹇楄褰曟敞瑙 + * + * @author ruoyi + * + */ +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log +{ + /** + * 妯″潡 + */ + public String title() default ""; + + /** + * 鍔熻兘 + */ + public BusinessType businessType() default BusinessType.OTHER; + + /** + * 鎿嶄綔浜虹被鍒 + */ + public OperatorType operatorType() default OperatorType.MANAGE; + + /** + * 鏄惁淇濆瓨璇锋眰鐨勫弬鏁 + */ + public boolean isSaveRequestData() default true; +} diff --git a/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/aspect/LogAspect.java b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/aspect/LogAspect.java new file mode 100644 index 0000000..34d4498 --- /dev/null +++ b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/aspect/LogAspect.java @@ -0,0 +1,242 @@ +package com.zhentao.common.log.aspect; + +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.service.AsyncLogService; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; +import com.alibaba.fastjson.JSON; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.ServletUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.utils.ip.IpUtils; +import com.zhentao.common.log.enums.BusinessStatus; +import com.zhentao.system.api.domain.SysOperLog; + +/** + * 鎿嶄綔鏃ュ織璁板綍澶勭悊 + * + * @author ruoyi + */ +@Aspect +@Component +public class LogAspect +{ + private static final Logger log = LoggerFactory.getLogger(LogAspect.class); + + @Autowired + private AsyncLogService asyncLogService; + + // 閰嶇疆缁囧叆鐐 + @Pointcut("@annotation(com.zhentao.common.log.annotation.Log)") + public void logPointCut() + { + } + + /** + * 澶勭悊瀹岃姹傚悗鎵ц + * + * @param joinPoint 鍒囩偣 + */ + @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) + { + handleLog(joinPoint, null, jsonResult); + } + + /** + * 鎷︽埅寮傚父鎿嶄綔 + * + * @param joinPoint 鍒囩偣 + * @param e 寮傚父 + */ + @AfterThrowing(value = "logPointCut()", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Exception e) + { + handleLog(joinPoint, e, null); + } + + protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult) + { + try + { + // 鑾峰緱娉ㄨВ + Log controllerLog = getAnnotationLog(joinPoint); + if (controllerLog == null) + { + return; + } + + // *========鏁版嵁搴撴棩蹇=========*// + SysOperLog operLog = new SysOperLog(); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 璇锋眰鐨勫湴鍧 + String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + operLog.setOperIp(ip); + // 杩斿洖鍙傛暟 + operLog.setJsonResult(JSON.toJSONString(jsonResult)); + + operLog.setOperUrl(ServletUtils.getRequest().getRequestURI()); + String username = SecurityUtils.getUsername(); + if (StringUtils.isNotBlank(username)) + { + operLog.setOperName(username); + } + + if (e != null) + { + operLog.setStatus(BusinessStatus.FAIL.ordinal()); + operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); + } + // 璁剧疆鏂规硶鍚嶇О + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + operLog.setMethod(className + "." + methodName + "()"); + // 璁剧疆璇锋眰鏂瑰紡 + operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); + // 澶勭悊璁剧疆娉ㄨВ涓婄殑鍙傛暟 + getControllerMethodDescription(joinPoint, controllerLog, operLog); + // 淇濆瓨鏁版嵁搴 + asyncLogService.saveSysLog(operLog); + } + catch (Exception exp) + { + // 璁板綍鏈湴寮傚父鏃ュ織 + log.error("==鍓嶇疆閫氱煡寮傚父=="); + log.error("寮傚父淇℃伅:{}", exp.getMessage()); + exp.printStackTrace(); + } + } + + /** + * 鑾峰彇娉ㄨВ涓鏂规硶鐨勬弿杩颁俊鎭 鐢ㄤ簬Controller灞傛敞瑙 + * + * @param log 鏃ュ織 + * @param operLog 鎿嶄綔鏃ュ織 + * @throws Exception + */ + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog) throws Exception + { + // 璁剧疆action鍔ㄤ綔 + operLog.setBusinessType(log.businessType().ordinal()); + // 璁剧疆鏍囬 + operLog.setTitle(log.title()); + // 璁剧疆鎿嶄綔浜虹被鍒 + operLog.setOperatorType(log.operatorType().ordinal()); + // 鏄惁闇瑕佷繚瀛榬equest锛屽弬鏁板拰鍊 + if (log.isSaveRequestData()) + { + // 鑾峰彇鍙傛暟鐨勪俊鎭紝浼犲叆鍒版暟鎹簱涓 + setRequestValue(joinPoint, operLog); + } + } + + /** + * 鑾峰彇璇锋眰鐨勫弬鏁帮紝鏀惧埌log涓 + * + * @param operLog 鎿嶄綔鏃ュ織 + * @throws Exception 寮傚父 + */ + private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception + { + String requestMethod = operLog.getRequestMethod(); + if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) + { + String params = argsArrayToString(joinPoint.getArgs()); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); + } + } + + /** + * 鏄惁瀛樺湪娉ㄨВ锛屽鏋滃瓨鍦ㄥ氨鑾峰彇 + */ + private Log getAnnotationLog(JoinPoint joinPoint) throws Exception + { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + + if (method != null) + { + return method.getAnnotation(Log.class); + } + return null; + } + + /** + * 鍙傛暟鎷艰 + */ + private String argsArrayToString(Object[] paramsArray) + { + String params = ""; + if (paramsArray != null && paramsArray.length > 0) + { + for (int i = 0; i < paramsArray.length; i++) + { + if (!isFilterObject(paramsArray[i])) + { + try + { + Object jsonObj = JSON.toJSON(paramsArray[i]); + params += jsonObj.toString() + " "; + } + catch (Exception e) + { + } + } + } + } + return params.trim(); + } + + /** + * 鍒ゆ柇鏄惁闇瑕佽繃婊ょ殑瀵硅薄銆 + * + * @param o 瀵硅薄淇℃伅銆 + * @return 濡傛灉鏄渶瑕佽繃婊ょ殑瀵硅薄锛屽垯杩斿洖true锛涘惁鍒欒繑鍥瀎alse銆 + */ + @SuppressWarnings("rawtypes") + public boolean isFilterObject(final Object o) + { + Class clazz = o.getClass(); + if (clazz.isArray()) + { + return clazz.getComponentType().isAssignableFrom(MultipartFile.class); + } + else if (Collection.class.isAssignableFrom(clazz)) + { + Collection collection = (Collection) o; + for (Iterator iter = collection.iterator(); iter.hasNext();) + { + return iter.next() instanceof MultipartFile; + } + } + else if (Map.class.isAssignableFrom(clazz)) + { + Map map = (Map) o; + for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) + { + Map.Entry entry = (Map.Entry) iter.next(); + return entry.getValue() instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse; + } +} diff --git a/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/BusinessStatus.java b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/BusinessStatus.java new file mode 100644 index 0000000..a7a0a87 --- /dev/null +++ b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/BusinessStatus.java @@ -0,0 +1,20 @@ +package com.zhentao.common.log.enums; + +/** + * 鎿嶄綔鐘舵 + * + * @author ruoyi + * + */ +public enum BusinessStatus +{ + /** + * 鎴愬姛 + */ + SUCCESS, + + /** + * 澶辫触 + */ + FAIL, +} diff --git a/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/BusinessType.java b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/BusinessType.java new file mode 100644 index 0000000..47e802d --- /dev/null +++ b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/BusinessType.java @@ -0,0 +1,59 @@ +package com.zhentao.common.log.enums; + +/** + * 涓氬姟鎿嶄綔绫诲瀷 + * + * @author ruoyi + */ +public enum BusinessType +{ + /** + * 鍏跺畠 + */ + OTHER, + + /** + * 鏂板 + */ + INSERT, + + /** + * 淇敼 + */ + UPDATE, + + /** + * 鍒犻櫎 + */ + DELETE, + + /** + * 鎺堟潈 + */ + GRANT, + + /** + * 瀵煎嚭 + */ + EXPORT, + + /** + * 瀵煎叆 + */ + IMPORT, + + /** + * 寮洪 + */ + FORCE, + + /** + * 鐢熸垚浠g爜 + */ + GENCODE, + + /** + * 娓呯┖鏁版嵁 + */ + CLEAN, +} diff --git a/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/OperatorType.java b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/OperatorType.java new file mode 100644 index 0000000..2f16b5c --- /dev/null +++ b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/enums/OperatorType.java @@ -0,0 +1,24 @@ +package com.zhentao.common.log.enums; + +/** + * 鎿嶄綔浜虹被鍒 + * + * @author ruoyi + */ +public enum OperatorType +{ + /** + * 鍏跺畠 + */ + OTHER, + + /** + * 鍚庡彴鐢ㄦ埛 + */ + MANAGE, + + /** + * 鎵嬫満绔敤鎴 + */ + MOBILE +} diff --git a/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/service/AsyncLogService.java b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/service/AsyncLogService.java new file mode 100644 index 0000000..65e0299 --- /dev/null +++ b/smart-common/smart-common-log/src/main/java/com/zhentao/common/log/service/AsyncLogService.java @@ -0,0 +1,28 @@ +package com.zhentao.common.log.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import com.zhentao.system.api.RemoteLogService; +import com.zhentao.system.api.domain.SysOperLog; + +/** + * 寮傛璋冪敤鏃ュ織鏈嶅姟 + * + * @author ruoyi + */ +@Service +public class AsyncLogService +{ + @Autowired + private RemoteLogService remoteLogService; + + /** + * 淇濆瓨绯荤粺鏃ュ織璁板綍 + */ + @Async + public void saveSysLog(SysOperLog sysOperLog) + { + remoteLogService.saveLog(sysOperLog); + } +} diff --git a/smart-common/smart-common-log/src/main/resources/META-INF/spring.factories b/smart-common/smart-common-log/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..cddb85a --- /dev/null +++ b/smart-common/smart-common-log/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.zhentao.common.log.service.AsyncLogService,\ + com.zhentao.common.log.aspect.LogAspect diff --git a/smart-common/smart-common-redis/pom.xml b/smart-common/smart-common-redis/pom.xml new file mode 100644 index 0000000..01ea17d --- /dev/null +++ b/smart-common/smart-common-redis/pom.xml @@ -0,0 +1,33 @@ + + + + com.ruoyi + smart-common + 2.5.0 + + 4.0.0 + + smart-common-redis + + + smart-common-redis缂撳瓨鏈嶅姟 + + + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + com.ruoyi + smart-common-core + + + + diff --git a/smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/configure/FastJson2JsonRedisSerializer.java b/smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/configure/FastJson2JsonRedisSerializer.java new file mode 100644 index 0000000..39cb58b --- /dev/null +++ b/smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/configure/FastJson2JsonRedisSerializer.java @@ -0,0 +1,71 @@ +package com.zhentao.common.redis.configure; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.TypeFactory; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; +import com.alibaba.fastjson.parser.ParserConfig; +import org.springframework.util.Assert; +import java.nio.charset.Charset; + +/** + * Redis浣跨敤FastJson搴忓垪鍖 + * + * @author ruoyi + */ +public class FastJson2JsonRedisSerializer implements RedisSerializer +{ + @SuppressWarnings("unused") + private ObjectMapper objectMapper = new ObjectMapper(); + + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + + private Class clazz; + + static + { + ParserConfig.getGlobalInstance().setAutoTypeSupport(true); + } + + public FastJson2JsonRedisSerializer(Class clazz) + { + super(); + this.clazz = clazz; + } + + @Override + public byte[] serialize(T t) throws SerializationException + { + if (t == null) + { + return new byte[0]; + } + return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); + } + + @Override + public T deserialize(byte[] bytes) throws SerializationException + { + if (bytes == null || bytes.length <= 0) + { + return null; + } + String str = new String(bytes, DEFAULT_CHARSET); + + return JSON.parseObject(str, clazz); + } + + public void setObjectMapper(ObjectMapper objectMapper) + { + Assert.notNull(objectMapper, "'objectMapper' must not be null"); + this.objectMapper = objectMapper; + } + + protected JavaType getJavaType(Class clazz) + { + return TypeFactory.defaultInstance().constructType(clazz); + } +} diff --git a/smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/configure/RedisConfig.java b/smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/configure/RedisConfig.java new file mode 100644 index 0000000..0e6cf55 --- /dev/null +++ b/smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/configure/RedisConfig.java @@ -0,0 +1,43 @@ +package com.zhentao.common.redis.configure; + +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * redis閰嶇疆 + * + * @author ruoyi + */ +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport +{ + @Bean + @SuppressWarnings(value = { "unchecked", "rawtypes", "deprecation" }) + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) + { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + serializer.setObjectMapper(mapper); + + template.setValueSerializer(serializer); + // 浣跨敤StringRedisSerializer鏉ュ簭鍒楀寲鍜屽弽搴忓垪鍖杛edis鐨刱ey鍊 + template.setKeySerializer(new StringRedisSerializer()); + template.afterPropertiesSet(); + return template; + } +} diff --git a/smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/service/RedisService.java b/smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/service/RedisService.java new file mode 100644 index 0000000..3f49318 --- /dev/null +++ b/smart-common/smart-common-redis/src/main/java/com/zhentao/common/redis/service/RedisService.java @@ -0,0 +1,234 @@ +package com.zhentao.common.redis.service; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; + +/** + * spring redis 宸ュ叿绫 + * + * @author ruoyi + **/ +@SuppressWarnings(value = { "unchecked", "rawtypes" }) +@Component +public class RedisService +{ + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛 + * + * @param key 缂撳瓨鐨勯敭鍊 + * @param value 缂撳瓨鐨勫 + */ + public void setCacheObject(final String key, final T value) + { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛 + * + * @param key 缂撳瓨鐨勯敭鍊 + * @param value 缂撳瓨鐨勫 + * @param timeout 鏃堕棿 + * @param timeUnit 鏃堕棿棰楃矑搴 + */ + public void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit) + { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 璁剧疆鏈夋晥鏃堕棿 + * + * @param key Redis閿 + * @param timeout 瓒呮椂鏃堕棿 + * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触 + */ + public boolean expire(final String key, final long timeout) + { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 璁剧疆鏈夋晥鏃堕棿 + * + * @param key Redis閿 + * @param timeout 瓒呮椂鏃堕棿 + * @param unit 鏃堕棿鍗曚綅 + * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) + { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 鑾峰緱缂撳瓨鐨勫熀鏈璞° + * + * @param key 缂撳瓨閿 + * @return 缂撳瓨閿煎搴旂殑鏁版嵁 + */ + public T getCacheObject(final String key) + { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 鍒犻櫎鍗曚釜瀵硅薄 + * + * @param key + */ + public boolean deleteObject(final String key) + { + return redisTemplate.delete(key); + } + + /** + * 鍒犻櫎闆嗗悎瀵硅薄 + * + * @param collection 澶氫釜瀵硅薄 + * @return + */ + public long deleteObject(final Collection collection) + { + return redisTemplate.delete(collection); + } + + /** + * 缂撳瓨List鏁版嵁 + * + * @param key 缂撳瓨鐨勯敭鍊 + * @param dataList 寰呯紦瀛樼殑List鏁版嵁 + * @return 缂撳瓨鐨勫璞 + */ + public long setCacheList(final String key, final List dataList) + { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 鑾峰緱缂撳瓨鐨刲ist瀵硅薄 + * + * @param key 缂撳瓨鐨勯敭鍊 + * @return 缂撳瓨閿煎搴旂殑鏁版嵁 + */ + public List getCacheList(final String key) + { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缂撳瓨Set + * + * @param key 缂撳瓨閿 + * @param dataSet 缂撳瓨鐨勬暟鎹 + * @return 缂撳瓨鏁版嵁鐨勫璞 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) + { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) + { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 鑾峰緱缂撳瓨鐨剆et + * + * @param key + * @return + */ + public Set getCacheSet(final String key) + { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缂撳瓨Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) + { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 鑾峰緱缂撳瓨鐨凪ap + * + * @param key + * @return + */ + public Map getCacheMap(final String key) + { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 寰Hash涓瓨鍏ユ暟鎹 + * + * @param key Redis閿 + * @param hKey Hash閿 + * @param value 鍊 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) + { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 鑾峰彇Hash涓殑鏁版嵁 + * + * @param key Redis閿 + * @param hKey Hash閿 + * @return Hash涓殑瀵硅薄 + */ + public T getCacheMapValue(final String key, final String hKey) + { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 鑾峰彇澶氫釜Hash涓殑鏁版嵁 + * + * @param key Redis閿 + * @param hKeys Hash閿泦鍚 + * @return Hash瀵硅薄闆嗗悎 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) + { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 鑾峰緱缂撳瓨鐨勫熀鏈璞″垪琛 + * + * @param pattern 瀛楃涓插墠缂 + * @return 瀵硅薄鍒楄〃 + */ + public Collection keys(final String pattern) + { + return redisTemplate.keys(pattern); + } +} diff --git a/smart-common/smart-common-redis/src/main/resources/META-INF/spring.factories b/smart-common/smart-common-redis/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..3c83128 --- /dev/null +++ b/smart-common/smart-common-redis/src/main/resources/META-INF/spring.factories @@ -0,0 +1,5 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.zhentao.common.redis.configure.RedisConfig,\ + com.zhentao.common.redis.service.RedisService + + diff --git a/smart-common/smart-common-security/pom.xml b/smart-common/smart-common-security/pom.xml new file mode 100644 index 0000000..1113b08 --- /dev/null +++ b/smart-common/smart-common-security/pom.xml @@ -0,0 +1,33 @@ + + + + com.ruoyi + smart-common + 2.5.0 + + 4.0.0 + + smart-common-security + + + smart-common-security瀹夊叏妯″潡 + + + + + + + com.ruoyi + smart-api-system + + + + + com.ruoyi + smart-common-redis + + + + + diff --git a/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/EnableCustomConfig.java b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/EnableCustomConfig.java new file mode 100644 index 0000000..cd25d79 --- /dev/null +++ b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/EnableCustomConfig.java @@ -0,0 +1,31 @@ +package com.zhentao.common.security.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.context.annotation.Import; +import org.springframework.scheduling.annotation.EnableAsync; +import com.zhentao.common.security.config.ApplicationConfig; +import com.zhentao.common.security.feign.FeignAutoConfiguration; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +// 琛ㄧず閫氳繃aop妗嗘灦鏆撮湶璇ヤ唬鐞嗗璞,AopContext鑳藉璁块棶 +@EnableAspectJAutoProxy(exposeProxy = true) +// 鎸囧畾瑕佹壂鎻忕殑Mapper绫荤殑鍖呯殑璺緞 +@MapperScan("com.zhentao.**.mapper") +// 寮鍚嚎绋嬪紓姝ユ墽琛 +@EnableAsync +// 鑷姩鍔犺浇绫 +@Import({ ApplicationConfig.class, FeignAutoConfiguration.class }) +public @interface EnableCustomConfig +{ + +} diff --git a/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/EnableRyFeignClients.java b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/EnableRyFeignClients.java new file mode 100644 index 0000000..99d990e --- /dev/null +++ b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/EnableRyFeignClients.java @@ -0,0 +1,27 @@ +package com.zhentao.common.security.annotation; + +import org.springframework.cloud.openfeign.EnableFeignClients; +import java.lang.annotation.*; + +/** + * 鑷畾涔塮eign娉ㄨВ + * 娣诲姞basePackages璺緞 + * + * @author ruoyi + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@EnableFeignClients +public @interface EnableRyFeignClients +{ + String[] value() default {}; + + String[] basePackages() default { "com.zhentao" }; + + Class[] basePackageClasses() default {}; + + Class[] defaultConfiguration() default {}; + + Class[] clients() default {}; +} diff --git a/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/PreAuthorize.java b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/PreAuthorize.java new file mode 100644 index 0000000..0279df2 --- /dev/null +++ b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/annotation/PreAuthorize.java @@ -0,0 +1,46 @@ +package com.zhentao.common.security.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 鏉冮檺娉ㄨВ + * + * @author ruoyi + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface PreAuthorize +{ + /** + * 楠岃瘉鐢ㄦ埛鏄惁鍏峰鏌愭潈闄 + */ + public String hasPermi() default ""; + + /** + * 楠岃瘉鐢ㄦ埛鏄惁涓嶅叿澶囨煇鏉冮檺锛屼笌 hasPermi閫昏緫鐩稿弽 + */ + public String lacksPermi() default ""; + + /** + * 楠岃瘉鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓涓潈闄 + */ + public String[] hasAnyPermi() default {}; + + /** + * 鍒ゆ柇鐢ㄦ埛鏄惁鎷ユ湁鏌愪釜瑙掕壊 + */ + public String hasRole() default ""; + + /** + * 楠岃瘉鐢ㄦ埛鏄惁涓嶅叿澶囨煇瑙掕壊锛屼笌 isRole閫昏緫鐩稿弽 + */ + public String lacksRole() default ""; + + /** + * 楠岃瘉鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓涓鑹 + */ + public String[] hasAnyRoles() default {}; +} diff --git a/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/aspect/PreAuthorizeAspect.java b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/aspect/PreAuthorizeAspect.java new file mode 100644 index 0000000..bbb01e4 --- /dev/null +++ b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/aspect/PreAuthorizeAspect.java @@ -0,0 +1,226 @@ +package com.zhentao.common.security.aspect; + +import java.lang.reflect.Method; +import java.util.Collection; + +import com.zhentao.common.security.annotation.PreAuthorize; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.PatternMatchUtils; +import org.springframework.util.StringUtils; +import com.zhentao.common.core.exception.PreAuthorizeException; +import com.zhentao.common.security.service.TokenService; +import com.zhentao.system.api.model.LoginUser; + +/** + * 鑷畾涔夋潈闄愬疄鐜 + * + * @author ruoyi + */ +@Aspect +@Component +public class PreAuthorizeAspect +{ + @Autowired + private TokenService tokenService; + + /** 鎵鏈夋潈闄愭爣璇 */ + private static final String ALL_PERMISSION = "*:*:*"; + + /** 绠$悊鍛樿鑹叉潈闄愭爣璇 */ + private static final String SUPER_ADMIN = "admin"; + + /** 鏁扮粍涓0鏃 */ + private static final Integer ARRAY_EMPTY = 0; + + @Around("@annotation(com.zhentao.common.security.annotation.PreAuthorize)") + public Object around(ProceedingJoinPoint point) throws Throwable + { + Signature signature = point.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + PreAuthorize annotation = method.getAnnotation(PreAuthorize.class); + if (annotation == null) + { + return point.proceed(); + } + + if (!StringUtils.isEmpty(annotation.hasPermi())) + { + if (hasPermi(annotation.hasPermi())) + { + return point.proceed(); + } + throw new PreAuthorizeException(); + } + else if (!StringUtils.isEmpty(annotation.lacksPermi())) + { + if (lacksPermi(annotation.lacksPermi())) + { + return point.proceed(); + } + throw new PreAuthorizeException(); + } + else if (ARRAY_EMPTY < annotation.hasAnyPermi().length) + { + if (hasAnyPermi(annotation.hasAnyPermi())) + { + return point.proceed(); + } + throw new PreAuthorizeException(); + } + else if (!StringUtils.isEmpty(annotation.hasRole())) + { + if (hasRole(annotation.hasRole())) + { + return point.proceed(); + } + throw new PreAuthorizeException(); + } + else if (!StringUtils.isEmpty(annotation.lacksRole())) + { + if (lacksRole(annotation.lacksRole())) + { + return point.proceed(); + } + throw new PreAuthorizeException(); + } + else if (ARRAY_EMPTY < annotation.hasAnyRoles().length) + { + if (hasAnyRoles(annotation.hasAnyRoles())) + { + return point.proceed(); + } + throw new PreAuthorizeException(); + } + + return point.proceed(); + } + + /** + * 楠岃瘉鐢ㄦ埛鏄惁鍏峰鏌愭潈闄 + * + * @param permission 鏉冮檺瀛楃涓 + * @return 鐢ㄦ埛鏄惁鍏峰鏌愭潈闄 + */ + public boolean hasPermi(String permission) + { + LoginUser userInfo = tokenService.getLoginUser(); + if (StringUtils.isEmpty(userInfo) || CollectionUtils.isEmpty(userInfo.getPermissions())) + { + return false; + } + return hasPermissions(userInfo.getPermissions(), permission); + } + + /** + * 楠岃瘉鐢ㄦ埛鏄惁涓嶅叿澶囨煇鏉冮檺锛屼笌 hasPermi閫昏緫鐩稿弽 + * + * @param permission 鏉冮檺瀛楃涓 + * @return 鐢ㄦ埛鏄惁涓嶅叿澶囨煇鏉冮檺 + */ + public boolean lacksPermi(String permission) + { + return hasPermi(permission) != true; + } + + /** + * 楠岃瘉鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓涓潈闄 + * + * @param permissions 鏉冮檺鍒楄〃 + * @return 鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓涓潈闄 + */ + public boolean hasAnyPermi(String[] permissions) + { + LoginUser userInfo = tokenService.getLoginUser(); + if (StringUtils.isEmpty(userInfo) || CollectionUtils.isEmpty(userInfo.getPermissions())) + { + return false; + } + Collection authorities = userInfo.getPermissions(); + for (String permission : permissions) + { + if (permission != null && hasPermissions(authorities, permission)) + { + return true; + } + } + return false; + } + + /** + * 鍒ゆ柇鐢ㄦ埛鏄惁鎷ユ湁鏌愪釜瑙掕壊 + * + * @param role 瑙掕壊瀛楃涓 + * @return 鐢ㄦ埛鏄惁鍏峰鏌愯鑹 + */ + public boolean hasRole(String role) + { + LoginUser userInfo = tokenService.getLoginUser(); + if (StringUtils.isEmpty(userInfo) || CollectionUtils.isEmpty(userInfo.getRoles())) + { + return false; + } + for (String roleKey : userInfo.getRoles()) + { + if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(role)) + { + return true; + } + } + return false; + } + + /** + * 楠岃瘉鐢ㄦ埛鏄惁涓嶅叿澶囨煇瑙掕壊锛屼笌 isRole閫昏緫鐩稿弽銆 + * + * @param role 瑙掕壊鍚嶇О + * @return 鐢ㄦ埛鏄惁涓嶅叿澶囨煇瑙掕壊 + */ + public boolean lacksRole(String role) + { + return hasRole(role) != true; + } + + /** + * 楠岃瘉鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓涓鑹 + * + * @param roles 瑙掕壊鍒楄〃 + * @return 鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓涓鑹 + */ + public boolean hasAnyRoles(String[] roles) + { + LoginUser userInfo = tokenService.getLoginUser(); + if (StringUtils.isEmpty(userInfo) || CollectionUtils.isEmpty(userInfo.getRoles())) + { + return false; + } + for (String role : roles) + { + if (hasRole(role)) + { + return true; + } + } + return false; + } + + /** + * 鍒ゆ柇鏄惁鍖呭惈鏉冮檺 + * + * @param authorities 鏉冮檺鍒楄〃 + * @param permission 鏉冮檺瀛楃涓 + * @return 鐢ㄦ埛鏄惁鍏峰鏌愭潈闄 + */ + private boolean hasPermissions(Collection authorities, String permission) + { + return authorities.stream().filter(StringUtils::hasText) + .anyMatch(x -> ALL_PERMISSION.contains(x) || PatternMatchUtils.simpleMatch(permission, x)); + } +} diff --git a/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/config/ApplicationConfig.java b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/config/ApplicationConfig.java new file mode 100644 index 0000000..4ce4130 --- /dev/null +++ b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/config/ApplicationConfig.java @@ -0,0 +1,22 @@ +package com.zhentao.common.security.config; + +import java.util.TimeZone; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; + +/** + * 绯荤粺閰嶇疆 + * + * @author ruoyi + */ +public class ApplicationConfig +{ + /** + * 鏃跺尯閰嶇疆 + */ + @Bean + public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() + { + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); + } +} diff --git a/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/feign/FeignAutoConfiguration.java b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/feign/FeignAutoConfiguration.java new file mode 100644 index 0000000..149b15c --- /dev/null +++ b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/feign/FeignAutoConfiguration.java @@ -0,0 +1,20 @@ +package com.zhentao.common.security.feign; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import feign.RequestInterceptor; + +/** + * Feign 閰嶇疆娉ㄥ唽 + * + * @author ruoyi + **/ +@Configuration +public class FeignAutoConfiguration +{ + @Bean + public RequestInterceptor requestInterceptor() + { + return new FeignRequestInterceptor(); + } +} diff --git a/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/feign/FeignRequestInterceptor.java b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/feign/FeignRequestInterceptor.java new file mode 100644 index 0000000..e678a6f --- /dev/null +++ b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/feign/FeignRequestInterceptor.java @@ -0,0 +1,45 @@ +package com.zhentao.common.security.feign; + +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Component; +import com.zhentao.common.core.constant.CacheConstants; +import com.zhentao.common.core.utils.ServletUtils; +import com.zhentao.common.core.utils.StringUtils; +import feign.RequestInterceptor; +import feign.RequestTemplate; + +/** + * feign 璇锋眰鎷︽埅鍣 + * + * @author ruoyi + */ +@Component +public class FeignRequestInterceptor implements RequestInterceptor +{ + @Override + public void apply(RequestTemplate requestTemplate) + { + HttpServletRequest httpServletRequest = ServletUtils.getRequest(); + if (StringUtils.isNotNull(httpServletRequest)) + { + Map headers = ServletUtils.getHeaders(httpServletRequest); + // 浼犻掔敤鎴蜂俊鎭姹傚ご锛岄槻姝涪澶 + String userId = headers.get(CacheConstants.DETAILS_USER_ID); + if (StringUtils.isNotEmpty(userId)) + { + requestTemplate.header(CacheConstants.DETAILS_USER_ID, userId); + } + String userName = headers.get(CacheConstants.DETAILS_USERNAME); + if (StringUtils.isNotEmpty(userName)) + { + requestTemplate.header(CacheConstants.DETAILS_USERNAME, userName); + } + String authentication = headers.get(CacheConstants.AUTHORIZATION_HEADER); + if (StringUtils.isNotEmpty(authentication)) + { + requestTemplate.header(CacheConstants.AUTHORIZATION_HEADER, authentication); + } + } + } +} diff --git a/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/handler/GlobalExceptionHandler.java b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..15e4cc5 --- /dev/null +++ b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/handler/GlobalExceptionHandler.java @@ -0,0 +1,94 @@ +package com.zhentao.common.security.handler; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import com.zhentao.common.core.exception.BaseException; +import com.zhentao.common.core.exception.CustomException; +import com.zhentao.common.core.exception.DemoModeException; +import com.zhentao.common.core.exception.PreAuthorizeException; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.web.domain.AjaxResult; + +/** + * 鍏ㄥ眬寮傚父澶勭悊鍣 + * + * @author ruoyi + */ +@RestControllerAdvice +public class GlobalExceptionHandler +{ + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + /** + * 鍩虹寮傚父 + */ + @ExceptionHandler(BaseException.class) + public AjaxResult baseException(BaseException e) + { + return AjaxResult.error(e.getDefaultMessage()); + } + + /** + * 涓氬姟寮傚父 + */ + @ExceptionHandler(CustomException.class) + public AjaxResult businessException(CustomException e) + { + if (StringUtils.isNull(e.getCode())) + { + return AjaxResult.error(e.getMessage()); + } + return AjaxResult.error(e.getCode(), e.getMessage()); + } + + @ExceptionHandler(Exception.class) + public AjaxResult handleException(Exception e) + { + log.error(e.getMessage(), e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 鑷畾涔夐獙璇佸紓甯 + */ + @ExceptionHandler(BindException.class) + public AjaxResult validatedBindException(BindException e) + { + log.error(e.getMessage(), e); + String message = e.getAllErrors().get(0).getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 鑷畾涔夐獙璇佸紓甯 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Object validExceptionHandler(MethodArgumentNotValidException e) + { + log.error(e.getMessage(), e); + String message = e.getBindingResult().getFieldError().getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 鏉冮檺寮傚父 + */ + @ExceptionHandler(PreAuthorizeException.class) + public AjaxResult preAuthorizeException(PreAuthorizeException e) + { + return AjaxResult.error("娌℃湁鏉冮檺锛岃鑱旂郴绠$悊鍛樻巿鏉"); + } + + /** + * 婕旂ず妯″紡寮傚父 + */ + @ExceptionHandler(DemoModeException.class) + public AjaxResult demoModeException(DemoModeException e) + { + return AjaxResult.error("婕旂ず妯″紡锛屼笉鍏佽鎿嶄綔"); + } +} diff --git a/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/service/TokenService.java b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/service/TokenService.java new file mode 100644 index 0000000..26de127 --- /dev/null +++ b/smart-common/smart-common-security/src/main/java/com/zhentao/common/security/service/TokenService.java @@ -0,0 +1,123 @@ +package com.zhentao.common.security.service; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.zhentao.common.core.constant.CacheConstants; +import com.zhentao.common.core.constant.Constants; +import com.zhentao.common.core.utils.IdUtils; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.ServletUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.utils.ip.IpUtils; +import com.zhentao.common.redis.service.RedisService; +import com.zhentao.system.api.model.LoginUser; + +/** + * token楠岃瘉澶勭悊 + * + * @author ruoyi + */ +@Component +public class TokenService +{ + @Autowired + private RedisService redisService; + + private final static long EXPIRE_TIME = Constants.TOKEN_EXPIRE * 60; + + private final static String ACCESS_TOKEN = CacheConstants.LOGIN_TOKEN_KEY; + + protected static final long MILLIS_SECOND = 1000; + + /** + * 鍒涘缓浠ょ墝 + */ + public Map createToken(LoginUser loginUser) + { + // 鐢熸垚token + String token = IdUtils.fastUUID(); + loginUser.setToken(token); + loginUser.setUserid(loginUser.getSysUser().getUserId()); + loginUser.setUsername(loginUser.getSysUser().getUserName()); + loginUser.setIpaddr(IpUtils.getIpAddr(ServletUtils.getRequest())); + refreshToken(loginUser); + + // 淇濆瓨鎴栨洿鏂扮敤鎴穞oken + Map map = new HashMap(); + map.put("access_token", token); + map.put("expires_in", EXPIRE_TIME); + redisService.setCacheObject(ACCESS_TOKEN + token, loginUser, EXPIRE_TIME, TimeUnit.SECONDS); + return map; + } + + /** + * 鑾峰彇鐢ㄦ埛韬唤淇℃伅 + * + * @return 鐢ㄦ埛淇℃伅 + */ + public LoginUser getLoginUser() + { + return getLoginUser(ServletUtils.getRequest()); + } + + /** + * 鑾峰彇鐢ㄦ埛韬唤淇℃伅 + * + * @return 鐢ㄦ埛淇℃伅 + */ + public LoginUser getLoginUser(HttpServletRequest request) + { + // 鑾峰彇璇锋眰鎼哄甫鐨勪护鐗 + String token = SecurityUtils.getToken(request); + if (StringUtils.isNotEmpty(token)) + { + String userKey = getTokenKey(token); + LoginUser user = redisService.getCacheObject(userKey); + return user; + } + return null; + } + + /** + * 璁剧疆鐢ㄦ埛韬唤淇℃伅 + */ + public void setLoginUser(LoginUser loginUser) + { + if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) + { + refreshToken(loginUser); + } + } + + public void delLoginUser(String token) + { + if (StringUtils.isNotEmpty(token)) + { + String userKey = getTokenKey(token); + redisService.deleteObject(userKey); + } + } + + /** + * 鍒锋柊浠ょ墝鏈夋晥鏈 + * + * @param loginUser 鐧诲綍淇℃伅 + */ + public void refreshToken(LoginUser loginUser) + { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + EXPIRE_TIME * MILLIS_SECOND); + // 鏍规嵁uuid灏唋oginUser缂撳瓨 + String userKey = getTokenKey(loginUser.getToken()); + redisService.setCacheObject(userKey, loginUser, EXPIRE_TIME, TimeUnit.SECONDS); + } + + private String getTokenKey(String token) + { + return ACCESS_TOKEN + token; + } +} diff --git a/smart-common/smart-common-security/src/main/resources/META-INF/spring.factories b/smart-common/smart-common-security/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..4158b3d --- /dev/null +++ b/smart-common/smart-common-security/src/main/resources/META-INF/spring.factories @@ -0,0 +1,4 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.zhentao.common.security.service.TokenService,\ + com.zhentao.common.security.aspect.PreAuthorizeAspect,\ + com.zhentao.common.security.handler.GlobalExceptionHandler diff --git a/smart-common/smart-common-swagger/pom.xml b/smart-common/smart-common-swagger/pom.xml new file mode 100644 index 0000000..345d365 --- /dev/null +++ b/smart-common/smart-common-swagger/pom.xml @@ -0,0 +1,34 @@ + + + + com.ruoyi + smart-common + 2.5.0 + + 4.0.0 + + smart-common-swagger + + + smart-common-swagger绯荤粺鎺ュ彛 + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + io.springfox + springfox-swagger2 + ${swagger.fox.version} + + + + diff --git a/smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/annotation/EnableCustomSwagger2.java b/smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/annotation/EnableCustomSwagger2.java new file mode 100644 index 0000000..2a21d8c --- /dev/null +++ b/smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/annotation/EnableCustomSwagger2.java @@ -0,0 +1,21 @@ +package com.zhentao.common.swagger.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import com.zhentao.common.swagger.config.SwaggerAutoConfiguration; +import org.springframework.context.annotation.Import; + +@Target({ ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@Import({ SwaggerAutoConfiguration.class }) +public @interface EnableCustomSwagger2 +{ + +} diff --git a/smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/config/SwaggerAutoConfiguration.java b/smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/config/SwaggerAutoConfiguration.java new file mode 100644 index 0000000..083aff6 --- /dev/null +++ b/smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/config/SwaggerAutoConfiguration.java @@ -0,0 +1,129 @@ +package com.zhentao.common.swagger.config; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.Contact; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +@EnableAutoConfiguration +@ConditionalOnProperty(name = "swagger.enabled", matchIfMissing = true) +public class SwaggerAutoConfiguration +{ + /** + * 榛樿鐨勬帓闄よ矾寰勶紝鎺掗櫎Spring Boot榛樿鐨勯敊璇鐞嗚矾寰勫拰绔偣 + */ + private static final List DEFAULT_EXCLUDE_PATH = Arrays.asList("/error", "/actuator/**"); + + private static final String BASE_PATH = "/**"; + + @Bean + @ConditionalOnMissingBean + public SwaggerProperties swaggerProperties() + { + return new SwaggerProperties(); + } + + @Bean + public Docket api(SwaggerProperties swaggerProperties) + { + // base-path澶勭悊 + if (swaggerProperties.getBasePath().isEmpty()) + { + swaggerProperties.getBasePath().add(BASE_PATH); + } + // noinspection unchecked + List> basePath = new ArrayList>(); + swaggerProperties.getBasePath().forEach(path -> basePath.add(PathSelectors.ant(path))); + + // exclude-path澶勭悊 + if (swaggerProperties.getExcludePath().isEmpty()) + { + swaggerProperties.getExcludePath().addAll(DEFAULT_EXCLUDE_PATH); + } + List> excludePath = new ArrayList<>(); + swaggerProperties.getExcludePath().forEach(path -> excludePath.add(PathSelectors.ant(path))); + + //noinspection Guava + return new Docket(DocumentationType.SWAGGER_2) + .host(swaggerProperties.getHost()) + .apiInfo(apiInfo(swaggerProperties)).select() + .apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage())) + .paths(Predicates.and(Predicates.not(Predicates.or(excludePath)), Predicates.or(basePath))) + .build() + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .pathMapping("/"); + } + + /** + * 瀹夊叏妯″紡锛岃繖閲屾寚瀹歵oken閫氳繃Authorization澶磋姹傚ご浼犻 + */ + private List securitySchemes() + { + List apiKeyList = new ArrayList(); + apiKeyList.add(new ApiKey("Authorization", "Authorization", "header")); + return apiKeyList; + } + + /** + * 瀹夊叏涓婁笅鏂 + */ + private List securityContexts() + { + List securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .forPaths(PathSelectors.regex("^(?!auth).*$")) + .build()); + return securityContexts; + } + + /** + * 榛樿鐨勫叏灞閴存潈绛栫暐 + * + * @return + */ + private List defaultAuth() + { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + List securityReferences = new ArrayList<>(); + securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); + return securityReferences; + } + + private ApiInfo apiInfo(SwaggerProperties swaggerProperties) + { + return new ApiInfoBuilder() + .title(swaggerProperties.getTitle()) + .description(swaggerProperties.getDescription()) + .license(swaggerProperties.getLicense()) + .licenseUrl(swaggerProperties.getLicenseUrl()) + .termsOfServiceUrl(swaggerProperties.getTermsOfServiceUrl()) + .contact(new Contact(swaggerProperties.getContact().getName(), swaggerProperties.getContact().getUrl(), swaggerProperties.getContact().getEmail())) + .version(swaggerProperties.getVersion()) + .build(); + } +} diff --git a/smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/config/SwaggerProperties.java b/smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/config/SwaggerProperties.java new file mode 100644 index 0000000..f5b90d7 --- /dev/null +++ b/smart-common/smart-common-swagger/src/main/java/com/zhentao/common/swagger/config/SwaggerProperties.java @@ -0,0 +1,345 @@ +package com.zhentao.common.swagger.config; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties("swagger") +public class SwaggerProperties +{ + /** + * 鏄惁寮鍚痵wagger + */ + private Boolean enabled; + + /** + * swagger浼氳В鏋愮殑鍖呰矾寰 + **/ + private String basePackage = ""; + + /** + * swagger浼氳В鏋愮殑url瑙勫垯 + **/ + private List basePath = new ArrayList<>(); + + /** + * 鍦╞asePath鍩虹涓婇渶瑕佹帓闄ょ殑url瑙勫垯 + **/ + private List excludePath = new ArrayList<>(); + + /** + * 鏍囬 + **/ + private String title = ""; + + /** + * 鎻忚堪 + **/ + private String description = ""; + + /** + * 鐗堟湰 + **/ + private String version = ""; + + /** + * 璁稿彲璇 + **/ + private String license = ""; + + /** + * 璁稿彲璇乁RL + **/ + private String licenseUrl = ""; + + /** + * 鏈嶅姟鏉℃URL + **/ + private String termsOfServiceUrl = ""; + + /** + * host淇℃伅 + **/ + private String host = ""; + + /** + * 鑱旂郴浜轰俊鎭 + */ + private Contact contact = new Contact(); + + /** + * 鍏ㄥ眬缁熶竴閴存潈閰嶇疆 + **/ + private Authorization authorization = new Authorization(); + + public Boolean getEnabled() + { + return enabled; + } + + public void setEnabled(Boolean enabled) + { + this.enabled = enabled; + } + + public String getBasePackage() + { + return basePackage; + } + + public void setBasePackage(String basePackage) + { + this.basePackage = basePackage; + } + + public List getBasePath() + { + return basePath; + } + + public void setBasePath(List basePath) + { + this.basePath = basePath; + } + + public List getExcludePath() + { + return excludePath; + } + + public void setExcludePath(List excludePath) + { + this.excludePath = excludePath; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getDescription() + { + return description; + } + + public void setDescription(String description) + { + this.description = description; + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getLicense() + { + return license; + } + + public void setLicense(String license) + { + this.license = license; + } + + public String getLicenseUrl() + { + return licenseUrl; + } + + public void setLicenseUrl(String licenseUrl) + { + this.licenseUrl = licenseUrl; + } + + public String getTermsOfServiceUrl() + { + return termsOfServiceUrl; + } + + public void setTermsOfServiceUrl(String termsOfServiceUrl) + { + this.termsOfServiceUrl = termsOfServiceUrl; + } + + public String getHost() + { + return host; + } + + public void setHost(String host) + { + this.host = host; + } + + public Contact getContact() + { + return contact; + } + + public void setContact(Contact contact) + { + this.contact = contact; + } + + public Authorization getAuthorization() + { + return authorization; + } + + public void setAuthorization(Authorization authorization) + { + this.authorization = authorization; + } + + public static class Contact + { + /** + * 鑱旂郴浜 + **/ + private String name = ""; + /** + * 鑱旂郴浜簎rl + **/ + private String url = ""; + /** + * 鑱旂郴浜篹mail + **/ + private String email = ""; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getUrl() + { + return url; + } + + public void setUrl(String url) + { + this.url = url; + } + + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + } + + public static class Authorization + { + /** + * 閴存潈绛栫暐ID锛岄渶瑕佸拰SecurityReferences ID淇濇寔涓鑷 + */ + private String name = ""; + + /** + * 闇瑕佸紑鍚壌鏉僓RL鐨勬鍒 + */ + private String authRegex = "^.*$"; + + /** + * 閴存潈浣滅敤鍩熷垪琛 + */ + private List authorizationScopeList = new ArrayList<>(); + + private List tokenUrlList = new ArrayList<>(); + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getAuthRegex() + { + return authRegex; + } + + public void setAuthRegex(String authRegex) + { + this.authRegex = authRegex; + } + + public List getAuthorizationScopeList() + { + return authorizationScopeList; + } + + public void setAuthorizationScopeList(List authorizationScopeList) + { + this.authorizationScopeList = authorizationScopeList; + } + + public List getTokenUrlList() + { + return tokenUrlList; + } + + public void setTokenUrlList(List tokenUrlList) + { + this.tokenUrlList = tokenUrlList; + } + } + + public static class AuthorizationScope + { + /** + * 浣滅敤鍩熷悕绉 + */ + private String scope = ""; + + /** + * 浣滅敤鍩熸弿杩 + */ + private String description = ""; + + public String getScope() + { + return scope; + } + + public void setScope(String scope) + { + this.scope = scope; + } + + public String getDescription() + { + return description; + } + + public void setDescription(String description) + { + this.description = description; + } + } +} diff --git a/smart-common/smart-common-swagger/src/main/resources/META-INF/spring.factories b/smart-common/smart-common-swagger/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..a943856 --- /dev/null +++ b/smart-common/smart-common-swagger/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.zhentao.common.swagger.config.SwaggerAutoConfiguration diff --git a/smart-gateway/pom.xml b/smart-gateway/pom.xml new file mode 100644 index 0000000..d74cddd --- /dev/null +++ b/smart-gateway/pom.xml @@ -0,0 +1,104 @@ + + + com.ruoyi + CloudParking + 2.5.0 + + 4.0.0 + + smart-gateway + + + smart-gateway缃戝叧妯″潡 + + + + + + + org.springframework.cloud + spring-cloud-starter-gateway + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + com.alibaba.cloud + spring-cloud-alibaba-sentinel-gateway + + + + + com.alibaba.csp + sentinel-datasource-nacos + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + com.github.penggle + kaptcha + + + + + com.ruoyi + smart-common-redis + + + + + io.springfox + springfox-swagger-ui + ${swagger.fox.version} + + + io.springfox + springfox-swagger2 + ${swagger.fox.version} + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/RuoYiGatewayApplication.java b/smart-gateway/src/main/java/com/zhentao/gateway/RuoYiGatewayApplication.java new file mode 100644 index 0000000..5100e70 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/RuoYiGatewayApplication.java @@ -0,0 +1,31 @@ +package com.zhentao.gateway; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * 缃戝叧鍚姩绋嬪簭 + * + * @author ruoyi + */ +@EnableDiscoveryClient +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class }) +public class RuoYiGatewayApplication +{ + public static void main(String[] args) + { + SpringApplication.run(RuoYiGatewayApplication.class, args); + System.out.println("(鈾モ棤鈥库棤)锞夛緸 鑻ヤ緷缃戝叧鍚姩鎴愬姛 醿(麓凇`醿)锞 \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/config/CaptchaConfig.java b/smart-gateway/src/main/java/com/zhentao/gateway/config/CaptchaConfig.java new file mode 100644 index 0000000..9a06ab9 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/config/CaptchaConfig.java @@ -0,0 +1,83 @@ +package com.zhentao.gateway.config; + +import java.util.Properties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import static com.google.code.kaptcha.Constants.*; + +/** + * 楠岃瘉鐮侀厤缃 + * + * @author ruoyi + */ +@Configuration +public class CaptchaConfig +{ + @Bean(name = "captchaProducer") + public DefaultKaptcha getKaptchaBean() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 鏄惁鏈夎竟妗 榛樿涓簍rue 鎴戜滑鍙互鑷繁璁剧疆yes锛宯o + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 楠岃瘉鐮佹枃鏈瓧绗﹂鑹 榛樿涓篊olor.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); + // 楠岃瘉鐮佸浘鐗囧搴 榛樿涓200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 楠岃瘉鐮佸浘鐗囬珮搴 榛樿涓50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 楠岃瘉鐮佹枃鏈瓧绗﹀ぇ灏 榛樿涓40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); + // 楠岃瘉鐮佹枃鏈瓧绗﹂暱搴 榛樿涓5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + // 楠岃瘉鐮佹枃鏈瓧浣撴牱寮 榛樿涓簄ew Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 鍥剧墖鏍峰紡 姘寸汗com.google.code.kaptcha.impl.WaterRipple 楸肩溂com.google.code.kaptcha.impl.FishEyeGimpy 闃村奖com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } + + @Bean(name = "captchaProducerMath") + public DefaultKaptcha getKaptchaBeanMath() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 鏄惁鏈夎竟妗 榛樿涓簍rue 鎴戜滑鍙互鑷繁璁剧疆yes锛宯o + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 杈规棰滆壊 榛樿涓篊olor.BLACK + properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); + // 楠岃瘉鐮佹枃鏈瓧绗﹂鑹 榛樿涓篊olor.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + // 楠岃瘉鐮佸浘鐗囧搴 榛樿涓200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 楠岃瘉鐮佸浘鐗囬珮搴 榛樿涓50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 楠岃瘉鐮佹枃鏈瓧绗﹀ぇ灏 榛樿涓40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); + // 楠岃瘉鐮佹枃鏈敓鎴愬櫒 + properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.gateway.config.KaptchaTextCreator"); + // 楠岃瘉鐮佹枃鏈瓧绗﹂棿璺 榛樿涓2 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); + // 楠岃瘉鐮佹枃鏈瓧绗﹂暱搴 榛樿涓5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); + // 楠岃瘉鐮佹枃鏈瓧浣撴牱寮 榛樿涓簄ew Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 楠岃瘉鐮佸櫔鐐归鑹 榛樿涓篊olor.BLACK + properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); + // 骞叉壈瀹炵幇绫 + properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); + // 鍥剧墖鏍峰紡 姘寸汗com.google.code.kaptcha.impl.WaterRipple 楸肩溂com.google.code.kaptcha.impl.FishEyeGimpy 闃村奖com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/config/GatewayConfig.java b/smart-gateway/src/main/java/com/zhentao/gateway/config/GatewayConfig.java new file mode 100644 index 0000000..051b840 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/config/GatewayConfig.java @@ -0,0 +1,32 @@ +package com.zhentao.gateway.config; + +import com.zhentao.gateway.handler.SentinelFallbackHandler; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter; + +/** + * 缃戝叧闄愭祦閰嶇疆 + * + * @author ruoyi + */ +@Configuration +public class GatewayConfig +{ + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public SentinelFallbackHandler sentinelGatewayExceptionHandler() + { + return new SentinelFallbackHandler(); + } + + @Bean + @Order(-1) + public GlobalFilter sentinelGatewayFilter() + { + return new SentinelGatewayFilter(); + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/config/KaptchaTextCreator.java b/smart-gateway/src/main/java/com/zhentao/gateway/config/KaptchaTextCreator.java new file mode 100644 index 0000000..5bbb2f8 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/config/KaptchaTextCreator.java @@ -0,0 +1,75 @@ +package com.zhentao.gateway.config; + +import java.util.Random; +import com.google.code.kaptcha.text.impl.DefaultTextCreator; + +/** + * 楠岃瘉鐮佹枃鏈敓鎴愬櫒 + * + * @author ruoyi + */ +public class KaptchaTextCreator extends DefaultTextCreator +{ + private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); + + @Override + public String getText() + { + Integer result = 0; + Random random = new Random(); + int x = random.nextInt(10); + int y = random.nextInt(10); + StringBuilder suChinese = new StringBuilder(); + int randomoperands = (int) Math.round(Math.random() * 2); + if (randomoperands == 0) + { + result = x * y; + suChinese.append(CNUMBERS[x]); + suChinese.append("*"); + suChinese.append(CNUMBERS[y]); + } + else if (randomoperands == 1) + { + if (!(x == 0) && y % x == 0) + { + result = y / x; + suChinese.append(CNUMBERS[y]); + suChinese.append("/"); + suChinese.append(CNUMBERS[x]); + } + else + { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + } + else if (randomoperands == 2) + { + if (x >= y) + { + result = x - y; + suChinese.append(CNUMBERS[x]); + suChinese.append("-"); + suChinese.append(CNUMBERS[y]); + } + else + { + result = y - x; + suChinese.append(CNUMBERS[y]); + suChinese.append("-"); + suChinese.append(CNUMBERS[x]); + } + } + else + { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + suChinese.append("=?@" + result); + return suChinese.toString(); + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/config/RouterFunctionConfiguration.java b/smart-gateway/src/main/java/com/zhentao/gateway/config/RouterFunctionConfiguration.java new file mode 100644 index 0000000..51ffa69 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/config/RouterFunctionConfiguration.java @@ -0,0 +1,31 @@ +package com.zhentao.gateway.config; + +import com.zhentao.gateway.handler.ValidateCodeHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.server.RequestPredicates; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; + +/** + * 璺敱閰嶇疆淇℃伅 + * + * @author ruoyi + */ +@Configuration +public class RouterFunctionConfiguration +{ + @Autowired + private ValidateCodeHandler validateCodeHandler; + + @SuppressWarnings("rawtypes") + @Bean + public RouterFunction routerFunction() + { + return RouterFunctions.route( + RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), + validateCodeHandler); + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/config/SwaggerProvider.java b/smart-gateway/src/main/java/com/zhentao/gateway/config/SwaggerProvider.java new file mode 100644 index 0000000..1bc6338 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/config/SwaggerProvider.java @@ -0,0 +1,66 @@ +package com.zhentao.gateway.config; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.gateway.config.GatewayProperties; +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.cloud.gateway.support.NameUtils; +import org.springframework.stereotype.Component; +import springfox.documentation.swagger.web.SwaggerResource; +import springfox.documentation.swagger.web.SwaggerResourcesProvider; + +/** + * 鑱氬悎绯荤粺鎺ュ彛 + * + * @author ruoyi + */ +@Component +public class SwaggerProvider implements SwaggerResourcesProvider +{ + /** + * Swagger2榛樿鐨剈rl鍚庣紑 + */ + public static final String SWAGGER2URL = "/v2/api-docs"; + /** + * 缃戝叧璺敱 + */ + @Autowired + private RouteLocator routeLocator; + + @Autowired + private GatewayProperties gatewayProperties; + + /** + * 鑱氬悎鍏朵粬鏈嶅姟鎺ュ彛 + * + * @return + */ + @Override + public List get() + { + List resourceList = new ArrayList<>(); + List routes = new ArrayList<>(); + // 鑾峰彇缃戝叧涓厤缃殑route + routeLocator.getRoutes().subscribe(route -> routes.add(route.getId())); + gatewayProperties.getRoutes().stream() + .filter(routeDefinition -> routes + .contains(routeDefinition.getId())) + .forEach(routeDefinition -> routeDefinition.getPredicates().stream() + .filter(predicateDefinition -> "Path".equalsIgnoreCase(predicateDefinition.getName())) + .filter(predicateDefinition -> !"ruoyi-auth".equalsIgnoreCase(routeDefinition.getId())) + .forEach(predicateDefinition -> resourceList + .add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs() + .get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", SWAGGER2URL))))); + return resourceList; + } + + private SwaggerResource swaggerResource(String name, String location) + { + SwaggerResource swaggerResource = new SwaggerResource(); + swaggerResource.setName(name); + swaggerResource.setLocation(location); + swaggerResource.setSwaggerVersion("2.0"); + return swaggerResource; + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/config/properties/IgnoreWhiteProperties.java b/smart-gateway/src/main/java/com/zhentao/gateway/config/properties/IgnoreWhiteProperties.java new file mode 100644 index 0000000..98cc798 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/config/properties/IgnoreWhiteProperties.java @@ -0,0 +1,33 @@ +package com.zhentao.gateway.config.properties; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 鏀捐鐧藉悕鍗曢厤缃 + * + * @author ruoyi + */ +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "ignore") +public class IgnoreWhiteProperties +{ + /** + * 鏀捐鐧藉悕鍗曢厤缃紝缃戝叧涓嶆牎楠屾澶勭殑鐧藉悕鍗 + */ + private List whites = new ArrayList<>(); + + public List getWhites() + { + return whites; + } + + public void setWhites(List whites) + { + this.whites = whites; + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/filter/AuthFilter.java b/smart-gateway/src/main/java/com/zhentao/gateway/filter/AuthFilter.java new file mode 100644 index 0000000..4eeedd2 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/filter/AuthFilter.java @@ -0,0 +1,125 @@ +package com.zhentao.gateway.filter; + +import javax.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.core.io.buffer.DataBufferFactory; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.zhentao.common.core.constant.CacheConstants; +import com.zhentao.common.core.constant.Constants; +import com.zhentao.common.core.domain.R; +import com.zhentao.common.core.utils.ServletUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.redis.service.RedisService; +import com.zhentao.gateway.config.properties.IgnoreWhiteProperties; +import reactor.core.publisher.Mono; + +/** + * 缃戝叧閴存潈 + * + * @author ruoyi + */ +@Component +public class AuthFilter implements GlobalFilter, Ordered +{ + private static final Logger log = LoggerFactory.getLogger(AuthFilter.class); + + private final static long EXPIRE_TIME = Constants.TOKEN_EXPIRE * 60; + + // 鎺掗櫎杩囨护鐨 uri 鍦板潃锛宯acos鑷娣诲姞 + @Autowired + private IgnoreWhiteProperties ignoreWhite; + + @Resource(name = "stringRedisTemplate") + private ValueOperations sops; + + @Autowired + private RedisService redisService; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) + { + String url = exchange.getRequest().getURI().getPath(); + // 璺宠繃涓嶉渶瑕侀獙璇佺殑璺緞 + if (StringUtils.matches(url, ignoreWhite.getWhites())) + { + return chain.filter(exchange); + } + String token = getToken(exchange.getRequest()); + if (StringUtils.isBlank(token)) + { + return setUnauthorizedResponse(exchange, "浠ょ墝涓嶈兘涓虹┖"); + } + String userStr = sops.get(getTokenKey(token)); + if (StringUtils.isNull(userStr)) + { + return setUnauthorizedResponse(exchange, "鐧诲綍鐘舵佸凡杩囨湡"); + } + JSONObject obj = JSONObject.parseObject(userStr); + String userid = obj.getString("userid"); + String username = obj.getString("username"); + if (StringUtils.isBlank(userid) || StringUtils.isBlank(username)) + { + return setUnauthorizedResponse(exchange, "浠ょ墝楠岃瘉澶辫触"); + } + + // 璁剧疆杩囨湡鏃堕棿 + redisService.expire(getTokenKey(token), EXPIRE_TIME); + // 璁剧疆鐢ㄦ埛淇℃伅鍒拌姹 + ServerHttpRequest mutableReq = exchange.getRequest().mutate().header(CacheConstants.DETAILS_USER_ID, userid) + .header(CacheConstants.DETAILS_USERNAME, ServletUtils.urlEncode(username)).build(); + ServerWebExchange mutableExchange = exchange.mutate().request(mutableReq).build(); + + return chain.filter(mutableExchange); + } + + private Mono setUnauthorizedResponse(ServerWebExchange exchange, String msg) + { + ServerHttpResponse response = exchange.getResponse(); + response.getHeaders().setContentType(MediaType.APPLICATION_JSON); + response.setStatusCode(HttpStatus.OK); + + log.error("[閴存潈寮傚父澶勭悊]璇锋眰璺緞:{}", exchange.getRequest().getPath()); + + return response.writeWith(Mono.fromSupplier(() -> { + DataBufferFactory bufferFactory = response.bufferFactory(); + return bufferFactory.wrap(JSON.toJSONBytes(R.fail(msg))); + })); + } + + private String getTokenKey(String token) + { + return CacheConstants.LOGIN_TOKEN_KEY + token; + } + + /** + * 鑾峰彇璇锋眰token + */ + private String getToken(ServerHttpRequest request) + { + String token = request.getHeaders().getFirst(CacheConstants.HEADER); + if (StringUtils.isNotEmpty(token) && token.startsWith(CacheConstants.TOKEN_PREFIX)) + { + token = token.replace(CacheConstants.TOKEN_PREFIX, ""); + } + return token; + } + + @Override + public int getOrder() + { + return -200; + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/filter/BlackListUrlFilter.java b/smart-gateway/src/main/java/com/zhentao/gateway/filter/BlackListUrlFilter.java new file mode 100644 index 0000000..9863eae --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/filter/BlackListUrlFilter.java @@ -0,0 +1,70 @@ +package com.zhentao.gateway.filter; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson.JSON; +import com.zhentao.common.core.web.domain.AjaxResult; +import reactor.core.publisher.Mono; + +/** + * 榛戝悕鍗曡繃婊ゅ櫒 + * + * @author ruoyi + */ +@Component +public class BlackListUrlFilter extends AbstractGatewayFilterFactory +{ + @Override + public GatewayFilter apply(Config config) + { + return (exchange, chain) -> { + + String url = exchange.getRequest().getURI().getPath(); + if (config.matchBlacklist(url)) + { + ServerHttpResponse response = exchange.getResponse(); + return exchange.getResponse().writeWith( + Mono.just(response.bufferFactory().wrap(JSON.toJSONBytes(AjaxResult.error("鏈嶅姟鎷掔粷璁块棶"))))); + } + + return chain.filter(exchange); + }; + } + + public BlackListUrlFilter() + { + super(Config.class); + } + + public static class Config + { + private List blacklistUrl; + + private List blacklistUrlPattern = new ArrayList<>(); + + public boolean matchBlacklist(String url) + { + return blacklistUrlPattern.isEmpty() ? false : blacklistUrlPattern.stream().filter(p -> p.matcher(url).find()).findAny().isPresent(); + } + + public List getBlacklistUrl() + { + return blacklistUrl; + } + + public void setBlacklistUrl(List blacklistUrl) + { + this.blacklistUrl = blacklistUrl; + this.blacklistUrlPattern.clear(); + this.blacklistUrl.forEach(url -> { + this.blacklistUrlPattern.add(Pattern.compile(url.replaceAll("\\*\\*", "(.*?)"), Pattern.CASE_INSENSITIVE)); + }); + } + } + +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/filter/CacheRequestFilter.java b/smart-gateway/src/main/java/com/zhentao/gateway/filter/CacheRequestFilter.java new file mode 100644 index 0000000..aecd41f --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/filter/CacheRequestFilter.java @@ -0,0 +1,100 @@ +package com.zhentao.gateway.filter; + +import java.util.Collections; +import java.util.List; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.OrderedGatewayFilter; +import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferFactory; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.http.HttpMethod; +import org.springframework.http.server.reactive.ServerHttpRequestDecorator; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Component +public class CacheRequestFilter extends AbstractGatewayFilterFactory +{ + public CacheRequestFilter() + { + super(Config.class); + } + + @Override + public String name() + { + return "CacheRequestFilter"; + } + + @Override + public GatewayFilter apply(Config config) + { + CacheRequestGatewayFilter cacheRequestGatewayFilter = new CacheRequestGatewayFilter(); + Integer order = config.getOrder(); + if (order == null) + { + return cacheRequestGatewayFilter; + } + return new OrderedGatewayFilter(cacheRequestGatewayFilter, order); + } + + public static class CacheRequestGatewayFilter implements GatewayFilter + { + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) + { + // GET DELETE 涓嶈繃婊 + HttpMethod method = exchange.getRequest().getMethod(); + if (method == null || method.matches("GET") || method.matches("DELETE")) + { + return chain.filter(exchange); + } + return DataBufferUtils.join(exchange.getRequest().getBody()).map(dataBuffer -> { + byte[] bytes = new byte[dataBuffer.readableByteCount()]; + dataBuffer.read(bytes); + DataBufferUtils.release(dataBuffer); + return bytes; + }).defaultIfEmpty(new byte[0]).flatMap(bytes -> { + DataBufferFactory dataBufferFactory = exchange.getResponse().bufferFactory(); + ServerHttpRequestDecorator decorator = new ServerHttpRequestDecorator(exchange.getRequest()) + { + @Override + public Flux getBody() + { + if (bytes.length > 0) + { + return Flux.just(dataBufferFactory.wrap(bytes)); + } + return Flux.empty(); + } + }; + return chain.filter(exchange.mutate().request(decorator).build()); + }); + } + } + + @Override + public List shortcutFieldOrder() + { + return Collections.singletonList("order"); + } + + static class Config + { + private Integer order; + + public Integer getOrder() + { + return order; + } + + public void setOrder(Integer order) + { + this.order = order; + } + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/filter/ValidateCodeFilter.java b/smart-gateway/src/main/java/com/zhentao/gateway/filter/ValidateCodeFilter.java new file mode 100644 index 0000000..2ebb1e8 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/filter/ValidateCodeFilter.java @@ -0,0 +1,80 @@ +package com.zhentao.gateway.filter; + +import java.nio.CharBuffer; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.atomic.AtomicReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.gateway.service.ValidateCodeService; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +/** + * 楠岃瘉鐮佽繃婊ゅ櫒 + * + * @author ruoyi + */ +@Component +public class ValidateCodeFilter extends AbstractGatewayFilterFactory +{ + private final static String AUTH_URL = "/auth/login"; + + @Autowired + private ValidateCodeService validateCodeService; + + private static final String CODE = "code"; + + private static final String UUID = "uuid"; + + @Override + public GatewayFilter apply(Object config) + { + return (exchange, chain) -> { + ServerHttpRequest request = exchange.getRequest(); + + // 闈炵櫥褰曡姹傦紝涓嶅鐞 + if (!StringUtils.containsIgnoreCase(request.getURI().getPath(), AUTH_URL)) + { + return chain.filter(exchange); + } + + try + { + String rspStr = resolveBodyFromRequest(request); + JSONObject obj = JSONObject.parseObject(rspStr); + validateCodeService.checkCapcha(obj.getString(CODE), obj.getString(UUID)); + } + catch (Exception e) + { + ServerHttpResponse response = exchange.getResponse(); + response.getHeaders().add("Content-Type", "application/json;charset=UTF-8"); + return exchange.getResponse().writeWith( + Mono.just(response.bufferFactory().wrap(JSON.toJSONBytes(AjaxResult.error(e.getMessage()))))); + } + return chain.filter(exchange); + }; + } + + private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) + { + // 鑾峰彇璇锋眰浣 + Flux body = serverHttpRequest.getBody(); + AtomicReference bodyRef = new AtomicReference<>(); + body.subscribe(buffer -> { + CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer()); + DataBufferUtils.release(buffer); + bodyRef.set(charBuffer.toString()); + }); + return bodyRef.get(); + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/handler/GatewayExceptionHandler.java b/smart-gateway/src/main/java/com/zhentao/gateway/handler/GatewayExceptionHandler.java new file mode 100644 index 0000000..792eaa0 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/handler/GatewayExceptionHandler.java @@ -0,0 +1,66 @@ +package com.zhentao.gateway.handler; + +import org.springframework.cloud.gateway.support.NotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.core.io.buffer.DataBufferFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.server.ServerWebExchange; +import com.alibaba.fastjson.JSON; +import com.zhentao.common.core.domain.R; +import reactor.core.publisher.Mono; + +/** + * 缃戝叧缁熶竴寮傚父澶勭悊 + * + * @author ruoyi + */ +@Order(-1) +@Configuration +public class GatewayExceptionHandler implements ErrorWebExceptionHandler +{ + private static final Logger log = LoggerFactory.getLogger(GatewayExceptionHandler.class); + + @Override + public Mono handle(ServerWebExchange exchange, Throwable ex) + { + ServerHttpResponse response = exchange.getResponse(); + + if (exchange.getResponse().isCommitted()) + { + return Mono.error(ex); + } + + String msg; + + if (ex instanceof NotFoundException) + { + msg = "鏈嶅姟鏈壘鍒"; + } + else if (ex instanceof ResponseStatusException) + { + ResponseStatusException responseStatusException = (ResponseStatusException) ex; + msg = responseStatusException.getMessage(); + } + else + { + msg = "鍐呴儴鏈嶅姟鍣ㄩ敊璇"; + } + + log.error("[缃戝叧寮傚父澶勭悊]璇锋眰璺緞:{},寮傚父淇℃伅:{}", exchange.getRequest().getPath(), ex.getMessage()); + + response.getHeaders().setContentType(MediaType.APPLICATION_JSON); + response.setStatusCode(HttpStatus.OK); + + return response.writeWith(Mono.fromSupplier(() -> { + DataBufferFactory bufferFactory = response.bufferFactory(); + return bufferFactory.wrap(JSON.toJSONBytes(R.fail(msg))); + })); + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/handler/SentinelFallbackHandler.java b/smart-gateway/src/main/java/com/zhentao/gateway/handler/SentinelFallbackHandler.java new file mode 100644 index 0000000..cafb07c --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/handler/SentinelFallbackHandler.java @@ -0,0 +1,47 @@ +package com.zhentao.gateway.handler; + +import java.nio.charset.StandardCharsets; +import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebExceptionHandler; +import reactor.core.publisher.Mono; + +/** + * 鑷畾涔夐檺娴佸紓甯稿鐞 + * + * @author ruoyi + */ +public class SentinelFallbackHandler implements WebExceptionHandler +{ + private Mono writeResponse(ServerResponse response, ServerWebExchange exchange) + { + ServerHttpResponse serverHttpResponse = exchange.getResponse(); + serverHttpResponse.getHeaders().add("Content-Type", "application/json;charset=UTF-8"); + byte[] datas = "{\"code\":429,\"msg\":\"璇锋眰瓒呰繃鏈澶ф暟锛岃绋嶅悗鍐嶈瘯\"}".getBytes(StandardCharsets.UTF_8); + DataBuffer buffer = serverHttpResponse.bufferFactory().wrap(datas); + return serverHttpResponse.writeWith(Mono.just(buffer)); + } + + @Override + public Mono handle(ServerWebExchange exchange, Throwable ex) + { + if (exchange.getResponse().isCommitted()) + { + return Mono.error(ex); + } + if (!BlockException.isBlockException(ex)) + { + return Mono.error(ex); + } + return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange)); + } + + private Mono handleBlockedRequest(ServerWebExchange exchange, Throwable throwable) + { + return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable); + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/handler/SwaggerHandler.java b/smart-gateway/src/main/java/com/zhentao/gateway/handler/SwaggerHandler.java new file mode 100644 index 0000000..b294e38 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/handler/SwaggerHandler.java @@ -0,0 +1,56 @@ +package com.zhentao.gateway.handler; + +import java.util.Optional; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; +import springfox.documentation.swagger.web.SecurityConfiguration; +import springfox.documentation.swagger.web.SecurityConfigurationBuilder; +import springfox.documentation.swagger.web.SwaggerResourcesProvider; +import springfox.documentation.swagger.web.UiConfiguration; +import springfox.documentation.swagger.web.UiConfigurationBuilder; + +@RestController +@RequestMapping("/swagger-resources") +public class SwaggerHandler +{ + @Autowired(required = false) + private SecurityConfiguration securityConfiguration; + + @Autowired(required = false) + private UiConfiguration uiConfiguration; + + private final SwaggerResourcesProvider swaggerResources; + + @Autowired + public SwaggerHandler(SwaggerResourcesProvider swaggerResources) + { + this.swaggerResources = swaggerResources; + } + + @GetMapping("/configuration/security") + public Mono> securityConfiguration() + { + return Mono.just(new ResponseEntity<>( + Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), + HttpStatus.OK)); + } + + @GetMapping("/configuration/ui") + public Mono> uiConfiguration() + { + return Mono.just(new ResponseEntity<>( + Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK)); + } + + @SuppressWarnings("rawtypes") + @GetMapping("") + public Mono swaggerResources() + { + return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK))); + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/handler/ValidateCodeHandler.java b/smart-gateway/src/main/java/com/zhentao/gateway/handler/ValidateCodeHandler.java new file mode 100644 index 0000000..bbec28b --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/handler/ValidateCodeHandler.java @@ -0,0 +1,41 @@ +package com.zhentao.gateway.handler; + +import java.io.IOException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.server.HandlerFunction; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import com.zhentao.common.core.exception.CaptchaException; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.gateway.service.ValidateCodeService; +import reactor.core.publisher.Mono; + +/** + * 楠岃瘉鐮佽幏鍙 + * + * @author ruoyi + */ +@Component +public class ValidateCodeHandler implements HandlerFunction +{ + @Autowired + private ValidateCodeService validateCodeService; + + @Override + public Mono handle(ServerRequest serverRequest) + { + AjaxResult ajax; + try + { + ajax = validateCodeService.createCapcha(); + } + catch (CaptchaException | IOException e) + { + return Mono.error(e); + } + return ServerResponse.status(HttpStatus.OK).body(BodyInserters.fromValue(ajax)); + } +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/service/ValidateCodeService.java b/smart-gateway/src/main/java/com/zhentao/gateway/service/ValidateCodeService.java new file mode 100644 index 0000000..a7fa061 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/service/ValidateCodeService.java @@ -0,0 +1,23 @@ +package com.zhentao.gateway.service; + +import java.io.IOException; +import com.zhentao.common.core.exception.CaptchaException; +import com.zhentao.common.core.web.domain.AjaxResult; + +/** + * 楠岃瘉鐮佸鐞 + * + * @author ruoyi + */ +public interface ValidateCodeService +{ + /** + * 鐢熸垚楠岃瘉鐮 + */ + public AjaxResult createCapcha() throws IOException, CaptchaException; + + /** + * 鏍¢獙楠岃瘉鐮 + */ + public void checkCapcha(String key, String value) throws CaptchaException; +} diff --git a/smart-gateway/src/main/java/com/zhentao/gateway/service/impl/ValidateCodeServiceImpl.java b/smart-gateway/src/main/java/com/zhentao/gateway/service/impl/ValidateCodeServiceImpl.java new file mode 100644 index 0000000..8bdc5e2 --- /dev/null +++ b/smart-gateway/src/main/java/com/zhentao/gateway/service/impl/ValidateCodeServiceImpl.java @@ -0,0 +1,110 @@ +package com.zhentao.gateway.service.impl; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Resource; +import javax.imageio.ImageIO; + +import com.zhentao.gateway.service.ValidateCodeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.FastByteArrayOutputStream; +import com.google.code.kaptcha.Producer; +import com.zhentao.common.core.constant.Constants; +import com.zhentao.common.core.exception.CaptchaException; +import com.zhentao.common.core.utils.IdUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.utils.sign.Base64; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.redis.service.RedisService; + +/** + * 楠岃瘉鐮佸疄鐜板鐞 + * + * @author ruoyi + */ +@Service +public class ValidateCodeServiceImpl implements ValidateCodeService +{ + @Resource(name = "captchaProducer") + private Producer captchaProducer; + + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + + @Autowired + private RedisService redisService; + + // 楠岃瘉鐮佺被鍨 + private String captchaType = "math"; + + /** + * 鐢熸垚楠岃瘉鐮 + */ + @Override + public AjaxResult createCapcha() throws IOException, CaptchaException + { + // 淇濆瓨楠岃瘉鐮佷俊鎭 + String uuid = IdUtils.simpleUUID(); + String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; + + String capStr = null, code = null; + BufferedImage image = null; + + // 鐢熸垚楠岃瘉鐮 + if ("math".equals(captchaType)) + { + String capText = captchaProducerMath.createText(); + capStr = capText.substring(0, capText.lastIndexOf("@")); + code = capText.substring(capText.lastIndexOf("@") + 1); + image = captchaProducerMath.createImage(capStr); + } + else if ("char".equals(captchaType)) + { + capStr = code = captchaProducer.createText(); + image = captchaProducer.createImage(capStr); + } + + redisService.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); + // 杞崲娴佷俊鎭啓鍑 + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try + { + ImageIO.write(image, "jpg", os); + } + catch (IOException e) + { + return AjaxResult.error(e.getMessage()); + } + + AjaxResult ajax = AjaxResult.success(); + ajax.put("uuid", uuid); + ajax.put("img", Base64.encode(os.toByteArray())); + return ajax; + } + + /** + * 鏍¢獙楠岃瘉鐮 + */ + @Override + public void checkCapcha(String code, String uuid) throws CaptchaException + { + if (StringUtils.isEmpty(code)) + { + throw new CaptchaException("楠岃瘉鐮佷笉鑳戒负绌"); + } + if (StringUtils.isEmpty(uuid)) + { + throw new CaptchaException("楠岃瘉鐮佸凡澶辨晥"); + } + String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; + String captcha = redisService.getCacheObject(verifyKey); + redisService.deleteObject(verifyKey); + + if (!code.equalsIgnoreCase(captcha)) + { + throw new CaptchaException("楠岃瘉鐮侀敊璇"); + } + } +} diff --git a/smart-gateway/src/main/resources/banner.txt b/smart-gateway/src/main/resources/banner.txt new file mode 100644 index 0000000..b0bd74c --- /dev/null +++ b/smart-gateway/src/main/resources/banner.txt @@ -0,0 +1,22 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} +'' + .::::. + .::::::::. + ::::::::::: + ..:::::::::::' + '::::::::::::' + .:::::::::: + '::::::::::::::.. + ..::::::::::::. + ``:::::::::::::::: + ::::``:::::::::' .:::. + ::::' ':::::' .::::::::. + .::::' :::: .:::::::'::::. + .:::' ::::: .:::::::::' ':::::. + .::' :::::.:::::::::' ':::::. + .::' ::::::::::::::' ``::::. + ...::: ::::::::::::' ``::. + ````':. ':::::::::' ::::.. + '.:::::' ':'````.. +''' diff --git a/smart-gateway/src/main/resources/bootstrap.yml b/smart-gateway/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..11afbf5 --- /dev/null +++ b/smart-gateway/src/main/resources/bootstrap.yml @@ -0,0 +1,48 @@ +# Tomcat +server: + port: 8081 + +# Spring +spring: + application: + # 搴旂敤鍚嶇О + name: ruoyi-gateway + profiles: + # 鐜閰嶇疆 + active: dev + main: + allow-bean-definition-overriding: true + cloud: + nacos: + discovery: + # 鏈嶅姟娉ㄥ唽鍦板潃 + server-addr: 8.130.77.16:8848 + + + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + config: + # 閰嶇疆涓績鍦板潃 + server-addr: 8.130.77.16:8848 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + # 閰嶇疆鏂囦欢鏍煎紡 + file-extension: yml + # 鍏变韩閰嶇疆 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + sentinel: + # 鍙栨秷鎺у埗鍙版噿鍔犺浇 + eager: true + transport: + # 鎺у埗鍙板湴鍧 + dashboard: 8.130.77.16:8858 + # nacos閰嶇疆鎸佷箙鍖 + datasource: + ds1: + nacos: + server-addr: 8.130.77.16:8848 + dataId: sentinel-ruoyi-gateway + groupId: DEFAULT_GROUP + data-type: json + rule-type: flow + + diff --git a/smart-gateway/src/main/resources/logback.xml b/smart-gateway/src/main/resources/logback.xml new file mode 100644 index 0000000..f8e7f8a --- /dev/null +++ b/smart-gateway/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/smart-modules/pom.xml b/smart-modules/pom.xml new file mode 100644 index 0000000..e40327e --- /dev/null +++ b/smart-modules/pom.xml @@ -0,0 +1,25 @@ + + + + com.ruoyi + CloudParking + 2.5.0 + + 4.0.0 + + + smart-system + smart-gen + smart-job + smart-file + + + smart-modules + pom + + + smart-modules涓氬姟妯″潡 + + + diff --git a/smart-modules/smart-file/pom.xml b/smart-modules/smart-file/pom.xml new file mode 100644 index 0000000..185a62c --- /dev/null +++ b/smart-modules/smart-file/pom.xml @@ -0,0 +1,95 @@ + + + + com.ruoyi + smart-modules + 2.5.0 + + 4.0.0 + + smart-modules-file + + + smart-modules-file鏂囦欢鏈嶅姟 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + io.springfox + springfox-swagger-ui + ${swagger.fox.version} + + + + + com.github.tobato + fastdfs-client + + + + + io.minio + minio + ${minio.version} + + + + + com.ruoyi + smart-api-system + + + + + com.ruoyi + smart-common-swagger + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/smart-modules/smart-file/src/main/java/com/zhentao/file/RuoYFileApplication.java b/smart-modules/smart-file/src/main/java/com/zhentao/file/RuoYFileApplication.java new file mode 100644 index 0000000..9a781ee --- /dev/null +++ b/smart-modules/smart-file/src/main/java/com/zhentao/file/RuoYFileApplication.java @@ -0,0 +1,33 @@ +package com.zhentao.file; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import com.zhentao.common.swagger.annotation.EnableCustomSwagger2; + +/** + * 鏂囦欢鏈嶅姟 + * + * @author ruoyi + */ +@EnableCustomSwagger2 +@EnableDiscoveryClient +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class }) +public class RuoYFileApplication +{ + public static void main(String[] args) + { + SpringApplication.run(RuoYFileApplication.class, args); + System.out.println("(鈾モ棤鈥库棤)锞夛緸 鏂囦欢鏈嶅姟妯″潡鍚姩鎴愬姛 醿(麓凇`醿)锞 \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} diff --git a/smart-modules/smart-file/src/main/java/com/zhentao/file/config/MinioConfig.java b/smart-modules/smart-file/src/main/java/com/zhentao/file/config/MinioConfig.java new file mode 100644 index 0000000..0b65175 --- /dev/null +++ b/smart-modules/smart-file/src/main/java/com/zhentao/file/config/MinioConfig.java @@ -0,0 +1,82 @@ +package com.zhentao.file.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import io.minio.MinioClient; + +/** + * Minio 閰嶇疆淇℃伅 + * + * @author ruoiy + */ +@Configuration +@ConfigurationProperties(prefix = "minio") +public class MinioConfig +{ + /** + * 鏈嶅姟鍦板潃 + */ + private String url; + + /** + * 鐢ㄦ埛鍚 + */ + private String accessKey; + + /** + * 瀵嗙爜 + */ + private String secretKey; + + /** + * 瀛樺偍妗跺悕绉 + */ + private String bucketName; + + public String getUrl() + { + return url; + } + + public void setUrl(String url) + { + this.url = url; + } + + public String getAccessKey() + { + return accessKey; + } + + public void setAccessKey(String accessKey) + { + this.accessKey = accessKey; + } + + public String getSecretKey() + { + return secretKey; + } + + public void setSecretKey(String secretKey) + { + this.secretKey = secretKey; + } + + public String getBucketName() + { + return bucketName; + } + + public void setBucketName(String bucketName) + { + this.bucketName = bucketName; + } + + @Bean + public MinioClient getMinioClient() + { + return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build(); + } +} diff --git a/smart-modules/smart-file/src/main/java/com/zhentao/file/config/ResourcesConfig.java b/smart-modules/smart-file/src/main/java/com/zhentao/file/config/ResourcesConfig.java new file mode 100644 index 0000000..14c4416 --- /dev/null +++ b/smart-modules/smart-file/src/main/java/com/zhentao/file/config/ResourcesConfig.java @@ -0,0 +1,36 @@ +package com.zhentao.file.config; + +import java.io.File; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 閫氱敤鏄犲皠閰嶇疆 + * + * @author ruoyi + */ +@Configuration +public class ResourcesConfig implements WebMvcConfigurer +{ + /** + * 涓婁紶鏂囦欢瀛樺偍鍦ㄦ湰鍦扮殑鏍硅矾寰 + */ + @Value("${file.path}") + private String localFilePath; + + /** + * 璧勬簮鏄犲皠璺緞 鍓嶇紑 + */ + @Value("${file.prefix}") + public String localFilePrefix; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) + { + /** 鏈湴鏂囦欢涓婁紶璺緞 */ + registry.addResourceHandler(localFilePrefix + "/**") + .addResourceLocations("file:" + localFilePath + File.separator); + } +} diff --git a/smart-modules/smart-file/src/main/java/com/zhentao/file/controller/SysFileController.java b/smart-modules/smart-file/src/main/java/com/zhentao/file/controller/SysFileController.java new file mode 100644 index 0000000..4c30e53 --- /dev/null +++ b/smart-modules/smart-file/src/main/java/com/zhentao/file/controller/SysFileController.java @@ -0,0 +1,48 @@ +package com.zhentao.file.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.zhentao.common.core.domain.R; +import com.zhentao.common.core.utils.file.FileUtils; +import com.zhentao.file.service.ISysFileService; +import com.zhentao.system.api.domain.SysFile; + +/** + * 鏂囦欢璇锋眰澶勭悊 + * + * @author ruoyi + */ +@RestController +public class SysFileController +{ + private static final Logger log = LoggerFactory.getLogger(SysFileController.class); + + @Autowired + private ISysFileService sysFileService; + + /** + * 鏂囦欢涓婁紶璇锋眰 + */ + @PostMapping("upload") + public R upload(MultipartFile file) + { + try + { + // 涓婁紶骞惰繑鍥炶闂湴鍧 + String url = sysFileService.uploadFile(file); + SysFile sysFile = new SysFile(); + sysFile.setName(FileUtils.getName(url)); + sysFile.setUrl(url); + return R.ok(sysFile); + } + catch (Exception e) + { + log.error("涓婁紶鏂囦欢澶辫触", e); + return R.fail(e.getMessage()); + } + } +} diff --git a/smart-modules/smart-file/src/main/java/com/zhentao/file/service/FastDfsSysFileServiceImpl.java b/smart-modules/smart-file/src/main/java/com/zhentao/file/service/FastDfsSysFileServiceImpl.java new file mode 100644 index 0000000..480d725 --- /dev/null +++ b/smart-modules/smart-file/src/main/java/com/zhentao/file/service/FastDfsSysFileServiceImpl.java @@ -0,0 +1,42 @@ +package com.zhentao.file.service; + +import org.apache.commons.io.FilenameUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import com.github.tobato.fastdfs.domain.fdfs.StorePath; +import com.github.tobato.fastdfs.service.FastFileStorageClient; + +/** + * FastDFS 鏂囦欢瀛樺偍 + * + * @author ruoyi + */ +@Service +public class FastDfsSysFileServiceImpl implements ISysFileService +{ + /** + * 鍩熷悕鎴栨湰鏈鸿闂湴鍧 + */ + @Value("${fdfs.domain}") + public String domain; + + @Autowired + private FastFileStorageClient storageClient; + + /** + * FastDfs鏂囦欢涓婁紶鎺ュ彛 + * + * @param file 涓婁紶鐨勬枃浠 + * @return 璁块棶鍦板潃 + * @throws Exception + */ + @Override + public String uploadFile(MultipartFile file) throws Exception + { + StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), + FilenameUtils.getExtension(file.getOriginalFilename()), null); + return domain + "/" + storePath.getFullPath(); + } +} diff --git a/smart-modules/smart-file/src/main/java/com/zhentao/file/service/ISysFileService.java b/smart-modules/smart-file/src/main/java/com/zhentao/file/service/ISysFileService.java new file mode 100644 index 0000000..43d37d4 --- /dev/null +++ b/smart-modules/smart-file/src/main/java/com/zhentao/file/service/ISysFileService.java @@ -0,0 +1,20 @@ +package com.zhentao.file.service; + +import org.springframework.web.multipart.MultipartFile; + +/** + * 鏂囦欢涓婁紶鎺ュ彛 + * + * @author ruoyi + */ +public interface ISysFileService +{ + /** + * 鏂囦欢涓婁紶鎺ュ彛 + * + * @param file 涓婁紶鐨勬枃浠 + * @return 璁块棶鍦板潃 + * @throws Exception + */ + public String uploadFile(MultipartFile file) throws Exception; +} diff --git a/smart-modules/smart-file/src/main/java/com/zhentao/file/service/LocalSysFileServiceImpl.java b/smart-modules/smart-file/src/main/java/com/zhentao/file/service/LocalSysFileServiceImpl.java new file mode 100644 index 0000000..98e6338 --- /dev/null +++ b/smart-modules/smart-file/src/main/java/com/zhentao/file/service/LocalSysFileServiceImpl.java @@ -0,0 +1,49 @@ +package com.zhentao.file.service; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import com.zhentao.file.utils.FileUploadUtils; + +/** + * 鏈湴鏂囦欢瀛樺偍 + * + * @author ruoyi + */ +@Primary +@Service +public class LocalSysFileServiceImpl implements ISysFileService +{ + /** + * 璧勬簮鏄犲皠璺緞 鍓嶇紑 + */ + @Value("${file.prefix}") + public String localFilePrefix; + + /** + * 鍩熷悕鎴栨湰鏈鸿闂湴鍧 + */ + @Value("${file.domain}") + public String domain; + + /** + * 涓婁紶鏂囦欢瀛樺偍鍦ㄦ湰鍦扮殑鏍硅矾寰 + */ + @Value("${file.path}") + private String localFilePath; + + /** + * 鏈湴鏂囦欢涓婁紶鎺ュ彛 + * + * @param file 涓婁紶鐨勬枃浠 + * @return 璁块棶鍦板潃 + * @throws Exception + */ + public String uploadFile(MultipartFile file) throws Exception + { + String name = FileUploadUtils.upload(localFilePath, file); + String url = domain + localFilePrefix + name; + return url; + } +} diff --git a/smart-modules/smart-file/src/main/java/com/zhentao/file/service/MinioSysFileServiceImpl.java b/smart-modules/smart-file/src/main/java/com/zhentao/file/service/MinioSysFileServiceImpl.java new file mode 100644 index 0000000..7e0c27c --- /dev/null +++ b/smart-modules/smart-file/src/main/java/com/zhentao/file/service/MinioSysFileServiceImpl.java @@ -0,0 +1,44 @@ +package com.zhentao.file.service; + +import com.zhentao.file.config.MinioConfig; +import com.zhentao.file.utils.FileUploadUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import io.minio.MinioClient; +import io.minio.PutObjectArgs; + +/** + * Minio 鏂囦欢瀛樺偍 + * + * @author ruoyi + */ +@Service +public class MinioSysFileServiceImpl implements ISysFileService +{ + @Autowired + private MinioConfig minioConfig; + + @Autowired + private MinioClient client; + + /** + * 鏈湴鏂囦欢涓婁紶鎺ュ彛 + * + * @param file 涓婁紶鐨勬枃浠 + * @return 璁块棶鍦板潃 + * @throws Exception + */ + public String uploadFile(MultipartFile file) throws Exception + { + String fileName = FileUploadUtils.extractFilename(file); + PutObjectArgs args = PutObjectArgs.builder() + .bucket(minioConfig.getBucketName()) + .object(fileName) + .stream(file.getInputStream(), file.getSize(), -1) + .contentType(file.getContentType()) + .build(); + client.putObject(args); + return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName; + } +} diff --git a/smart-modules/smart-file/src/main/java/com/zhentao/file/utils/FileUploadUtils.java b/smart-modules/smart-file/src/main/java/com/zhentao/file/utils/FileUploadUtils.java new file mode 100644 index 0000000..b28d6c0 --- /dev/null +++ b/smart-modules/smart-file/src/main/java/com/zhentao/file/utils/FileUploadUtils.java @@ -0,0 +1,197 @@ +package com.zhentao.file.utils; + +import java.io.File; +import java.io.IOException; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; +import com.zhentao.common.core.exception.file.FileNameLengthLimitExceededException; +import com.zhentao.common.core.exception.file.FileSizeLimitExceededException; +import com.zhentao.common.core.exception.file.InvalidExtensionException; +import com.zhentao.common.core.utils.DateUtils; +import com.zhentao.common.core.utils.IdUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.utils.file.MimeTypeUtils; + +/** + * 鏂囦欢涓婁紶宸ュ叿绫 + * + * @author ruoyi + */ +public class FileUploadUtils +{ + /** + * 榛樿澶у皬 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; + + /** + * 榛樿鐨勬枃浠跺悕鏈澶ч暱搴 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 鏍规嵁鏂囦欢璺緞涓婁紶 + * + * @param baseDir 鐩稿搴旂敤鐨勫熀鐩綍 + * @param file 涓婁紶鐨勬枃浠 + * @return 鏂囦欢鍚嶇О + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file) throws IOException + { + try + { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 鏂囦欢涓婁紶 + * + * @param baseDir 鐩稿搴旂敤鐨勫熀鐩綍 + * @param file 涓婁紶鐨勬枃浠 + * @param extension 涓婁紶鏂囦欢绫诲瀷 + * @return 杩斿洖涓婁紶鎴愬姛鐨勬枃浠跺悕 + * @throws FileSizeLimitExceededException 濡傛灉瓒呭嚭鏈澶уぇ灏 + * @throws FileNameLengthLimitExceededException 鏂囦欢鍚嶅お闀 + * @throws IOException 姣斿璇诲啓鏂囦欢鍑洪敊鏃 + * @throws InvalidExtensionException 鏂囦欢鏍¢獙寮傚父 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException + { + int fileNamelength = file.getOriginalFilename().length(); + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) + { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = extractFilename(file); + + File desc = getAbsoluteFile(baseDir, fileName); + file.transferTo(desc); + String pathFileName = getPathFileName(fileName); + return pathFileName; + } + + /** + * 缂栫爜鏂囦欢鍚 + */ + public static final String extractFilename(MultipartFile file) + { + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + fileName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + return fileName; + } + + private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException + { + File desc = new File(uploadDir + File.separator + fileName); + + if (!desc.exists()) + { + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + } + return desc.isAbsolute() ? desc : desc.getAbsoluteFile(); + } + + private static final String getPathFileName(String fileName) throws IOException + { + String pathFileName = "/" + fileName; + return pathFileName; + } + + /** + * 鏂囦欢澶у皬鏍¢獙 + * + * @param file 涓婁紶鐨勬枃浠 + * @return + * @throws FileSizeLimitExceededException 濡傛灉瓒呭嚭鏈澶уぇ灏 + * @throws InvalidExtensionException + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException + { + long size = file.getSize(); + if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) + { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) + { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) + { + throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) + { + throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) + { + throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) + { + throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, + fileName); + } + else + { + throw new InvalidExtensionException(allowedExtension, extension, fileName); + } + } + } + + /** + * 鍒ゆ柇MIME绫诲瀷鏄惁鏄厑璁哥殑MIME绫诲瀷 + * + * @param extension + * @param allowedExtension + * @return + */ + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) + { + for (String str : allowedExtension) + { + if (str.equalsIgnoreCase(extension)) + { + return true; + } + } + return false; + } + + /** + * 鑾峰彇鏂囦欢鍚嶇殑鍚庣紑 + * + * @param file 琛ㄥ崟鏂囦欢 + * @return 鍚庣紑鍚 + */ + public static final String getExtension(MultipartFile file) + { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (StringUtils.isEmpty(extension)) + { + extension = MimeTypeUtils.getExtension(file.getContentType()); + } + return extension; + } +} diff --git a/smart-modules/smart-file/src/main/resources/banner.txt b/smart-modules/smart-file/src/main/resources/banner.txt new file mode 100644 index 0000000..27cacb9 --- /dev/null +++ b/smart-modules/smart-file/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ __ _ _ + (_) / _|(_)| | + _ __ _ _ ___ _ _ _ ______ | |_ _ | | ___ +| '__|| | | | / _ \ | | | || ||______|| _|| || | / _ \ +| | | |_| || (_) || |_| || | | | | || || __/ +|_| \__,_| \___/ \__, ||_| |_| |_||_| \___| + __/ | + |___/ \ No newline at end of file diff --git a/smart-modules/smart-file/src/main/resources/bootstrap.yml b/smart-modules/smart-file/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..81d6e61 --- /dev/null +++ b/smart-modules/smart-file/src/main/resources/bootstrap.yml @@ -0,0 +1,27 @@ +# Tomcat +server: + port: 9300 + +# Spring +spring: + application: + # 搴旂敤鍚嶇О + name: ruoyi-file + profiles: + # 鐜閰嶇疆 + active: dev + cloud: + nacos: + discovery: + # 鏈嶅姟娉ㄥ唽鍦板潃 + server-addr: 8.130.77.16:8848 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + config: + # 閰嶇疆涓績鍦板潃 + server-addr: 8.130.77.16:8848 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + # 閰嶇疆鏂囦欢鏍煎紡 + file-extension: yml + # 鍏变韩閰嶇疆 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} diff --git a/smart-modules/smart-file/src/main/resources/logback.xml b/smart-modules/smart-file/src/main/resources/logback.xml new file mode 100644 index 0000000..ed6c17d --- /dev/null +++ b/smart-modules/smart-file/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/smart-modules/smart-gen/pom.xml b/smart-modules/smart-gen/pom.xml new file mode 100644 index 0000000..c110d9b --- /dev/null +++ b/smart-modules/smart-gen/pom.xml @@ -0,0 +1,94 @@ + + + + com.ruoyi + smart-modules + 2.5.0 + + 4.0.0 + + smart-modules-gen + + + smart-modules-gen浠g爜鐢熸垚 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + io.springfox + springfox-swagger-ui + ${swagger.fox.version} + + + + + org.apache.velocity + velocity + + + + + mysql + mysql-connector-java + + + + + com.ruoyi + smart-common-log + + + + + com.ruoyi + smart-common-swagger + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/RuoYiGenApplication.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/RuoYiGenApplication.java new file mode 100644 index 0000000..3ed8fe7 --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/RuoYiGenApplication.java @@ -0,0 +1,34 @@ +package com.zhentao.gen; + +import org.springframework.boot.SpringApplication; +import org.springframework.cloud.client.SpringCloudApplication; +import com.zhentao.common.security.annotation.EnableCustomConfig; +import com.zhentao.common.security.annotation.EnableRyFeignClients; +import com.zhentao.common.swagger.annotation.EnableCustomSwagger2; + +/** + * 浠g爜鐢熸垚 + * + * @author ruoyi + */ +@EnableCustomConfig +@EnableCustomSwagger2 +@EnableRyFeignClients +@SpringCloudApplication +public class RuoYiGenApplication +{ + public static void main(String[] args) + { + SpringApplication.run(RuoYiGenApplication.class, args); + System.out.println("(鈾モ棤鈥库棤)锞夛緸 浠g爜鐢熸垚妯″潡鍚姩鎴愬姛 醿(麓凇`醿)锞 \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/config/GenConfig.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/config/GenConfig.java new file mode 100644 index 0000000..815ae96 --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/config/GenConfig.java @@ -0,0 +1,66 @@ +package com.zhentao.gen.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 浠g爜鐢熸垚鐩稿叧閰嶇疆 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "gen") +public class GenConfig +{ + /** 浣滆 */ + public static String author; + + /** 鐢熸垚鍖呰矾寰 */ + public static String packageName; + + /** 鑷姩鍘婚櫎琛ㄥ墠缂锛岄粯璁ゆ槸false */ + public static boolean autoRemovePre; + + /** 琛ㄥ墠缂(绫诲悕涓嶄細鍖呭惈琛ㄥ墠缂) */ + public static String tablePrefix; + + public static String getAuthor() + { + return author; + } + + public void setAuthor(String author) + { + GenConfig.author = author; + } + + public static String getPackageName() + { + return packageName; + } + + public void setPackageName(String packageName) + { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() + { + return autoRemovePre; + } + + public void setAutoRemovePre(boolean autoRemovePre) + { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() + { + return tablePrefix; + } + + public void setTablePrefix(String tablePrefix) + { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/controller/GenController.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/controller/GenController.java new file mode 100644 index 0000000..d3b8479 --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/controller/GenController.java @@ -0,0 +1,212 @@ +package com.zhentao.gen.controller; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.gen.service.IGenTableService; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.text.Convert; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; +import com.zhentao.gen.domain.GenTable; +import com.zhentao.gen.domain.GenTableColumn; +import com.zhentao.gen.service.IGenTableColumnService; + +/** + * 浠g爜鐢熸垚 鎿嶄綔澶勭悊 + * + * @author ruoyi + */ +@RequestMapping("/gen") +@RestController +public class GenController extends BaseController +{ + @Autowired + private IGenTableService genTableService; + + @Autowired + private IGenTableColumnService genTableColumnService; + + /** + * 鏌ヨ浠g爜鐢熸垚鍒楄〃 + */ + @PreAuthorize(hasPermi = "tool:gen:list") + @GetMapping("/list") + public TableDataInfo genList(GenTable genTable) + { + startPage(); + List list = genTableService.selectGenTableList(genTable); + return getDataTable(list); + } + + /** + * 淇敼浠g爜鐢熸垚涓氬姟 + */ + @PreAuthorize(hasPermi = "tool:gen:query") + @GetMapping(value = "/{talbleId}") + public AjaxResult getInfo(@PathVariable Long talbleId) + { + GenTable table = genTableService.selectGenTableById(talbleId); + List tables = genTableService.selectGenTableAll(); + List list = genTableColumnService.selectGenTableColumnListByTableId(talbleId); + Map map = new HashMap(); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return AjaxResult.success(map); + } + + /** + * 鏌ヨ鏁版嵁搴撳垪琛 + */ + @PreAuthorize(hasPermi = "tool:gen:list") + @GetMapping("/db/list") + public TableDataInfo dataList(GenTable genTable) + { + startPage(); + List list = genTableService.selectDbTableList(genTable); + return getDataTable(list); + } + + /** + * 鏌ヨ鏁版嵁琛ㄥ瓧娈靛垪琛 + */ + @GetMapping(value = "/column/{talbleId}") + public TableDataInfo columnList(Long tableId) + { + TableDataInfo dataInfo = new TableDataInfo(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 瀵煎叆琛ㄧ粨鏋勶紙淇濆瓨锛 + */ + @PreAuthorize(hasPermi = "tool:gen:list") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public AjaxResult importTableSave(String tables) + { + String[] tableNames = Convert.toStrArray(tables); + // 鏌ヨ琛ㄤ俊鎭 + List tableList = genTableService.selectDbTableListByNames(tableNames); + genTableService.importGenTable(tableList); + return AjaxResult.success(); + } + + /** + * 淇敼淇濆瓨浠g爜鐢熸垚涓氬姟 + */ + @PreAuthorize(hasPermi = "tool:gen:edit") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult editSave(@Validated @RequestBody GenTable genTable) + { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return AjaxResult.success(); + } + + /** + * 鍒犻櫎浠g爜鐢熸垚 + */ + @PreAuthorize(hasPermi = "tool:gen:remove") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public AjaxResult remove(@PathVariable Long[] tableIds) + { + genTableService.deleteGenTableByIds(tableIds); + return AjaxResult.success(); + } + + /** + * 棰勮浠g爜 + */ + @PreAuthorize(hasPermi = "tool:gen:preview") + @GetMapping("/preview/{tableId}") + public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException + { + Map dataMap = genTableService.previewCode(tableId); + return AjaxResult.success(dataMap); + } + + /** + * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級 + */ + @PreAuthorize(hasPermi = "tool:gen:code") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableName}") + public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException + { + byte[] data = genTableService.downloadCode(tableName); + genCode(response, data); + } + + /** + * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛 + */ + @PreAuthorize(hasPermi = "tool:gen:code") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableName}") + public AjaxResult genCode(@PathVariable("tableName") String tableName) + { + genTableService.generatorCode(tableName); + return AjaxResult.success(); + } + + /** + * 鍚屾鏁版嵁搴 + */ + @PreAuthorize(hasPermi = "tool:gen:edit") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableName}") + public AjaxResult synchDb(@PathVariable("tableName") String tableName) + { + genTableService.synchDb(tableName); + return AjaxResult.success(); + } + + /** + * 鎵归噺鐢熸垚浠g爜 + */ + @PreAuthorize(hasPermi = "tool:gen:code") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tables) throws IOException + { + String[] tableNames = Convert.toStrArray(tables); + byte[] data = genTableService.downloadCode(tableNames); + genCode(response, data); + } + + /** + * 鐢熸垚zip鏂囦欢 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException + { + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/domain/GenTable.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/domain/GenTable.java new file mode 100644 index 0000000..fd78391 --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/domain/GenTable.java @@ -0,0 +1,370 @@ +package com.zhentao.gen.domain; + +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import org.apache.commons.lang3.ArrayUtils; +import com.zhentao.common.core.constant.GenConstants; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 涓氬姟琛 gen_table + * + * @author ruoyi + */ +public class GenTable extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 缂栧彿 */ + private Long tableId; + + /** 琛ㄥ悕绉 */ + @NotBlank(message = "琛ㄥ悕绉颁笉鑳戒负绌") + private String tableName; + + /** 琛ㄦ弿杩 */ + @NotBlank(message = "琛ㄦ弿杩颁笉鑳戒负绌") + private String tableComment; + + /** 鍏宠仈鐖惰〃鐨勮〃鍚 */ + private String subTableName; + + /** 鏈〃鍏宠仈鐖惰〃鐨勫閿悕 */ + private String subTableFkName; + + /** 瀹炰綋绫诲悕绉(棣栧瓧姣嶅ぇ鍐) */ + @NotBlank(message = "瀹炰綋绫诲悕绉颁笉鑳戒负绌") + private String className; + + /** 浣跨敤鐨勬ā鏉匡紙crud鍗曡〃鎿嶄綔 tree鏍戣〃鎿嶄綔 sub涓诲瓙琛ㄦ搷浣滐級 */ + private String tplCategory; + + /** 鐢熸垚鍖呰矾寰 */ + @NotBlank(message = "鐢熸垚鍖呰矾寰勪笉鑳戒负绌") + private String packageName; + + /** 鐢熸垚妯″潡鍚 */ + @NotBlank(message = "鐢熸垚妯″潡鍚嶄笉鑳戒负绌") + private String moduleName; + + /** 鐢熸垚涓氬姟鍚 */ + @NotBlank(message = "鐢熸垚涓氬姟鍚嶄笉鑳戒负绌") + private String businessName; + + /** 鐢熸垚鍔熻兘鍚 */ + @NotBlank(message = "鐢熸垚鍔熻兘鍚嶄笉鑳戒负绌") + private String functionName; + + /** 鐢熸垚浣滆 */ + @NotBlank(message = "浣滆呬笉鑳戒负绌") + private String functionAuthor; + + /** 鐢熸垚浠g爜鏂瑰紡锛0zip鍘嬬缉鍖 1鑷畾涔夎矾寰勶級 */ + private String genType; + + /** 鐢熸垚璺緞锛堜笉濉粯璁ら」鐩矾寰勶級 */ + private String genPath; + + /** 涓婚敭淇℃伅 */ + private GenTableColumn pkColumn; + + /** 瀛愯〃淇℃伅 */ + private GenTable subTable; + + /** 琛ㄥ垪淇℃伅 */ + @Valid + private List columns; + + /** 鍏跺畠鐢熸垚閫夐」 */ + private String options; + + /** 鏍戠紪鐮佸瓧娈 */ + private String treeCode; + + /** 鏍戠埗缂栫爜瀛楁 */ + private String treeParentCode; + + /** 鏍戝悕绉板瓧娈 */ + private String treeName; + + /** 涓婄骇鑿滃崟ID瀛楁 */ + private String parentMenuId; + + /** 涓婄骇鑿滃崟鍚嶇О瀛楁 */ + private String parentMenuName; + + public Long getTableId() + { + return tableId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public String getTableName() + { + return tableName; + } + + public void setTableName(String tableName) + { + this.tableName = tableName; + } + + public String getTableComment() + { + return tableComment; + } + + public void setTableComment(String tableComment) + { + this.tableComment = tableComment; + } + + public String getSubTableName() + { + return subTableName; + } + + public void setSubTableName(String subTableName) + { + this.subTableName = subTableName; + } + + public String getSubTableFkName() + { + return subTableFkName; + } + + public void setSubTableFkName(String subTableFkName) + { + this.subTableFkName = subTableFkName; + } + + public String getClassName() + { + return className; + } + + public void setClassName(String className) + { + this.className = className; + } + + public String getTplCategory() + { + return tplCategory; + } + + public void setTplCategory(String tplCategory) + { + this.tplCategory = tplCategory; + } + + public String getPackageName() + { + return packageName; + } + + public void setPackageName(String packageName) + { + this.packageName = packageName; + } + + public String getModuleName() + { + return moduleName; + } + + public void setModuleName(String moduleName) + { + this.moduleName = moduleName; + } + + public String getBusinessName() + { + return businessName; + } + + public void setBusinessName(String businessName) + { + this.businessName = businessName; + } + + public String getFunctionName() + { + return functionName; + } + + public void setFunctionName(String functionName) + { + this.functionName = functionName; + } + + public String getFunctionAuthor() + { + return functionAuthor; + } + + public void setFunctionAuthor(String functionAuthor) + { + this.functionAuthor = functionAuthor; + } + + public String getGenType() + { + return genType; + } + + public void setGenType(String genType) + { + this.genType = genType; + } + + public String getGenPath() + { + return genPath; + } + + public void setGenPath(String genPath) + { + this.genPath = genPath; + } + + public GenTableColumn getPkColumn() + { + return pkColumn; + } + + public void setPkColumn(GenTableColumn pkColumn) + { + this.pkColumn = pkColumn; + } + + public GenTable getSubTable() + { + return subTable; + } + + public void setSubTable(GenTable subTable) + { + this.subTable = subTable; + } + public List getColumns() + { + return columns; + } + + public void setColumns(List columns) + { + this.columns = columns; + } + + public String getOptions() + { + return options; + } + + public void setOptions(String options) + { + this.options = options; + } + + public String getTreeCode() + { + return treeCode; + } + + public void setTreeCode(String treeCode) + { + this.treeCode = treeCode; + } + + public String getTreeParentCode() + { + return treeParentCode; + } + + public void setTreeParentCode(String treeParentCode) + { + this.treeParentCode = treeParentCode; + } + + public String getTreeName() + { + return treeName; + } + + public void setTreeName(String treeName) + { + this.treeName = treeName; + } + + public String getParentMenuId() + { + return parentMenuId; + } + + public void setParentMenuId(String parentMenuId) + { + this.parentMenuId = parentMenuId; + } + + public String getParentMenuName() + { + return parentMenuName; + } + + public void setParentMenuName(String parentMenuName) + { + this.parentMenuName = parentMenuName; + } + + public boolean isSub() + { + return isSub(this.tplCategory); + } + + public static boolean isSub(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); + } + public boolean isTree() + { + return isTree(this.tplCategory); + } + + public static boolean isTree(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + + public boolean isCrud() + { + return isCrud(this.tplCategory); + } + + public static boolean isCrud(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + + public boolean isSuperColumn(String javaField) + { + return isSuperColumn(this.tplCategory, javaField); + } + + public static boolean isSuperColumn(String tplCategory, String javaField) + { + if (isTree(tplCategory)) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); + } + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + } +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/domain/GenTableColumn.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/domain/GenTableColumn.java new file mode 100644 index 0000000..7f201ba --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/domain/GenTableColumn.java @@ -0,0 +1,374 @@ +package com.zhentao.gen.domain; + +import javax.validation.constraints.NotBlank; + +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 浠g爜鐢熸垚涓氬姟瀛楁琛 gen_table_column + * + * @author ruoyi + */ +public class GenTableColumn extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 缂栧彿 */ + private Long columnId; + + /** 褰掑睘琛ㄧ紪鍙 */ + private Long tableId; + + /** 鍒楀悕绉 */ + private String columnName; + + /** 鍒楁弿杩 */ + private String columnComment; + + /** 鍒楃被鍨 */ + private String columnType; + + /** JAVA绫诲瀷 */ + private String javaType; + + /** JAVA瀛楁鍚 */ + @NotBlank(message = "Java灞炴т笉鑳戒负绌") + private String javaField; + + /** 鏄惁涓婚敭锛1鏄級 */ + private String isPk; + + /** 鏄惁鑷锛1鏄級 */ + private String isIncrement; + + /** 鏄惁蹇呭~锛1鏄級 */ + private String isRequired; + + /** 鏄惁涓烘彃鍏ュ瓧娈碉紙1鏄級 */ + private String isInsert; + + /** 鏄惁缂栬緫瀛楁锛1鏄級 */ + private String isEdit; + + /** 鏄惁鍒楄〃瀛楁锛1鏄級 */ + private String isList; + + /** 鏄惁鏌ヨ瀛楁锛1鏄級 */ + private String isQuery; + + /** 鏌ヨ鏂瑰紡锛圗Q绛変簬銆丯E涓嶇瓑浜庛丟T澶т簬銆丩T灏忎簬銆丩IKE妯$硦銆丅ETWEEN鑼冨洿锛 */ + private String queryType; + + /** 鏄剧ず绫诲瀷锛坕nput鏂囨湰妗嗐乼extarea鏂囨湰鍩熴乻elect涓嬫媺妗嗐乧heckbox澶嶉夋銆乺adio鍗曢夋銆乨atetime鏃ユ湡鎺т欢銆乮mage鍥剧墖涓婁紶鎺т欢銆乽pload鏂囦欢涓婁紶鎺т欢銆乪ditor瀵屾枃鏈帶浠讹級 */ + private String htmlType; + + /** 瀛楀吀绫诲瀷 */ + private String dictType; + + /** 鎺掑簭 */ + private Integer sort; + + public void setColumnId(Long columnId) + { + this.columnId = columnId; + } + + public Long getColumnId() + { + return columnId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public Long getTableId() + { + return tableId; + } + + public void setColumnName(String columnName) + { + this.columnName = columnName; + } + + public String getColumnName() + { + return columnName; + } + + public void setColumnComment(String columnComment) + { + this.columnComment = columnComment; + } + + public String getColumnComment() + { + return columnComment; + } + + public void setColumnType(String columnType) + { + this.columnType = columnType; + } + + public String getColumnType() + { + return columnType; + } + + public void setJavaType(String javaType) + { + this.javaType = javaType; + } + + public String getJavaType() + { + return javaType; + } + + public void setJavaField(String javaField) + { + this.javaField = javaField; + } + + public String getJavaField() + { + return javaField; + } + + public String getCapJavaField() + { + return StringUtils.capitalize(javaField); + } + + public void setIsPk(String isPk) + { + this.isPk = isPk; + } + + public String getIsPk() + { + return isPk; + } + + public boolean isPk() + { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) + { + return isPk != null && StringUtils.equals("1", isPk); + } + + public String getIsIncrement() + { + return isIncrement; + } + + public void setIsIncrement(String isIncrement) + { + this.isIncrement = isIncrement; + } + + public boolean isIncrement() + { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) + { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public void setIsRequired(String isRequired) + { + this.isRequired = isRequired; + } + + public String getIsRequired() + { + return isRequired; + } + + public boolean isRequired() + { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) + { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public void setIsInsert(String isInsert) + { + this.isInsert = isInsert; + } + + public String getIsInsert() + { + return isInsert; + } + + public boolean isInsert() + { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) + { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public void setIsEdit(String isEdit) + { + this.isEdit = isEdit; + } + + public String getIsEdit() + { + return isEdit; + } + + public boolean isEdit() + { + return isInsert(this.isEdit); + } + + public boolean isEdit(String isEdit) + { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public void setIsList(String isList) + { + this.isList = isList; + } + + public String getIsList() + { + return isList; + } + + public boolean isList() + { + return isList(this.isList); + } + + public boolean isList(String isList) + { + return isList != null && StringUtils.equals("1", isList); + } + + public void setIsQuery(String isQuery) + { + this.isQuery = isQuery; + } + + public String getIsQuery() + { + return isQuery; + } + + public boolean isQuery() + { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) + { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public void setQueryType(String queryType) + { + this.queryType = queryType; + } + + public String getQueryType() + { + return queryType; + } + + public String getHtmlType() + { + return htmlType; + } + + public void setHtmlType(String htmlType) + { + this.htmlType = htmlType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getDictType() + { + return dictType; + } + + public void setSort(Integer sort) + { + this.sort = sort; + } + + public Integer getSort() + { + return sort; + } + + public boolean isSuperColumn() + { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", "remark", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); + } + + public boolean isUsableColumn() + { + return isUsableColumn(javaField); + } + + public static boolean isUsableColumn(String javaField) + { + // isSuperColumn()涓殑鍚嶅崟鐢ㄤ簬閬垮厤鐢熸垚澶氫綑Domain灞炴э紝鑻ユ煇浜涘睘鎬у湪鐢熸垚椤甸潰鏃堕渶瑕佺敤鍒颁笉鑳藉拷鐣ワ紝鍒欐斁鍦ㄦ澶勭櫧鍚嶅崟 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public String readConverterExp() + { + String remarks = StringUtils.substringBetween(this.columnComment, "锛", "锛"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) + { + for (String value : remarks.split(" ")) + { + if (StringUtils.isNotEmpty(value)) + { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append("").append(startStr).append("=").append(endStr).append(","); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } + else + { + return this.columnComment; + } + } +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/mapper/GenTableColumnMapper.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/mapper/GenTableColumnMapper.java new file mode 100644 index 0000000..27738d2 --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/mapper/GenTableColumnMapper.java @@ -0,0 +1,60 @@ +package com.zhentao.gen.mapper; + +import java.util.List; +import com.zhentao.gen.domain.GenTableColumn; + +/** + * 涓氬姟瀛楁 鏁版嵁灞 + * + * @author ruoyi + */ +public interface GenTableColumnMapper +{ + /** + * 鏍规嵁琛ㄥ悕绉版煡璇㈠垪淇℃伅 + * + * @param tableName 琛ㄥ悕绉 + * @return 鍒椾俊鎭 + */ + public List selectDbTableColumnsByName(String tableName); + + /** + * 鏌ヨ涓氬姟瀛楁鍒楄〃 + * + * @param tableId 涓氬姟瀛楁缂栧彿 + * @return 涓氬姟瀛楁闆嗗悎 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 鏂板涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 淇敼涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 鍒犻櫎涓氬姟瀛楁 + * + * @param genTableColumns 鍒楁暟鎹 + * @return 缁撴灉 + */ + public int deleteGenTableColumns(List genTableColumns); + + /** + * 鎵归噺鍒犻櫎涓氬姟瀛楁 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteGenTableColumnByIds(Long[] ids); +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/mapper/GenTableMapper.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/mapper/GenTableMapper.java new file mode 100644 index 0000000..5ae824b --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/mapper/GenTableMapper.java @@ -0,0 +1,83 @@ +package com.zhentao.gen.mapper; + +import java.util.List; +import com.zhentao.gen.domain.GenTable; + +/** + * 涓氬姟 鏁版嵁灞 + * + * @author ruoyi + */ +public interface GenTableMapper +{ + /** + * 鏌ヨ涓氬姟鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 涓氬姟闆嗗悎 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param tableNames 琛ㄥ悕绉扮粍 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 鏌ヨ鎵鏈夎〃淇℃伅 + * + * @return 琛ㄤ俊鎭泦鍚 + */ + public List selectGenTableAll(); + + /** + * 鏌ヨ琛↖D涓氬姟淇℃伅 + * + * @param id 涓氬姟ID + * @return 涓氬姟淇℃伅 + */ + public GenTable selectGenTableById(Long id); + + /** + * 鏌ヨ琛ㄥ悕绉颁笟鍔′俊鎭 + * + * @param tableName 琛ㄥ悕绉 + * @return 涓氬姟淇℃伅 + */ + public GenTable selectGenTableByName(String tableName); + + /** + * 鏂板涓氬姟 + * + * @param genTable 涓氬姟淇℃伅 + * @return 缁撴灉 + */ + public int insertGenTable(GenTable genTable); + + /** + * 淇敼涓氬姟 + * + * @param genTable 涓氬姟淇℃伅 + * @return 缁撴灉 + */ + public int updateGenTable(GenTable genTable); + + /** + * 鎵归噺鍒犻櫎涓氬姟 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteGenTableByIds(Long[] ids); +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/GenTableColumnServiceImpl.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/GenTableColumnServiceImpl.java new file mode 100644 index 0000000..fb60bb1 --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/GenTableColumnServiceImpl.java @@ -0,0 +1,68 @@ +package com.zhentao.gen.service; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.zhentao.common.core.text.Convert; +import com.zhentao.gen.domain.GenTableColumn; +import com.zhentao.gen.mapper.GenTableColumnMapper; + +/** + * 涓氬姟瀛楁 鏈嶅姟灞傚疄鐜 + * + * @author ruoyi + */ +@Service +public class GenTableColumnServiceImpl implements IGenTableColumnService +{ + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 鏌ヨ涓氬姟瀛楁鍒楄〃 + * + * @param tableId 涓氬姟瀛楁缂栧彿 + * @return 涓氬姟瀛楁闆嗗悎 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) + { + return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); + } + + /** + * 鏂板涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.insertGenTableColumn(genTableColumn); + } + + /** + * 淇敼涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.updateGenTableColumn(genTableColumn); + } + + /** + * 鍒犻櫎涓氬姟瀛楁瀵硅薄 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + @Override + public int deleteGenTableColumnByIds(String ids) + { + return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + } +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/GenTableServiceImpl.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/GenTableServiceImpl.java new file mode 100644 index 0000000..2370221 --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/GenTableServiceImpl.java @@ -0,0 +1,500 @@ +package com.zhentao.gen.service; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import com.zhentao.gen.mapper.GenTableMapper; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.zhentao.common.core.constant.Constants; +import com.zhentao.common.core.constant.GenConstants; +import com.zhentao.common.core.exception.CustomException; +import com.zhentao.common.core.text.CharsetKit; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.utils.file.FileUtils; +import com.zhentao.gen.domain.GenTable; +import com.zhentao.gen.domain.GenTableColumn; +import com.zhentao.gen.mapper.GenTableColumnMapper; +import com.zhentao.gen.util.GenUtils; +import com.zhentao.gen.util.VelocityInitializer; +import com.zhentao.gen.util.VelocityUtils; + +/** + * 涓氬姟 鏈嶅姟灞傚疄鐜 + * + * @author ruoyi + */ +@Service +public class GenTableServiceImpl implements IGenTableService +{ + private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class); + + @Autowired + private GenTableMapper genTableMapper; + + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 鏌ヨ涓氬姟淇℃伅 + * + * @param id 涓氬姟ID + * @return 涓氬姟淇℃伅 + */ + @Override + public GenTable selectGenTableById(Long id) + { + GenTable genTable = genTableMapper.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } + + /** + * 鏌ヨ涓氬姟鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 涓氬姟闆嗗悎 + */ + @Override + public List selectGenTableList(GenTable genTable) + { + return genTableMapper.selectGenTableList(genTable); + } + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + @Override + public List selectDbTableList(GenTable genTable) + { + return genTableMapper.selectDbTableList(genTable); + } + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param tableNames 琛ㄥ悕绉扮粍 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + @Override + public List selectDbTableListByNames(String[] tableNames) + { + return genTableMapper.selectDbTableListByNames(tableNames); + } + + /** + * 鏌ヨ鎵鏈夎〃淇℃伅 + * + * @return 琛ㄤ俊鎭泦鍚 + */ + @Override + public List selectGenTableAll() + { + return genTableMapper.selectGenTableAll(); + } + + /** + * 淇敼涓氬姟 + * + * @param genTable 涓氬姟淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public void updateGenTable(GenTable genTable) + { + String options = JSON.toJSONString(genTable.getParams()); + genTable.setOptions(options); + int row = genTableMapper.updateGenTable(genTable); + if (row > 0) + { + for (GenTableColumn cenTableColumn : genTable.getColumns()) + { + genTableColumnMapper.updateGenTableColumn(cenTableColumn); + } + } + } + + /** + * 鍒犻櫎涓氬姟瀵硅薄 + * + * @param tableIds 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + @Override + @Transactional + public void deleteGenTableByIds(Long[] tableIds) + { + genTableMapper.deleteGenTableByIds(tableIds); + genTableColumnMapper.deleteGenTableColumnByIds(tableIds); + } + + /** + * 瀵煎叆琛ㄧ粨鏋 + * + * @param tableList 瀵煎叆琛ㄥ垪琛 + */ + @Override + @Transactional + public void importGenTable(List tableList) + { + String operName = SecurityUtils.getUsername(); + try + { + for (GenTable table : tableList) + { + String tableName = table.getTableName(); + GenUtils.initTable(table, operName); + int row = genTableMapper.insertGenTable(table); + if (row > 0) + { + // 淇濆瓨鍒椾俊鎭 + List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + for (GenTableColumn column : genTableColumns) + { + GenUtils.initColumnField(column, table); + genTableColumnMapper.insertGenTableColumn(column); + } + } + } + } + catch (Exception e) + { + throw new CustomException("瀵煎叆澶辫触锛" + e.getMessage()); + } + } + + /** + * 棰勮浠g爜 + * + * @param tableId 琛ㄧ紪鍙 + * @return 棰勮鏁版嵁鍒楄〃 + */ + @Override + public Map previewCode(Long tableId) + { + Map dataMap = new LinkedHashMap<>(); + // 鏌ヨ琛ㄤ俊鎭 + GenTable table = genTableMapper.selectGenTableById(tableId); + // 璁剧疆涓诲瓙琛ㄤ俊鎭 + setSubTable(table); + // 璁剧疆涓婚敭鍒椾俊鎭 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 鑾峰彇妯℃澘鍒楄〃 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + // 娓叉煋妯℃澘 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級 + * + * @param tableName 琛ㄥ悕绉 + * @return 鏁版嵁 + */ + @Override + public byte[] downloadCode(String tableName) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableName, zip); + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛 + * + * @param tableName 琛ㄥ悕绉 + */ + @Override + public void generatorCode(String tableName) + { + // 鏌ヨ琛ㄤ俊鎭 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 璁剧疆涓诲瓙琛ㄤ俊鎭 + setSubTable(table); + // 璁剧疆涓婚敭鍒椾俊鎭 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 鑾峰彇妯℃澘鍒楄〃 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) + { + // 娓叉煋妯℃澘 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + String path = getGenPath(table, template); + FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); + } + catch (IOException e) + { + throw new CustomException("娓叉煋妯℃澘澶辫触锛岃〃鍚嶏細" + table.getTableName()); + } + } + } + } + + /** + * 鍚屾鏁版嵁搴 + * + * @param tableName 琛ㄥ悕绉 + */ + @Override + @Transactional + public void synchDb(String tableName) + { + GenTable table = genTableMapper.selectGenTableByName(tableName); + List tableColumns = table.getColumns(); + List tableColumnNames = tableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + + List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + if (StringUtils.isEmpty(dbTableColumns)) + { + throw new CustomException("鍚屾鏁版嵁澶辫触锛屽師琛ㄧ粨鏋勪笉瀛樺湪"); + } + List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + + dbTableColumns.forEach(column -> { + if (!tableColumnNames.contains(column.getColumnName())) + { + GenUtils.initColumnField(column, table); + genTableColumnMapper.insertGenTableColumn(column); + } + }); + + List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); + if (StringUtils.isNotEmpty(delColumns)) + { + genTableColumnMapper.deleteGenTableColumns(delColumns); + } + } + + /** + * 鎵归噺鐢熸垚浠g爜锛堜笅杞芥柟寮忥級 + * + * @param tableNames 琛ㄦ暟缁 + * @return 鏁版嵁 + */ + @Override + public byte[] downloadCode(String[] tableNames) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) + { + generatorCode(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 鏌ヨ琛ㄤ俊鎭苟鐢熸垚浠g爜 + */ + private void generatorCode(String tableName, ZipOutputStream zip) + { + // 鏌ヨ琛ㄤ俊鎭 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 璁剧疆涓诲瓙琛ㄤ俊鎭 + setSubTable(table); + // 璁剧疆涓婚敭鍒椾俊鎭 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 鑾峰彇妯℃澘鍒楄〃 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + // 娓叉煋妯℃澘 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + // 娣诲姞鍒皕ip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IOUtils.write(sw.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } + catch (IOException e) + { + log.error("娓叉煋妯℃澘澶辫触锛岃〃鍚嶏細" + table.getTableName(), e); + } + } + } + + /** + * 淇敼淇濆瓨鍙傛暟鏍¢獙 + * + * @param genTable 涓氬姟淇℃伅 + */ + @Override + public void validateEdit(GenTable genTable) + { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) + { + String options = JSON.toJSONString(genTable.getParams()); + JSONObject paramsObj = JSONObject.parseObject(options); + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) + { + throw new CustomException("鏍戠紪鐮佸瓧娈典笉鑳戒负绌"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) + { + throw new CustomException("鏍戠埗缂栫爜瀛楁涓嶈兘涓虹┖"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) + { + throw new CustomException("鏍戝悕绉板瓧娈典笉鑳戒负绌"); + } + else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) + { + if (StringUtils.isEmpty(genTable.getSubTableName())) + { + throw new CustomException("鍏宠仈瀛愯〃鐨勮〃鍚嶄笉鑳戒负绌"); + } + else if (StringUtils.isEmpty(genTable.getSubTableFkName())) + { + throw new CustomException("瀛愯〃鍏宠仈鐨勫閿悕涓嶈兘涓虹┖"); + } + } + } + } + + /** + * 璁剧疆涓婚敭鍒椾俊鎭 + * + * @param table 涓氬姟琛ㄤ俊鎭 + */ + public void setPkColumn(GenTable table) + { + for (GenTableColumn column : table.getColumns()) + { + if (column.isPk()) + { + table.setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getPkColumn())) + { + table.setPkColumn(table.getColumns().get(0)); + } + if (GenConstants.TPL_SUB.equals(table.getTplCategory())) + { + for (GenTableColumn column : table.getSubTable().getColumns()) + { + if (column.isPk()) + { + table.getSubTable().setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getSubTable().getPkColumn())) + { + table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); + } + } + } + /** + * 璁剧疆涓诲瓙琛ㄤ俊鎭 + * + * @param table 涓氬姟琛ㄤ俊鎭 + */ + public void setSubTable(GenTable table) + { + String subTableName = table.getSubTableName(); + if (StringUtils.isNotEmpty(subTableName)) + { + table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); + } + } + + /** + * 璁剧疆浠g爜鐢熸垚鍏朵粬閫夐」鍊 + * + * @param genTable 璁剧疆鍚庣殑鐢熸垚瀵硅薄 + */ + public void setTableFromOptions(GenTable genTable) + { + JSONObject paramsObj = JSONObject.parseObject(genTable.getOptions()); + if (StringUtils.isNotNull(paramsObj)) + { + String treeCode = paramsObj.getString(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } + + /** + * 鑾峰彇浠g爜鐢熸垚鍦板潃 + * + * @param table 涓氬姟琛ㄤ俊鎭 + * @param template 妯℃澘鏂囦欢璺緞 + * @return 鐢熸垚鍦板潃 + */ + public static String getGenPath(GenTable table, String template) + { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) + { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/IGenTableColumnService.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/IGenTableColumnService.java new file mode 100644 index 0000000..0975ef5 --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/IGenTableColumnService.java @@ -0,0 +1,44 @@ +package com.zhentao.gen.service; + +import java.util.List; +import com.zhentao.gen.domain.GenTableColumn; + +/** + * 涓氬姟瀛楁 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface IGenTableColumnService +{ + /** + * 鏌ヨ涓氬姟瀛楁鍒楄〃 + * + * @param tableId 涓氬姟瀛楁缂栧彿 + * @return 涓氬姟瀛楁闆嗗悎 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 鏂板涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 淇敼涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 鍒犻櫎涓氬姟瀛楁淇℃伅 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteGenTableColumnByIds(String ids); +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/IGenTableService.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/IGenTableService.java new file mode 100644 index 0000000..8fe4d86 --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/service/IGenTableService.java @@ -0,0 +1,121 @@ +package com.zhentao.gen.service; + +import java.util.List; +import java.util.Map; +import com.zhentao.gen.domain.GenTable; + +/** + * 涓氬姟 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface IGenTableService +{ + /** + * 鏌ヨ涓氬姟鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 涓氬姟闆嗗悎 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param tableNames 琛ㄥ悕绉扮粍 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 鏌ヨ鎵鏈夎〃淇℃伅 + * + * @return 琛ㄤ俊鎭泦鍚 + */ + public List selectGenTableAll(); + + /** + * 鏌ヨ涓氬姟淇℃伅 + * + * @param id 涓氬姟ID + * @return 涓氬姟淇℃伅 + */ + public GenTable selectGenTableById(Long id); + + /** + * 淇敼涓氬姟 + * + * @param genTable 涓氬姟淇℃伅 + * @return 缁撴灉 + */ + public void updateGenTable(GenTable genTable); + + /** + * 鍒犻櫎涓氬姟淇℃伅 + * + * @param tableIds 闇瑕佸垹闄ょ殑琛ㄦ暟鎹甀D + * @return 缁撴灉 + */ + public void deleteGenTableByIds(Long[] tableIds); + + /** + * 瀵煎叆琛ㄧ粨鏋 + * + * @param tableList 瀵煎叆琛ㄥ垪琛 + */ + public void importGenTable(List tableList); + + /** + * 棰勮浠g爜 + * + * @param tableId 琛ㄧ紪鍙 + * @return 棰勮鏁版嵁鍒楄〃 + */ + public Map previewCode(Long tableId); + + /** + * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級 + * + * @param tableName 琛ㄥ悕绉 + * @return 鏁版嵁 + */ + public byte[] downloadCode(String tableName); + + /** + * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛 + * + * @param tableName 琛ㄥ悕绉 + * @return 鏁版嵁 + */ + public void generatorCode(String tableName); + + /** + * 鍚屾鏁版嵁搴 + * + * @param tableName 琛ㄥ悕绉 + */ + public void synchDb(String tableName); + + /** + * 鎵归噺鐢熸垚浠g爜锛堜笅杞芥柟寮忥級 + * + * @param tableNames 琛ㄦ暟缁 + * @return 鏁版嵁 + */ + public byte[] downloadCode(String[] tableNames); + + /** + * 淇敼淇濆瓨鍙傛暟鏍¢獙 + * + * @param genTable 涓氬姟淇℃伅 + */ + public void validateEdit(GenTable genTable); +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/GenUtils.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/GenUtils.java new file mode 100644 index 0000000..551fba6 --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/GenUtils.java @@ -0,0 +1,258 @@ +package com.zhentao.gen.util; + +import java.util.Arrays; +import org.apache.commons.lang3.RegExUtils; +import com.zhentao.common.core.constant.GenConstants; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.gen.config.GenConfig; +import com.zhentao.gen.domain.GenTable; +import com.zhentao.gen.domain.GenTableColumn; + +/** + * 浠g爜鐢熸垚鍣 宸ュ叿绫 + * + * @author ruoyi + */ +public class GenUtils +{ + /** + * 鍒濆鍖栬〃淇℃伅 + */ + public static void initTable(GenTable genTable, String operName) + { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(replaceText(genTable.getTableComment())); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + genTable.setCreateBy(operName); + } + + /** + * 鍒濆鍖栧垪灞炴у瓧娈 + */ + public static void initColumnField(GenTableColumn column, GenTable table) + { + String dataType = getDbType(column.getColumnType()); + String columnName = column.getColumnName(); + column.setTableId(table.getTableId()); + column.setCreateBy(table.getCreateBy()); + // 璁剧疆java瀛楁鍚 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 璁剧疆榛樿绫诲瀷 + column.setJavaType(GenConstants.TYPE_STRING); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) + { + // 瀛楃涓查暱搴﹁秴杩500璁剧疆涓烘枃鏈煙 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } + else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) + { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } + else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) + { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 濡傛灉鏄诞鐐瑰瀷 缁熶竴鐢˙igDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) + { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 濡傛灉鏄暣褰 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) + { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 闀挎暣褰 + else + { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // 鎻掑叆瀛楁锛堥粯璁ゆ墍鏈夊瓧娈甸兘闇瑕佹彃鍏ワ級 + column.setIsInsert(GenConstants.REQUIRE); + + // 缂栬緫瀛楁 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) + { + column.setIsEdit(GenConstants.REQUIRE); + } + // 鍒楄〃瀛楁 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) + { + column.setIsList(GenConstants.REQUIRE); + } + // 鏌ヨ瀛楁 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) + { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 鏌ヨ瀛楁绫诲瀷 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) + { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 鐘舵佸瓧娈佃缃崟閫夋 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) + { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 绫诲瀷&鎬у埆瀛楁璁剧疆涓嬫媺妗 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) + { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 鍥剧墖瀛楁璁剧疆鍥剧墖涓婁紶鎺т欢 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) + { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 鏂囦欢瀛楁璁剧疆鏂囦欢涓婁紶鎺т欢 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) + { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 鍐呭瀛楁璁剧疆瀵屾枃鏈帶浠 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) + { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 鏍¢獙鏁扮粍鏄惁鍖呭惈鎸囧畾鍊 + * + * @param arr 鏁扮粍 + * @param targetValue 鍊 + * @return 鏄惁鍖呭惈 + */ + public static boolean arraysContains(String[] arr, String targetValue) + { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 鑾峰彇妯″潡鍚 + * + * @param packageName 鍖呭悕 + * @return 妯″潡鍚 + */ + public static String getModuleName(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); + return moduleName; + } + + /** + * 鑾峰彇涓氬姟鍚 + * + * @param tableName 琛ㄥ悕 + * @return 涓氬姟鍚 + */ + public static String getBusinessName(String tableName) + { + int lastIndex = tableName.lastIndexOf("_"); + int nameLength = tableName.length(); + String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength); + return businessName; + } + + /** + * 琛ㄥ悕杞崲鎴怞ava绫诲悕 + * + * @param tableName 琛ㄥ悕绉 + * @return 绫诲悕 + */ + public static String convertClassName(String tableName) + { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) + { + String[] searchList = StringUtils.split(tablePrefix, ","); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 鎵归噺鏇挎崲鍓嶇紑 + * + * @param replacementm 鏇挎崲鍊 + * @param searchList 鏇挎崲鍒楄〃 + * @return + */ + public static String replaceFirst(String replacementm, String[] searchList) + { + String text = replacementm; + for (String searchString : searchList) + { + if (replacementm.startsWith(searchString)) + { + text = replacementm.replaceFirst(searchString, ""); + break; + } + } + return text; + } + + /** + * 鍏抽敭瀛楁浛鎹 + * + * @param text 闇瑕佽鏇挎崲鐨勫悕瀛 + * @return 鏇挎崲鍚庣殑鍚嶅瓧 + */ + public static String replaceText(String text) + { + return RegExUtils.replaceAll(text, "(?:琛▅鑻ヤ緷)", ""); + } + + /** + * 鑾峰彇鏁版嵁搴撶被鍨嬪瓧娈 + * + * @param columnType 鍒楃被鍨 + * @return 鎴彇鍚庣殑鍒楃被鍨 + */ + public static String getDbType(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + return StringUtils.substringBefore(columnType, "("); + } + else + { + return columnType; + } + } + + /** + * 鑾峰彇瀛楁闀垮害 + * + * @param columnType 鍒楃被鍨 + * @return 鎴彇鍚庣殑鍒楃被鍨 + */ + public static Integer getColumnLength(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } + else + { + return 0; + } + } +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/VelocityInitializer.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/VelocityInitializer.java new file mode 100644 index 0000000..566458a --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/VelocityInitializer.java @@ -0,0 +1,35 @@ +package com.zhentao.gen.util; + +import java.util.Properties; +import org.apache.velocity.app.Velocity; +import com.zhentao.common.core.constant.Constants; + +/** + * VelocityEngine宸ュ巶 + * + * @author ruoyi + */ +public class VelocityInitializer +{ + /** + * 鍒濆鍖杤m鏂规硶 + */ + public static void initVelocity() + { + Properties p = new Properties(); + try + { + // 鍔犺浇classpath鐩綍涓嬬殑vm鏂囦欢 + p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 瀹氫箟瀛楃闆 + p.setProperty(Velocity.ENCODING_DEFAULT, Constants.UTF8); + p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8); + // 鍒濆鍖朧elocity寮曟搸锛屾寚瀹氶厤缃甈roperties + Velocity.init(p); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } +} diff --git a/smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/VelocityUtils.java b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/VelocityUtils.java new file mode 100644 index 0000000..566ae53 --- /dev/null +++ b/smart-modules/smart-gen/src/main/java/com/zhentao/gen/util/VelocityUtils.java @@ -0,0 +1,361 @@ +package com.zhentao.gen.util; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import org.apache.velocity.VelocityContext; +import com.alibaba.fastjson.JSONObject; +import com.zhentao.common.core.constant.GenConstants; +import com.zhentao.common.core.utils.DateUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.gen.domain.GenTable; +import com.zhentao.gen.domain.GenTableColumn; + +/** + * 妯℃澘宸ュ叿绫 + * + * @author ruoyi + */ +public class VelocityUtils +{ + /** 椤圭洰绌洪棿璺緞 */ + private static final String PROJECT_PATH = "main/java"; + + /** mybatis绌洪棿璺緞 */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** 榛樿涓婄骇鑿滃崟锛岀郴缁熷伐鍏 */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 璁剧疆妯℃澘鍙橀噺淇℃伅 + * + * @return 妯℃澘鍒楄〃 + */ + public static VelocityContext prepareContext(GenTable genTable) + { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "銆愯濉啓鍔熻兘鍚嶇О銆"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) + { + setTreeVelocityContext(velocityContext, genTable); + } + if (GenConstants.TPL_SUB.equals(tplCategory)) + { + setSubVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); + } + } + + public static void setSubVelocityContext(VelocityContext context, GenTable genTable) + { + GenTable subTable = genTable.getSubTable(); + String subTableName = genTable.getSubTableName(); + String subTableFkName = genTable.getSubTableFkName(); + String subClassName = genTable.getSubTable().getClassName(); + String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); + + context.put("subTable", subTable); + context.put("subTableName", subTableName); + context.put("subTableFkName", subTableFkName); + context.put("subTableFkClassName", subTableFkClassName); + context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); + context.put("subClassName", subClassName); + context.put("subclassName", StringUtils.uncapitalize(subClassName)); + context.put("subImportList", getImportList(genTable.getSubTable())); + } + + /** + * 鑾峰彇妯℃澘淇℃伅 + * + * @return 妯℃澘鍒楄〃 + */ + public static List getTemplateList(String tplCategory) + { + List templates = new ArrayList(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + templates.add("vm/sql/sql.vm"); + templates.add("vm/js/api.js.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) + { + templates.add("vm/vue/index.vue.vm"); + } + else if (GenConstants.TPL_TREE.equals(tplCategory)) + { + templates.add("vm/vue/index-tree.vue.vm"); + } + else if (GenConstants.TPL_SUB.equals(tplCategory)) + { + templates.add("vm/vue/index.vue.vm"); + templates.add("vm/java/sub-domain.java.vm"); + } + return templates; + } + + /** + * 鑾峰彇鏂囦欢鍚 + */ + public static String getFileName(String template, GenTable genTable) + { + // 鏂囦欢鍚嶇О + String fileName = ""; + // 鍖呰矾寰 + String packageName = genTable.getPackageName(); + // 妯″潡鍚 + String moduleName = genTable.getModuleName(); + // 澶у啓绫诲悕 + String className = genTable.getClassName(); + // 涓氬姟鍚嶇О + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); + } + else if (template.contains("mapper.java.vm")) + { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } + else if (template.contains("service.java.vm")) + { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } + else if (template.contains("serviceImpl.java.vm")) + { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } + else if (template.contains("controller.java.vm")) + { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } + else if (template.contains("mapper.xml.vm")) + { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } + else if (template.contains("sql.vm")) + { + fileName = businessName + "Menu.sql"; + } + else if (template.contains("api.js.vm")) + { + fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); + } + else if (template.contains("index.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + else if (template.contains("index-tree.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 鑾峰彇鍖呭墠缂 + * + * @param packageName 鍖呭悕绉 + * @return 鍖呭墠缂鍚嶇О + */ + public static String getPackagePrefix(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + String basePackage = StringUtils.substring(packageName, 0, lastIndex); + return basePackage; + } + + /** + * 鏍规嵁鍒楃被鍨嬭幏鍙栧鍏ュ寘 + * + * @param genTable 涓氬姟琛ㄥ璞 + * @return 杩斿洖闇瑕佸鍏ョ殑鍖呭垪琛 + */ + public static HashSet getImportList(GenTable genTable) + { + List columns = genTable.getColumns(); + GenTable subGenTable = genTable.getSubTable(); + HashSet importList = new HashSet(); + if (StringUtils.isNotNull(subGenTable)) + { + importList.add("java.util.List"); + } + for (GenTableColumn column : columns) + { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) + { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } + else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) + { + importList.add("java.math.BigDecimal"); + } + } + return importList; + } + + /** + * 鑾峰彇鏉冮檺鍓嶇紑 + * + * @param moduleName 妯″潡鍚嶇О + * @param businessName 涓氬姟鍚嶇О + * @return 杩斿洖鏉冮檺鍓嶇紑 + */ + public static String getPermissionPrefix(String moduleName, String businessName) + { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 鑾峰彇涓婄骇鑿滃崟ID瀛楁 + * + * @param paramsObj 鐢熸垚鍏朵粬閫夐」 + * @return 涓婄骇鑿滃崟ID瀛楁 + */ + public static String getParentMenuId(JSONObject paramsObj) + { + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)) + { + return paramsObj.getString(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 鑾峰彇鏍戠紪鐮 + * + * @param paramsObj 鐢熸垚鍏朵粬閫夐」 + * @return 鏍戠紪鐮 + */ + public static String getTreecode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 鑾峰彇鏍戠埗缂栫爜 + * + * @param paramsObj 鐢熸垚鍏朵粬閫夐」 + * @return 鏍戠埗缂栫爜 + */ + public static String getTreeParentCode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 鑾峰彇鏍戝悕绉 + * + * @param paramsObj 鐢熸垚鍏朵粬閫夐」 + * @return 鏍戝悕绉 + */ + public static String getTreeName(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 鑾峰彇闇瑕佸湪鍝竴鍒椾笂闈㈡樉绀哄睍寮鎸夐挳 + * + * @param genTable 涓氬姟琛ㄥ璞 + * @return 灞曞紑鎸夐挳鍒楀簭鍙 + */ + public static int getExpandColumn(GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) + { + if (column.isList()) + { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) + { + break; + } + } + } + return num; + } +} diff --git a/smart-modules/smart-gen/src/main/resources/banner.txt b/smart-modules/smart-gen/src/main/resources/banner.txt new file mode 100644 index 0000000..05f528c --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ + (_) + _ __ _ _ ___ _ _ _ ______ __ _ ___ _ __ +| '__|| | | | / _ \ | | | || ||______| / _` | / _ \| '_ \ +| | | |_| || (_) || |_| || | | (_| || __/| | | | +|_| \__,_| \___/ \__, ||_| \__, | \___||_| |_| + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/smart-modules/smart-gen/src/main/resources/bootstrap.yml b/smart-modules/smart-gen/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..ae7887b --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/bootstrap.yml @@ -0,0 +1,27 @@ +# Tomcat +server: + port: 9202 + +# Spring +spring: + application: + # 搴旂敤鍚嶇О + name: ruoyi-gen + profiles: + # 鐜閰嶇疆 + active: dev + cloud: + nacos: + discovery: + # 鏈嶅姟娉ㄥ唽鍦板潃 + server-addr: 8.130.77.16:8848 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + config: + # 閰嶇疆涓績鍦板潃 + server-addr: 8.130.77.16:8848 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + # 閰嶇疆鏂囦欢鏍煎紡 + file-extension: yml + # 鍏变韩閰嶇疆 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} diff --git a/smart-modules/smart-gen/src/main/resources/logback.xml b/smart-modules/smart-gen/src/main/resources/logback.xml new file mode 100644 index 0000000..c301bb4 --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/smart-modules/smart-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/smart-modules/smart-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 0000000..5579435 --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + + + + + + + insert into gen_table_column ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + diff --git a/smart-modules/smart-gen/src/main/resources/mapper/generator/GenTableMapper.xml b/smart-modules/smart-gen/src/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 0000000..bc33949 --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + diff --git a/smart-modules/smart-gen/src/main/resources/vm/java/controller.java.vm b/smart-modules/smart-gen/src/main/resources/vm/java/controller.java.vm new file mode 100644 index 0000000..e8b1889 --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/vm/java/controller.java.vm @@ -0,0 +1,116 @@ +package ${packageName}.controller; + +import java.util.List; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import com.zhentao.common.core.web.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@RestController +@RequestMapping("/${businessName}") +public class ${ClassName}Controller extends BaseController +{ + @Autowired + private I${ClassName}Service ${className}Service; + + /** + * 鏌ヨ${functionName}鍒楄〃 + */ + @PreAuthorize(hasPermi = "${permissionPrefix}:list") + @GetMapping("/list") +#if($table.crud || $table.sub) + public TableDataInfo list(${ClassName} ${className}) + { + startPage(); + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return getDataTable(list); + } +#elseif($table.tree) + public AjaxResult list(${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return AjaxResult.success(list); + } +#end + + /** + * 瀵煎嚭${functionName}鍒楄〃 + */ + @PreAuthorize(hasPermi = "${permissionPrefix}:export") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ${ClassName} ${className}) throws IOException + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + util.exportExcel(response, list, "${businessName}"); + } + + /** + * 鑾峰彇${functionName}璇︾粏淇℃伅 + */ + @PreAuthorize(hasPermi = "${permissionPrefix}:query") + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + { + return AjaxResult.success(${className}Service.select${ClassName}ById(${pkColumn.javaField})); + } + + /** + * 鏂板${functionName} + */ + @PreAuthorize(hasPermi = "${permissionPrefix}:add") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.insert${ClassName}(${className})); + } + + /** + * 淇敼${functionName} + */ + @PreAuthorize(hasPermi = "${permissionPrefix}:edit") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.update${ClassName}(${className})); + } + + /** + * 鍒犻櫎${functionName} + */ + @PreAuthorize(hasPermi = "${permissionPrefix}:remove") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) + { + return toAjax(${className}Service.delete${ClassName}ByIds(${pkColumn.javaField}s)); + } +} diff --git a/smart-modules/smart-gen/src/main/resources/vm/java/domain.java.vm b/smart-modules/smart-gen/src/main/resources/vm/java/domain.java.vm new file mode 100644 index 0000000..dbdb59b --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/vm/java/domain.java.vm @@ -0,0 +1,101 @@ +package ${packageName}.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import com.zhentao.common.core.annotation.Excel; +#if($table.crud || $table.sub) +#elseif($table.tree) +#end + +/** + * ${functionName}瀵硅薄 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) +#set($Entity="BaseEntity") +#elseif($table.tree) +#set($Entity="TreeEntity") +#end +public class ${ClassName} extends ${Entity} +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("锛")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#if($table.sub) + /** $table.subTable.functionName淇℃伅 */ + private List<${subClassName}> ${subclassName}List; + +#end +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + +#if($table.sub) + public List<${subClassName}> get${subClassName}List() + { + return ${subclassName}List; + } + + public void set${subClassName}List(List<${subClassName}> ${subclassName}List) + { + this.${subclassName}List = ${subclassName}List; + } + +#end + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end +#if($table.sub) + .append("${subclassName}List", get${subClassName}List()) +#end + .toString(); + } +} diff --git a/smart-modules/smart-gen/src/main/resources/vm/java/mapper.java.vm b/smart-modules/smart-gen/src/main/resources/vm/java/mapper.java.vm new file mode 100644 index 0000000..1bb36d6 --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/vm/java/mapper.java.vm @@ -0,0 +1,91 @@ +package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}Mapper鎺ュ彛 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper +{ + /** + * 鏌ヨ${functionName} + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return ${functionName} + */ + public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 鏌ヨ${functionName}鍒楄〃 + * + * @param ${className} ${functionName} + * @return ${functionName}闆嗗悎 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 鏂板${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 淇敼${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 鍒犻櫎${functionName} + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 缁撴灉 + */ + public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 鎵归噺鍒犻櫎${functionName} + * + * @param ${pkColumn.javaField}s 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 鎵归噺鍒犻櫎${subTable.functionName} + * + * @param customerIds 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 鎵归噺鏂板${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}鍒楄〃 + * @return 缁撴灉 + */ + public int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 閫氳繃${functionName}ID鍒犻櫎${subTable.functionName}淇℃伅 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/smart-modules/smart-gen/src/main/resources/vm/java/service.java.vm b/smart-modules/smart-gen/src/main/resources/vm/java/service.java.vm new file mode 100644 index 0000000..1217d53 --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/vm/java/service.java.vm @@ -0,0 +1,61 @@ +package ${packageName}.service; + +import java.util.List; +import ${packageName}.domain.${ClassName}; + +/** + * ${functionName}Service鎺ュ彛 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service +{ + /** + * 鏌ヨ${functionName} + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return ${functionName} + */ + public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 鏌ヨ${functionName}鍒楄〃 + * + * @param ${className} ${functionName} + * @return ${functionName}闆嗗悎 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 鏂板${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 淇敼${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 鎵归噺鍒犻櫎${functionName} + * + * @param ${pkColumn.javaField}s 闇瑕佸垹闄ょ殑${functionName}ID + * @return 缁撴灉 + */ + public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 鍒犻櫎${functionName}淇℃伅 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 缁撴灉 + */ + public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); +} diff --git a/smart-modules/smart-gen/src/main/resources/vm/java/serviceImpl.java.vm b/smart-modules/smart-gen/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..4023cd3 --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,166 @@ +package ${packageName}.service.impl; + +import java.util.List; +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +import com.zhentao.common.core.utils.DateUtils; +#break +#end +#end +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +#if($table.sub) +import java.util.ArrayList; +import com.zhentao.common.core.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.domain.${subClassName}; +#end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; + +/** + * ${functionName}Service涓氬姟灞傚鐞 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service +{ + @Autowired + private ${ClassName}Mapper ${className}Mapper; + + /** + * 鏌ヨ${functionName} + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.select${ClassName}ById(${pkColumn.javaField}); + } + + /** + * 鏌ヨ${functionName}鍒楄〃 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) + { + return ${className}Mapper.select${ClassName}List(${className}); + } + + /** + * 鏂板${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ +#if($table.sub) + @Transactional +#end + @Override + public int insert${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; +#else + return ${className}Mapper.insert${ClassName}(${className}); +#end + } + + /** + * 淇敼${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ +#if($table.sub) + @Transactional +#end + @Override + public int update${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); + insert${subClassName}(${className}); +#end + return ${className}Mapper.update${ClassName}(${className}); + } + + /** + * 鎵归噺鍒犻櫎${functionName} + * + * @param ${pkColumn.javaField}s 闇瑕佸垹闄ょ殑${functionName}ID + * @return 缁撴灉 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); +#end + return ${className}Mapper.delete${ClassName}ByIds(${pkColumn.javaField}s); + } + + /** + * 鍒犻櫎${functionName}淇℃伅 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 缁撴灉 + */ + @Override + public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); +#end + return ${className}Mapper.delete${ClassName}ById(${pkColumn.javaField}); + } +#if($table.sub) + + /** + * 鏂板${subTable.functionName}淇℃伅 + * + * @param ${className} ${functionName}瀵硅薄 + */ + public void insert${subClassName}(${ClassName} ${className}) + { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + Long ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) + { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} : ${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) + { + ${className}Mapper.batch${subClassName}(list); + } + } + } +#end +} diff --git a/smart-modules/smart-gen/src/main/resources/vm/java/sub-domain.java.vm b/smart-modules/smart-gen/src/main/resources/vm/java/sub-domain.java.vm new file mode 100644 index 0000000..51ee0c3 --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/vm/java/sub-domain.java.vm @@ -0,0 +1,73 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import com.zhentao.common.core.annotation.Excel; + +/** + * ${subTable.functionName}瀵硅薄 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("锛")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/smart-modules/smart-gen/src/main/resources/vm/js/api.js.vm b/smart-modules/smart-gen/src/main/resources/vm/js/api.js.vm new file mode 100644 index 0000000..9295524 --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/vm/js/api.js.vm @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 鏌ヨ${functionName}鍒楄〃 +export function list${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ${functionName}璇︾粏 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 鏂板${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 淇敼${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 鍒犻櫎${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} diff --git a/smart-modules/smart-gen/src/main/resources/vm/sql/sql.vm b/smart-modules/smart-gen/src/main/resources/vm/sql/sql.vm new file mode 100644 index 0000000..fb91844 --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/vm/sql/sql.vm @@ -0,0 +1,22 @@ +-- 鑿滃崟 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '${functionName}鑿滃崟'); + +-- 鎸夐挳鐖惰彍鍗旾D +SELECT @parentId := LAST_INSERT_ID(); + +-- 鎸夐挳 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}鏌ヨ', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}鏂板', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}淇敼', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}鍒犻櫎', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}瀵煎嚭', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); \ No newline at end of file diff --git a/smart-modules/smart-gen/src/main/resources/vm/vue/index-tree.vue.vm b/smart-modules/smart-gen/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..46e65cf --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,523 @@ + + + diff --git a/smart-modules/smart-gen/src/main/resources/vm/vue/index.vue.vm b/smart-modules/smart-gen/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..ac0315f --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,634 @@ + + + \ No newline at end of file diff --git a/smart-modules/smart-gen/src/main/resources/vm/xml/mapper.xml.vm b/smart-modules/smart-gen/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..1cc0795 --- /dev/null +++ b/smart-modules/smart-gen/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,135 @@ + + + + + +#foreach ($column in $columns) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($velocityCount != $columns.size()),#end#end from ${tableName} + + + + + + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($velocityCount != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($velocityCount != $subTable.columns.size()),#end#end) + + +#end + \ No newline at end of file diff --git a/smart-modules/smart-job/pom.xml b/smart-modules/smart-job/pom.xml new file mode 100644 index 0000000..0fc1a1c --- /dev/null +++ b/smart-modules/smart-job/pom.xml @@ -0,0 +1,100 @@ + + + + com.ruoyi + smart-modules + 2.5.0 + + 4.0.0 + + smart-modules-job + + + smart-modules-job瀹氭椂浠诲姟 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + io.springfox + springfox-swagger-ui + ${swagger.fox.version} + + + + + org.quartz-scheduler + quartz + + + com.mchange + c3p0 + + + + + + + mysql + mysql-connector-java + + + + + com.ruoyi + smart-common-log + + + + + com.ruoyi + smart-common-swagger + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/RuoYiJobApplication.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/RuoYiJobApplication.java new file mode 100644 index 0000000..854039f --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/RuoYiJobApplication.java @@ -0,0 +1,34 @@ +package com.zhentao.job; + +import org.springframework.boot.SpringApplication; +import org.springframework.cloud.client.SpringCloudApplication; +import com.zhentao.common.security.annotation.EnableCustomConfig; +import com.zhentao.common.security.annotation.EnableRyFeignClients; +import com.zhentao.common.swagger.annotation.EnableCustomSwagger2; + +/** + * 瀹氭椂浠诲姟 + * + * @author ruoyi + */ +@EnableCustomConfig +@EnableCustomSwagger2 +@EnableRyFeignClients +@SpringCloudApplication +public class RuoYiJobApplication +{ + public static void main(String[] args) + { + SpringApplication.run(RuoYiJobApplication.class, args); + System.out.println("(鈾モ棤鈥库棤)锞夛緸 瀹氭椂浠诲姟妯″潡鍚姩鎴愬姛 醿(麓凇`醿)锞 \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/config/ScheduleConfig.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/config/ScheduleConfig.java new file mode 100644 index 0000000..e73be48 --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/config/ScheduleConfig.java @@ -0,0 +1,57 @@ +package com.zhentao.job.config; + +import java.util.Properties; +import javax.sql.DataSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +/** + * 瀹氭椂浠诲姟閰嶇疆 + * + * @author ruoyi + */ +@Configuration +public class ScheduleConfig +{ + @Bean + public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) + { + SchedulerFactoryBean factory = new SchedulerFactoryBean(); + factory.setDataSource(dataSource); + + // quartz鍙傛暟 + Properties prop = new Properties(); + prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler"); + prop.put("org.quartz.scheduler.instanceId", "AUTO"); + // 绾跨▼姹犻厤缃 + prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); + prop.put("org.quartz.threadPool.threadCount", "20"); + prop.put("org.quartz.threadPool.threadPriority", "5"); + // JobStore閰嶇疆 + prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); + // 闆嗙兢閰嶇疆 + prop.put("org.quartz.jobStore.isClustered", "true"); + prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); + prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1"); + prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); + + // sqlserver 鍚敤 + // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); + prop.put("org.quartz.jobStore.misfireThreshold", "12000"); + prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); + factory.setQuartzProperties(prop); + + factory.setSchedulerName("RuoyiScheduler"); + // 寤舵椂鍚姩 + factory.setStartupDelay(1); + factory.setApplicationContextSchedulerContextKey("applicationContextKey"); + // 鍙夛紝QuartzScheduler + // 鍚姩鏃舵洿鏂板繁瀛樺湪鐨凧ob锛岃繖鏍峰氨涓嶇敤姣忔淇敼targetObject鍚庡垹闄rtz_job_details琛ㄥ搴旇褰曚簡 + factory.setOverwriteExistingJobs(true); + // 璁剧疆鑷姩鍚姩锛岄粯璁や负true + factory.setAutoStartup(true); + + return factory; + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/controller/SysJobController.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/controller/SysJobController.java new file mode 100644 index 0000000..33debfd --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/controller/SysJobController.java @@ -0,0 +1,145 @@ +package com.zhentao.job.controller; + +import java.io.IOException; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.job.domain.SysJob; +import com.zhentao.job.service.ISysJobService; +import com.zhentao.job.util.CronUtils; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.exception.job.TaskException; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.poi.ExcelUtil; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; + +/** + * 璋冨害浠诲姟淇℃伅鎿嶄綔澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/job") +public class SysJobController extends BaseController +{ + @Autowired + private ISysJobService jobService; + + /** + * 鏌ヨ瀹氭椂浠诲姟鍒楄〃 + */ + @PreAuthorize(hasPermi = "monitor:job:list") + @GetMapping("/list") + public TableDataInfo list(SysJob sysJob) + { + startPage(); + List list = jobService.selectJobList(sysJob); + return getDataTable(list); + } + + /** + * 瀵煎嚭瀹氭椂浠诲姟鍒楄〃 + */ + @PreAuthorize(hasPermi = "monitor:job:export") + @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJob sysJob) throws IOException + { + List list = jobService.selectJobList(sysJob); + ExcelUtil util = new ExcelUtil(SysJob.class); + util.exportExcel(response, list, "瀹氭椂浠诲姟"); + } + + /** + * 鑾峰彇瀹氭椂浠诲姟璇︾粏淇℃伅 + */ + @PreAuthorize(hasPermi = "monitor:job:query") + @GetMapping(value = "/{jobId}") + public AjaxResult getInfo(@PathVariable("jobId") Long jobId) + { + return AjaxResult.success(jobService.selectJobById(jobId)); + } + + /** + * 鏂板瀹氭椂浠诲姟 + */ + @PreAuthorize(hasPermi = "monitor:job:add") + @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysJob sysJob) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(sysJob.getCronExpression())) + { + return AjaxResult.error("cron琛ㄨ揪寮忎笉姝g‘"); + } + sysJob.setCreateBy(SecurityUtils.getUsername()); + return toAjax(jobService.insertJob(sysJob)); + } + + /** + * 淇敼瀹氭椂浠诲姟 + */ + @PreAuthorize(hasPermi = "monitor:job:edit") + @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysJob sysJob) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(sysJob.getCronExpression())) + { + return AjaxResult.error("cron琛ㄨ揪寮忎笉姝g‘"); + } + sysJob.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(jobService.updateJob(sysJob)); + } + + /** + * 瀹氭椂浠诲姟鐘舵佷慨鏀 + */ + @PreAuthorize(hasPermi = "monitor:job:changeStatus") + @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException + { + SysJob newJob = jobService.selectJobById(job.getJobId()); + newJob.setStatus(job.getStatus()); + return toAjax(jobService.changeStatus(newJob)); + } + + /** + * 瀹氭椂浠诲姟绔嬪嵆鎵ц涓娆 + */ + @PreAuthorize(hasPermi = "monitor:job:changeStatus") + @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE) + @PutMapping("/run") + public AjaxResult run(@RequestBody SysJob job) throws SchedulerException + { + jobService.run(job); + return AjaxResult.success(); + } + + /** + * 鍒犻櫎瀹氭椂浠诲姟 + */ + @PreAuthorize(hasPermi = "monitor:job:remove") + @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobIds}") + public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException + { + jobService.deleteJobByIds(jobIds); + return AjaxResult.success(); + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/controller/SysJobLogController.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/controller/SysJobLogController.java new file mode 100644 index 0000000..29a85bb --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/controller/SysJobLogController.java @@ -0,0 +1,93 @@ +package com.zhentao.job.controller; + +import java.io.IOException; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.job.domain.SysJobLog; +import com.zhentao.job.service.ISysJobLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.utils.poi.ExcelUtil; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; + +/** + * 璋冨害鏃ュ織鎿嶄綔澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/job/log") +public class SysJobLogController extends BaseController +{ + @Autowired + private ISysJobLogService jobLogService; + + /** + * 鏌ヨ瀹氭椂浠诲姟璋冨害鏃ュ織鍒楄〃 + */ + @PreAuthorize(hasPermi = "monitor:job:list") + @GetMapping("/list") + public TableDataInfo list(SysJobLog sysJobLog) + { + startPage(); + List list = jobLogService.selectJobLogList(sysJobLog); + return getDataTable(list); + } + + /** + * 瀵煎嚭瀹氭椂浠诲姟璋冨害鏃ュ織鍒楄〃 + */ + @PreAuthorize(hasPermi = "monitor:job:export") + @Log(title = "浠诲姟璋冨害鏃ュ織", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJobLog sysJobLog) throws IOException + { + List list = jobLogService.selectJobLogList(sysJobLog); + ExcelUtil util = new ExcelUtil(SysJobLog.class); + util.exportExcel(response, list, "璋冨害鏃ュ織"); + } + + /** + * 鏍规嵁璋冨害缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize(hasPermi = "monitor:job:query") + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable Long jobLogId) + { + return AjaxResult.success(jobLogService.selectJobLogById(jobLogId)); + } + + /** + * 鍒犻櫎瀹氭椂浠诲姟璋冨害鏃ュ織 + */ + @PreAuthorize(hasPermi = "monitor:job:remove") + @Log(title = "瀹氭椂浠诲姟璋冨害鏃ュ織", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobLogIds}") + public AjaxResult remove(@PathVariable Long[] jobLogIds) + { + return toAjax(jobLogService.deleteJobLogByIds(jobLogIds)); + } + + /** + * 娓呯┖瀹氭椂浠诲姟璋冨害鏃ュ織 + */ + @PreAuthorize(hasPermi = "monitor:job:remove") + @Log(title = "璋冨害鏃ュ織", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + jobLogService.cleanJobLog(); + return AjaxResult.success(); + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/domain/SysJob.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/domain/SysJob.java new file mode 100644 index 0000000..ea3fee0 --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/domain/SysJob.java @@ -0,0 +1,172 @@ +package com.zhentao.job.domain; + +import java.io.Serializable; +import java.util.Date; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.zhentao.common.core.annotation.Excel; +import com.zhentao.common.core.annotation.Excel.ColumnType; +import com.zhentao.common.core.constant.ScheduleConstants; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.web.domain.BaseEntity; +import com.zhentao.job.util.CronUtils; + +/** + * 瀹氭椂浠诲姟璋冨害琛 sys_job + * + * @author ruoyi + */ +public class SysJob extends BaseEntity implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 浠诲姟ID */ + @Excel(name = "浠诲姟搴忓彿", cellType = ColumnType.NUMERIC) + private Long jobId; + + /** 浠诲姟鍚嶇О */ + @Excel(name = "浠诲姟鍚嶇О") + private String jobName; + + /** 浠诲姟缁勫悕 */ + @Excel(name = "浠诲姟缁勫悕") + private String jobGroup; + + /** 璋冪敤鐩爣瀛楃涓 */ + @Excel(name = "璋冪敤鐩爣瀛楃涓") + private String invokeTarget; + + /** cron鎵ц琛ㄨ揪寮 */ + @Excel(name = "鎵ц琛ㄨ揪寮 ") + private String cronExpression; + + /** cron璁″垝绛栫暐 */ + @Excel(name = "璁″垝绛栫暐 ", readConverterExp = "0=榛樿,1=绔嬪嵆瑙﹀彂鎵ц,2=瑙﹀彂涓娆℃墽琛,3=涓嶈Е鍙戠珛鍗虫墽琛") + private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; + + /** 鏄惁骞跺彂鎵ц锛0鍏佽 1绂佹锛 */ + @Excel(name = "骞跺彂鎵ц", readConverterExp = "0=鍏佽,1=绂佹") + private String concurrent; + + /** 浠诲姟鐘舵侊紙0姝e父 1鏆傚仠锛 */ + @Excel(name = "浠诲姟鐘舵", readConverterExp = "0=姝e父,1=鏆傚仠") + private String status; + + public Long getJobId() + { + return jobId; + } + + public void setJobId(Long jobId) + { + this.jobId = jobId; + } + + @NotBlank(message = "浠诲姟鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 64, message = "浠诲姟鍚嶇О涓嶈兘瓒呰繃64涓瓧绗") + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + @NotBlank(message = "璋冪敤鐩爣瀛楃涓蹭笉鑳戒负绌") + @Size(min = 0, max = 500, message = "璋冪敤鐩爣瀛楃涓查暱搴︿笉鑳借秴杩500涓瓧绗") + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + @NotBlank(message = "Cron鎵ц琛ㄨ揪寮忎笉鑳戒负绌") + @Size(min = 0, max = 255, message = "Cron鎵ц琛ㄨ揪寮忎笉鑳借秴杩255涓瓧绗") + public String getCronExpression() + { + return cronExpression; + } + + public void setCronExpression(String cronExpression) + { + this.cronExpression = cronExpression; + } + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public Date getNextValidTime() + { + if (StringUtils.isNotEmpty(cronExpression)) + { + return CronUtils.getNextExecution(cronExpression); + } + return null; + } + + public String getMisfirePolicy() + { + return misfirePolicy; + } + + public void setMisfirePolicy(String misfirePolicy) + { + this.misfirePolicy = misfirePolicy; + } + + public String getConcurrent() + { + return concurrent; + } + + public void setConcurrent(String concurrent) + { + this.concurrent = concurrent; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobId", getJobId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("cronExpression", getCronExpression()) + .append("nextValidTime", getNextValidTime()) + .append("misfirePolicy", getMisfirePolicy()) + .append("concurrent", getConcurrent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/domain/SysJobLog.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/domain/SysJobLog.java new file mode 100644 index 0000000..8ad2659 --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/domain/SysJobLog.java @@ -0,0 +1,155 @@ +package com.zhentao.job.domain; + +import java.util.Date; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.zhentao.common.core.annotation.Excel; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 瀹氭椂浠诲姟璋冨害鏃ュ織琛 sys_job_log + * + * @author ruoyi + */ +public class SysJobLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @Excel(name = "鏃ュ織搴忓彿") + private Long jobLogId; + + /** 浠诲姟鍚嶇О */ + @Excel(name = "浠诲姟鍚嶇О") + private String jobName; + + /** 浠诲姟缁勫悕 */ + @Excel(name = "浠诲姟缁勫悕") + private String jobGroup; + + /** 璋冪敤鐩爣瀛楃涓 */ + @Excel(name = "璋冪敤鐩爣瀛楃涓") + private String invokeTarget; + + /** 鏃ュ織淇℃伅 */ + @Excel(name = "鏃ュ織淇℃伅") + private String jobMessage; + + /** 鎵ц鐘舵侊紙0姝e父 1澶辫触锛 */ + @Excel(name = "鎵ц鐘舵", readConverterExp = "0=姝e父,1=澶辫触") + private String status; + + /** 寮傚父淇℃伅 */ + @Excel(name = "寮傚父淇℃伅") + private String exceptionInfo; + + /** 寮濮嬫椂闂 */ + private Date startTime; + + /** 鍋滄鏃堕棿 */ + private Date stopTime; + + public Long getJobLogId() + { + return jobLogId; + } + + public void setJobLogId(Long jobLogId) + { + this.jobLogId = jobLogId; + } + + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + public String getJobMessage() + { + return jobMessage; + } + + public void setJobMessage(String jobMessage) + { + this.jobMessage = jobMessage; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getExceptionInfo() + { + return exceptionInfo; + } + + public void setExceptionInfo(String exceptionInfo) + { + this.exceptionInfo = exceptionInfo; + } + + public Date getStartTime() + { + return startTime; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getStopTime() + { + return stopTime; + } + + public void setStopTime(Date stopTime) + { + this.stopTime = stopTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobLogId", getJobLogId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("jobMessage", getJobMessage()) + .append("status", getStatus()) + .append("exceptionInfo", getExceptionInfo()) + .append("startTime", getStartTime()) + .append("stopTime", getStopTime()) + .toString(); + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/mapper/SysJobLogMapper.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/mapper/SysJobLogMapper.java new file mode 100644 index 0000000..6952935 --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/mapper/SysJobLogMapper.java @@ -0,0 +1,64 @@ +package com.zhentao.job.mapper; + +import java.util.List; +import com.zhentao.job.domain.SysJobLog; + +/** + * 璋冨害浠诲姟鏃ュ織淇℃伅 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysJobLogMapper +{ + /** + * 鑾峰彇quartz璋冨害鍣ㄦ棩蹇楃殑璁″垝浠诲姟 + * + * @param jobLog 璋冨害鏃ュ織淇℃伅 + * @return 璋冨害浠诲姟鏃ュ織闆嗗悎 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 鏌ヨ鎵鏈夎皟搴︿换鍔℃棩蹇 + * + * @return 璋冨害浠诲姟鏃ュ織鍒楄〃 + */ + public List selectJobLogAll(); + + /** + * 閫氳繃璋冨害浠诲姟鏃ュ織ID鏌ヨ璋冨害淇℃伅 + * + * @param jobLogId 璋冨害浠诲姟鏃ュ織ID + * @return 璋冨害浠诲姟鏃ュ織瀵硅薄淇℃伅 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 鏂板浠诲姟鏃ュ織 + * + * @param jobLog 璋冨害鏃ュ織淇℃伅 + * @return 缁撴灉 + */ + public int insertJobLog(SysJobLog jobLog); + + /** + * 鎵归噺鍒犻櫎璋冨害鏃ュ織淇℃伅 + * + * @param logIds 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 鍒犻櫎浠诲姟鏃ュ織 + * + * @param jobId 璋冨害鏃ュ織ID + * @return 缁撴灉 + */ + public int deleteJobLogById(Long jobId); + + /** + * 娓呯┖浠诲姟鏃ュ織 + */ + public void cleanJobLog(); +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/mapper/SysJobMapper.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/mapper/SysJobMapper.java new file mode 100644 index 0000000..b297a59 --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/mapper/SysJobMapper.java @@ -0,0 +1,67 @@ +package com.zhentao.job.mapper; + +import java.util.List; +import com.zhentao.job.domain.SysJob; + +/** + * 璋冨害浠诲姟淇℃伅 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysJobMapper +{ + /** + * 鏌ヨ璋冨害浠诲姟鏃ュ織闆嗗悎 + * + * @param job 璋冨害淇℃伅 + * @return 鎿嶄綔鏃ュ織闆嗗悎 + */ + public List selectJobList(SysJob job); + + /** + * 鏌ヨ鎵鏈夎皟搴︿换鍔 + * + * @return 璋冨害浠诲姟鍒楄〃 + */ + public List selectJobAll(); + + /** + * 閫氳繃璋冨害ID鏌ヨ璋冨害浠诲姟淇℃伅 + * + * @param jobId 璋冨害ID + * @return 瑙掕壊瀵硅薄淇℃伅 + */ + public SysJob selectJobById(Long jobId); + + /** + * 閫氳繃璋冨害ID鍒犻櫎璋冨害浠诲姟淇℃伅 + * + * @param jobId 璋冨害ID + * @return 缁撴灉 + */ + public int deleteJobById(Long jobId); + + /** + * 鎵归噺鍒犻櫎璋冨害浠诲姟淇℃伅 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteJobByIds(Long[] ids); + + /** + * 淇敼璋冨害浠诲姟淇℃伅 + * + * @param job 璋冨害浠诲姟淇℃伅 + * @return 缁撴灉 + */ + public int updateJob(SysJob job); + + /** + * 鏂板璋冨害浠诲姟淇℃伅 + * + * @param job 璋冨害浠诲姟淇℃伅 + * @return 缁撴灉 + */ + public int insertJob(SysJob job); +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/service/ISysJobLogService.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/service/ISysJobLogService.java new file mode 100644 index 0000000..4be8b9e --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/service/ISysJobLogService.java @@ -0,0 +1,56 @@ +package com.zhentao.job.service; + +import java.util.List; +import com.zhentao.job.domain.SysJobLog; + +/** + * 瀹氭椂浠诲姟璋冨害鏃ュ織淇℃伅淇℃伅 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysJobLogService +{ + /** + * 鑾峰彇quartz璋冨害鍣ㄦ棩蹇楃殑璁″垝浠诲姟 + * + * @param jobLog 璋冨害鏃ュ織淇℃伅 + * @return 璋冨害浠诲姟鏃ュ織闆嗗悎 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 閫氳繃璋冨害浠诲姟鏃ュ織ID鏌ヨ璋冨害淇℃伅 + * + * @param jobLogId 璋冨害浠诲姟鏃ュ織ID + * @return 璋冨害浠诲姟鏃ュ織瀵硅薄淇℃伅 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 鏂板浠诲姟鏃ュ織 + * + * @param jobLog 璋冨害鏃ュ織淇℃伅 + */ + public void addJobLog(SysJobLog jobLog); + + /** + * 鎵归噺鍒犻櫎璋冨害鏃ュ織淇℃伅 + * + * @param logIds 闇瑕佸垹闄ょ殑鏃ュ織ID + * @return 缁撴灉 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 鍒犻櫎浠诲姟鏃ュ織 + * + * @param jobId 璋冨害鏃ュ織ID + * @return 缁撴灉 + */ + public int deleteJobLogById(Long jobId); + + /** + * 娓呯┖浠诲姟鏃ュ織 + */ + public void cleanJobLog(); +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/service/ISysJobService.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/service/ISysJobService.java new file mode 100644 index 0000000..f189b54 --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/service/ISysJobService.java @@ -0,0 +1,103 @@ +package com.zhentao.job.service; + +import java.util.List; + +import com.zhentao.job.domain.SysJob; +import org.quartz.SchedulerException; +import com.zhentao.common.core.exception.job.TaskException; + +/** + * 瀹氭椂浠诲姟璋冨害淇℃伅淇℃伅 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysJobService +{ + /** + * 鑾峰彇quartz璋冨害鍣ㄧ殑璁″垝浠诲姟 + * + * @param job 璋冨害淇℃伅 + * @return 璋冨害浠诲姟闆嗗悎 + */ + public List selectJobList(SysJob job); + + /** + * 閫氳繃璋冨害浠诲姟ID鏌ヨ璋冨害淇℃伅 + * + * @param jobId 璋冨害浠诲姟ID + * @return 璋冨害浠诲姟瀵硅薄淇℃伅 + */ + public SysJob selectJobById(Long jobId); + + /** + * 鏆傚仠浠诲姟 + * + * @param job 璋冨害淇℃伅 + * @return 缁撴灉 + */ + public int pauseJob(SysJob job) throws SchedulerException; + + /** + * 鎭㈠浠诲姟 + * + * @param job 璋冨害淇℃伅 + * @return 缁撴灉 + */ + public int resumeJob(SysJob job) throws SchedulerException; + + /** + * 鍒犻櫎浠诲姟鍚庯紝鎵瀵瑰簲鐨則rigger涔熷皢琚垹闄 + * + * @param job 璋冨害淇℃伅 + * @return 缁撴灉 + */ + public int deleteJob(SysJob job) throws SchedulerException; + + /** + * 鎵归噺鍒犻櫎璋冨害淇℃伅 + * + * @param jobIds 闇瑕佸垹闄ょ殑浠诲姟ID + * @return 缁撴灉 + */ + public void deleteJobByIds(Long[] jobIds) throws SchedulerException; + + /** + * 浠诲姟璋冨害鐘舵佷慨鏀 + * + * @param job 璋冨害淇℃伅 + * @return 缁撴灉 + */ + public int changeStatus(SysJob job) throws SchedulerException; + + /** + * 绔嬪嵆杩愯浠诲姟 + * + * @param job 璋冨害淇℃伅 + * @return 缁撴灉 + */ + public void run(SysJob job) throws SchedulerException; + + /** + * 鏂板浠诲姟 + * + * @param job 璋冨害淇℃伅 + * @return 缁撴灉 + */ + public int insertJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 鏇存柊浠诲姟 + * + * @param job 璋冨害淇℃伅 + * @return 缁撴灉 + */ + public int updateJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 鏍¢獙cron琛ㄨ揪寮忔槸鍚︽湁鏁 + * + * @param cronExpression 琛ㄨ揪寮 + * @return 缁撴灉 + */ + public boolean checkCronExpressionIsValid(String cronExpression); +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/service/SysJobLogServiceImpl.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/service/SysJobLogServiceImpl.java new file mode 100644 index 0000000..b5aea44 --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/service/SysJobLogServiceImpl.java @@ -0,0 +1,87 @@ +package com.zhentao.job.service; + +import java.util.List; + +import com.zhentao.job.domain.SysJobLog; +import com.zhentao.job.mapper.SysJobLogMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 瀹氭椂浠诲姟璋冨害鏃ュ織淇℃伅 鏈嶅姟灞 + * + * @author ruoyi + */ +@Service +public class SysJobLogServiceImpl implements ISysJobLogService +{ + @Autowired + private SysJobLogMapper jobLogMapper; + + /** + * 鑾峰彇quartz璋冨害鍣ㄦ棩蹇楃殑璁″垝浠诲姟 + * + * @param jobLog 璋冨害鏃ュ織淇℃伅 + * @return 璋冨害浠诲姟鏃ュ織闆嗗悎 + */ + @Override + public List selectJobLogList(SysJobLog jobLog) + { + return jobLogMapper.selectJobLogList(jobLog); + } + + /** + * 閫氳繃璋冨害浠诲姟鏃ュ織ID鏌ヨ璋冨害淇℃伅 + * + * @param jobLogId 璋冨害浠诲姟鏃ュ織ID + * @return 璋冨害浠诲姟鏃ュ織瀵硅薄淇℃伅 + */ + @Override + public SysJobLog selectJobLogById(Long jobLogId) + { + return jobLogMapper.selectJobLogById(jobLogId); + } + + /** + * 鏂板浠诲姟鏃ュ織 + * + * @param jobLog 璋冨害鏃ュ織淇℃伅 + */ + @Override + public void addJobLog(SysJobLog jobLog) + { + jobLogMapper.insertJobLog(jobLog); + } + + /** + * 鎵归噺鍒犻櫎璋冨害鏃ュ織淇℃伅 + * + * @param logIds 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + @Override + public int deleteJobLogByIds(Long[] logIds) + { + return jobLogMapper.deleteJobLogByIds(logIds); + } + + /** + * 鍒犻櫎浠诲姟鏃ュ織 + * + * @param jobId 璋冨害鏃ュ織ID + */ + @Override + public int deleteJobLogById(Long jobId) + { + return jobLogMapper.deleteJobLogById(jobId); + } + + /** + * 娓呯┖浠诲姟鏃ュ織 + */ + @Override + public void cleanJobLog() + { + jobLogMapper.cleanJobLog(); + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/service/SysJobServiceImpl.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/service/SysJobServiceImpl.java new file mode 100644 index 0000000..9fca527 --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/service/SysJobServiceImpl.java @@ -0,0 +1,254 @@ +package com.zhentao.job.service; + +import java.util.List; +import javax.annotation.PostConstruct; + +import com.zhentao.job.domain.SysJob; +import com.zhentao.job.mapper.SysJobMapper; +import com.zhentao.job.util.CronUtils; +import com.zhentao.job.util.ScheduleUtils; +import org.quartz.JobDataMap; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.zhentao.common.core.constant.ScheduleConstants; +import com.zhentao.common.core.exception.job.TaskException; + +/** + * 瀹氭椂浠诲姟璋冨害淇℃伅 鏈嶅姟灞 + * + * @author ruoyi + */ +@Service +public class SysJobServiceImpl implements ISysJobService +{ + @Autowired + private Scheduler scheduler; + + @Autowired + private SysJobMapper jobMapper; + + /** + * 椤圭洰鍚姩鏃讹紝鍒濆鍖栧畾鏃跺櫒 涓昏鏄槻姝㈡墜鍔ㄤ慨鏀规暟鎹簱瀵艰嚧鏈悓姝ュ埌瀹氭椂浠诲姟澶勭悊锛堟敞锛氫笉鑳芥墜鍔ㄤ慨鏀规暟鎹簱ID鍜屼换鍔$粍鍚嶏紝鍚﹀垯浼氬鑷磋剰鏁版嵁锛 + */ + @PostConstruct + public void init() throws SchedulerException, TaskException + { + scheduler.clear(); + List jobList = jobMapper.selectJobAll(); + for (SysJob job : jobList) + { + ScheduleUtils.createScheduleJob(scheduler, job); + } + } + + /** + * 鑾峰彇quartz璋冨害鍣ㄧ殑璁″垝浠诲姟鍒楄〃 + * + * @param job 璋冨害淇℃伅 + * @return + */ + @Override + public List selectJobList(SysJob job) + { + return jobMapper.selectJobList(job); + } + + /** + * 閫氳繃璋冨害浠诲姟ID鏌ヨ璋冨害淇℃伅 + * + * @param jobId 璋冨害浠诲姟ID + * @return 璋冨害浠诲姟瀵硅薄淇℃伅 + */ + @Override + public SysJob selectJobById(Long jobId) + { + return jobMapper.selectJobById(jobId); + } + + /** + * 鏆傚仠浠诲姟 + * + * @param job 璋冨害淇℃伅 + */ + @Override + @Transactional + public int pauseJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 鎭㈠浠诲姟 + * + * @param job 璋冨害淇℃伅 + */ + @Override + @Transactional + public int resumeJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 鍒犻櫎浠诲姟鍚庯紝鎵瀵瑰簲鐨則rigger涔熷皢琚垹闄 + * + * @param job 璋冨害淇℃伅 + */ + @Override + @Transactional + public int deleteJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + int rows = jobMapper.deleteJobById(jobId); + if (rows > 0) + { + scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 鎵归噺鍒犻櫎璋冨害淇℃伅 + * + * @param jobIds 闇瑕佸垹闄ょ殑浠诲姟ID + * @return 缁撴灉 + */ + @Override + @Transactional + public void deleteJobByIds(Long[] jobIds) throws SchedulerException + { + for (Long jobId : jobIds) + { + SysJob job = jobMapper.selectJobById(jobId); + deleteJob(job); + } + } + + /** + * 浠诲姟璋冨害鐘舵佷慨鏀 + * + * @param job 璋冨害淇℃伅 + */ + @Override + @Transactional + public int changeStatus(SysJob job) throws SchedulerException + { + int rows = 0; + String status = job.getStatus(); + if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) + { + rows = resumeJob(job); + } + else if (ScheduleConstants.Status.PAUSE.getValue().equals(status)) + { + rows = pauseJob(job); + } + return rows; + } + + /** + * 绔嬪嵆杩愯浠诲姟 + * + * @param job 璋冨害淇℃伅 + */ + @Override + @Transactional + public void run(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + SysJob properties = selectJobById(job.getJobId()); + // 鍙傛暟 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties); + scheduler.triggerJob(ScheduleUtils.getJobKey(jobId, jobGroup), dataMap); + } + + /** + * 鏂板浠诲姟 + * + * @param job 璋冨害淇℃伅 璋冨害淇℃伅 + */ + @Override + @Transactional + public int insertJob(SysJob job) throws SchedulerException, TaskException + { + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.insertJob(job); + if (rows > 0) + { + ScheduleUtils.createScheduleJob(scheduler, job); + } + return rows; + } + + /** + * 鏇存柊浠诲姟鐨勬椂闂磋〃杈惧紡 + * + * @param job 璋冨害淇℃伅 + */ + @Override + @Transactional + public int updateJob(SysJob job) throws SchedulerException, TaskException + { + SysJob properties = selectJobById(job.getJobId()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + updateSchedulerJob(job, properties.getJobGroup()); + } + return rows; + } + + /** + * 鏇存柊浠诲姟 + * + * @param job 浠诲姟瀵硅薄 + * @param jobGroup 浠诲姟缁勫悕 + */ + public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException + { + Long jobId = job.getJobId(); + // 鍒ゆ柇鏄惁瀛樺湪 + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + // 闃叉鍒涘缓鏃跺瓨鍦ㄦ暟鎹棶棰 鍏堢Щ闄わ紝鐒跺悗鍦ㄦ墽琛屽垱寤烘搷浣 + scheduler.deleteJob(jobKey); + } + ScheduleUtils.createScheduleJob(scheduler, job); + } + + /** + * 鏍¢獙cron琛ㄨ揪寮忔槸鍚︽湁鏁 + * + * @param cronExpression 琛ㄨ揪寮 + * @return 缁撴灉 + */ + @Override + public boolean checkCronExpressionIsValid(String cronExpression) + { + return CronUtils.isValid(cronExpression); + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/task/RyTask.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/task/RyTask.java new file mode 100644 index 0000000..ca3c92a --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/task/RyTask.java @@ -0,0 +1,28 @@ +package com.zhentao.job.task; + +import org.springframework.stereotype.Component; +import com.zhentao.common.core.utils.StringUtils; + +/** + * 瀹氭椂浠诲姟璋冨害娴嬭瘯 + * + * @author ruoyi + */ +@Component("ryTask") +public class RyTask +{ + public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) + { + System.out.println(StringUtils.format("鎵ц澶氬弬鏂规硶锛 瀛楃涓茬被鍨媨}锛屽竷灏旂被鍨媨}锛岄暱鏁村瀷{}锛屾诞鐐瑰瀷{}锛屾暣褰}", s, b, l, d, i)); + } + + public void ryParams(String params) + { + System.out.println("鎵ц鏈夊弬鏂规硶锛" + params); + } + + public void ryNoParams() + { + System.out.println("鎵ц鏃犲弬鏂规硶"); + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/util/AbstractQuartzJob.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/AbstractQuartzJob.java new file mode 100644 index 0000000..b6f8bfc --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/AbstractQuartzJob.java @@ -0,0 +1,107 @@ +package com.zhentao.job.util; + +import java.util.Date; + +import com.zhentao.job.domain.SysJob; +import com.zhentao.job.domain.SysJobLog; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.zhentao.common.core.constant.ScheduleConstants; +import com.zhentao.common.core.utils.ExceptionUtil; +import com.zhentao.common.core.utils.SpringUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.utils.bean.BeanUtils; +import com.zhentao.job.service.ISysJobLogService; + +/** + * 鎶借薄quartz璋冪敤 + * + * @author ruoyi + */ +public abstract class AbstractQuartzJob implements Job +{ + private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 绾跨▼鏈湴鍙橀噺 + */ + private static ThreadLocal threadLocal = new ThreadLocal<>(); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException + { + SysJob sysJob = new SysJob(); + BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES)); + try + { + before(context, sysJob); + if (sysJob != null) + { + doExecute(context, sysJob); + } + after(context, sysJob, null); + } + catch (Exception e) + { + log.error("浠诲姟鎵ц寮傚父 - 锛", e); + after(context, sysJob, e); + } + } + + /** + * 鎵ц鍓 + * + * @param context 宸ヤ綔鎵ц涓婁笅鏂囧璞 + * @param sysJob 绯荤粺璁″垝浠诲姟 + */ + protected void before(JobExecutionContext context, SysJob sysJob) + { + threadLocal.set(new Date()); + } + + /** + * 鎵ц鍚 + * + * @param context 宸ヤ綔鎵ц涓婁笅鏂囧璞 + * @param sysJob 绯荤粺璁″垝浠诲姟 + */ + protected void after(JobExecutionContext context, SysJob sysJob, Exception e) + { + Date startTime = threadLocal.get(); + threadLocal.remove(); + + final SysJobLog sysJobLog = new SysJobLog(); + sysJobLog.setJobName(sysJob.getJobName()); + sysJobLog.setJobGroup(sysJob.getJobGroup()); + sysJobLog.setInvokeTarget(sysJob.getInvokeTarget()); + sysJobLog.setStartTime(startTime); + sysJobLog.setStopTime(new Date()); + long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime(); + sysJobLog.setJobMessage(sysJobLog.getJobName() + " 鎬诲叡鑰楁椂锛" + runMs + "姣"); + if (e != null) + { + sysJobLog.setStatus("1"); + String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000); + sysJobLog.setExceptionInfo(errorMsg); + } + else + { + sysJobLog.setStatus("0"); + } + + // 鍐欏叆鏁版嵁搴撳綋涓 + SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog); + } + + /** + * 鎵ц鏂规硶锛岀敱瀛愮被閲嶈浇 + * + * @param context 宸ヤ綔鎵ц涓婁笅鏂囧璞 + * @param sysJob 绯荤粺璁″垝浠诲姟 + * @throws Exception 鎵ц杩囩▼涓殑寮傚父 + */ + protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception; +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/util/CronUtils.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/CronUtils.java new file mode 100644 index 0000000..8e899f2 --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/CronUtils.java @@ -0,0 +1,63 @@ +package com.zhentao.job.util; + +import java.text.ParseException; +import java.util.Date; +import org.quartz.CronExpression; + +/** + * cron琛ㄨ揪寮忓伐鍏风被 + * + * @author ruoyi + * + */ +public class CronUtils +{ + /** + * 杩斿洖涓涓竷灏斿间唬琛ㄤ竴涓粰瀹氱殑Cron琛ㄨ揪寮忕殑鏈夋晥鎬 + * + * @param cronExpression Cron琛ㄨ揪寮 + * @return boolean 琛ㄨ揪寮忔槸鍚︽湁鏁 + */ + public static boolean isValid(String cronExpression) + { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 杩斿洖涓涓瓧绗︿覆鍊,琛ㄧず璇ユ秷鎭棤鏁圕ron琛ㄨ揪寮忕粰鍑烘湁鏁堟 + * + * @param cronExpression Cron琛ㄨ揪寮 + * @return String 鏃犳晥鏃惰繑鍥炶〃杈惧紡閿欒鎻忚堪,濡傛灉鏈夋晥杩斿洖null + */ + public static String getInvalidMessage(String cronExpression) + { + try + { + new CronExpression(cronExpression); + return null; + } + catch (ParseException pe) + { + return pe.getMessage(); + } + } + + /** + * 杩斿洖涓嬩竴涓墽琛屾椂闂存牴鎹粰瀹氱殑Cron琛ㄨ揪寮 + * + * @param cronExpression Cron琛ㄨ揪寮 + * @return Date 涓嬫Cron琛ㄨ揪寮忔墽琛屾椂闂 + */ + public static Date getNextExecution(String cronExpression) + { + try + { + CronExpression cron = new CronExpression(cronExpression); + return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); + } + catch (ParseException e) + { + throw new IllegalArgumentException(e.getMessage()); + } + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/util/JobInvokeUtil.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/JobInvokeUtil.java new file mode 100644 index 0000000..c62af7e --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/JobInvokeUtil.java @@ -0,0 +1,182 @@ +package com.zhentao.job.util; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; +import com.zhentao.common.core.utils.SpringUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.job.domain.SysJob; + +/** + * 浠诲姟鎵ц宸ュ叿 + * + * @author ruoyi + */ +public class JobInvokeUtil +{ + /** + * 鎵ц鏂规硶 + * + * @param sysJob 绯荤粺浠诲姟 + */ + public static void invokeMethod(SysJob sysJob) throws Exception + { + String invokeTarget = sysJob.getInvokeTarget(); + String beanName = getBeanName(invokeTarget); + String methodName = getMethodName(invokeTarget); + List methodParams = getMethodParams(invokeTarget); + + if (!isValidClassName(beanName)) + { + Object bean = SpringUtils.getBean(beanName); + invokeMethod(bean, methodName, methodParams); + } + else + { + Object bean = Class.forName(beanName).newInstance(); + invokeMethod(bean, methodName, methodParams); + } + } + + /** + * 璋冪敤浠诲姟鏂规硶 + * + * @param bean 鐩爣瀵硅薄 + * @param methodName 鏂规硶鍚嶇О + * @param methodParams 鏂规硶鍙傛暟 + */ + private static void invokeMethod(Object bean, String methodName, List methodParams) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException + { + if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) + { + Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams)); + method.invoke(bean, getMethodParamsValue(methodParams)); + } + else + { + Method method = bean.getClass().getDeclaredMethod(methodName); + method.invoke(bean); + } + } + + /** + * 鏍¢獙鏄惁涓轰负class鍖呭悕 + * + * @param invokeTarget 鍚嶇О + * @return true鏄 false鍚 + */ + public static boolean isValidClassName(String invokeTarget) + { + return StringUtils.countMatches(invokeTarget, ".") > 1; + } + + /** + * 鑾峰彇bean鍚嶇О + * + * @param invokeTarget 鐩爣瀛楃涓 + * @return bean鍚嶇О + */ + public static String getBeanName(String invokeTarget) + { + String beanName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBeforeLast(beanName, "."); + } + + /** + * 鑾峰彇bean鏂规硶 + * + * @param invokeTarget 鐩爣瀛楃涓 + * @return method鏂规硶 + */ + public static String getMethodName(String invokeTarget) + { + String methodName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringAfterLast(methodName, "."); + } + + /** + * 鑾峰彇method鏂规硶鍙傛暟鐩稿叧鍒楄〃 + * + * @param invokeTarget 鐩爣瀛楃涓 + * @return method鏂规硶鐩稿叧鍙傛暟鍒楄〃 + */ + public static List getMethodParams(String invokeTarget) + { + String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); + if (StringUtils.isEmpty(methodStr)) + { + return null; + } + String[] methodParams = methodStr.split(","); + List classs = new LinkedList<>(); + for (int i = 0; i < methodParams.length; i++) + { + String str = StringUtils.trimToEmpty(methodParams[i]); + // String瀛楃涓茬被鍨嬶紝鍖呭惈' + if (StringUtils.contains(str, "'")) + { + classs.add(new Object[] { StringUtils.replace(str, "'", ""), String.class }); + } + // boolean甯冨皵绫诲瀷锛岀瓑浜巘rue鎴栬協alse + else if (StringUtils.equals(str, "true") || StringUtils.equalsIgnoreCase(str, "false")) + { + classs.add(new Object[] { Boolean.valueOf(str), Boolean.class }); + } + // long闀挎暣褰紝鍖呭惈L + else if (StringUtils.containsIgnoreCase(str, "L")) + { + classs.add(new Object[] { Long.valueOf(StringUtils.replaceIgnoreCase(str, "L", "")), Long.class }); + } + // double娴偣绫诲瀷锛屽寘鍚獶 + else if (StringUtils.containsIgnoreCase(str, "D")) + { + classs.add(new Object[] { Double.valueOf(StringUtils.replaceIgnoreCase(str, "D", "")), Double.class }); + } + // 鍏朵粬绫诲瀷褰掔被涓烘暣褰 + else + { + classs.add(new Object[] { Integer.valueOf(str), Integer.class }); + } + } + return classs; + } + + /** + * 鑾峰彇鍙傛暟绫诲瀷 + * + * @param methodParams 鍙傛暟鐩稿叧鍒楄〃 + * @return 鍙傛暟绫诲瀷鍒楄〃 + */ + public static Class[] getMethodParamsType(List methodParams) + { + Class[] classs = new Class[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Class) os[1]; + index++; + } + return classs; + } + + /** + * 鑾峰彇鍙傛暟鍊 + * + * @param methodParams 鍙傛暟鐩稿叧鍒楄〃 + * @return 鍙傛暟鍊煎垪琛 + */ + public static Object[] getMethodParamsValue(List methodParams) + { + Object[] classs = new Object[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Object) os[0]; + index++; + } + return classs; + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/util/QuartzDisallowConcurrentExecution.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/QuartzDisallowConcurrentExecution.java new file mode 100644 index 0000000..52ba08b --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/QuartzDisallowConcurrentExecution.java @@ -0,0 +1,21 @@ +package com.zhentao.job.util; + +import com.zhentao.job.domain.SysJob; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; + +/** + * 瀹氭椂浠诲姟澶勭悊锛堢姝㈠苟鍙戞墽琛岋級 + * + * @author ruoyi + * + */ +@DisallowConcurrentExecution +public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/util/QuartzJobExecution.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/QuartzJobExecution.java new file mode 100644 index 0000000..a0d0b12 --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/QuartzJobExecution.java @@ -0,0 +1,19 @@ +package com.zhentao.job.util; + +import com.zhentao.job.domain.SysJob; +import org.quartz.JobExecutionContext; + +/** + * 瀹氭椂浠诲姟澶勭悊锛堝厑璁稿苟鍙戞墽琛岋級 + * + * @author ruoyi + * + */ +public class QuartzJobExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/smart-modules/smart-job/src/main/java/com/zhentao/job/util/ScheduleUtils.java b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/ScheduleUtils.java new file mode 100644 index 0000000..3751273 --- /dev/null +++ b/smart-modules/smart-job/src/main/java/com/zhentao/job/util/ScheduleUtils.java @@ -0,0 +1,113 @@ +package com.zhentao.job.util; + +import org.quartz.CronScheduleBuilder; +import org.quartz.CronTrigger; +import org.quartz.Job; +import org.quartz.JobBuilder; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.TriggerBuilder; +import org.quartz.TriggerKey; +import com.zhentao.common.core.constant.ScheduleConstants; +import com.zhentao.common.core.exception.job.TaskException; +import com.zhentao.common.core.exception.job.TaskException.Code; +import com.zhentao.job.domain.SysJob; + +/** + * 瀹氭椂浠诲姟宸ュ叿绫 + * + * @author ruoyi + * + */ +public class ScheduleUtils +{ + /** + * 寰楀埌quartz浠诲姟绫 + * + * @param sysJob 鎵ц璁″垝 + * @return 鍏蜂綋鎵ц浠诲姟绫 + */ + private static Class getQuartzJobClass(SysJob sysJob) + { + boolean isConcurrent = "0".equals(sysJob.getConcurrent()); + return isConcurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class; + } + + /** + * 鏋勫缓浠诲姟瑙﹀彂瀵硅薄 + */ + public static TriggerKey getTriggerKey(Long jobId, String jobGroup) + { + return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 鏋勫缓浠诲姟閿璞 + */ + public static JobKey getJobKey(Long jobId, String jobGroup) + { + return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 鍒涘缓瀹氭椂浠诲姟 + */ + public static void createScheduleJob(Scheduler scheduler, SysJob job) throws SchedulerException, TaskException + { + Class jobClass = getQuartzJobClass(job); + // 鏋勫缓job淇℃伅 + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build(); + + // 琛ㄨ揪寮忚皟搴︽瀯寤哄櫒 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); + cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); + + // 鎸夋柊鐨刢ronExpression琛ㄨ揪寮忔瀯寤轰竴涓柊鐨則rigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)) + .withSchedule(cronScheduleBuilder).build(); + + // 鏀惧叆鍙傛暟锛岃繍琛屾椂鐨勬柟娉曞彲浠ヨ幏鍙 + jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); + + // 鍒ゆ柇鏄惁瀛樺湪 + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) + { + // 闃叉鍒涘缓鏃跺瓨鍦ㄦ暟鎹棶棰 鍏堢Щ闄わ紝鐒跺悗鍦ㄦ墽琛屽垱寤烘搷浣 + scheduler.deleteJob(getJobKey(jobId, jobGroup)); + } + + scheduler.scheduleJob(jobDetail, trigger); + + // 鏆傚仠浠诲姟 + if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + } + + /** + * 璁剧疆瀹氭椂浠诲姟绛栫暐 + */ + public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb) + throws TaskException + { + switch (job.getMisfirePolicy()) + { + case ScheduleConstants.MISFIRE_DEFAULT: + return cb; + case ScheduleConstants.MISFIRE_IGNORE_MISFIRES: + return cb.withMisfireHandlingInstructionIgnoreMisfires(); + case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED: + return cb.withMisfireHandlingInstructionFireAndProceed(); + case ScheduleConstants.MISFIRE_DO_NOTHING: + return cb.withMisfireHandlingInstructionDoNothing(); + default: + throw new TaskException("The task misfire policy '" + job.getMisfirePolicy() + + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR); + } + } +} diff --git a/smart-modules/smart-job/src/main/resources/banner.txt b/smart-modules/smart-job/src/main/resources/banner.txt new file mode 100644 index 0000000..0b9cd42 --- /dev/null +++ b/smart-modules/smart-job/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ _ + (_) (_) | | + _ __ _ _ ___ _ _ _ ______ _ ___ | |__ +| '__|| | | | / _ \ | | | || ||______| | | / _ \ | '_ \ +| | | |_| || (_) || |_| || | | || (_) || |_) | +|_| \__,_| \___/ \__, ||_| | | \___/ |_.__/ + __/ | _/ | + |___/ |__/ \ No newline at end of file diff --git a/smart-modules/smart-job/src/main/resources/bootstrap.yml b/smart-modules/smart-job/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..6530727 --- /dev/null +++ b/smart-modules/smart-job/src/main/resources/bootstrap.yml @@ -0,0 +1,27 @@ +# Tomcat +server: + port: 9203 + +# Spring +spring: + application: + # 搴旂敤鍚嶇О + name: ruoyi-job + profiles: + # 鐜閰嶇疆 + active: dev + cloud: + nacos: + discovery: + # 鏈嶅姟娉ㄥ唽鍦板潃 + server-addr: 8.130.77.16:8848 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + config: + # 閰嶇疆涓績鍦板潃 + server-addr: 8.130.77.16:8848 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + # 閰嶇疆鏂囦欢鏍煎紡 + file-extension: yml + # 鍏变韩閰嶇疆 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} diff --git a/smart-modules/smart-job/src/main/resources/logback.xml b/smart-modules/smart-job/src/main/resources/logback.xml new file mode 100644 index 0000000..44e4ff2 --- /dev/null +++ b/smart-modules/smart-job/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/smart-modules/smart-job/src/main/resources/mapper/job/SysJobLogMapper.xml b/smart-modules/smart-job/src/main/resources/mapper/job/SysJobLogMapper.xml new file mode 100644 index 0000000..4bc4bb0 --- /dev/null +++ b/smart-modules/smart-job/src/main/resources/mapper/job/SysJobLogMapper.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, create_time + from sys_job_log + + + + + + + + + + delete from sys_job_log where job_log_id = #{jobLogId} + + + + delete from sys_job_log where job_log_id in + + #{jobLogId} + + + + + truncate table sys_job_log + + + + insert into sys_job_log( + job_log_id, + job_name, + job_group, + invoke_target, + job_message, + status, + exception_info, + create_time + )values( + #{jobLogId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{jobMessage}, + #{status}, + #{exceptionInfo}, + sysdate() + ) + + + diff --git a/smart-modules/smart-job/src/main/resources/mapper/job/SysJobMapper.xml b/smart-modules/smart-job/src/main/resources/mapper/job/SysJobMapper.xml new file mode 100644 index 0000000..47443cb --- /dev/null +++ b/smart-modules/smart-job/src/main/resources/mapper/job/SysJobMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark + from sys_job + + + + + + + + + + delete from sys_job where job_id = #{jobId} + + + + delete from sys_job where job_id in + + #{jobId} + + + + + update sys_job + + job_name = #{jobName}, + job_group = #{jobGroup}, + invoke_target = #{invokeTarget}, + cron_expression = #{cronExpression}, + misfire_policy = #{misfirePolicy}, + concurrent = #{concurrent}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where job_id = #{jobId} + + + + insert into sys_job( + job_id, + job_name, + job_group, + invoke_target, + cron_expression, + misfire_policy, + concurrent, + status, + remark, + create_by, + create_time + )values( + #{jobId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{cronExpression}, + #{misfirePolicy}, + #{concurrent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + diff --git a/smart-modules/smart-system/pom.xml b/smart-modules/smart-system/pom.xml new file mode 100644 index 0000000..154bd65 --- /dev/null +++ b/smart-modules/smart-system/pom.xml @@ -0,0 +1,105 @@ + + + + com.ruoyi + smart-modules + 2.5.0 + + 4.0.0 + + smart-modules-system + + + smart-modules-system绯荤粺妯″潡 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + io.springfox + springfox-swagger-ui + ${swagger.fox.version} + + + + + mysql + mysql-connector-java + + + + + com.ruoyi + smart-common-datasource + + + + + com.ruoyi + smart-common-datascope + + + + + com.ruoyi + smart-common-log + + + + + com.ruoyi + smart-common-swagger + + + + com.baomidou + mybatis-plus-boot-starter + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/RuoYiSystemApplication.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/RuoYiSystemApplication.java new file mode 100644 index 0000000..9656697 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/RuoYiSystemApplication.java @@ -0,0 +1,34 @@ +package com.zhentao.system; + +import org.springframework.boot.SpringApplication; +import org.springframework.cloud.client.SpringCloudApplication; +import com.zhentao.common.security.annotation.EnableCustomConfig; +import com.zhentao.common.security.annotation.EnableRyFeignClients; +import com.zhentao.common.swagger.annotation.EnableCustomSwagger2; + +/** + * 绯荤粺妯″潡 + * + * @author ruoyi + */ +@EnableCustomConfig +@EnableCustomSwagger2 +@EnableRyFeignClients +@SpringCloudApplication +public class RuoYiSystemApplication +{ + public static void main(String[] args) + { + SpringApplication.run(RuoYiSystemApplication.class, args); + System.out.println("(鈾モ棤鈥库棤)锞夛緸 绯荤粺妯″潡鍚姩鎴愬姛 醿(麓凇`醿)锞 \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SmartCsController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SmartCsController.java new file mode 100644 index 0000000..6f45968 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SmartCsController.java @@ -0,0 +1,28 @@ +package com.zhentao.system.controller; + +import com.zhentao.system.domain.SmartCs; +import com.zhentao.system.service.SmartCsService; +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; + +/** + * @ClassName: SmartCsController + * @Author: 鎸稕鏁欒偛_Q + * @Date: 2025/2/9 19:36 + */ +@RestController +@RequestMapping("/cs") +public class SmartCsController { + @Autowired + private SmartCsService service; + + @GetMapping("/run") + public void run(){ + SmartCs smartCs = new SmartCs(); + smartCs.setId(1); + smartCs.setCs("123456789"); + service.save(smartCs); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysConfigController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysConfigController.java new file mode 100644 index 0000000..26b2602 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysConfigController.java @@ -0,0 +1,135 @@ +package com.zhentao.system.controller; + +import java.io.IOException; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.system.domain.SysConfig; +import com.zhentao.system.service.ISysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.poi.ExcelUtil; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; + +/** + * 鍙傛暟閰嶇疆 淇℃伅鎿嶄綔澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/config") +public class SysConfigController extends BaseController +{ + @Autowired + private ISysConfigService configService; + + /** + * 鑾峰彇鍙傛暟閰嶇疆鍒楄〃 + */ + @PreAuthorize(hasPermi = "system:config:list") + @GetMapping("/list") + public TableDataInfo list(SysConfig config) + { + startPage(); + List list = configService.selectConfigList(config); + return getDataTable(list); + } + + @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.EXPORT) + @PreAuthorize(hasPermi = "system:config:export") + @PostMapping("/export") + public void export(HttpServletResponse response, SysConfig config) throws IOException + { + List list = configService.selectConfigList(config); + ExcelUtil util = new ExcelUtil(SysConfig.class); + util.exportExcel(response, list, "鍙傛暟鏁版嵁"); + } + + /** + * 鏍规嵁鍙傛暟缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable Long configId) + { + return AjaxResult.success(configService.selectConfigById(configId)); + } + + /** + * 鏍规嵁鍙傛暟閿悕鏌ヨ鍙傛暟鍊 + */ + @GetMapping(value = "/configKey/{configKey}") + public AjaxResult getConfigKey(@PathVariable String configKey) + { + return AjaxResult.success(configService.selectConfigByKey(configKey)); + } + + /** + * 鏂板鍙傛暟閰嶇疆 + */ + @PreAuthorize(hasPermi = "system:config:add") + @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysConfig config) + { + if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) + { + return AjaxResult.error("鏂板鍙傛暟'" + config.getConfigName() + "'澶辫触锛屽弬鏁伴敭鍚嶅凡瀛樺湪"); + } + config.setCreateBy(SecurityUtils.getUsername()); + return toAjax(configService.insertConfig(config)); + } + + /** + * 淇敼鍙傛暟閰嶇疆 + */ + @PreAuthorize(hasPermi = "system:config:edit") + @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysConfig config) + { + if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) + { + return AjaxResult.error("淇敼鍙傛暟'" + config.getConfigName() + "'澶辫触锛屽弬鏁伴敭鍚嶅凡瀛樺湪"); + } + config.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(configService.updateConfig(config)); + } + + /** + * 鍒犻櫎鍙傛暟閰嶇疆 + */ + @PreAuthorize(hasPermi = "system:config:remove") + @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public AjaxResult remove(@PathVariable Long[] configIds) + { + return toAjax(configService.deleteConfigByIds(configIds)); + } + + /** + * 娓呯┖缂撳瓨 + */ + @PreAuthorize(hasPermi = "system:config:remove") + @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.CLEAN) + @DeleteMapping("/clearCache") + public AjaxResult clearCache() + { + configService.clearCache(); + return AjaxResult.success(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDeptController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDeptController.java new file mode 100644 index 0000000..1049ae9 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDeptController.java @@ -0,0 +1,164 @@ +package com.zhentao.system.controller; + +import java.util.Iterator; +import java.util.List; + +import com.zhentao.system.service.ISysDeptService; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; +import com.zhentao.system.api.domain.SysDept; + +/** + * 閮ㄩ棬淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/dept") +public class SysDeptController extends BaseController +{ + @Autowired + private ISysDeptService deptService; + + /** + * 鑾峰彇閮ㄩ棬鍒楄〃 + */ + @PreAuthorize(hasPermi = "system:dept:list") + @GetMapping("/list") + public AjaxResult list(SysDept dept) + { + List depts = deptService.selectDeptList(dept); + return AjaxResult.success(depts); + } + + /** + * 鏌ヨ閮ㄩ棬鍒楄〃锛堟帓闄よ妭鐐癸級 + */ + @PreAuthorize(hasPermi = "system:dept:list") + @GetMapping("/list/exclude/{deptId}") + public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) + { + List depts = deptService.selectDeptList(new SysDept()); + Iterator it = depts.iterator(); + while (it.hasNext()) + { + SysDept d = (SysDept) it.next(); + if (d.getDeptId().intValue() == deptId + || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")) + { + it.remove(); + } + } + return AjaxResult.success(depts); + } + + /** + * 鏍规嵁閮ㄩ棬缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize(hasPermi = "system:dept:query") + @GetMapping(value = "/{deptId}") + public AjaxResult getInfo(@PathVariable Long deptId) + { + return AjaxResult.success(deptService.selectDeptById(deptId)); + } + + /** + * 鑾峰彇閮ㄩ棬涓嬫媺鏍戝垪琛 + */ + @GetMapping("/treeselect") + public AjaxResult treeselect(SysDept dept) + { + List depts = deptService.selectDeptList(dept); + return AjaxResult.success(deptService.buildDeptTreeSelect(depts)); + } + + /** + * 鍔犺浇瀵瑰簲瑙掕壊閮ㄩ棬鍒楄〃鏍 + */ + @GetMapping(value = "/roleDeptTreeselect/{roleId}") + public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId) + { + List depts = deptService.selectDeptList(new SysDept()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", deptService.buildDeptTreeSelect(depts)); + return ajax; + } + + /** + * 鏂板閮ㄩ棬 + */ + @PreAuthorize(hasPermi = "system:dept:add") + @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDept dept) + { + if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) + { + return AjaxResult.error("鏂板閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪"); + } + dept.setCreateBy(SecurityUtils.getUsername()); + return toAjax(deptService.insertDept(dept)); + } + + /** + * 淇敼閮ㄩ棬 + */ + @PreAuthorize(hasPermi = "system:dept:edit") + @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDept dept) + { + if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) + { + return AjaxResult.error("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪"); + } + else if (dept.getParentId().equals(dept.getDeptId())) + { + return AjaxResult.error("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛屼笂绾ч儴闂ㄤ笉鑳芥槸鑷繁"); + } + else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) + && deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0) + { + return AjaxResult.error("璇ラ儴闂ㄥ寘鍚湭鍋滅敤鐨勫瓙閮ㄩ棬锛"); + } + dept.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(deptService.updateDept(dept)); + } + + /** + * 鍒犻櫎閮ㄩ棬 + */ + @PreAuthorize(hasPermi = "system:dept:remove") + @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public AjaxResult remove(@PathVariable Long deptId) + { + if (deptService.hasChildByDeptId(deptId)) + { + return AjaxResult.error("瀛樺湪涓嬬骇閮ㄩ棬,涓嶅厑璁稿垹闄"); + } + if (deptService.checkDeptExistUser(deptId)) + { + return AjaxResult.error("閮ㄩ棬瀛樺湪鐢ㄦ埛,涓嶅厑璁稿垹闄"); + } + return toAjax(deptService.deleteDeptById(deptId)); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDictDataController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDictDataController.java new file mode 100644 index 0000000..2207e42 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDictDataController.java @@ -0,0 +1,123 @@ +package com.zhentao.system.controller; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.system.domain.SysDictData; +import com.zhentao.system.service.ISysDictDataService; +import com.zhentao.system.service.ISysDictTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.utils.poi.ExcelUtil; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; + +/** + * 鏁版嵁瀛楀吀淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/dict/data") +public class SysDictDataController extends BaseController +{ + @Autowired + private ISysDictDataService dictDataService; + + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize(hasPermi = "system:dict:list") + @GetMapping("/list") + public TableDataInfo list(SysDictData dictData) + { + startPage(); + List list = dictDataService.selectDictDataList(dictData); + return getDataTable(list); + } + + @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.EXPORT) + @PreAuthorize(hasPermi = "system:dict:export") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictData dictData) throws IOException + { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil util = new ExcelUtil(SysDictData.class); + util.exportExcel(response, list, "瀛楀吀鏁版嵁"); + } + + /** + * 鏌ヨ瀛楀吀鏁版嵁璇︾粏 + */ + @PreAuthorize(hasPermi = "system:dict:query") + @GetMapping(value = "/{dictCode}") + public AjaxResult getInfo(@PathVariable Long dictCode) + { + return AjaxResult.success(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅 + */ + @GetMapping(value = "/type/{dictType}") + public AjaxResult dictType(@PathVariable String dictType) + { + List data = dictTypeService.selectDictDataByType(dictType); + if (StringUtils.isNull(data)) + { + data = new ArrayList(); + } + return AjaxResult.success(data); + } + + /** + * 鏂板瀛楀吀绫诲瀷 + */ + @PreAuthorize(hasPermi = "system:dict:add") + @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictData dict) + { + dict.setCreateBy(SecurityUtils.getUsername()); + return toAjax(dictDataService.insertDictData(dict)); + } + + /** + * 淇敼淇濆瓨瀛楀吀绫诲瀷 + */ + @PreAuthorize(hasPermi = "system:dict:edit") + @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictData dict) + { + dict.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(dictDataService.updateDictData(dict)); + } + + /** + * 鍒犻櫎瀛楀吀绫诲瀷 + */ + @PreAuthorize(hasPermi = "system:dict:remove") + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public AjaxResult remove(@PathVariable Long[] dictCodes) + { + return toAjax(dictDataService.deleteDictDataByIds(dictCodes)); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDictTypeController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDictTypeController.java new file mode 100644 index 0000000..f1851c1 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysDictTypeController.java @@ -0,0 +1,134 @@ +package com.zhentao.system.controller; + +import java.io.IOException; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.system.domain.SysDictType; +import com.zhentao.system.service.ISysDictTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.poi.ExcelUtil; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; + +/** + * 鏁版嵁瀛楀吀淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/dict/type") +public class SysDictTypeController extends BaseController +{ + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize(hasPermi = "system:dict:list") + @GetMapping("/list") + public TableDataInfo list(SysDictType dictType) + { + startPage(); + List list = dictTypeService.selectDictTypeList(dictType); + return getDataTable(list); + } + + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.EXPORT) + @PreAuthorize(hasPermi = "system:dict:export") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictType dictType) throws IOException + { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil util = new ExcelUtil(SysDictType.class); + util.exportExcel(response, list, "瀛楀吀绫诲瀷"); + } + + /** + * 鏌ヨ瀛楀吀绫诲瀷璇︾粏 + */ + @PreAuthorize(hasPermi = "system:dict:query") + @GetMapping(value = "/{dictId}") + public AjaxResult getInfo(@PathVariable Long dictId) + { + return AjaxResult.success(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 鏂板瀛楀吀绫诲瀷 + */ + @PreAuthorize(hasPermi = "system:dict:add") + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictType dict) + { + if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) + { + return AjaxResult.error("鏂板瀛楀吀'" + dict.getDictName() + "'澶辫触锛屽瓧鍏哥被鍨嬪凡瀛樺湪"); + } + dict.setCreateBy(SecurityUtils.getUsername()); + return toAjax(dictTypeService.insertDictType(dict)); + } + + /** + * 淇敼瀛楀吀绫诲瀷 + */ + @PreAuthorize(hasPermi = "system:dict:edit") + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictType dict) + { + if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) + { + return AjaxResult.error("淇敼瀛楀吀'" + dict.getDictName() + "'澶辫触锛屽瓧鍏哥被鍨嬪凡瀛樺湪"); + } + dict.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(dictTypeService.updateDictType(dict)); + } + + /** + * 鍒犻櫎瀛楀吀绫诲瀷 + */ + @PreAuthorize(hasPermi = "system:dict:remove") + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public AjaxResult remove(@PathVariable Long[] dictIds) + { + return toAjax(dictTypeService.deleteDictTypeByIds(dictIds)); + } + + /** + * 娓呯┖缂撳瓨 + */ + @PreAuthorize(hasPermi = "system:dict:remove") + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.CLEAN) + @DeleteMapping("/clearCache") + public AjaxResult clearCache() + { + dictTypeService.clearCache(); + return AjaxResult.success(); + } + + /** + * 鑾峰彇瀛楀吀閫夋嫨妗嗗垪琛 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + List dictTypes = dictTypeService.selectDictTypeAll(); + return AjaxResult.success(dictTypes); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysLogininforController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysLogininforController.java new file mode 100644 index 0000000..197cc23 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysLogininforController.java @@ -0,0 +1,98 @@ +package com.zhentao.system.controller; + +import java.io.IOException; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.system.domain.SysLogininfor; +import com.zhentao.system.service.ISysLogininforService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.constant.Constants; +import com.zhentao.common.core.utils.ServletUtils; +import com.zhentao.common.core.utils.ip.IpUtils; +import com.zhentao.common.core.utils.poi.ExcelUtil; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; + +/** + * 绯荤粺璁块棶璁板綍 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/logininfor") +public class SysLogininforController extends BaseController +{ + @Autowired + private ISysLogininforService logininforService; + + @PreAuthorize(hasPermi = "system:logininfor:list") + @GetMapping("/list") + public TableDataInfo list(SysLogininfor logininfor) + { + startPage(); + List list = logininforService.selectLogininforList(logininfor); + return getDataTable(list); + } + + @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.EXPORT) + @PreAuthorize(hasPermi = "system:logininfor:export") + @PostMapping("/export") + public void export(HttpServletResponse response, SysLogininfor logininfor) throws IOException + { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil util = new ExcelUtil(SysLogininfor.class); + util.exportExcel(response, list, "鐧诲綍鏃ュ織"); + } + + @PreAuthorize(hasPermi = "system:logininfor:remove") + @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public AjaxResult remove(@PathVariable Long[] infoIds) + { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + @PreAuthorize(hasPermi = "system:logininfor:remove") + @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.DELETE) + @DeleteMapping("/clean") + public AjaxResult clean() + { + logininforService.cleanLogininfor(); + return AjaxResult.success(); + } + + @PostMapping + public AjaxResult add(@RequestParam("username") String username, @RequestParam("status") String status, + @RequestParam("message") String message) + { + String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + + // 灏佽瀵硅薄 + SysLogininfor logininfor = new SysLogininfor(); + logininfor.setUserName(username); + logininfor.setIpaddr(ip); + logininfor.setMsg(message); + // 鏃ュ織鐘舵 + if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status)) + { + logininfor.setStatus("0"); + } + else if (Constants.LOGIN_FAIL.equals(status)) + { + logininfor.setStatus("1"); + } + return toAjax(logininforService.insertLogininfor(logininfor)); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysMenuController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysMenuController.java new file mode 100644 index 0000000..02398c9 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysMenuController.java @@ -0,0 +1,163 @@ +package com.zhentao.system.controller; + +import java.util.List; + +import com.zhentao.system.domain.SysMenu; +import com.zhentao.system.service.ISysMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.constant.Constants; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; + +/** + * 鑿滃崟淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/menu") +public class SysMenuController extends BaseController +{ + @Autowired + private ISysMenuService menuService; + + /** + * 鑾峰彇鑿滃崟鍒楄〃 + */ + @PreAuthorize(hasPermi = "system:menu:list") + @GetMapping("/list") + public AjaxResult list(SysMenu menu) + { + Long userId = SecurityUtils.getUserId(); + List menus = menuService.selectMenuList(menu, userId); + return AjaxResult.success(menus); + } + + /** + * 鏍规嵁鑿滃崟缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize(hasPermi = "system:menu:query") + @GetMapping(value = "/{menuId}") + public AjaxResult getInfo(@PathVariable Long menuId) + { + return AjaxResult.success(menuService.selectMenuById(menuId)); + } + + /** + * 鑾峰彇鑿滃崟涓嬫媺鏍戝垪琛 + */ + @GetMapping("/treeselect") + public AjaxResult treeselect(SysMenu menu) + { + Long userId = SecurityUtils.getUserId(); + List menus = menuService.selectMenuList(menu, userId); + return AjaxResult.success(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 鍔犺浇瀵瑰簲瑙掕壊鑿滃崟鍒楄〃鏍 + */ + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) + { + Long userId = SecurityUtils.getUserId(); + List menus = menuService.selectMenuList(userId); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); + ajax.put("menus", menuService.buildMenuTreeSelect(menus)); + return ajax; + } + + /** + * 鏂板鑿滃崟 + */ + @PreAuthorize(hasPermi = "system:menu:add") + @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysMenu menu) + { + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) + { + return AjaxResult.error("鏂板鑿滃崟'" + menu.getMenuName() + "'澶辫触锛岃彍鍗曞悕绉板凡瀛樺湪"); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) + && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS)) + { + return AjaxResult.error("鏂板鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屽湴鍧蹇呴』浠ttp(s)://寮澶"); + } + menu.setCreateBy(SecurityUtils.getUsername()); + return toAjax(menuService.insertMenu(menu)); + } + + /** + * 淇敼鑿滃崟 + */ + @PreAuthorize(hasPermi = "system:menu:edit") + @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysMenu menu) + { + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) + { + return AjaxResult.error("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛岃彍鍗曞悕绉板凡瀛樺湪"); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) + && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS)) + { + return AjaxResult.error("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屽湴鍧蹇呴』浠ttp(s)://寮澶"); + } + else if (menu.getMenuId().equals(menu.getParentId())) + { + return AjaxResult.error("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屼笂绾ц彍鍗曚笉鑳介夋嫨鑷繁"); + } + menu.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(menuService.updateMenu(menu)); + } + + /** + * 鍒犻櫎鑿滃崟 + */ + @PreAuthorize(hasPermi = "system:menu:remove") + @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public AjaxResult remove(@PathVariable("menuId") Long menuId) + { + if (menuService.hasChildByMenuId(menuId)) + { + return AjaxResult.error("瀛樺湪瀛愯彍鍗,涓嶅厑璁稿垹闄"); + } + if (menuService.checkMenuExistRole(menuId)) + { + return AjaxResult.error("鑿滃崟宸插垎閰,涓嶅厑璁稿垹闄"); + } + return toAjax(menuService.deleteMenuById(menuId)); + } + + /** + * 鑾峰彇璺敱淇℃伅 + * + * @return 璺敱淇℃伅 + */ + @GetMapping("getRouters") + public AjaxResult getRouters() + { + Long userId = SecurityUtils.getUserId(); + List menus = menuService.selectMenuTreeByUserId(userId); + return AjaxResult.success(menuService.buildMenus(menus)); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysNoticeController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysNoticeController.java new file mode 100644 index 0000000..b6fa4f4 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysNoticeController.java @@ -0,0 +1,93 @@ +package com.zhentao.system.controller; + +import java.util.List; + +import com.zhentao.system.domain.SysNotice; +import com.zhentao.system.service.ISysNoticeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; + +/** + * 鍏憡 淇℃伅鎿嶄綔澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/notice") +public class SysNoticeController extends BaseController +{ + @Autowired + private ISysNoticeService noticeService; + + /** + * 鑾峰彇閫氱煡鍏憡鍒楄〃 + */ + @PreAuthorize(hasPermi = "system:notice:list") + @GetMapping("/list") + public TableDataInfo list(SysNotice notice) + { + startPage(); + List list = noticeService.selectNoticeList(notice); + return getDataTable(list); + } + + /** + * 鏍规嵁閫氱煡鍏憡缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize(hasPermi = "system:notice:query") + @GetMapping(value = "/{noticeId}") + public AjaxResult getInfo(@PathVariable Long noticeId) + { + return AjaxResult.success(noticeService.selectNoticeById(noticeId)); + } + + /** + * 鏂板閫氱煡鍏憡 + */ + @PreAuthorize(hasPermi = "system:notice:add") + @Log(title = "閫氱煡鍏憡", businessType = BusinessType.UPDATE) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysNotice notice) + { + notice.setCreateBy(SecurityUtils.getUsername()); + return toAjax(noticeService.insertNotice(notice)); + } + + /** + * 淇敼閫氱煡鍏憡 + */ + @PreAuthorize(hasPermi = "system:notice:edit") + @Log(title = "閫氱煡鍏憡", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysNotice notice) + { + notice.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 鍒犻櫎閫氱煡鍏憡 + */ + @PreAuthorize(hasPermi = "system:notice:remove") + @Log(title = "閫氱煡鍏憡", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public AjaxResult remove(@PathVariable Long[] noticeIds) + { + return toAjax(noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysOperlogController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysOperlogController.java new file mode 100644 index 0000000..9e2dfb7 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysOperlogController.java @@ -0,0 +1,77 @@ +package com.zhentao.system.controller; + +import java.io.IOException; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.system.service.ISysOperLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.utils.poi.ExcelUtil; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; +import com.zhentao.system.api.domain.SysOperLog; + +/** + * 鎿嶄綔鏃ュ織璁板綍 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/operlog") +public class SysOperlogController extends BaseController +{ + @Autowired + private ISysOperLogService operLogService; + + @PreAuthorize(hasPermi = "system:operlog:list") + @GetMapping("/list") + public TableDataInfo list(SysOperLog operLog) + { + startPage(); + List list = operLogService.selectOperLogList(operLog); + return getDataTable(list); + } + + @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.EXPORT) + @PreAuthorize(hasPermi = "system:operlog:export") + @PostMapping("/export") + public void export(HttpServletResponse response, SysOperLog operLog) throws IOException + { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil util = new ExcelUtil(SysOperLog.class); + util.exportExcel(response, list, "鎿嶄綔鏃ュ織"); + } + + @PreAuthorize(hasPermi = "system:operlog:remove") + @DeleteMapping("/{operIds}") + public AjaxResult remove(@PathVariable Long[] operIds) + { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + @PreAuthorize(hasPermi = "system:operlog:remove") + @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + operLogService.cleanOperLog(); + return AjaxResult.success(); + } + + @PostMapping + public AjaxResult add(@RequestBody SysOperLog operLog) + { + return toAjax(operLogService.insertOperlog(operLog)); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysPostController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysPostController.java new file mode 100644 index 0000000..7bcee8f --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysPostController.java @@ -0,0 +1,133 @@ +package com.zhentao.system.controller; + +import java.io.IOException; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.system.domain.SysPost; +import com.zhentao.system.service.ISysPostService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.poi.ExcelUtil; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; + +/** + * 宀椾綅淇℃伅鎿嶄綔澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/post") +public class SysPostController extends BaseController +{ + @Autowired + private ISysPostService postService; + + /** + * 鑾峰彇宀椾綅鍒楄〃 + */ + @PreAuthorize(hasPermi = "system:post:list") + @GetMapping("/list") + public TableDataInfo list(SysPost post) + { + startPage(); + List list = postService.selectPostList(post); + return getDataTable(list); + } + + @Log(title = "宀椾綅绠$悊", businessType = BusinessType.EXPORT) + @PreAuthorize(hasPermi = "system:post:export") + @PostMapping("/export") + public void export(HttpServletResponse response, SysPost post) throws IOException + { + List list = postService.selectPostList(post); + ExcelUtil util = new ExcelUtil(SysPost.class); + util.exportExcel(response, list, "宀椾綅鏁版嵁"); + } + + /** + * 鏍规嵁宀椾綅缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize(hasPermi = "system:post:query") + @GetMapping(value = "/{postId}") + public AjaxResult getInfo(@PathVariable Long postId) + { + return AjaxResult.success(postService.selectPostById(postId)); + } + + /** + * 鏂板宀椾綅 + */ + @PreAuthorize(hasPermi = "system:post:add") + @Log(title = "宀椾綅绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysPost post) + { + if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) + { + return AjaxResult.error("鏂板宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶅悕绉板凡瀛樺湪"); + } + else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) + { + return AjaxResult.error("鏂板宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶇紪鐮佸凡瀛樺湪"); + } + post.setCreateBy(SecurityUtils.getUsername()); + return toAjax(postService.insertPost(post)); + } + + /** + * 淇敼宀椾綅 + */ + @PreAuthorize(hasPermi = "system:post:edit") + @Log(title = "宀椾綅绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysPost post) + { + if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) + { + return AjaxResult.error("淇敼宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶅悕绉板凡瀛樺湪"); + } + else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) + { + return AjaxResult.error("淇敼宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶇紪鐮佸凡瀛樺湪"); + } + post.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(postService.updatePost(post)); + } + + /** + * 鍒犻櫎宀椾綅 + */ + @PreAuthorize(hasPermi = "system:post:remove") + @Log(title = "宀椾綅绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public AjaxResult remove(@PathVariable Long[] postIds) + { + return toAjax(postService.deletePostByIds(postIds)); + } + + /** + * 鑾峰彇宀椾綅閫夋嫨妗嗗垪琛 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + List posts = postService.selectPostAll(); + return AjaxResult.success(posts); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysProfileController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysProfileController.java new file mode 100644 index 0000000..61602b8 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysProfileController.java @@ -0,0 +1,139 @@ +package com.zhentao.system.controller; + +import java.io.IOException; + +import com.zhentao.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.zhentao.common.core.domain.R; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.ServletUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.service.TokenService; +import com.zhentao.system.api.RemoteFileService; +import com.zhentao.system.api.domain.SysFile; +import com.zhentao.system.api.domain.SysUser; +import com.zhentao.system.api.model.LoginUser; + +/** + * 涓汉淇℃伅 涓氬姟澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/user/profile") +public class SysProfileController extends BaseController +{ + @Autowired + private ISysUserService userService; + + @Autowired + private TokenService tokenService; + + @Autowired + private RemoteFileService remoteFileService; + + /** + * 涓汉淇℃伅 + */ + @GetMapping + public AjaxResult profile() + { + String username = SecurityUtils.getUsername(); + SysUser user = userService.selectUserByUserName(username); + AjaxResult ajax = AjaxResult.success(user); + ajax.put("roleGroup", userService.selectUserRoleGroup(username)); + ajax.put("postGroup", userService.selectUserPostGroup(username)); + return ajax; + } + + /** + * 淇敼鐢ㄦ埛 + */ + @Log(title = "涓汉淇℃伅", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult updateProfile(@RequestBody SysUser user) + { + if (userService.updateUserProfile(user) > 0) + { + LoginUser loginUser = tokenService.getLoginUser(); + // 鏇存柊缂撳瓨鐢ㄦ埛淇℃伅 + loginUser.getSysUser().setNickName(user.getNickName()); + loginUser.getSysUser().setPhonenumber(user.getPhonenumber()); + loginUser.getSysUser().setEmail(user.getEmail()); + loginUser.getSysUser().setSex(user.getSex()); + tokenService.setLoginUser(loginUser); + return AjaxResult.success(); + } + return AjaxResult.error("淇敼涓汉淇℃伅寮傚父锛岃鑱旂郴绠$悊鍛"); + } + + /** + * 閲嶇疆瀵嗙爜 + */ + @Log(title = "涓汉淇℃伅", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public AjaxResult updatePwd(String oldPassword, String newPassword) + { + String username = SecurityUtils.getUsername(); + SysUser user = userService.selectUserByUserName(username); + String password = user.getPassword(); + if (!SecurityUtils.matchesPassword(oldPassword, password)) + { + return AjaxResult.error("淇敼瀵嗙爜澶辫触锛屾棫瀵嗙爜閿欒"); + } + if (SecurityUtils.matchesPassword(newPassword, password)) + { + return AjaxResult.error("鏂板瘑鐮佷笉鑳戒笌鏃у瘑鐮佺浉鍚"); + } + if (userService.resetUserPwd(username, SecurityUtils.encryptPassword(newPassword)) > 0) + { + // 鏇存柊缂撳瓨鐢ㄦ埛瀵嗙爜 + LoginUser loginUser = tokenService.getLoginUser(); + loginUser.getSysUser().setPassword(SecurityUtils.encryptPassword(newPassword)); + tokenService.setLoginUser(loginUser); + return AjaxResult.success(); + } + return AjaxResult.error("淇敼瀵嗙爜寮傚父锛岃鑱旂郴绠$悊鍛"); + } + + /** + * 澶村儚涓婁紶 + */ + @Log(title = "鐢ㄦ埛澶村儚", businessType = BusinessType.UPDATE) + @PostMapping("/avatar") + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException + { + if (!file.isEmpty()) + { + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + R fileResult = remoteFileService.upload(file); + if (StringUtils.isNull(fileResult) || StringUtils.isNull(fileResult.getData())) + { + return AjaxResult.error("鏂囦欢鏈嶅姟寮傚父锛岃鑱旂郴绠$悊鍛"); + } + String url = fileResult.getData().getUrl(); + if (userService.updateUserAvatar(loginUser.getUsername(), url)) + { + AjaxResult ajax = AjaxResult.success(); + ajax.put("imgUrl", url); + // 鏇存柊缂撳瓨鐢ㄦ埛澶村儚 + loginUser.getSysUser().setAvatar(url); + tokenService.setLoginUser(loginUser); + return ajax; + } + } + return AjaxResult.error("涓婁紶鍥剧墖寮傚父锛岃鑱旂郴绠$悊鍛"); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysRoleController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysRoleController.java new file mode 100644 index 0000000..9cf2a87 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysRoleController.java @@ -0,0 +1,157 @@ +package com.zhentao.system.controller; + +import java.io.IOException; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.system.service.ISysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.poi.ExcelUtil; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; +import com.zhentao.system.api.domain.SysRole; + +/** + * 瑙掕壊淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/role") +public class SysRoleController extends BaseController +{ + @Autowired + private ISysRoleService roleService; + + @PreAuthorize(hasPermi = "system:role:list") + @GetMapping("/list") + public TableDataInfo list(SysRole role) + { + startPage(); + List list = roleService.selectRoleList(role); + return getDataTable(list); + } + + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.EXPORT) + @PreAuthorize(hasPermi = "system:role:export") + @PostMapping("/export") + public void export(HttpServletResponse response, SysRole role) throws IOException + { + List list = roleService.selectRoleList(role); + ExcelUtil util = new ExcelUtil(SysRole.class); + util.exportExcel(response, list, "瑙掕壊鏁版嵁"); + } + + /** + * 鏍规嵁瑙掕壊缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize(hasPermi = "system:role:query") + @GetMapping(value = "/{roleId}") + public AjaxResult getInfo(@PathVariable Long roleId) + { + return AjaxResult.success(roleService.selectRoleById(roleId)); + } + + /** + * 鏂板瑙掕壊 + */ + @PreAuthorize(hasPermi = "system:role:add") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysRole role) + { + if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) + { + return AjaxResult.error("鏂板瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹插悕绉板凡瀛樺湪"); + } + else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) + { + return AjaxResult.error("鏂板瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹叉潈闄愬凡瀛樺湪"); + } + role.setCreateBy(SecurityUtils.getUsername()); + return toAjax(roleService.insertRole(role)); + + } + + /** + * 淇敼淇濆瓨瑙掕壊 + */ + @PreAuthorize(hasPermi = "system:role:edit") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) + { + return AjaxResult.error("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹插悕绉板凡瀛樺湪"); + } + else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) + { + return AjaxResult.error("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹叉潈闄愬凡瀛樺湪"); + } + role.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(roleService.updateRole(role)); + } + + /** + * 淇敼淇濆瓨鏁版嵁鏉冮檺 + */ + @PreAuthorize(hasPermi = "system:role:edit") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public AjaxResult dataScope(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 鐘舵佷慨鏀 + */ + @PreAuthorize(hasPermi = "system:role:edit") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + role.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(roleService.updateRoleStatus(role)); + } + + /** + * 鍒犻櫎瑙掕壊 + */ + @PreAuthorize(hasPermi = "system:role:remove") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public AjaxResult remove(@PathVariable Long[] roleIds) + { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛 + */ + @PreAuthorize(hasPermi = "system:role:query") + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + return AjaxResult.success(roleService.selectRoleAll()); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysUserController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysUserController.java new file mode 100644 index 0000000..f0f857e --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysUserController.java @@ -0,0 +1,251 @@ +package com.zhentao.system.controller; + +import java.io.IOException; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; + +import com.zhentao.system.service.ISysPermissionService; +import com.zhentao.system.service.ISysPostService; +import com.zhentao.system.service.ISysRoleService; +import com.zhentao.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.domain.R; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.utils.poi.ExcelUtil; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.security.annotation.PreAuthorize; +import com.zhentao.system.api.domain.SysRole; +import com.zhentao.system.api.domain.SysUser; +import com.zhentao.system.api.model.LoginUser; + +/** + * 鐢ㄦ埛淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/user") +public class SysUserController extends BaseController +{ + @Autowired + private ISysUserService userService; + + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysPostService postService; + + @Autowired + private ISysPermissionService permissionService; + + /** + * 鑾峰彇鐢ㄦ埛鍒楄〃 + */ + @PreAuthorize(hasPermi = "system:user:list") + @GetMapping("/list") + public TableDataInfo list(SysUser user) + { + startPage(); + List list = userService.selectUserList(user); + return getDataTable(list); + } + + + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.EXPORT) + @PreAuthorize(hasPermi = "system:user:export") + @PostMapping("/export") + public void export(HttpServletResponse response, SysUser user) throws IOException + { + List list = userService.selectUserList(user); + ExcelUtil util = new ExcelUtil(SysUser.class); + util.exportExcel(response, list, "鐢ㄦ埛鏁版嵁"); + } + + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.IMPORT) + @PreAuthorize(hasPermi = "system:user:import") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception + { + ExcelUtil util = new ExcelUtil(SysUser.class); + List userList = util.importExcel(file.getInputStream()); + String operName = SecurityUtils.getUsername(); + String message = userService.importUser(userList, updateSupport, operName); + return AjaxResult.success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) throws IOException + { + ExcelUtil util = new ExcelUtil(SysUser.class); + util.importTemplateExcel(response, "鐢ㄦ埛鏁版嵁"); + } + + /** + * 鑾峰彇褰撳墠鐢ㄦ埛淇℃伅 + */ + @GetMapping("/info/{username}") + public R info(@PathVariable("username") String username) + { + SysUser sysUser = userService.selectUserByUserName(username); + if (StringUtils.isNull(sysUser)) + { + return R.fail("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒"); + } + // 瑙掕壊闆嗗悎 + Set roles = permissionService.getRolePermission(sysUser.getUserId()); + // 鏉冮檺闆嗗悎 + Set permissions = permissionService.getMenuPermission(sysUser.getUserId()); + LoginUser sysUserVo = new LoginUser(); + sysUserVo.setSysUser(sysUser); + sysUserVo.setRoles(roles); + sysUserVo.setPermissions(permissions); + return R.ok(sysUserVo); + } + + /** + * 鑾峰彇鐢ㄦ埛淇℃伅 + * + * @return 鐢ㄦ埛淇℃伅 + */ + @GetMapping("getInfo") + public AjaxResult getInfo() + { + Long userId = SecurityUtils.getUserId(); + // 瑙掕壊闆嗗悎 + Set roles = permissionService.getRolePermission(userId); + // 鏉冮檺闆嗗悎 + Set permissions = permissionService.getMenuPermission(userId); + AjaxResult ajax = AjaxResult.success(); + ajax.put("user", userService.selectUserById(userId)); + ajax.put("roles", roles); + ajax.put("permissions", permissions); + return ajax; + } + + /** + * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize(hasPermi = "system:user:query") + @GetMapping(value = { "/", "/{userId}" }) + public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) + { + AjaxResult ajax = AjaxResult.success(); + List roles = roleService.selectRoleAll(); + ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + ajax.put("posts", postService.selectPostAll()); + if (StringUtils.isNotNull(userId)) + { + ajax.put(AjaxResult.DATA_TAG, userService.selectUserById(userId)); + ajax.put("postIds", postService.selectPostListByUserId(userId)); + ajax.put("roleIds", roleService.selectRoleListByUserId(userId)); + } + return ajax; + } + + /** + * 鏂板鐢ㄦ埛 + */ + @PreAuthorize(hasPermi = "system:user:add") + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysUser user) + { + if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) + { + return AjaxResult.error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岀櫥褰曡处鍙峰凡瀛樺湪"); + } + else if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) + { + return AjaxResult.error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪"); + } + else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) + { + return AjaxResult.error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪"); + } + user.setCreateBy(SecurityUtils.getUsername()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + return toAjax(userService.insertUser(user)); + } + + /** + * 淇敼鐢ㄦ埛 + */ + @PreAuthorize(hasPermi = "system:user:edit") + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysUser user) + { + userService.checkUserAllowed(user); + if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) + { + return AjaxResult.error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪"); + } + else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) + { + return AjaxResult.error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪"); + } + user.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(userService.updateUser(user)); + } + + /** + * 鍒犻櫎鐢ㄦ埛 + */ + @PreAuthorize(hasPermi = "system:user:remove") + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) + { + return toAjax(userService.deleteUserByIds(userIds)); + } + + /** + * 閲嶇疆瀵嗙爜 + */ + @PreAuthorize(hasPermi = "system:user:edit") + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public AjaxResult resetPwd(@RequestBody SysUser user) + { + userService.checkUserAllowed(user); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(userService.resetPwd(user)); + } + + /** + * 鐘舵佷慨鏀 + */ + @PreAuthorize(hasPermi = "system:user:edit") + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysUser user) + { + userService.checkUserAllowed(user); + user.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(userService.updateUserStatus(user)); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysUserOnlineController.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysUserOnlineController.java new file mode 100644 index 0000000..37ae03e --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/controller/SysUserOnlineController.java @@ -0,0 +1,93 @@ +package com.zhentao.system.controller; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import com.zhentao.system.domain.SysUserOnline; +import com.zhentao.system.service.ISysUserOnlineService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhentao.common.core.constant.CacheConstants; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.core.web.controller.BaseController; +import com.zhentao.common.core.web.domain.AjaxResult; +import com.zhentao.common.core.web.page.TableDataInfo; +import com.zhentao.common.log.annotation.Log; +import com.zhentao.common.log.enums.BusinessType; +import com.zhentao.common.redis.service.RedisService; +import com.zhentao.common.security.annotation.PreAuthorize; +import com.zhentao.system.api.model.LoginUser; + +/** + * 鍦ㄧ嚎鐢ㄦ埛鐩戞帶 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/online") +public class SysUserOnlineController extends BaseController +{ + @Autowired + private ISysUserOnlineService userOnlineService; + + @Autowired + private RedisService redisService; + + @PreAuthorize(hasPermi = "monitor:online:list") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) + { + Collection keys = redisService.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); + List userOnlineList = new ArrayList(); + for (String key : keys) + { + LoginUser user = redisService.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)); + } + } + Collections.reverse(userOnlineList); + userOnlineList.removeAll(Collections.singleton(null)); + return getDataTable(userOnlineList); + } + + /** + * 寮洪鐢ㄦ埛 + */ + @PreAuthorize(hasPermi = "monitor:online:forceLogout") + @Log(title = "鍦ㄧ嚎鐢ㄦ埛", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public AjaxResult forceLogout(@PathVariable String tokenId) + { + redisService.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId); + return AjaxResult.success(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SmartCs.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SmartCs.java new file mode 100644 index 0000000..64c2104 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SmartCs.java @@ -0,0 +1,45 @@ +package com.zhentao.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; + + +/** + * + * @TableName smart_cs + */ +@TableName(value ="smart_cs") +public class SmartCs implements Serializable { + /** + * + */ + @TableId + private Integer id; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getCs() { + return cs; + } + + public void setCs(String cs) { + this.cs = cs; + } + + /** + * + */ + private String cs; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysConfig.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysConfig.java new file mode 100644 index 0000000..ec5ec88 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysConfig.java @@ -0,0 +1,111 @@ +package com.zhentao.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.zhentao.common.core.annotation.Excel; +import com.zhentao.common.core.annotation.Excel.ColumnType; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 鍙傛暟閰嶇疆琛 sys_config + * + * @author ruoyi + */ +public class SysConfig extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 鍙傛暟涓婚敭 */ + @Excel(name = "鍙傛暟涓婚敭", cellType = ColumnType.NUMERIC) + private Long configId; + + /** 鍙傛暟鍚嶇О */ + @Excel(name = "鍙傛暟鍚嶇О") + private String configName; + + /** 鍙傛暟閿悕 */ + @Excel(name = "鍙傛暟閿悕") + private String configKey; + + /** 鍙傛暟閿 */ + @Excel(name = "鍙傛暟閿") + private String configValue; + + /** 绯荤粺鍐呯疆锛圷鏄 N鍚︼級 */ + @Excel(name = "绯荤粺鍐呯疆", readConverterExp = "Y=鏄,N=鍚") + private String configType; + + public Long getConfigId() + { + return configId; + } + + public void setConfigId(Long configId) + { + this.configId = configId; + } + + @NotBlank(message = "鍙傛暟鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "鍙傛暟鍚嶇О涓嶈兘瓒呰繃100涓瓧绗") + public String getConfigName() + { + return configName; + } + + public void setConfigName(String configName) + { + this.configName = configName; + } + + @NotBlank(message = "鍙傛暟閿悕闀垮害涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "鍙傛暟閿悕闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getConfigKey() + { + return configKey; + } + + public void setConfigKey(String configKey) + { + this.configKey = configKey; + } + + @NotBlank(message = "鍙傛暟閿间笉鑳戒负绌") + @Size(min = 0, max = 500, message = "鍙傛暟閿奸暱搴︿笉鑳借秴杩500涓瓧绗") + public String getConfigValue() + { + return configValue; + } + + public void setConfigValue(String configValue) + { + this.configValue = configValue; + } + + public String getConfigType() + { + return configType; + } + + public void setConfigType(String configType) + { + this.configType = configType; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("configId", getConfigId()) + .append("configName", getConfigName()) + .append("configKey", getConfigKey()) + .append("configValue", getConfigValue()) + .append("configType", getConfigType()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysDictData.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysDictData.java new file mode 100644 index 0000000..91c75b9 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysDictData.java @@ -0,0 +1,176 @@ +package com.zhentao.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.zhentao.common.core.annotation.Excel; +import com.zhentao.common.core.annotation.Excel.ColumnType; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 瀛楀吀鏁版嵁琛 sys_dict_data + * + * @author ruoyi + */ +public class SysDictData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 瀛楀吀缂栫爜 */ + @Excel(name = "瀛楀吀缂栫爜", cellType = ColumnType.NUMERIC) + private Long dictCode; + + /** 瀛楀吀鎺掑簭 */ + @Excel(name = "瀛楀吀鎺掑簭", cellType = ColumnType.NUMERIC) + private Long dictSort; + + /** 瀛楀吀鏍囩 */ + @Excel(name = "瀛楀吀鏍囩") + private String dictLabel; + + /** 瀛楀吀閿 */ + @Excel(name = "瀛楀吀閿") + private String dictValue; + + /** 瀛楀吀绫诲瀷 */ + @Excel(name = "瀛楀吀绫诲瀷") + private String dictType; + + /** 鏍峰紡灞炴э紙鍏朵粬鏍峰紡鎵╁睍锛 */ + private String cssClass; + + /** 琛ㄦ牸瀛楀吀鏍峰紡 */ + private String listClass; + + /** 鏄惁榛樿锛圷鏄 N鍚︼級 */ + @Excel(name = "鏄惁榛樿", readConverterExp = "Y=鏄,N=鍚") + private String isDefault; + + /** 鐘舵侊紙0姝e父 1鍋滅敤锛 */ + @Excel(name = "鐘舵", readConverterExp = "0=姝e父,1=鍋滅敤") + private String status; + + public Long getDictCode() + { + return dictCode; + } + + public void setDictCode(Long dictCode) + { + this.dictCode = dictCode; + } + + public Long getDictSort() + { + return dictSort; + } + + public void setDictSort(Long dictSort) + { + this.dictSort = dictSort; + } + + @NotBlank(message = "瀛楀吀鏍囩涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "瀛楀吀鏍囩闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getDictLabel() + { + return dictLabel; + } + + public void setDictLabel(String dictLabel) + { + this.dictLabel = dictLabel; + } + + @NotBlank(message = "瀛楀吀閿间笉鑳戒负绌") + @Size(min = 0, max = 100, message = "瀛楀吀閿奸暱搴︿笉鑳借秴杩100涓瓧绗") + public String getDictValue() + { + return dictValue; + } + + public void setDictValue(String dictValue) + { + this.dictValue = dictValue; + } + + @NotBlank(message = "瀛楀吀绫诲瀷涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "瀛楀吀绫诲瀷闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getDictType() + { + return dictType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + @Size(min = 0, max = 100, message = "鏍峰紡灞炴ч暱搴︿笉鑳借秴杩100涓瓧绗") + public String getCssClass() + { + return cssClass; + } + + public void setCssClass(String cssClass) + { + this.cssClass = cssClass; + } + + public String getListClass() + { + return listClass; + } + + public void setListClass(String listClass) + { + this.listClass = listClass; + } + + public boolean getDefault() + { + return UserConstants.YES.equals(this.isDefault) ? true : false; + } + + public String getIsDefault() + { + return isDefault; + } + + public void setIsDefault(String isDefault) + { + this.isDefault = isDefault; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictCode", getDictCode()) + .append("dictSort", getDictSort()) + .append("dictLabel", getDictLabel()) + .append("dictValue", getDictValue()) + .append("dictType", getDictType()) + .append("cssClass", getCssClass()) + .append("listClass", getListClass()) + .append("isDefault", getIsDefault()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysDictType.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysDictType.java new file mode 100644 index 0000000..3c386f3 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysDictType.java @@ -0,0 +1,94 @@ +package com.zhentao.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.zhentao.common.core.annotation.Excel; +import com.zhentao.common.core.annotation.Excel.ColumnType; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 瀛楀吀绫诲瀷琛 sys_dict_type + * + * @author ruoyi + */ +public class SysDictType extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 瀛楀吀涓婚敭 */ + @Excel(name = "瀛楀吀涓婚敭", cellType = ColumnType.NUMERIC) + private Long dictId; + + /** 瀛楀吀鍚嶇О */ + @Excel(name = "瀛楀吀鍚嶇О") + private String dictName; + + /** 瀛楀吀绫诲瀷 */ + @Excel(name = "瀛楀吀绫诲瀷") + private String dictType; + + /** 鐘舵侊紙0姝e父 1鍋滅敤锛 */ + @Excel(name = "鐘舵", readConverterExp = "0=姝e父,1=鍋滅敤") + private String status; + + public Long getDictId() + { + return dictId; + } + + public void setDictId(Long dictId) + { + this.dictId = dictId; + } + + @NotBlank(message = "瀛楀吀鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "瀛楀吀绫诲瀷鍚嶇О闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getDictName() + { + return dictName; + } + + public void setDictName(String dictName) + { + this.dictName = dictName; + } + + @NotBlank(message = "瀛楀吀绫诲瀷涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "瀛楀吀绫诲瀷绫诲瀷闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getDictType() + { + return dictType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictId", getDictId()) + .append("dictName", getDictName()) + .append("dictType", getDictType()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysLogininfor.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysLogininfor.java new file mode 100644 index 0000000..3561c01 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysLogininfor.java @@ -0,0 +1,102 @@ +package com.zhentao.system.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.zhentao.common.core.annotation.Excel; +import com.zhentao.common.core.annotation.Excel.ColumnType; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 绯荤粺璁块棶璁板綍琛 sys_logininfor + * + * @author ruoyi + */ +public class SysLogininfor extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @Excel(name = "搴忓彿", cellType = ColumnType.NUMERIC) + private Long infoId; + + /** 鐢ㄦ埛璐﹀彿 */ + @Excel(name = "鐢ㄦ埛璐﹀彿") + private String userName; + + /** 鐘舵 0鎴愬姛 1澶辫触 */ + @Excel(name = "鐘舵", readConverterExp = "0=鎴愬姛,1=澶辫触") + private String status; + + /** 鍦板潃 */ + @Excel(name = "鍦板潃") + private String ipaddr; + + /** 鎻忚堪 */ + @Excel(name = "鎻忚堪") + private String msg; + + /** 璁块棶鏃堕棿 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "璁块棶鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date accessTime; + + public Long getInfoId() + { + return infoId; + } + + public void setInfoId(Long infoId) + { + this.infoId = infoId; + } + + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public Date getAccessTime() + { + return accessTime; + } + + public void setAccessTime(Date accessTime) + { + this.accessTime = accessTime; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysMenu.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysMenu.java new file mode 100644 index 0000000..c13fda6 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysMenu.java @@ -0,0 +1,246 @@ +package com.zhentao.system.domain; + +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 鑿滃崟鏉冮檺琛 sys_menu + * + * @author ruoyi + */ +public class SysMenu extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 鑿滃崟ID */ + private Long menuId; + + /** 鑿滃崟鍚嶇О */ + private String menuName; + + /** 鐖惰彍鍗曞悕绉 */ + private String parentName; + + /** 鐖惰彍鍗旾D */ + private Long parentId; + + /** 鏄剧ず椤哄簭 */ + private String orderNum; + + /** 璺敱鍦板潃 */ + private String path; + + /** 缁勪欢璺緞 */ + private String component; + + /** 鏄惁涓哄閾撅紙0鏄 1鍚︼級 */ + private String isFrame; + + /** 鏄惁缂撳瓨锛0缂撳瓨 1涓嶇紦瀛橈級 */ + private String isCache; + + /** 绫诲瀷锛圡鐩綍 C鑿滃崟 F鎸夐挳锛 */ + private String menuType; + + /** 鏄剧ず鐘舵侊紙0鏄剧ず 1闅愯棌锛 */ + private String visible; + + /** 鑿滃崟鐘舵侊紙0鏄剧ず 1闅愯棌锛 */ + private String status; + + /** 鏉冮檺瀛楃涓 */ + private String perms; + + /** 鑿滃崟鍥炬爣 */ + private String icon; + + /** 瀛愯彍鍗 */ + private List children = new ArrayList(); + + public Long getMenuId() + { + return menuId; + } + + public void setMenuId(Long menuId) + { + this.menuId = menuId; + } + + @NotBlank(message = "鑿滃崟鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 50, message = "鑿滃崟鍚嶇О闀垮害涓嶈兘瓒呰繃50涓瓧绗") + public String getMenuName() + { + return menuName; + } + + public void setMenuName(String menuName) + { + this.menuName = menuName; + } + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + @NotBlank(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖") + public String getOrderNum() + { + return orderNum; + } + + public void setOrderNum(String orderNum) + { + this.orderNum = orderNum; + } + + @Size(min = 0, max = 200, message = "璺敱鍦板潃涓嶈兘瓒呰繃200涓瓧绗") + public String getPath() + { + return path; + } + + public void setPath(String path) + { + this.path = path; + } + + @Size(min = 0, max = 200, message = "缁勪欢璺緞涓嶈兘瓒呰繃255涓瓧绗") + public String getComponent() + { + return component; + } + + public void setComponent(String component) + { + this.component = component; + } + + public String getIsFrame() + { + return isFrame; + } + + public void setIsFrame(String isFrame) + { + this.isFrame = isFrame; + } + + public String getIsCache() + { + return isCache; + } + + public void setIsCache(String isCache) + { + this.isCache = isCache; + } + + @NotBlank(message = "鑿滃崟绫诲瀷涓嶈兘涓虹┖") + public String getMenuType() + { + return menuType; + } + + public void setMenuType(String menuType) + { + this.menuType = menuType; + } + + public String getVisible() + { + return visible; + } + + public void setVisible(String visible) + { + this.visible = visible; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Size(min = 0, max = 100, message = "鏉冮檺鏍囪瘑闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getPerms() + { + return perms; + } + + public void setPerms(String perms) + { + this.perms = perms; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("menuId", getMenuId()) + .append("menuName", getMenuName()) + .append("parentId", getParentId()) + .append("orderNum", getOrderNum()) + .append("path", getPath()) + .append("component", getComponent()) + .append("isFrame", getIsFrame()) + .append("IsCache", getIsCache()) + .append("menuType", getMenuType()) + .append("visible", getVisible()) + .append("status ", getStatus()) + .append("perms", getPerms()) + .append("icon", getIcon()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysNotice.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysNotice.java new file mode 100644 index 0000000..2608365 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysNotice.java @@ -0,0 +1,101 @@ +package com.zhentao.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 閫氱煡鍏憡琛 sys_notice + * + * @author ruoyi + */ +public class SysNotice extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 鍏憡ID */ + private Long noticeId; + + /** 鍏憡鏍囬 */ + private String noticeTitle; + + /** 鍏憡绫诲瀷锛1閫氱煡 2鍏憡锛 */ + private String noticeType; + + /** 鍏憡鍐呭 */ + private String noticeContent; + + /** 鍏憡鐘舵侊紙0姝e父 1鍏抽棴锛 */ + private String status; + + public Long getNoticeId() + { + return noticeId; + } + + public void setNoticeId(Long noticeId) + { + this.noticeId = noticeId; + } + + public void setNoticeTitle(String noticeTitle) + { + this.noticeTitle = noticeTitle; + } + + @NotBlank(message = "鍏憡鏍囬涓嶈兘涓虹┖") + @Size(min = 0, max = 50, message = "鍏憡鏍囬涓嶈兘瓒呰繃50涓瓧绗") + public String getNoticeTitle() + { + return noticeTitle; + } + + public void setNoticeType(String noticeType) + { + this.noticeType = noticeType; + } + + public String getNoticeType() + { + return noticeType; + } + + public void setNoticeContent(String noticeContent) + { + this.noticeContent = noticeContent; + } + + public String getNoticeContent() + { + return noticeContent; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("noticeId", getNoticeId()) + .append("noticeTitle", getNoticeTitle()) + .append("noticeType", getNoticeType()) + .append("noticeContent", getNoticeContent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysPost.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysPost.java new file mode 100644 index 0000000..033c51d --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysPost.java @@ -0,0 +1,123 @@ +package com.zhentao.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.zhentao.common.core.annotation.Excel; +import com.zhentao.common.core.annotation.Excel.ColumnType; +import com.zhentao.common.core.web.domain.BaseEntity; + +/** + * 宀椾綅琛 sys_post + * + * @author ruoyi + */ +public class SysPost extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 宀椾綅搴忓彿 */ + @Excel(name = "宀椾綅搴忓彿", cellType = ColumnType.NUMERIC) + private Long postId; + + /** 宀椾綅缂栫爜 */ + @Excel(name = "宀椾綅缂栫爜") + private String postCode; + + /** 宀椾綅鍚嶇О */ + @Excel(name = "宀椾綅鍚嶇О") + private String postName; + + /** 宀椾綅鎺掑簭 */ + @Excel(name = "宀椾綅鎺掑簭") + private String postSort; + + /** 鐘舵侊紙0姝e父 1鍋滅敤锛 */ + @Excel(name = "鐘舵", readConverterExp = "0=姝e父,1=鍋滅敤") + private String status; + + /** 鐢ㄦ埛鏄惁瀛樺湪姝ゅ矖浣嶆爣璇 榛樿涓嶅瓨鍦 */ + private boolean flag = false; + + public Long getPostId() + { + return postId; + } + + public void setPostId(Long postId) + { + this.postId = postId; + } + + @NotBlank(message = "宀椾綅缂栫爜涓嶈兘涓虹┖") + @Size(min = 0, max = 64, message = "宀椾綅缂栫爜闀垮害涓嶈兘瓒呰繃64涓瓧绗") + public String getPostCode() + { + return postCode; + } + + public void setPostCode(String postCode) + { + this.postCode = postCode; + } + + @NotBlank(message = "宀椾綅鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 50, message = "宀椾綅鍚嶇О闀垮害涓嶈兘瓒呰繃50涓瓧绗") + public String getPostName() + { + return postName; + } + + public void setPostName(String postName) + { + this.postName = postName; + } + + @NotBlank(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖") + public String getPostSort() + { + return postSort; + } + + public void setPostSort(String postSort) + { + this.postSort = postSort; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public boolean isFlag() + { + return flag; + } + + public void setFlag(boolean flag) + { + this.flag = flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("postId", getPostId()) + .append("postCode", getPostCode()) + .append("postName", getPostName()) + .append("postSort", getPostSort()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysRoleDept.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysRoleDept.java new file mode 100644 index 0000000..49b29ff --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysRoleDept.java @@ -0,0 +1,46 @@ +package com.zhentao.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 瑙掕壊鍜岄儴闂ㄥ叧鑱 sys_role_dept + * + * @author ruoyi + */ +public class SysRoleDept +{ + /** 瑙掕壊ID */ + private Long roleId; + + /** 閮ㄩ棬ID */ + private Long deptId; + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("deptId", getDeptId()) + .toString(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysRoleMenu.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysRoleMenu.java new file mode 100644 index 0000000..06b2084 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysRoleMenu.java @@ -0,0 +1,46 @@ +package com.zhentao.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 瑙掕壊鍜岃彍鍗曞叧鑱 sys_role_menu + * + * @author ruoyi + */ +public class SysRoleMenu +{ + /** 瑙掕壊ID */ + private Long roleId; + + /** 鑿滃崟ID */ + private Long menuId; + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public Long getMenuId() + { + return menuId; + } + + public void setMenuId(Long menuId) + { + this.menuId = menuId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("menuId", getMenuId()) + .toString(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserOnline.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserOnline.java new file mode 100644 index 0000000..301d9e5 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserOnline.java @@ -0,0 +1,100 @@ +package com.zhentao.system.domain; + +/** + * 褰撳墠鍦ㄧ嚎浼氳瘽 + * + * @author ruoyi + */ +public class SysUserOnline +{ + /** 浼氳瘽缂栧彿 */ + private String tokenId; + + /** 鐢ㄦ埛鍚嶇О */ + private String userName; + + /** 鐧诲綍IP鍦板潃 */ + private String ipaddr; + + /** 鐧诲綍鍦板潃 */ + private String loginLocation; + + /** 娴忚鍣ㄧ被鍨 */ + private String browser; + + /** 鎿嶄綔绯荤粺 */ + private String os; + + /** 鐧诲綍鏃堕棿 */ + private Long loginTime; + + public String getTokenId() + { + return tokenId; + } + + public void setTokenId(String tokenId) + { + this.tokenId = tokenId; + } + + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public Long getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Long loginTime) + { + this.loginTime = loginTime; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserPost.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserPost.java new file mode 100644 index 0000000..84fba0c --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserPost.java @@ -0,0 +1,46 @@ +package com.zhentao.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 鐢ㄦ埛鍜屽矖浣嶅叧鑱 sys_user_post + * + * @author ruoyi + */ +public class SysUserPost +{ + /** 鐢ㄦ埛ID */ + private Long userId; + + /** 宀椾綅ID */ + private Long postId; + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getPostId() + { + return postId; + } + + public void setPostId(Long postId) + { + this.postId = postId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("postId", getPostId()) + .toString(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserRole.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserRole.java new file mode 100644 index 0000000..cd983b7 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/SysUserRole.java @@ -0,0 +1,46 @@ +package com.zhentao.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 鐢ㄦ埛鍜岃鑹插叧鑱 sys_user_role + * + * @author ruoyi + */ +public class SysUserRole +{ + /** 鐢ㄦ埛ID */ + private Long userId; + + /** 瑙掕壊ID */ + private Long roleId; + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("roleId", getRoleId()) + .toString(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/MetaVo.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/MetaVo.java new file mode 100644 index 0000000..16053e0 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/MetaVo.java @@ -0,0 +1,71 @@ +package com.zhentao.system.domain.vo; + +/** + * 璺敱鏄剧ず淇℃伅 + * + * @author ruoyi + */ +public class MetaVo +{ + /** + * 璁剧疆璇ヨ矾鐢卞湪渚ц竟鏍忓拰闈㈠寘灞戜腑灞曠ず鐨勫悕瀛 + */ + private String title; + + /** + * 璁剧疆璇ヨ矾鐢辩殑鍥炬爣锛屽搴旇矾寰剆rc/assets/icons/svg + */ + private String icon; + + /** + * 璁剧疆涓簍rue锛屽垯涓嶄細琚 缂撳瓨 + */ + private boolean noCache; + + public MetaVo() + { + } + + public MetaVo(String title, String icon) + { + this.title = title; + this.icon = icon; + } + + public MetaVo(String title, String icon, boolean noCache) + { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public boolean isNoCache() + { + return noCache; + } + + public void setNoCache(boolean noCache) + { + this.noCache = noCache; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/RouterVo.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/RouterVo.java new file mode 100644 index 0000000..51f3c25 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/RouterVo.java @@ -0,0 +1,133 @@ +package com.zhentao.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import java.util.List; + +/** + * 璺敱閰嶇疆淇℃伅 + * + * @author ruoyi + */ +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class RouterVo +{ + /** + * 璺敱鍚嶅瓧 + */ + private String name; + + /** + * 璺敱鍦板潃 + */ + private String path; + + /** + * 鏄惁闅愯棌璺敱锛屽綋璁剧疆 true 鐨勬椂鍊欒璺敱涓嶄細鍐嶄晶杈规爮鍑虹幇 + */ + private boolean hidden; + + /** + * 閲嶅畾鍚戝湴鍧锛屽綋璁剧疆 noRedirect 鐨勬椂鍊欒璺敱鍦ㄩ潰鍖呭睉瀵艰埅涓笉鍙鐐瑰嚮 + */ + private String redirect; + + /** + * 缁勪欢鍦板潃 + */ + private String component; + + /** + * 褰撲綘涓涓矾鐢变笅闈㈢殑 children 澹版槑鐨勮矾鐢卞ぇ浜1涓椂锛岃嚜鍔ㄤ細鍙樻垚宓屽鐨勬ā寮--濡傜粍浠堕〉闈 + */ + private Boolean alwaysShow; + + /** + * 鍏朵粬鍏冪礌 + */ + private MetaVo meta; + + /** + * 瀛愯矾鐢 + */ + private List children; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getPath() + { + return path; + } + + public void setPath(String path) + { + this.path = path; + } + + public boolean getHidden() + { + return hidden; + } + + public void setHidden(boolean hidden) + { + this.hidden = hidden; + } + + public String getRedirect() + { + return redirect; + } + + public void setRedirect(String redirect) + { + this.redirect = redirect; + } + + public String getComponent() + { + return component; + } + + public void setComponent(String component) + { + this.component = component; + } + + public Boolean getAlwaysShow() + { + return alwaysShow; + } + + public void setAlwaysShow(Boolean alwaysShow) + { + this.alwaysShow = alwaysShow; + } + + public MetaVo getMeta() + { + return meta; + } + + public void setMeta(MetaVo meta) + { + this.meta = meta; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/TreeSelect.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/TreeSelect.java new file mode 100644 index 0000000..201c42b --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/domain/vo/TreeSelect.java @@ -0,0 +1,77 @@ +package com.zhentao.system.domain.vo; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.zhentao.system.api.domain.SysDept; +import com.zhentao.system.domain.SysMenu; + +/** + * Treeselect鏍戠粨鏋勫疄浣撶被 + * + * @author ruoyi + */ +public class TreeSelect implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 鑺傜偣ID */ + private Long id; + + /** 鑺傜偣鍚嶇О */ + private String label; + + /** 瀛愯妭鐐 */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List children; + + public TreeSelect() + { + + } + + public TreeSelect(SysDept dept) + { + this.id = dept.getDeptId(); + this.label = dept.getDeptName(); + this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public TreeSelect(SysMenu menu) + { + this.id = menu.getMenuId(); + this.label = menu.getMenuName(); + this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public Long getId() + { + return id; + } + + public void setId(Long id) + { + this.id = id; + } + + public String getLabel() + { + return label; + } + + public void setLabel(String label) + { + this.label = label; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SmartCsMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SmartCsMapper.java new file mode 100644 index 0000000..cbecbde --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SmartCsMapper.java @@ -0,0 +1,18 @@ +package com.zhentao.system.mapper; + +import com.zhentao.system.domain.SmartCs; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author lenovo +* @description 閽堝琛ㄣ恠mart_cs銆戠殑鏁版嵁搴撴搷浣淢apper +* @createDate 2025-02-09 19:36:09 +* @Entity com.zhentao.system.domain.SmartCs +*/ +public interface SmartCsMapper extends BaseMapper { + +} + + + + diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysConfigMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysConfigMapper.java new file mode 100644 index 0000000..3548e73 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysConfigMapper.java @@ -0,0 +1,69 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import com.zhentao.system.domain.SysConfig; + +/** + * 鍙傛暟閰嶇疆 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysConfigMapper +{ + /** + * 鏌ヨ鍙傛暟閰嶇疆淇℃伅 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 鍙傛暟閰嶇疆淇℃伅 + */ + public SysConfig selectConfig(SysConfig config); + + /** + * 鏌ヨ鍙傛暟閰嶇疆鍒楄〃 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 鍙傛暟閰嶇疆闆嗗悎 + */ + public List selectConfigList(SysConfig config); + + /** + * 鏍规嵁閿悕鏌ヨ鍙傛暟閰嶇疆淇℃伅 + * + * @param configKey 鍙傛暟閿悕 + * @return 鍙傛暟閰嶇疆淇℃伅 + */ + public SysConfig checkConfigKeyUnique(String configKey); + + /** + * 鏂板鍙傛暟閰嶇疆 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + public int insertConfig(SysConfig config); + + /** + * 淇敼鍙傛暟閰嶇疆 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + public int updateConfig(SysConfig config); + + /** + * 鍒犻櫎鍙傛暟閰嶇疆 + * + * @param configId 鍙傛暟ID + * @return 缁撴灉 + */ + public int deleteConfigById(Long configId); + + /** + * 鎵归噺鍒犻櫎鍙傛暟淇℃伅 + * + * @param configIds 闇瑕佸垹闄ょ殑鍙傛暟ID + * @return 缁撴灉 + */ + public int deleteConfigByIds(Long[] configIds); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDeptMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDeptMapper.java new file mode 100644 index 0000000..d8386d6 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDeptMapper.java @@ -0,0 +1,120 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.zhentao.system.api.domain.SysDept; + +/** + * 閮ㄩ棬绠$悊 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysDeptMapper +{ + /** + * 鏌ヨ閮ㄩ棬绠$悊鏁版嵁 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 閮ㄩ棬淇℃伅闆嗗悎 + */ + public List selectDeptList(SysDept dept); + + /** + * 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戜俊鎭 + * + * @param roleId 瑙掕壊ID + * @param deptCheckStrictly 閮ㄩ棬鏍戦夋嫨椤规槸鍚﹀叧鑱旀樉绀 + * @return 閫変腑閮ㄩ棬鍒楄〃 + */ + public List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); + + /** + * 鏍规嵁閮ㄩ棬ID鏌ヨ淇℃伅 + * + * @param deptId 閮ㄩ棬ID + * @return 閮ㄩ棬淇℃伅 + */ + public SysDept selectDeptById(Long deptId); + + /** + * 鏍规嵁ID鏌ヨ鎵鏈夊瓙閮ㄩ棬 + * + * @param deptId 閮ㄩ棬ID + * @return 閮ㄩ棬鍒楄〃 + */ + public List selectChildrenDeptById(Long deptId); + + /** + * 鏍规嵁ID鏌ヨ鎵鏈夊瓙閮ㄩ棬锛堟甯哥姸鎬侊級 + * + * @param deptId 閮ㄩ棬ID + * @return 瀛愰儴闂ㄦ暟 + */ + public int selectNormalChildrenDeptById(Long deptId); + + /** + * 鏄惁瀛樺湪瀛愯妭鐐 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + public int hasChildByDeptId(Long deptId); + + /** + * 鏌ヨ閮ㄩ棬鏄惁瀛樺湪鐢ㄦ埛 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + public int checkDeptExistUser(Long deptId); + + /** + * 鏍¢獙閮ㄩ棬鍚嶇О鏄惁鍞竴 + * + * @param deptName 閮ㄩ棬鍚嶇О + * @param parentId 鐖堕儴闂↖D + * @return 缁撴灉 + */ + public SysDept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") Long parentId); + + /** + * 鏂板閮ㄩ棬淇℃伅 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + public int insertDept(SysDept dept); + + /** + * 淇敼閮ㄩ棬淇℃伅 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + public int updateDept(SysDept dept); + + /** + * 淇敼鎵鍦ㄩ儴闂ㄧ殑鐖剁骇閮ㄩ棬鐘舵 + * + * @param dept 閮ㄩ棬 + */ + public void updateDeptStatus(SysDept dept); + + /** + * 淇敼瀛愬厓绱犲叧绯 + * + * @param depts 瀛愬厓绱 + * @return 缁撴灉 + */ + public int updateDeptChildren(@Param("depts") List depts); + + /** + * 鍒犻櫎閮ㄩ棬绠$悊淇℃伅 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + public int deleteDeptById(Long deptId); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDictDataMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDictDataMapper.java new file mode 100644 index 0000000..4040032 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDictDataMapper.java @@ -0,0 +1,97 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.zhentao.system.domain.SysDictData; + +/** + * 瀛楀吀琛 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysDictDataMapper +{ + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀鏁版嵁 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅 + */ + public List selectDictDataList(SysDictData dictData); + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅 + */ + public List selectDictDataByType(String dictType); + + /** + * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏搁敭鍊兼煡璇㈠瓧鍏告暟鎹俊鎭 + * + * @param dictType 瀛楀吀绫诲瀷 + * @param dictValue 瀛楀吀閿 + * @return 瀛楀吀鏍囩 + */ + public String selectDictLabel(@Param("dictType") String dictType, @Param("dictValue") String dictValue); + + /** + * 鏍规嵁瀛楀吀鏁版嵁ID鏌ヨ淇℃伅 + * + * @param dictCode 瀛楀吀鏁版嵁ID + * @return 瀛楀吀鏁版嵁 + */ + public SysDictData selectDictDataById(Long dictCode); + + /** + * 鏌ヨ瀛楀吀鏁版嵁 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 瀛楀吀鏁版嵁 + */ + public int countDictDataByType(String dictType); + + /** + * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀鏁版嵁淇℃伅 + * + * @param dictCode 瀛楀吀鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteDictDataById(Long dictCode); + + /** + * 鎵归噺鍒犻櫎瀛楀吀鏁版嵁淇℃伅 + * + * @param dictCodes 闇瑕佸垹闄ょ殑瀛楀吀鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteDictDataByIds(Long[] dictCodes); + + /** + * 鏂板瀛楀吀鏁版嵁淇℃伅 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 缁撴灉 + */ + public int insertDictData(SysDictData dictData); + + /** + * 淇敼瀛楀吀鏁版嵁淇℃伅 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 缁撴灉 + */ + public int updateDictData(SysDictData dictData); + + /** + * 鍚屾淇敼瀛楀吀绫诲瀷 + * + * @param oldDictType 鏃у瓧鍏哥被鍨 + * @param newDictType 鏂版棫瀛楀吀绫诲瀷 + * @return 缁撴灉 + */ + public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDictTypeMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDictTypeMapper.java new file mode 100644 index 0000000..4990248 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysDictTypeMapper.java @@ -0,0 +1,87 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Mapper; + +import com.zhentao.system.domain.SysDictType; + +/** + * 瀛楀吀琛 鏁版嵁灞 + * + * @author ruoyi + */ +@Mapper +public interface SysDictTypeMapper +{ + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀绫诲瀷 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅 + */ + public List selectDictTypeList(SysDictType dictType); + + /** + * 鏍规嵁鎵鏈夊瓧鍏哥被鍨 + * + * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅 + */ + public List selectDictTypeAll(); + + /** + * 鏍规嵁瀛楀吀绫诲瀷ID鏌ヨ淇℃伅 + * + * @param dictId 瀛楀吀绫诲瀷ID + * @return 瀛楀吀绫诲瀷 + */ + public SysDictType selectDictTypeById(Long dictId); + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 瀛楀吀绫诲瀷 + */ + public SysDictType selectDictTypeByType(String dictType); + + /** + * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀淇℃伅 + * + * @param dictId 瀛楀吀ID + * @return 缁撴灉 + */ + public int deleteDictTypeById(Long dictId); + + /** + * 鎵归噺鍒犻櫎瀛楀吀绫诲瀷淇℃伅 + * + * @param dictIds 闇瑕佸垹闄ょ殑瀛楀吀ID + * @return 缁撴灉 + */ + public int deleteDictTypeByIds(Long[] dictIds); + + /** + * 鏂板瀛楀吀绫诲瀷淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 缁撴灉 + */ + public int insertDictType(SysDictType dictType); + + /** + * 淇敼瀛楀吀绫诲瀷淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 缁撴灉 + */ + public int updateDictType(SysDictType dictType); + + /** + * 鏍¢獙瀛楀吀绫诲瀷绉版槸鍚﹀敮涓 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 缁撴灉 + */ + public SysDictType checkDictTypeUnique(String dictType); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysLogininforMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysLogininforMapper.java new file mode 100644 index 0000000..f0d06e6 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysLogininforMapper.java @@ -0,0 +1,42 @@ +package com.zhentao.system.mapper; + +import java.util.List; +import com.zhentao.system.domain.SysLogininfor; + +/** + * 绯荤粺璁块棶鏃ュ織鎯呭喌淇℃伅 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysLogininforMapper +{ + /** + * 鏂板绯荤粺鐧诲綍鏃ュ織 + * + * @param logininfor 璁块棶鏃ュ織瀵硅薄 + */ + public int insertLogininfor(SysLogininfor logininfor); + + /** + * 鏌ヨ绯荤粺鐧诲綍鏃ュ織闆嗗悎 + * + * @param logininfor 璁块棶鏃ュ織瀵硅薄 + * @return 鐧诲綍璁板綍闆嗗悎 + */ + public List selectLogininforList(SysLogininfor logininfor); + + /** + * 鎵归噺鍒犻櫎绯荤粺鐧诲綍鏃ュ織 + * + * @param infoIds 闇瑕佸垹闄ょ殑鐧诲綍鏃ュ織ID + * @return 缁撴灉 + */ + public int deleteLogininforByIds(Long[] infoIds); + + /** + * 娓呯┖绯荤粺鐧诲綍鏃ュ織 + * + * @return 缁撴灉 + */ + public int cleanLogininfor(); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysMenuMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysMenuMapper.java new file mode 100644 index 0000000..f0f1fca --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysMenuMapper.java @@ -0,0 +1,119 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.zhentao.system.domain.SysMenu; + +/** + * 鑿滃崟琛 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysMenuMapper +{ + /** + * 鏌ヨ绯荤粺鑿滃崟鍒楄〃 + * + * @param menu 鑿滃崟淇℃伅 + * @return 鑿滃崟鍒楄〃 + */ + public List selectMenuList(SysMenu menu); + + /** + * 鏍规嵁鐢ㄦ埛鎵鏈夋潈闄 + * + * @return 鏉冮檺鍒楄〃 + */ + public List selectMenuPerms(); + + /** + * 鏍规嵁鐢ㄦ埛鏌ヨ绯荤粺鑿滃崟鍒楄〃 + * + * @param menu 鑿滃崟淇℃伅 + * @return 鑿滃崟鍒楄〃 + */ + public List selectMenuListByUserId(SysMenu menu); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺 + * + * @param userId 鐢ㄦ埛ID + * @return 鏉冮檺鍒楄〃 + */ + public List selectMenuPermsByUserId(Long userId); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鑿滃崟 + * + * @return 鑿滃崟鍒楄〃 + */ + public List selectMenuTreeAll(); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鑿滃崟 + * + * @param username 鐢ㄦ埛ID + * @return 鑿滃崟鍒楄〃 + */ + public List selectMenuTreeByUserId(Long userId); + + /** + * 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟鏍戜俊鎭 + * + * @param roleId 瑙掕壊ID + * @param menuCheckStrictly 鑿滃崟鏍戦夋嫨椤规槸鍚﹀叧鑱旀樉绀 + * @return 閫変腑鑿滃崟鍒楄〃 + */ + public List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); + + /** + * 鏍规嵁鑿滃崟ID鏌ヨ淇℃伅 + * + * @param menuId 鑿滃崟ID + * @return 鑿滃崟淇℃伅 + */ + public SysMenu selectMenuById(Long menuId); + + /** + * 鏄惁瀛樺湪鑿滃崟瀛愯妭鐐 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 + */ + public int hasChildByMenuId(Long menuId); + + /** + * 鏂板鑿滃崟淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public int insertMenu(SysMenu menu); + + /** + * 淇敼鑿滃崟淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public int updateMenu(SysMenu menu); + + /** + * 鍒犻櫎鑿滃崟绠$悊淇℃伅 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 + */ + public int deleteMenuById(Long menuId); + + /** + * 鏍¢獙鑿滃崟鍚嶇О鏄惁鍞竴 + * + * @param menuName 鑿滃崟鍚嶇О + * @param parentId 鐖惰彍鍗旾D + * @return 缁撴灉 + */ + public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysNoticeMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysNoticeMapper.java new file mode 100644 index 0000000..905855a --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysNoticeMapper.java @@ -0,0 +1,61 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import com.zhentao.system.domain.SysNotice; + +/** + * 閫氱煡鍏憡琛 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysNoticeMapper +{ + /** + * 鏌ヨ鍏憡淇℃伅 + * + * @param noticeId 鍏憡ID + * @return 鍏憡淇℃伅 + */ + public SysNotice selectNoticeById(Long noticeId); + + /** + * 鏌ヨ鍏憡鍒楄〃 + * + * @param notice 鍏憡淇℃伅 + * @return 鍏憡闆嗗悎 + */ + public List selectNoticeList(SysNotice notice); + + /** + * 鏂板鍏憡 + * + * @param notice 鍏憡淇℃伅 + * @return 缁撴灉 + */ + public int insertNotice(SysNotice notice); + + /** + * 淇敼鍏憡 + * + * @param notice 鍏憡淇℃伅 + * @return 缁撴灉 + */ + public int updateNotice(SysNotice notice); + + /** + * 鎵归噺鍒犻櫎鍏憡 + * + * @param noticeId 鍏憡ID + * @return 缁撴灉 + */ + public int deleteNoticeById(Long noticeId); + + /** + * 鎵归噺鍒犻櫎鍏憡淇℃伅 + * + * @param noticeIds 闇瑕佸垹闄ょ殑鍏憡ID + * @return 缁撴灉 + */ + public int deleteNoticeByIds(Long[] noticeIds); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysOperLogMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysOperLogMapper.java new file mode 100644 index 0000000..dafdfe9 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysOperLogMapper.java @@ -0,0 +1,49 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import com.zhentao.system.api.domain.SysOperLog; + +/** + * 鎿嶄綔鏃ュ織 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysOperLogMapper +{ + /** + * 鏂板鎿嶄綔鏃ュ織 + * + * @param operLog 鎿嶄綔鏃ュ織瀵硅薄 + */ + public int insertOperlog(SysOperLog operLog); + + /** + * 鏌ヨ绯荤粺鎿嶄綔鏃ュ織闆嗗悎 + * + * @param operLog 鎿嶄綔鏃ュ織瀵硅薄 + * @return 鎿嶄綔鏃ュ織闆嗗悎 + */ + public List selectOperLogList(SysOperLog operLog); + + /** + * 鎵归噺鍒犻櫎绯荤粺鎿嶄綔鏃ュ織 + * + * @param operIds 闇瑕佸垹闄ょ殑鎿嶄綔鏃ュ織ID + * @return 缁撴灉 + */ + public int deleteOperLogByIds(Long[] operIds); + + /** + * 鏌ヨ鎿嶄綔鏃ュ織璇︾粏 + * + * @param operId 鎿嶄綔ID + * @return 鎿嶄綔鏃ュ織瀵硅薄 + */ + public SysOperLog selectOperLogById(Long operId); + + /** + * 娓呯┖鎿嶄綔鏃ュ織 + */ + public void cleanOperLog(); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysPostMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysPostMapper.java new file mode 100644 index 0000000..4f37f9a --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysPostMapper.java @@ -0,0 +1,100 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import com.zhentao.system.domain.SysPost; + +/** + * 宀椾綅淇℃伅 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysPostMapper +{ + /** + * 鏌ヨ宀椾綅鏁版嵁闆嗗悎 + * + * @param post 宀椾綅淇℃伅 + * @return 宀椾綅鏁版嵁闆嗗悎 + */ + public List selectPostList(SysPost post); + + /** + * 鏌ヨ鎵鏈夊矖浣 + * + * @return 宀椾綅鍒楄〃 + */ + public List selectPostAll(); + + /** + * 閫氳繃宀椾綅ID鏌ヨ宀椾綅淇℃伅 + * + * @param postId 宀椾綅ID + * @return 瑙掕壊瀵硅薄淇℃伅 + */ + public SysPost selectPostById(Long postId); + + /** + * 鏍规嵁鐢ㄦ埛ID鑾峰彇宀椾綅閫夋嫨妗嗗垪琛 + * + * @param userId 鐢ㄦ埛ID + * @return 閫変腑宀椾綅ID鍒楄〃 + */ + public List selectPostListByUserId(Long userId); + + /** + * 鏌ヨ鐢ㄦ埛鎵灞炲矖浣嶇粍 + * + * @param userName 鐢ㄦ埛鍚 + * @return 缁撴灉 + */ + public List selectPostsByUserName(String userName); + + /** + * 鍒犻櫎宀椾綅淇℃伅 + * + * @param postId 宀椾綅ID + * @return 缁撴灉 + */ + public int deletePostById(Long postId); + + /** + * 鎵归噺鍒犻櫎宀椾綅淇℃伅 + * + * @param postIds 闇瑕佸垹闄ょ殑宀椾綅ID + * @return 缁撴灉 + */ + public int deletePostByIds(Long[] postIds); + + /** + * 淇敼宀椾綅淇℃伅 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + public int updatePost(SysPost post); + + /** + * 鏂板宀椾綅淇℃伅 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + public int insertPost(SysPost post); + + /** + * 鏍¢獙宀椾綅鍚嶇О + * + * @param postName 宀椾綅鍚嶇О + * @return 缁撴灉 + */ + public SysPost checkPostNameUnique(String postName); + + /** + * 鏍¢獙宀椾綅缂栫爜 + * + * @param postCode 宀椾綅缂栫爜 + * @return 缁撴灉 + */ + public SysPost checkPostCodeUnique(String postCode); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleDeptMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..4eef75d --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleDeptMapper.java @@ -0,0 +1,45 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import com.zhentao.system.domain.SysRoleDept; + +/** + * 瑙掕壊涓庨儴闂ㄥ叧鑱旇〃 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysRoleDeptMapper +{ + /** + * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊鍜岄儴闂ㄥ叧鑱 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + public int deleteRoleDeptByRoleId(Long roleId); + + /** + * 鎵归噺鍒犻櫎瑙掕壊閮ㄩ棬鍏宠仈淇℃伅 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteRoleDept(Long[] ids); + + /** + * 鏌ヨ閮ㄩ棬浣跨敤鏁伴噺 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + public int selectCountRoleDeptByDeptId(Long deptId); + + /** + * 鎵归噺鏂板瑙掕壊閮ㄩ棬淇℃伅 + * + * @param roleDeptList 瑙掕壊閮ㄩ棬鍒楄〃 + * @return 缁撴灉 + */ + public int batchRoleDept(List roleDeptList); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleMapper.java new file mode 100644 index 0000000..e6e2d42 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleMapper.java @@ -0,0 +1,108 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import com.zhentao.system.api.domain.SysRole; + +/** + * 瑙掕壊琛 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysRoleMapper +{ + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瑙掕壊鏁版嵁 + * + * @param role 瑙掕壊淇℃伅 + * @return 瑙掕壊鏁版嵁闆嗗悎淇℃伅 + */ + public List selectRoleList(SysRole role); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊 + * + * @param userId 鐢ㄦ埛ID + * @return 瑙掕壊鍒楄〃 + */ + public List selectRolePermissionByUserId(Long userId); + + /** + * 鏌ヨ鎵鏈夎鑹 + * + * @return 瑙掕壊鍒楄〃 + */ + public List selectRoleAll(); + + /** + * 鏍规嵁鐢ㄦ埛ID鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛 + * + * @param userId 鐢ㄦ埛ID + * @return 閫変腑瑙掕壊ID鍒楄〃 + */ + public List selectRoleListByUserId(Long userId); + + /** + * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @return 瑙掕壊瀵硅薄淇℃伅 + */ + public SysRole selectRoleById(Long roleId); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊 + * + * @param userName 鐢ㄦ埛鍚 + * @return 瑙掕壊鍒楄〃 + */ + public List selectRolesByUserName(String userName); + + /** + * 鏍¢獙瑙掕壊鍚嶇О鏄惁鍞竴 + * + * @param roleName 瑙掕壊鍚嶇О + * @return 瑙掕壊淇℃伅 + */ + public SysRole checkRoleNameUnique(String roleName); + + /** + * 鏍¢獙瑙掕壊鏉冮檺鏄惁鍞竴 + * + * @param roleKey 瑙掕壊鏉冮檺 + * @return 瑙掕壊淇℃伅 + */ + public SysRole checkRoleKeyUnique(String roleKey); + + /** + * 淇敼瑙掕壊淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public int updateRole(SysRole role); + + /** + * 鏂板瑙掕壊淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public int insertRole(SysRole role); + + /** + * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + public int deleteRoleById(Long roleId); + + /** + * 鎵归噺鍒犻櫎瑙掕壊淇℃伅 + * + * @param roleIds 闇瑕佸垹闄ょ殑瑙掕壊ID + * @return 缁撴灉 + */ + public int deleteRoleByIds(Long[] roleIds); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleMenuMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..2469ca5 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysRoleMenuMapper.java @@ -0,0 +1,45 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import com.zhentao.system.domain.SysRoleMenu; + +/** + * 瑙掕壊涓庤彍鍗曞叧鑱旇〃 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysRoleMenuMapper +{ + /** + * 鏌ヨ鑿滃崟浣跨敤鏁伴噺 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 + */ + public int checkMenuExistRole(Long menuId); + + /** + * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊鍜岃彍鍗曞叧鑱 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + public int deleteRoleMenuByRoleId(Long roleId); + + /** + * 鎵归噺鍒犻櫎瑙掕壊鑿滃崟鍏宠仈淇℃伅 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteRoleMenu(Long[] ids); + + /** + * 鎵归噺鏂板瑙掕壊鑿滃崟淇℃伅 + * + * @param roleMenuList 瑙掕壊鑿滃崟鍒楄〃 + * @return 缁撴灉 + */ + public int batchRoleMenu(List roleMenuList); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserMapper.java new file mode 100644 index 0000000..f4e6018 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserMapper.java @@ -0,0 +1,113 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.zhentao.system.api.domain.SysUser; + +/** + * 鐢ㄦ埛琛 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysUserMapper +{ + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鐢ㄦ埛鍒楄〃 + * + * @param sysUser 鐢ㄦ埛淇℃伅 + * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 + */ + public List selectUserList(SysUser sysUser); + + /** + * 閫氳繃鐢ㄦ埛鍚嶆煡璇㈢敤鎴 + * + * @param userName 鐢ㄦ埛鍚 + * @return 鐢ㄦ埛瀵硅薄淇℃伅 + */ + public SysUser selectUserByUserName(String userName); + + /** + * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛ID + * @return 鐢ㄦ埛瀵硅薄淇℃伅 + */ + public SysUser selectUserById(Long userId); + + /** + * 鏂板鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int insertUser(SysUser user); + + /** + * 淇敼鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int updateUser(SysUser user); + + /** + * 淇敼鐢ㄦ埛澶村儚 + * + * @param userName 鐢ㄦ埛鍚 + * @param avatar 澶村儚鍦板潃 + * @return 缁撴灉 + */ + public int updateUserAvatar(@Param("userName") String userName, @Param("avatar") String avatar); + + /** + * 閲嶇疆鐢ㄦ埛瀵嗙爜 + * + * @param userName 鐢ㄦ埛鍚 + * @param password 瀵嗙爜 + * @return 缁撴灉 + */ + public int resetUserPwd(@Param("userName") String userName, @Param("password") String password); + + /** + * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛ID + * @return 缁撴灉 + */ + public int deleteUserById(Long userId); + + /** + * 鎵归噺鍒犻櫎鐢ㄦ埛淇℃伅 + * + * @param userIds 闇瑕佸垹闄ょ殑鐢ㄦ埛ID + * @return 缁撴灉 + */ + public int deleteUserByIds(Long[] userIds); + + /** + * 鏍¢獙鐢ㄦ埛鍚嶇О鏄惁鍞竴 + * + * @param userName 鐢ㄦ埛鍚嶇О + * @return 缁撴灉 + */ + public int checkUserNameUnique(String userName); + + /** + * 鏍¢獙鎵嬫満鍙风爜鏄惁鍞竴 + * + * @param phonenumber 鎵嬫満鍙风爜 + * @return 缁撴灉 + */ + public SysUser checkPhoneUnique(String phonenumber); + + /** + * 鏍¢獙email鏄惁鍞竴 + * + * @param email 鐢ㄦ埛閭 + * @return 缁撴灉 + */ + public SysUser checkEmailUnique(String email); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserPostMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserPostMapper.java new file mode 100644 index 0000000..452b82e --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserPostMapper.java @@ -0,0 +1,45 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import com.zhentao.system.domain.SysUserPost; + +/** + * 鐢ㄦ埛涓庡矖浣嶅叧鑱旇〃 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysUserPostMapper +{ + /** + * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛鍜屽矖浣嶅叧鑱 + * + * @param userId 鐢ㄦ埛ID + * @return 缁撴灉 + */ + public int deleteUserPostByUserId(Long userId); + + /** + * 閫氳繃宀椾綅ID鏌ヨ宀椾綅浣跨敤鏁伴噺 + * + * @param postId 宀椾綅ID + * @return 缁撴灉 + */ + public int countUserPostById(Long postId); + + /** + * 鎵归噺鍒犻櫎鐢ㄦ埛鍜屽矖浣嶅叧鑱 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteUserPost(Long[] ids); + + /** + * 鎵归噺鏂板鐢ㄦ埛宀椾綅淇℃伅 + * + * @param userPostList 鐢ㄦ埛瑙掕壊鍒楄〃 + * @return 缁撴灉 + */ + public int batchUserPost(List userPostList); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserRoleMapper.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..8cf0855 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,64 @@ +package com.zhentao.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.zhentao.system.domain.SysUserRole; + +/** + * 鐢ㄦ埛涓庤鑹插叧鑱旇〃 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysUserRoleMapper +{ + /** + * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛鍜岃鑹插叧鑱 + * + * @param userId 鐢ㄦ埛ID + * @return 缁撴灉 + */ + public int deleteUserRoleByUserId(Long userId); + + /** + * 鎵归噺鍒犻櫎鐢ㄦ埛鍜岃鑹插叧鑱 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteUserRole(Long[] ids); + + /** + * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊浣跨敤鏁伴噺 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + public int countUserRoleByRoleId(Long roleId); + + /** + * 鎵归噺鏂板鐢ㄦ埛瑙掕壊淇℃伅 + * + * @param userRoleList 鐢ㄦ埛瑙掕壊鍒楄〃 + * @return 缁撴灉 + */ + public int batchUserRole(List userRoleList); + + /** + * 鍒犻櫎鐢ㄦ埛鍜岃鑹插叧鑱斾俊鎭 + * + * @param userRole 鐢ㄦ埛鍜岃鑹插叧鑱斾俊鎭 + * @return 缁撴灉 + */ + public int deleteUserRoleInfo(SysUserRole userRole); + + /** + * 鎵归噺鍙栨秷鎺堟潈鐢ㄦ埛瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @param userIds 闇瑕佸垹闄ょ殑鐢ㄦ埛鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteUserRoleInfos(@Param("roleId") Long roleId, @Param("userIds") Long[] userIds); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysConfigService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysConfigService.java new file mode 100644 index 0000000..8100c43 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysConfigService.java @@ -0,0 +1,74 @@ +package com.zhentao.system.service; + +import java.util.List; + +import com.zhentao.system.domain.SysConfig; + +/** + * 鍙傛暟閰嶇疆 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysConfigService +{ + /** + * 鏌ヨ鍙傛暟閰嶇疆淇℃伅 + * + * @param configId 鍙傛暟閰嶇疆ID + * @return 鍙傛暟閰嶇疆淇℃伅 + */ + public SysConfig selectConfigById(Long configId); + + /** + * 鏍规嵁閿悕鏌ヨ鍙傛暟閰嶇疆淇℃伅 + * + * @param configKey 鍙傛暟閿悕 + * @return 鍙傛暟閿 + */ + public String selectConfigByKey(String configKey); + + /** + * 鏌ヨ鍙傛暟閰嶇疆鍒楄〃 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 鍙傛暟閰嶇疆闆嗗悎 + */ + public List selectConfigList(SysConfig config); + + /** + * 鏂板鍙傛暟閰嶇疆 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + public int insertConfig(SysConfig config); + + /** + * 淇敼鍙傛暟閰嶇疆 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + public int updateConfig(SysConfig config); + + /** + * 鎵归噺鍒犻櫎鍙傛暟淇℃伅 + * + * @param configIds 闇瑕佸垹闄ょ殑鍙傛暟ID + * @return 缁撴灉 + */ + public int deleteConfigByIds(Long[] configIds); + + /** + * 娓呯┖缂撳瓨鏁版嵁 + */ + public void clearCache(); + + /** + * 鏍¢獙鍙傛暟閿悕鏄惁鍞竴 + * + * @param config 鍙傛暟淇℃伅 + * @return 缁撴灉 + */ + public String checkConfigKeyUnique(SysConfig config); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDeptService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDeptService.java new file mode 100644 index 0000000..a873888 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDeptService.java @@ -0,0 +1,110 @@ +package com.zhentao.system.service; + +import java.util.List; + +import com.zhentao.system.api.domain.SysDept; +import com.zhentao.system.domain.vo.TreeSelect; + +/** + * 閮ㄩ棬绠$悊 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysDeptService +{ + /** + * 鏌ヨ閮ㄩ棬绠$悊鏁版嵁 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 閮ㄩ棬淇℃伅闆嗗悎 + */ + public List selectDeptList(SysDept dept); + + /** + * 鏋勫缓鍓嶇鎵闇瑕佹爲缁撴瀯 + * + * @param depts 閮ㄩ棬鍒楄〃 + * @return 鏍戠粨鏋勫垪琛 + */ + public List buildDeptTree(List depts); + + /** + * 鏋勫缓鍓嶇鎵闇瑕佷笅鎷夋爲缁撴瀯 + * + * @param depts 閮ㄩ棬鍒楄〃 + * @return 涓嬫媺鏍戠粨鏋勫垪琛 + */ + public List buildDeptTreeSelect(List depts); + + /** + * 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戜俊鎭 + * + * @param roleId 瑙掕壊ID + * @return 閫変腑閮ㄩ棬鍒楄〃 + */ + public List selectDeptListByRoleId(Long roleId); + + /** + * 鏍规嵁閮ㄩ棬ID鏌ヨ淇℃伅 + * + * @param deptId 閮ㄩ棬ID + * @return 閮ㄩ棬淇℃伅 + */ + public SysDept selectDeptById(Long deptId); + + /** + * 鏍规嵁ID鏌ヨ鎵鏈夊瓙閮ㄩ棬锛堟甯哥姸鎬侊級 + * + * @param deptId 閮ㄩ棬ID + * @return 瀛愰儴闂ㄦ暟 + */ + public int selectNormalChildrenDeptById(Long deptId); + + /** + * 鏄惁瀛樺湪閮ㄩ棬瀛愯妭鐐 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + public boolean hasChildByDeptId(Long deptId); + + /** + * 鏌ヨ閮ㄩ棬鏄惁瀛樺湪鐢ㄦ埛 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦 + */ + public boolean checkDeptExistUser(Long deptId); + + /** + * 鏍¢獙閮ㄩ棬鍚嶇О鏄惁鍞竴 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + public String checkDeptNameUnique(SysDept dept); + + /** + * 鏂板淇濆瓨閮ㄩ棬淇℃伅 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + public int insertDept(SysDept dept); + + /** + * 淇敼淇濆瓨閮ㄩ棬淇℃伅 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + public int updateDept(SysDept dept); + + /** + * 鍒犻櫎閮ㄩ棬绠$悊淇℃伅 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + public int deleteDeptById(Long deptId); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDictDataService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDictDataService.java new file mode 100644 index 0000000..5ec3c8a --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDictDataService.java @@ -0,0 +1,61 @@ +package com.zhentao.system.service; + +import java.util.List; +import com.zhentao.system.domain.SysDictData; + +/** + * 瀛楀吀 涓氬姟灞 + * + * @author ruoyi + */ +public interface ISysDictDataService +{ + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀鏁版嵁 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅 + */ + public List selectDictDataList(SysDictData dictData); + + /** + * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏搁敭鍊兼煡璇㈠瓧鍏告暟鎹俊鎭 + * + * @param dictType 瀛楀吀绫诲瀷 + * @param dictValue 瀛楀吀閿 + * @return 瀛楀吀鏍囩 + */ + public String selectDictLabel(String dictType, String dictValue); + + /** + * 鏍规嵁瀛楀吀鏁版嵁ID鏌ヨ淇℃伅 + * + * @param dictCode 瀛楀吀鏁版嵁ID + * @return 瀛楀吀鏁版嵁 + */ + public SysDictData selectDictDataById(Long dictCode); + + /** + * 鎵归噺鍒犻櫎瀛楀吀鏁版嵁淇℃伅 + * + * @param dictCodes 闇瑕佸垹闄ょ殑瀛楀吀鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteDictDataByIds(Long[] dictCodes); + + /** + * 鏂板淇濆瓨瀛楀吀鏁版嵁淇℃伅 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 缁撴灉 + */ + public int insertDictData(SysDictData dictData); + + /** + * 淇敼淇濆瓨瀛楀吀鏁版嵁淇℃伅 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 缁撴灉 + */ + public int updateDictData(SysDictData dictData); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDictTypeService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDictTypeService.java new file mode 100644 index 0000000..cb5799d --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysDictTypeService.java @@ -0,0 +1,89 @@ +package com.zhentao.system.service; + +import java.util.List; +import com.zhentao.system.domain.SysDictData; +import com.zhentao.system.domain.SysDictType; + +/** + * 瀛楀吀 涓氬姟灞 + * + * @author ruoyi + */ +public interface ISysDictTypeService +{ + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀绫诲瀷 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅 + */ + public List selectDictTypeList(SysDictType dictType); + + /** + * 鏍规嵁鎵鏈夊瓧鍏哥被鍨 + * + * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅 + */ + public List selectDictTypeAll(); + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅 + */ + public List selectDictDataByType(String dictType); + + /** + * 鏍规嵁瀛楀吀绫诲瀷ID鏌ヨ淇℃伅 + * + * @param dictId 瀛楀吀绫诲瀷ID + * @return 瀛楀吀绫诲瀷 + */ + public SysDictType selectDictTypeById(Long dictId); + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 瀛楀吀绫诲瀷 + */ + public SysDictType selectDictTypeByType(String dictType); + + /** + * 鎵归噺鍒犻櫎瀛楀吀淇℃伅 + * + * @param dictIds 闇瑕佸垹闄ょ殑瀛楀吀ID + * @return 缁撴灉 + */ + public int deleteDictTypeByIds(Long[] dictIds); + + /** + * 娓呯┖缂撳瓨鏁版嵁 + */ + public void clearCache(); + + /** + * 鏂板淇濆瓨瀛楀吀绫诲瀷淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 缁撴灉 + */ + public int insertDictType(SysDictType dictType); + + /** + * 淇敼淇濆瓨瀛楀吀绫诲瀷淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 缁撴灉 + */ + public int updateDictType(SysDictType dictType); + + /** + * 鏍¢獙瀛楀吀绫诲瀷绉版槸鍚﹀敮涓 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 缁撴灉 + */ + public String checkDictTypeUnique(SysDictType dictType); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysLogininforService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysLogininforService.java new file mode 100644 index 0000000..2017b5d --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysLogininforService.java @@ -0,0 +1,40 @@ +package com.zhentao.system.service; + +import java.util.List; +import com.zhentao.system.domain.SysLogininfor; + +/** + * 绯荤粺璁块棶鏃ュ織鎯呭喌淇℃伅 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysLogininforService +{ + /** + * 鏂板绯荤粺鐧诲綍鏃ュ織 + * + * @param logininfor 璁块棶鏃ュ織瀵硅薄 + */ + public int insertLogininfor(SysLogininfor logininfor); + + /** + * 鏌ヨ绯荤粺鐧诲綍鏃ュ織闆嗗悎 + * + * @param logininfor 璁块棶鏃ュ織瀵硅薄 + * @return 鐧诲綍璁板綍闆嗗悎 + */ + public List selectLogininforList(SysLogininfor logininfor); + + /** + * 鎵归噺鍒犻櫎绯荤粺鐧诲綍鏃ュ織 + * + * @param infoIds 闇瑕佸垹闄ょ殑鐧诲綍鏃ュ織ID + * @return + */ + public int deleteLogininforByIds(Long[] infoIds); + + /** + * 娓呯┖绯荤粺鐧诲綍鏃ュ織 + */ + public void cleanLogininfor(); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysMenuService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysMenuService.java new file mode 100644 index 0000000..958fc67 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysMenuService.java @@ -0,0 +1,137 @@ +package com.zhentao.system.service; + +import java.util.List; +import java.util.Set; + +import com.zhentao.system.domain.SysMenu; +import com.zhentao.system.domain.vo.RouterVo; +import com.zhentao.system.domain.vo.TreeSelect; + +/** + * 鑿滃崟 涓氬姟灞 + * + * @author ruoyi + */ +public interface ISysMenuService +{ + /** + * 鏍规嵁鐢ㄦ埛鏌ヨ绯荤粺鑿滃崟鍒楄〃 + * + * @param userId 鐢ㄦ埛ID + * @return 鑿滃崟鍒楄〃 + */ + public List selectMenuList(Long userId); + + /** + * 鏍规嵁鐢ㄦ埛鏌ヨ绯荤粺鑿滃崟鍒楄〃 + * + * @param menu 鑿滃崟淇℃伅 + * @param userId 鐢ㄦ埛ID + * @return 鑿滃崟鍒楄〃 + */ + public List selectMenuList(SysMenu menu, Long userId); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺 + * + * @param userId 鐢ㄦ埛ID + * @return 鏉冮檺鍒楄〃 + */ + public Set selectMenuPermsByUserId(Long userId); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鑿滃崟鏍戜俊鎭 + * + * @param userId 鐢ㄦ埛ID + * @return 鑿滃崟鍒楄〃 + */ + public List selectMenuTreeByUserId(Long userId); + + /** + * 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟鏍戜俊鎭 + * + * @param roleId 瑙掕壊ID + * @return 閫変腑鑿滃崟鍒楄〃 + */ + public List selectMenuListByRoleId(Long roleId); + + /** + * 鏋勫缓鍓嶇璺敱鎵闇瑕佺殑鑿滃崟 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 璺敱鍒楄〃 + */ + public List buildMenus(List menus); + + /** + * 鏋勫缓鍓嶇鎵闇瑕佹爲缁撴瀯 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 鏍戠粨鏋勫垪琛 + */ + public List buildMenuTree(List menus); + + /** + * 鏋勫缓鍓嶇鎵闇瑕佷笅鎷夋爲缁撴瀯 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 涓嬫媺鏍戠粨鏋勫垪琛 + */ + public List buildMenuTreeSelect(List menus); + + /** + * 鏍规嵁鑿滃崟ID鏌ヨ淇℃伅 + * + * @param menuId 鑿滃崟ID + * @return 鑿滃崟淇℃伅 + */ + public SysMenu selectMenuById(Long menuId); + + /** + * 鏄惁瀛樺湪鑿滃崟瀛愯妭鐐 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦 + */ + public boolean hasChildByMenuId(Long menuId); + + /** + * 鏌ヨ鑿滃崟鏄惁瀛樺湪瑙掕壊 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦 + */ + public boolean checkMenuExistRole(Long menuId); + + /** + * 鏂板淇濆瓨鑿滃崟淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public int insertMenu(SysMenu menu); + + /** + * 淇敼淇濆瓨鑿滃崟淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public int updateMenu(SysMenu menu); + + /** + * 鍒犻櫎鑿滃崟绠$悊淇℃伅 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 + */ + public int deleteMenuById(Long menuId); + + /** + * 鏍¢獙鑿滃崟鍚嶇О鏄惁鍞竴 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public String checkMenuNameUnique(SysMenu menu); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysNoticeService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysNoticeService.java new file mode 100644 index 0000000..bda5cc2 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysNoticeService.java @@ -0,0 +1,61 @@ +package com.zhentao.system.service; + +import java.util.List; + +import com.zhentao.system.domain.SysNotice; + +/** + * 鍏憡 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysNoticeService +{ + /** + * 鏌ヨ鍏憡淇℃伅 + * + * @param noticeId 鍏憡ID + * @return 鍏憡淇℃伅 + */ + public SysNotice selectNoticeById(Long noticeId); + + /** + * 鏌ヨ鍏憡鍒楄〃 + * + * @param notice 鍏憡淇℃伅 + * @return 鍏憡闆嗗悎 + */ + public List selectNoticeList(SysNotice notice); + + /** + * 鏂板鍏憡 + * + * @param notice 鍏憡淇℃伅 + * @return 缁撴灉 + */ + public int insertNotice(SysNotice notice); + + /** + * 淇敼鍏憡 + * + * @param notice 鍏憡淇℃伅 + * @return 缁撴灉 + */ + public int updateNotice(SysNotice notice); + + /** + * 鍒犻櫎鍏憡淇℃伅 + * + * @param noticeId 鍏憡ID + * @return 缁撴灉 + */ + public int deleteNoticeById(Long noticeId); + + /** + * 鎵归噺鍒犻櫎鍏憡淇℃伅 + * + * @param noticeIds 闇瑕佸垹闄ょ殑鍏憡ID + * @return 缁撴灉 + */ + public int deleteNoticeByIds(Long[] noticeIds); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysOperLogService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysOperLogService.java new file mode 100644 index 0000000..5f64f06 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysOperLogService.java @@ -0,0 +1,49 @@ +package com.zhentao.system.service; + +import java.util.List; +import com.zhentao.system.api.domain.SysOperLog; + +/** + * 鎿嶄綔鏃ュ織 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysOperLogService +{ + /** + * 鏂板鎿嶄綔鏃ュ織 + * + * @param operLog 鎿嶄綔鏃ュ織瀵硅薄 + * @return 缁撴灉 + */ + public int insertOperlog(SysOperLog operLog); + + /** + * 鏌ヨ绯荤粺鎿嶄綔鏃ュ織闆嗗悎 + * + * @param operLog 鎿嶄綔鏃ュ織瀵硅薄 + * @return 鎿嶄綔鏃ュ織闆嗗悎 + */ + public List selectOperLogList(SysOperLog operLog); + + /** + * 鎵归噺鍒犻櫎绯荤粺鎿嶄綔鏃ュ織 + * + * @param operIds 闇瑕佸垹闄ょ殑鎿嶄綔鏃ュ織ID + * @return 缁撴灉 + */ + public int deleteOperLogByIds(Long[] operIds); + + /** + * 鏌ヨ鎿嶄綔鏃ュ織璇︾粏 + * + * @param operId 鎿嶄綔ID + * @return 鎿嶄綔鏃ュ織瀵硅薄 + */ + public SysOperLog selectOperLogById(Long operId); + + /** + * 娓呯┖鎿嶄綔鏃ュ織 + */ + public void cleanOperLog(); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysPermissionService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysPermissionService.java new file mode 100644 index 0000000..000322e --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysPermissionService.java @@ -0,0 +1,22 @@ +package com.zhentao.system.service; + +import java.util.Set; + +public interface ISysPermissionService +{ + /** + * 鑾峰彇瑙掕壊鏁版嵁鏉冮檺 + * + * @param userId 鐢ㄦ埛Id + * @return 瑙掕壊鏉冮檺淇℃伅 + */ + public Set getRolePermission(Long userId); + + /** + * 鑾峰彇鑿滃崟鏁版嵁鏉冮檺 + * + * @param userId 鐢ㄦ埛Id + * @return 鑿滃崟鏉冮檺淇℃伅 + */ + public Set getMenuPermission(Long userId); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysPostService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysPostService.java new file mode 100644 index 0000000..021a389 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysPostService.java @@ -0,0 +1,101 @@ +package com.zhentao.system.service; + +import java.util.List; + +import com.zhentao.system.domain.SysPost; + +/** + * 宀椾綅淇℃伅 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysPostService +{ + /** + * 鏌ヨ宀椾綅淇℃伅闆嗗悎 + * + * @param post 宀椾綅淇℃伅 + * @return 宀椾綅鍒楄〃 + */ + public List selectPostList(SysPost post); + + /** + * 鏌ヨ鎵鏈夊矖浣 + * + * @return 宀椾綅鍒楄〃 + */ + public List selectPostAll(); + + /** + * 閫氳繃宀椾綅ID鏌ヨ宀椾綅淇℃伅 + * + * @param postId 宀椾綅ID + * @return 瑙掕壊瀵硅薄淇℃伅 + */ + public SysPost selectPostById(Long postId); + + /** + * 鏍规嵁鐢ㄦ埛ID鑾峰彇宀椾綅閫夋嫨妗嗗垪琛 + * + * @param userId 鐢ㄦ埛ID + * @return 閫変腑宀椾綅ID鍒楄〃 + */ + public List selectPostListByUserId(Long userId); + + /** + * 鏍¢獙宀椾綅鍚嶇О + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + public String checkPostNameUnique(SysPost post); + + /** + * 鏍¢獙宀椾綅缂栫爜 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + public String checkPostCodeUnique(SysPost post); + + /** + * 閫氳繃宀椾綅ID鏌ヨ宀椾綅浣跨敤鏁伴噺 + * + * @param postId 宀椾綅ID + * @return 缁撴灉 + */ + public int countUserPostById(Long postId); + + /** + * 鍒犻櫎宀椾綅淇℃伅 + * + * @param postId 宀椾綅ID + * @return 缁撴灉 + */ + public int deletePostById(Long postId); + + /** + * 鎵归噺鍒犻櫎宀椾綅淇℃伅 + * + * @param postIds 闇瑕佸垹闄ょ殑宀椾綅ID + * @return 缁撴灉 + * @throws Exception 寮傚父 + */ + public int deletePostByIds(Long[] postIds); + + /** + * 鏂板淇濆瓨宀椾綅淇℃伅 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + public int insertPost(SysPost post); + + /** + * 淇敼淇濆瓨宀椾綅淇℃伅 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + public int updatePost(SysPost post); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysRoleService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysRoleService.java new file mode 100644 index 0000000..a1bd4e8 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysRoleService.java @@ -0,0 +1,132 @@ +package com.zhentao.system.service; + +import java.util.List; +import java.util.Set; + +import com.zhentao.system.api.domain.SysRole; + +/** + * 瑙掕壊涓氬姟灞 + * + * @author ruoyi + */ +public interface ISysRoleService +{ + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瑙掕壊鏁版嵁 + * + * @param role 瑙掕壊淇℃伅 + * @return 瑙掕壊鏁版嵁闆嗗悎淇℃伅 + */ + public List selectRoleList(SysRole role); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊 + * + * @param userId 鐢ㄦ埛ID + * @return 鏉冮檺鍒楄〃 + */ + public Set selectRolePermissionByUserId(Long userId); + + /** + * 鏌ヨ鎵鏈夎鑹 + * + * @return 瑙掕壊鍒楄〃 + */ + public List selectRoleAll(); + + /** + * 鏍规嵁鐢ㄦ埛ID鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛 + * + * @param userId 鐢ㄦ埛ID + * @return 閫変腑瑙掕壊ID鍒楄〃 + */ + public List selectRoleListByUserId(Long userId); + + /** + * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @return 瑙掕壊瀵硅薄淇℃伅 + */ + public SysRole selectRoleById(Long roleId); + + /** + * 鏍¢獙瑙掕壊鍚嶇О鏄惁鍞竴 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public String checkRoleNameUnique(SysRole role); + + /** + * 鏍¢獙瑙掕壊鏉冮檺鏄惁鍞竴 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public String checkRoleKeyUnique(SysRole role); + + /** + * 鏍¢獙瑙掕壊鏄惁鍏佽鎿嶄綔 + * + * @param role 瑙掕壊淇℃伅 + */ + public void checkRoleAllowed(SysRole role); + + /** + * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊浣跨敤鏁伴噺 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + public int countUserRoleByRoleId(Long roleId); + + /** + * 鏂板淇濆瓨瑙掕壊淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public int insertRole(SysRole role); + + /** + * 淇敼淇濆瓨瑙掕壊淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public int updateRole(SysRole role); + + /** + * 淇敼瑙掕壊鐘舵 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public int updateRoleStatus(SysRole role); + + /** + * 淇敼鏁版嵁鏉冮檺淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public int authDataScope(SysRole role); + + /** + * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + public int deleteRoleById(Long roleId); + + /** + * 鎵归噺鍒犻櫎瑙掕壊淇℃伅 + * + * @param roleIds 闇瑕佸垹闄ょ殑瑙掕壊ID + * @return 缁撴灉 + */ + public int deleteRoleByIds(Long[] roleIds); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysUserOnlineService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysUserOnlineService.java new file mode 100644 index 0000000..f67bbcf --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysUserOnlineService.java @@ -0,0 +1,48 @@ +package com.zhentao.system.service; + +import com.zhentao.system.api.model.LoginUser; +import com.zhentao.system.domain.SysUserOnline; + +/** + * 鍦ㄧ嚎鐢ㄦ埛 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysUserOnlineService +{ + /** + * 閫氳繃鐧诲綍鍦板潃鏌ヨ淇℃伅 + * + * @param ipaddr 鐧诲綍鍦板潃 + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user); + + /** + * 閫氳繃鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 + * + * @param userName 鐢ㄦ埛鍚嶇О + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user); + + /** + * 閫氳繃鐧诲綍鍦板潃/鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 + * + * @param ipaddr 鐧诲綍鍦板潃 + * @param userName 鐢ㄦ埛鍚嶇О + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user); + + /** + * 璁剧疆鍦ㄧ嚎鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛 + */ + public SysUserOnline loginUserToUserOnline(LoginUser user); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysUserService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysUserService.java new file mode 100644 index 0000000..a323cc2 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/ISysUserService.java @@ -0,0 +1,168 @@ +package com.zhentao.system.service; + +import java.util.List; + +import com.zhentao.system.api.domain.SysUser; + +/** + * 鐢ㄦ埛 涓氬姟灞 + * + * @author ruoyi + */ +public interface ISysUserService +{ + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鐢ㄦ埛鍒楄〃 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 + */ + public List selectUserList(SysUser user); + + /** + * 閫氳繃鐢ㄦ埛鍚嶆煡璇㈢敤鎴 + * + * @param userName 鐢ㄦ埛鍚 + * @return 鐢ㄦ埛瀵硅薄淇℃伅 + */ + public SysUser selectUserByUserName(String userName); + + /** + * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛ID + * @return 鐢ㄦ埛瀵硅薄淇℃伅 + */ + public SysUser selectUserById(Long userId); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鐢ㄦ埛鎵灞炶鑹茬粍 + * + * @param userName 鐢ㄦ埛鍚 + * @return 缁撴灉 + */ + public String selectUserRoleGroup(String userName); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鐢ㄦ埛鎵灞炲矖浣嶇粍 + * + * @param userName 鐢ㄦ埛鍚 + * @return 缁撴灉 + */ + public String selectUserPostGroup(String userName); + + /** + * 鏍¢獙鐢ㄦ埛鍚嶇О鏄惁鍞竴 + * + * @param userName 鐢ㄦ埛鍚嶇О + * @return 缁撴灉 + */ + public String checkUserNameUnique(String userName); + + /** + * 鏍¢獙鎵嬫満鍙风爜鏄惁鍞竴 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public String checkPhoneUnique(SysUser user); + + /** + * 鏍¢獙email鏄惁鍞竴 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public String checkEmailUnique(SysUser user); + + /** + * 鏍¢獙鐢ㄦ埛鏄惁鍏佽鎿嶄綔 + * + * @param user 鐢ㄦ埛淇℃伅 + */ + public void checkUserAllowed(SysUser user); + + /** + * 鏂板鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int insertUser(SysUser user); + + /** + * 淇敼鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int updateUser(SysUser user); + + /** + * 淇敼鐢ㄦ埛鐘舵 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int updateUserStatus(SysUser user); + + /** + * 淇敼鐢ㄦ埛鍩烘湰淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int updateUserProfile(SysUser user); + + /** + * 淇敼鐢ㄦ埛澶村儚 + * + * @param userName 鐢ㄦ埛鍚 + * @param avatar 澶村儚鍦板潃 + * @return 缁撴灉 + */ + public boolean updateUserAvatar(String userName, String avatar); + + /** + * 閲嶇疆鐢ㄦ埛瀵嗙爜 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int resetPwd(SysUser user); + + /** + * 閲嶇疆鐢ㄦ埛瀵嗙爜 + * + * @param userName 鐢ㄦ埛鍚 + * @param password 瀵嗙爜 + * @return 缁撴灉 + */ + public int resetUserPwd(String userName, String password); + + /** + * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛ID + * @return 缁撴灉 + */ + public int deleteUserById(Long userId); + + /** + * 鎵归噺鍒犻櫎鐢ㄦ埛淇℃伅 + * + * @param userIds 闇瑕佸垹闄ょ殑鐢ㄦ埛ID + * @return 缁撴灉 + */ + public int deleteUserByIds(Long[] userIds); + + /** + * 瀵煎叆鐢ㄦ埛鏁版嵁 + * + * @param userList 鐢ㄦ埛鏁版嵁鍒楄〃 + * @param isUpdateSupport 鏄惁鏇存柊鏀寔锛屽鏋滃凡瀛樺湪锛屽垯杩涜鏇存柊鏁版嵁 + * @param operName 鎿嶄綔鐢ㄦ埛 + * @return 缁撴灉 + */ + public String importUser(List userList, Boolean isUpdateSupport, String operName); +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/SmartCsService.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/SmartCsService.java new file mode 100644 index 0000000..d661942 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/SmartCsService.java @@ -0,0 +1,13 @@ +package com.zhentao.system.service; + +import com.zhentao.system.domain.SmartCs; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author lenovo +* @description 閽堝琛ㄣ恠mart_cs銆戠殑鏁版嵁搴撴搷浣淪ervice +* @createDate 2025-02-09 19:36:09 +*/ +public interface SmartCsService extends IService { + +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SmartCsServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SmartCsServiceImpl.java new file mode 100644 index 0000000..263fe00 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SmartCsServiceImpl.java @@ -0,0 +1,22 @@ +package com.zhentao.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zhentao.system.domain.SmartCs; +import com.zhentao.system.service.SmartCsService; +import com.zhentao.system.mapper.SmartCsMapper; +import org.springframework.stereotype.Service; + +/** +* @author lenovo +* @description 閽堝琛ㄣ恠mart_cs銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇 +* @createDate 2025-02-09 19:36:09 +*/ +@Service +public class SmartCsServiceImpl extends ServiceImpl + implements SmartCsService{ + +} + + + + diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysConfigServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..24d6be3 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,194 @@ +package com.zhentao.system.service.impl; + +import java.util.Collection; +import java.util.List; +import javax.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.zhentao.common.core.constant.Constants; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.exception.CustomException; +import com.zhentao.common.core.text.Convert; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.redis.service.RedisService; +import com.zhentao.system.domain.SysConfig; +import com.zhentao.system.mapper.SysConfigMapper; +import com.zhentao.system.service.ISysConfigService; + +/** + * 鍙傛暟閰嶇疆 鏈嶅姟灞傚疄鐜 + * + * @author ruoyi + */ +@Service +public class SysConfigServiceImpl implements ISysConfigService +{ + @Autowired + private SysConfigMapper configMapper; + + @Autowired + private RedisService redisService; + + /** + * 椤圭洰鍚姩鏃讹紝鍒濆鍖栧弬鏁板埌缂撳瓨 + */ + @PostConstruct + public void init() + { + List configsList = configMapper.selectConfigList(new SysConfig()); + for (SysConfig config : configsList) + { + redisService.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + } + + /** + * 鏌ヨ鍙傛暟閰嶇疆淇℃伅 + * + * @param configId 鍙傛暟閰嶇疆ID + * @return 鍙傛暟閰嶇疆淇℃伅 + */ + @Override + public SysConfig selectConfigById(Long configId) + { + SysConfig config = new SysConfig(); + config.setConfigId(configId); + return configMapper.selectConfig(config); + } + + /** + * 鏍规嵁閿悕鏌ヨ鍙傛暟閰嶇疆淇℃伅 + * + * @param configKey 鍙傛暟key + * @return 鍙傛暟閿 + */ + @Override + public String selectConfigByKey(String configKey) + { + String configValue = Convert.toStr(redisService.getCacheObject(getCacheKey(configKey))); + if (StringUtils.isNotEmpty(configValue)) + { + return configValue; + } + SysConfig config = new SysConfig(); + config.setConfigKey(configKey); + SysConfig retConfig = configMapper.selectConfig(config); + if (StringUtils.isNotNull(retConfig)) + { + redisService.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue()); + return retConfig.getConfigValue(); + } + return StringUtils.EMPTY; + } + + /** + * 鏌ヨ鍙傛暟閰嶇疆鍒楄〃 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 鍙傛暟閰嶇疆闆嗗悎 + */ + @Override + public List selectConfigList(SysConfig config) + { + return configMapper.selectConfigList(config); + } + + /** + * 鏂板鍙傛暟閰嶇疆 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertConfig(SysConfig config) + { + int row = configMapper.insertConfig(config); + if (row > 0) + { + redisService.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 淇敼鍙傛暟閰嶇疆 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateConfig(SysConfig config) + { + int row = configMapper.updateConfig(config); + if (row > 0) + { + redisService.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 鎵归噺鍒犻櫎鍙傛暟淇℃伅 + * + * @param configIds 闇瑕佸垹闄ょ殑鍙傛暟ID + * @return 缁撴灉 + */ + @Override + public int deleteConfigByIds(Long[] configIds) + { + for (Long configId : configIds) + { + SysConfig config = selectConfigById(configId); + if (StringUtils.equals(UserConstants.YES, config.getConfigType())) + { + throw new CustomException(String.format("鍐呯疆鍙傛暟銆%1$s銆戜笉鑳藉垹闄 ", config.getConfigKey())); + } + } + int count = configMapper.deleteConfigByIds(configIds); + if (count > 0) + { + Collection keys = redisService.keys(Constants.SYS_CONFIG_KEY + "*"); + redisService.deleteObject(keys); + } + return count; + } + + /** + * 娓呯┖缂撳瓨鏁版嵁 + */ + @Override + public void clearCache() + { + Collection keys = redisService.keys(Constants.SYS_CONFIG_KEY + "*"); + redisService.deleteObject(keys); + } + + /** + * 鏍¢獙鍙傛暟閿悕鏄惁鍞竴 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkConfigKeyUnique(SysConfig config) + { + Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId(); + SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey()); + if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 璁剧疆cache key + * + * @param configKey 鍙傛暟閿 + * @return 缂撳瓨閿甼ey + */ + private String getCacheKey(String configKey) + { + return Constants.SYS_CONFIG_KEY + configKey; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDeptServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..cd9c858 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,306 @@ +package com.zhentao.system.service.impl; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.exception.CustomException; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.datascope.annotation.DataScope; +import com.zhentao.system.api.domain.SysDept; +import com.zhentao.system.api.domain.SysRole; +import com.zhentao.system.domain.vo.TreeSelect; +import com.zhentao.system.mapper.SysDeptMapper; +import com.zhentao.system.mapper.SysRoleMapper; +import com.zhentao.system.service.ISysDeptService; + +/** + * 閮ㄩ棬绠$悊 鏈嶅姟瀹炵幇 + * + * @author ruoyi + */ +@Service +public class SysDeptServiceImpl implements ISysDeptService +{ + @Autowired + private SysDeptMapper deptMapper; + + @Autowired + private SysRoleMapper roleMapper; + + /** + * 鏌ヨ閮ㄩ棬绠$悊鏁版嵁 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 閮ㄩ棬淇℃伅闆嗗悎 + */ + @Override + @DataScope(deptAlias = "d") + public List selectDeptList(SysDept dept) + { + return deptMapper.selectDeptList(dept); + } + + /** + * 鏋勫缓鍓嶇鎵闇瑕佹爲缁撴瀯 + * + * @param depts 閮ㄩ棬鍒楄〃 + * @return 鏍戠粨鏋勫垪琛 + */ + @Override + public List buildDeptTree(List depts) + { + List returnList = new ArrayList(); + List tempList = new ArrayList(); + for (SysDept dept : depts) + { + tempList.add(dept.getDeptId()); + } + for (Iterator iterator = depts.iterator(); iterator.hasNext();) + { + SysDept dept = (SysDept) iterator.next(); + // 濡傛灉鏄《绾ц妭鐐, 閬嶅巻璇ョ埗鑺傜偣鐨勬墍鏈夊瓙鑺傜偣 + if (!tempList.contains(dept.getParentId())) + { + recursionFn(depts, dept); + returnList.add(dept); + } + } + if (returnList.isEmpty()) + { + returnList = depts; + } + return returnList; + } + + /** + * 鏋勫缓鍓嶇鎵闇瑕佷笅鎷夋爲缁撴瀯 + * + * @param depts 閮ㄩ棬鍒楄〃 + * @return 涓嬫媺鏍戠粨鏋勫垪琛 + */ + @Override + public List buildDeptTreeSelect(List depts) + { + List deptTrees = buildDeptTree(depts); + return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + /** + * 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戜俊鎭 + * + * @param roleId 瑙掕壊ID + * @return 閫変腑閮ㄩ棬鍒楄〃 + */ + @Override + public List selectDeptListByRoleId(Long roleId) + { + SysRole role = roleMapper.selectRoleById(roleId); + return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly()); + } + + /** + * 鏍规嵁閮ㄩ棬ID鏌ヨ淇℃伅 + * + * @param deptId 閮ㄩ棬ID + * @return 閮ㄩ棬淇℃伅 + */ + @Override + public SysDept selectDeptById(Long deptId) + { + return deptMapper.selectDeptById(deptId); + } + + /** + * 鏍规嵁ID鏌ヨ鎵鏈夊瓙閮ㄩ棬锛堟甯哥姸鎬侊級 + * + * @param deptId 閮ㄩ棬ID + * @return 瀛愰儴闂ㄦ暟 + */ + @Override + public int selectNormalChildrenDeptById(Long deptId) + { + return deptMapper.selectNormalChildrenDeptById(deptId); + } + + /** + * 鏄惁瀛樺湪瀛愯妭鐐 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + @Override + public boolean hasChildByDeptId(Long deptId) + { + int result = deptMapper.hasChildByDeptId(deptId); + return result > 0 ? true : false; + } + + /** + * 鏌ヨ閮ㄩ棬鏄惁瀛樺湪鐢ㄦ埛 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦 + */ + @Override + public boolean checkDeptExistUser(Long deptId) + { + int result = deptMapper.checkDeptExistUser(deptId); + return result > 0 ? true : false; + } + + /** + * 鏍¢獙閮ㄩ棬鍚嶇О鏄惁鍞竴 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkDeptNameUnique(SysDept dept) + { + Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId(); + SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId()); + if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏂板淇濆瓨閮ㄩ棬淇℃伅 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertDept(SysDept dept) + { + SysDept info = deptMapper.selectDeptById(dept.getParentId()); + // 濡傛灉鐖惰妭鐐逛笉涓烘甯哥姸鎬,鍒欎笉鍏佽鏂板瀛愯妭鐐 + if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) + { + throw new CustomException("閮ㄩ棬鍋滅敤锛屼笉鍏佽鏂板"); + } + dept.setAncestors(info.getAncestors() + "," + dept.getParentId()); + return deptMapper.insertDept(dept); + } + + /** + * 淇敼淇濆瓨閮ㄩ棬淇℃伅 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateDept(SysDept dept) + { + SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId()); + SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId()); + if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) + { + String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); + } + int result = deptMapper.updateDept(dept); + if (UserConstants.DEPT_NORMAL.equals(dept.getStatus())) + { + // 濡傛灉璇ラ儴闂ㄦ槸鍚敤鐘舵侊紝鍒欏惎鐢ㄨ閮ㄩ棬鐨勬墍鏈変笂绾ч儴闂 + updateParentDeptStatus(dept); + } + return result; + } + + /** + * 淇敼璇ラ儴闂ㄧ殑鐖剁骇閮ㄩ棬鐘舵 + * + * @param dept 褰撳墠閮ㄩ棬 + */ + private void updateParentDeptStatus(SysDept dept) + { + String updateBy = dept.getUpdateBy(); + dept = deptMapper.selectDeptById(dept.getDeptId()); + dept.setUpdateBy(updateBy); + deptMapper.updateDeptStatus(dept); + } + + /** + * 淇敼瀛愬厓绱犲叧绯 + * + * @param deptId 琚慨鏀圭殑閮ㄩ棬ID + * @param newAncestors 鏂扮殑鐖禝D闆嗗悎 + * @param oldAncestors 鏃х殑鐖禝D闆嗗悎 + */ + public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) + { + List children = deptMapper.selectChildrenDeptById(deptId); + for (SysDept child : children) + { + child.setAncestors(child.getAncestors().replace(oldAncestors, newAncestors)); + } + if (children.size() > 0) + { + deptMapper.updateDeptChildren(children); + } + } + + /** + * 鍒犻櫎閮ㄩ棬绠$悊淇℃伅 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + @Override + public int deleteDeptById(Long deptId) + { + return deptMapper.deleteDeptById(deptId); + } + + /** + * 閫掑綊鍒楄〃 + */ + private void recursionFn(List list, SysDept t) + { + // 寰楀埌瀛愯妭鐐瑰垪琛 + List childList = getChildList(list, t); + t.setChildren(childList); + for (SysDept tChild : childList) + { + if (hasChild(list, tChild)) + { + recursionFn(list, tChild); + } + } + } + + /** + * 寰楀埌瀛愯妭鐐瑰垪琛 + */ + private List getChildList(List list, SysDept t) + { + List tlist = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) + { + SysDept n = (SysDept) it.next(); + if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) + { + tlist.add(n); + } + } + return tlist; + } + + /** + * 鍒ゆ柇鏄惁鏈夊瓙鑺傜偣 + */ + private boolean hasChild(List list, SysDept t) + { + return getChildList(list, t).size() > 0 ? true : false; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDictDataServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..2ebb444 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,109 @@ +package com.zhentao.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.zhentao.system.domain.SysDictData; +import com.zhentao.system.mapper.SysDictDataMapper; +import com.zhentao.system.service.ISysDictDataService; +import com.zhentao.system.utils.DictUtils; + +/** + * 瀛楀吀 涓氬姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysDictDataServiceImpl implements ISysDictDataService +{ + @Autowired + private SysDictDataMapper dictDataMapper; + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀鏁版嵁 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅 + */ + @Override + public List selectDictDataList(SysDictData dictData) + { + return dictDataMapper.selectDictDataList(dictData); + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏搁敭鍊兼煡璇㈠瓧鍏告暟鎹俊鎭 + * + * @param dictType 瀛楀吀绫诲瀷 + * @param dictValue 瀛楀吀閿 + * @return 瀛楀吀鏍囩 + */ + @Override + public String selectDictLabel(String dictType, String dictValue) + { + return dictDataMapper.selectDictLabel(dictType, dictValue); + } + + /** + * 鏍规嵁瀛楀吀鏁版嵁ID鏌ヨ淇℃伅 + * + * @param dictCode 瀛楀吀鏁版嵁ID + * @return 瀛楀吀鏁版嵁 + */ + @Override + public SysDictData selectDictDataById(Long dictCode) + { + return dictDataMapper.selectDictDataById(dictCode); + } + + /** + * 鎵归噺鍒犻櫎瀛楀吀鏁版嵁淇℃伅 + * + * @param dictCodes 闇瑕佸垹闄ょ殑瀛楀吀鏁版嵁ID + * @return 缁撴灉 + */ + @Override + public int deleteDictDataByIds(Long[] dictCodes) + { + int row = dictDataMapper.deleteDictDataByIds(dictCodes); + if (row > 0) + { + DictUtils.clearDictCache(); + } + return row; + } + + /** + * 鏂板淇濆瓨瀛楀吀鏁版嵁淇℃伅 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertDictData(SysDictData dictData) + { + int row = dictDataMapper.insertDictData(dictData); + if (row > 0) + { + DictUtils.clearDictCache(); + } + return row; + } + + /** + * 淇敼淇濆瓨瀛楀吀鏁版嵁淇℃伅 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateDictData(SysDictData dictData) + { + int row = dictDataMapper.updateDictData(dictData); + if (row > 0) + { + DictUtils.clearDictCache(); + } + return row; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDictTypeServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..5f251b5 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,205 @@ +package com.zhentao.system.service.impl; + +import java.util.List; +import javax.annotation.PostConstruct; + +import com.zhentao.system.domain.SysDictData; +import com.zhentao.system.domain.SysDictType; +import com.zhentao.system.mapper.SysDictDataMapper; +import com.zhentao.system.mapper.SysDictTypeMapper; +import com.zhentao.system.service.ISysDictTypeService; +import com.zhentao.system.utils.DictUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.exception.CustomException; +import com.zhentao.common.core.utils.StringUtils; + +/** + * 瀛楀吀 涓氬姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysDictTypeServiceImpl implements ISysDictTypeService +{ + @Autowired + private SysDictTypeMapper dictTypeMapper; + + @Autowired + private SysDictDataMapper dictDataMapper; + + /** + * 椤圭洰鍚姩鏃讹紝鍒濆鍖栧瓧鍏稿埌缂撳瓨 + */ + @PostConstruct + public void init() + { + List dictTypeList = dictTypeMapper.selectDictTypeAll(); + for (SysDictType dictType : dictTypeList) + { + List dictDatas = dictDataMapper.selectDictDataByType(dictType.getDictType()); + DictUtils.setDictCache(dictType.getDictType(), dictDatas); + } + } + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀绫诲瀷 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅 + */ + @Override + public List selectDictTypeList(SysDictType dictType) + { + return dictTypeMapper.selectDictTypeList(dictType); + } + + /** + * 鏍规嵁鎵鏈夊瓧鍏哥被鍨 + * + * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅 + */ + @Override + public List selectDictTypeAll() + { + return dictTypeMapper.selectDictTypeAll(); + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅 + */ + @Override + public List selectDictDataByType(String dictType) + { + List dictDatas = DictUtils.getDictCache(dictType); + if (StringUtils.isNotEmpty(dictDatas)) + { + return dictDatas; + } + dictDatas = dictDataMapper.selectDictDataByType(dictType); + if (StringUtils.isNotEmpty(dictDatas)) + { + DictUtils.setDictCache(dictType, dictDatas); + return dictDatas; + } + return null; + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷ID鏌ヨ淇℃伅 + * + * @param dictId 瀛楀吀绫诲瀷ID + * @return 瀛楀吀绫诲瀷 + */ + @Override + public SysDictType selectDictTypeById(Long dictId) + { + return dictTypeMapper.selectDictTypeById(dictId); + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 瀛楀吀绫诲瀷 + */ + @Override + public SysDictType selectDictTypeByType(String dictType) + { + return dictTypeMapper.selectDictTypeByType(dictType); + } + + /** + * 鎵归噺鍒犻櫎瀛楀吀绫诲瀷淇℃伅 + * + * @param dictIds 闇瑕佸垹闄ょ殑瀛楀吀ID + * @return 缁撴灉 + */ + @Override + public int deleteDictTypeByIds(Long[] dictIds) + { + for (Long dictId : dictIds) + { + SysDictType dictType = selectDictTypeById(dictId); + if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0) + { + throw new CustomException(String.format("%1$s宸插垎閰,涓嶈兘鍒犻櫎", dictType.getDictName())); + } + } + int count = dictTypeMapper.deleteDictTypeByIds(dictIds); + if (count > 0) + { + DictUtils.clearDictCache(); + } + return count; + } + + /** + * 娓呯┖缂撳瓨鏁版嵁 + */ + @Override + public void clearCache() + { + DictUtils.clearDictCache(); + } + + /** + * 鏂板淇濆瓨瀛楀吀绫诲瀷淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertDictType(SysDictType dictType) + { + int row = dictTypeMapper.insertDictType(dictType); + if (row > 0) + { + DictUtils.clearDictCache(); + } + return row; + } + + /** + * 淇敼淇濆瓨瀛楀吀绫诲瀷淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int updateDictType(SysDictType dictType) + { + SysDictType oldDict = dictTypeMapper.selectDictTypeById(dictType.getDictId()); + dictDataMapper.updateDictDataType(oldDict.getDictType(), dictType.getDictType()); + int row = dictTypeMapper.updateDictType(dictType); + if (row > 0) + { + DictUtils.clearDictCache(); + } + return row; + } + + /** + * 鏍¢獙瀛楀吀绫诲瀷绉版槸鍚﹀敮涓 + * + * @param dict 瀛楀吀绫诲瀷 + * @return 缁撴灉 + */ + @Override + public String checkDictTypeUnique(SysDictType dict) + { + Long dictId = StringUtils.isNull(dict.getDictId()) ? -1L : dict.getDictId(); + SysDictType dictType = dictTypeMapper.checkDictTypeUnique(dict.getDictType()); + if (StringUtils.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysLogininforServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysLogininforServiceImpl.java new file mode 100644 index 0000000..bb41011 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysLogininforServiceImpl.java @@ -0,0 +1,65 @@ +package com.zhentao.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.zhentao.system.domain.SysLogininfor; +import com.zhentao.system.mapper.SysLogininforMapper; +import com.zhentao.system.service.ISysLogininforService; + +/** + * 绯荤粺璁块棶鏃ュ織鎯呭喌淇℃伅 鏈嶅姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysLogininforServiceImpl implements ISysLogininforService +{ + + @Autowired + private SysLogininforMapper logininforMapper; + + /** + * 鏂板绯荤粺鐧诲綍鏃ュ織 + * + * @param logininfor 璁块棶鏃ュ織瀵硅薄 + */ + @Override + public int insertLogininfor(SysLogininfor logininfor) + { + return logininforMapper.insertLogininfor(logininfor); + } + + /** + * 鏌ヨ绯荤粺鐧诲綍鏃ュ織闆嗗悎 + * + * @param logininfor 璁块棶鏃ュ織瀵硅薄 + * @return 鐧诲綍璁板綍闆嗗悎 + */ + @Override + public List selectLogininforList(SysLogininfor logininfor) + { + return logininforMapper.selectLogininforList(logininfor); + } + + /** + * 鎵归噺鍒犻櫎绯荤粺鐧诲綍鏃ュ織 + * + * @param infoIds 闇瑕佸垹闄ょ殑鐧诲綍鏃ュ織ID + * @return + */ + @Override + public int deleteLogininforByIds(Long[] infoIds) + { + return logininforMapper.deleteLogininforByIds(infoIds); + } + + /** + * 娓呯┖绯荤粺鐧诲綍鏃ュ織 + */ + @Override + public void cleanLogininfor() + { + logininforMapper.cleanLogininfor(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysMenuServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..f38894e --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,465 @@ +package com.zhentao.system.service.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.system.api.domain.SysRole; +import com.zhentao.system.api.domain.SysUser; +import com.zhentao.system.domain.SysMenu; +import com.zhentao.system.domain.vo.MetaVo; +import com.zhentao.system.domain.vo.RouterVo; +import com.zhentao.system.domain.vo.TreeSelect; +import com.zhentao.system.mapper.SysMenuMapper; +import com.zhentao.system.mapper.SysRoleMapper; +import com.zhentao.system.mapper.SysRoleMenuMapper; +import com.zhentao.system.service.ISysMenuService; + +/** + * 鑿滃崟 涓氬姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysMenuServiceImpl implements ISysMenuService +{ + public static final String PREMISSION_STRING = "perms[\"{0}\"]"; + + @Autowired + private SysMenuMapper menuMapper; + + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysRoleMenuMapper roleMenuMapper; + + /** + * 鏍规嵁鐢ㄦ埛鏌ヨ绯荤粺鑿滃崟鍒楄〃 + * + * @param userId 鐢ㄦ埛ID + * @return 鑿滃崟鍒楄〃 + */ + @Override + public List selectMenuList(Long userId) + { + return selectMenuList(new SysMenu(), userId); + } + + /** + * 鏌ヨ绯荤粺鑿滃崟鍒楄〃 + * + * @param menu 鑿滃崟淇℃伅 + * @return 鑿滃崟鍒楄〃 + */ + @Override + public List selectMenuList(SysMenu menu, Long userId) + { + List menuList = null; + // 绠$悊鍛樻樉绀烘墍鏈夎彍鍗曚俊鎭 + if (SysUser.isAdmin(userId)) + { + menuList = menuMapper.selectMenuList(menu); + } + else + { + menu.getParams().put("userId", userId); + menuList = menuMapper.selectMenuListByUserId(menu); + } + return menuList; + } + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺 + * + * @param userId 鐢ㄦ埛ID + * @return 鏉冮檺鍒楄〃 + */ + @Override + public Set selectMenuPermsByUserId(Long userId) + { + List perms = menuMapper.selectMenuPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) + { + if (StringUtils.isNotEmpty(perm)) + { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鑿滃崟 + * + * @param userId 鐢ㄦ埛鍚嶇О + * @return 鑿滃崟鍒楄〃 + */ + @Override + public List selectMenuTreeByUserId(Long userId) + { + List menus = null; + if (SecurityUtils.isAdmin(userId)) + { + menus = menuMapper.selectMenuTreeAll(); + } + else + { + menus = menuMapper.selectMenuTreeByUserId(userId); + } + return getChildPerms(menus, 0); + } + + /** + * 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟鏍戜俊鎭 + * + * @param roleId 瑙掕壊ID + * @return 閫変腑鑿滃崟鍒楄〃 + */ + @Override + public List selectMenuListByRoleId(Long roleId) + { + SysRole role = roleMapper.selectRoleById(roleId); + return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); + } + + /** + * 鏋勫缓鍓嶇璺敱鎵闇瑕佺殑鑿滃崟 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 璺敱鍒楄〃 + */ + @Override + public List buildMenus(List menus) + { + List routers = new LinkedList(); + for (SysMenu menu : menus) + { + RouterVo router = new RouterVo(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(getRouteName(menu)); + router.setPath(getRouterPath(menu)); + router.setComponent(getComponent(menu)); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()))); + List cMenus = menu.getChildren(); + if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) + { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } + else if (isMeunFrame(menu)) + { + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(StringUtils.capitalize(menu.getPath())); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()))); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 鏋勫缓鍓嶇鎵闇瑕佹爲缁撴瀯 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 鏍戠粨鏋勫垪琛 + */ + @Override + public List buildMenuTree(List menus) + { + List returnList = new ArrayList(); + List tempList = new ArrayList(); + for (SysMenu dept : menus) + { + tempList.add(dept.getMenuId()); + } + for (Iterator iterator = menus.iterator(); iterator.hasNext();) + { + SysMenu menu = (SysMenu) iterator.next(); + // 濡傛灉鏄《绾ц妭鐐, 閬嶅巻璇ョ埗鑺傜偣鐨勬墍鏈夊瓙鑺傜偣 + if (!tempList.contains(menu.getParentId())) + { + recursionFn(menus, menu); + returnList.add(menu); + } + } + if (returnList.isEmpty()) + { + returnList = menus; + } + return returnList; + } + + /** + * 鏋勫缓鍓嶇鎵闇瑕佷笅鎷夋爲缁撴瀯 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 涓嬫媺鏍戠粨鏋勫垪琛 + */ + @Override + public List buildMenuTreeSelect(List menus) + { + List menuTrees = buildMenuTree(menus); + return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + /** + * 鏍规嵁鑿滃崟ID鏌ヨ淇℃伅 + * + * @param menuId 鑿滃崟ID + * @return 鑿滃崟淇℃伅 + */ + @Override + public SysMenu selectMenuById(Long menuId) + { + return menuMapper.selectMenuById(menuId); + } + + /** + * 鏄惁瀛樺湪鑿滃崟瀛愯妭鐐 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 + */ + @Override + public boolean hasChildByMenuId(Long menuId) + { + int result = menuMapper.hasChildByMenuId(menuId); + return result > 0 ? true : false; + } + + /** + * 鏌ヨ鑿滃崟浣跨敤鏁伴噺 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 + */ + @Override + public boolean checkMenuExistRole(Long menuId) + { + int result = roleMenuMapper.checkMenuExistRole(menuId); + return result > 0 ? true : false; + } + + /** + * 鏂板淇濆瓨鑿滃崟淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertMenu(SysMenu menu) + { + return menuMapper.insertMenu(menu); + } + + /** + * 淇敼淇濆瓨鑿滃崟淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateMenu(SysMenu menu) + { + return menuMapper.updateMenu(menu); + } + + /** + * 鍒犻櫎鑿滃崟绠$悊淇℃伅 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 + */ + @Override + public int deleteMenuById(Long menuId) + { + return menuMapper.deleteMenuById(menuId); + } + + /** + * 鏍¢獙鑿滃崟鍚嶇О鏄惁鍞竴 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkMenuNameUnique(SysMenu menu) + { + Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId(); + SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId()); + if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鑾峰彇璺敱鍚嶇О + * + * @param menu 鑿滃崟淇℃伅 + * @return 璺敱鍚嶇О + */ + public String getRouteName(SysMenu menu) + { + String routerName = StringUtils.capitalize(menu.getPath()); + // 闈炲閾惧苟涓旀槸涓绾х洰褰曪紙绫诲瀷涓虹洰褰曪級 + if (isMeunFrame(menu)) + { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 鑾峰彇璺敱鍦板潃 + * + * @param menu 鑿滃崟淇℃伅 + * @return 璺敱鍦板潃 + */ + public String getRouterPath(SysMenu menu) + { + String routerPath = menu.getPath(); + // 闈炲閾惧苟涓旀槸涓绾х洰褰曪紙绫诲瀷涓虹洰褰曪級 + if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType()) + && UserConstants.NO_FRAME.equals(menu.getIsFrame())) + { + routerPath = "/" + menu.getPath(); + } + // 闈炲閾惧苟涓旀槸涓绾х洰褰曪紙绫诲瀷涓鸿彍鍗曪級 + else if (isMeunFrame(menu)) + { + routerPath = "/"; + } + return routerPath; + } + + /** + * 鑾峰彇缁勪欢淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁勪欢淇℃伅 + */ + public String getComponent(SysMenu menu) + { + String component = UserConstants.LAYOUT; + if (StringUtils.isNotEmpty(menu.getComponent()) && !isMeunFrame(menu)) + { + component = menu.getComponent(); + } + else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) + { + component = UserConstants.PARENT_VIEW; + } + return component; + } + + /** + * 鏄惁涓鸿彍鍗曞唴閮ㄨ烦杞 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public boolean isMeunFrame(SysMenu menu) + { + return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType()) + && menu.getIsFrame().equals(UserConstants.NO_FRAME); + } + + /** + * 鏄惁涓簆arent_view缁勪欢 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public boolean isParentView(SysMenu menu) + { + return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()); + } + + /** + * 鏍规嵁鐖惰妭鐐圭殑ID鑾峰彇鎵鏈夊瓙鑺傜偣 + * + * @param list 鍒嗙被琛 + * @param parentId 浼犲叆鐨勭埗鑺傜偣ID + * @return String + */ + public List getChildPerms(List list, int parentId) + { + List returnList = new ArrayList(); + for (Iterator iterator = list.iterator(); iterator.hasNext();) + { + SysMenu t = (SysMenu) iterator.next(); + // 涓銆佹牴鎹紶鍏ョ殑鏌愪釜鐖惰妭鐐笽D,閬嶅巻璇ョ埗鑺傜偣鐨勬墍鏈夊瓙鑺傜偣 + if (t.getParentId() == parentId) + { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 閫掑綊鍒楄〃 + * + * @param list + * @param t + */ + private void recursionFn(List list, SysMenu t) + { + // 寰楀埌瀛愯妭鐐瑰垪琛 + List childList = getChildList(list, t); + t.setChildren(childList); + for (SysMenu tChild : childList) + { + if (hasChild(list, tChild)) + { + recursionFn(list, tChild); + } + } + } + + /** + * 寰楀埌瀛愯妭鐐瑰垪琛 + */ + private List getChildList(List list, SysMenu t) + { + List tlist = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) + { + SysMenu n = (SysMenu) it.next(); + if (n.getParentId().longValue() == t.getMenuId().longValue()) + { + tlist.add(n); + } + } + return tlist; + } + + /** + * 鍒ゆ柇鏄惁鏈夊瓙鑺傜偣 + */ + private boolean hasChild(List list, SysMenu t) + { + return getChildList(list, t).size() > 0 ? true : false; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysNoticeServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysNoticeServiceImpl.java new file mode 100644 index 0000000..5991a05 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysNoticeServiceImpl.java @@ -0,0 +1,94 @@ +package com.zhentao.system.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.zhentao.system.domain.SysNotice; +import com.zhentao.system.mapper.SysNoticeMapper; +import com.zhentao.system.service.ISysNoticeService; + +/** + * 鍏憡 鏈嶅姟灞傚疄鐜 + * + * @author ruoyi + */ +@Service +public class SysNoticeServiceImpl implements ISysNoticeService +{ + @Autowired + private SysNoticeMapper noticeMapper; + + /** + * 鏌ヨ鍏憡淇℃伅 + * + * @param noticeId 鍏憡ID + * @return 鍏憡淇℃伅 + */ + @Override + public SysNotice selectNoticeById(Long noticeId) + { + return noticeMapper.selectNoticeById(noticeId); + } + + /** + * 鏌ヨ鍏憡鍒楄〃 + * + * @param notice 鍏憡淇℃伅 + * @return 鍏憡闆嗗悎 + */ + @Override + public List selectNoticeList(SysNotice notice) + { + return noticeMapper.selectNoticeList(notice); + } + + /** + * 鏂板鍏憡 + * + * @param notice 鍏憡淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertNotice(SysNotice notice) + { + return noticeMapper.insertNotice(notice); + } + + /** + * 淇敼鍏憡 + * + * @param notice 鍏憡淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateNotice(SysNotice notice) + { + return noticeMapper.updateNotice(notice); + } + + /** + * 鍒犻櫎鍏憡瀵硅薄 + * + * @param noticeId 鍏憡ID + * @return 缁撴灉 + */ + @Override + public int deleteNoticeById(Long noticeId) + { + return noticeMapper.deleteNoticeById(noticeId); + } + + /** + * 鎵归噺鍒犻櫎鍏憡淇℃伅 + * + * @param noticeIds 闇瑕佸垹闄ょ殑鍏憡ID + * @return 缁撴灉 + */ + @Override + public int deleteNoticeByIds(Long[] noticeIds) + { + return noticeMapper.deleteNoticeByIds(noticeIds); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysOperLogServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysOperLogServiceImpl.java new file mode 100644 index 0000000..ce10179 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysOperLogServiceImpl.java @@ -0,0 +1,78 @@ +package com.zhentao.system.service.impl; + +import java.util.List; + +import com.zhentao.system.mapper.SysOperLogMapper; +import com.zhentao.system.service.ISysOperLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.zhentao.system.api.domain.SysOperLog; + +/** + * 鎿嶄綔鏃ュ織 鏈嶅姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysOperLogServiceImpl implements ISysOperLogService +{ + @Autowired + private SysOperLogMapper operLogMapper; + + /** + * 鏂板鎿嶄綔鏃ュ織 + * + * @param operLog 鎿嶄綔鏃ュ織瀵硅薄 + * @return 缁撴灉 + */ + @Override + public int insertOperlog(SysOperLog operLog) + { + return operLogMapper.insertOperlog(operLog); + } + + /** + * 鏌ヨ绯荤粺鎿嶄綔鏃ュ織闆嗗悎 + * + * @param operLog 鎿嶄綔鏃ュ織瀵硅薄 + * @return 鎿嶄綔鏃ュ織闆嗗悎 + */ + @Override + public List selectOperLogList(SysOperLog operLog) + { + return operLogMapper.selectOperLogList(operLog); + } + + /** + * 鎵归噺鍒犻櫎绯荤粺鎿嶄綔鏃ュ織 + * + * @param operIds 闇瑕佸垹闄ょ殑鎿嶄綔鏃ュ織ID + * @return 缁撴灉 + */ + @Override + public int deleteOperLogByIds(Long[] operIds) + { + return operLogMapper.deleteOperLogByIds(operIds); + } + + /** + * 鏌ヨ鎿嶄綔鏃ュ織璇︾粏 + * + * @param operId 鎿嶄綔ID + * @return 鎿嶄綔鏃ュ織瀵硅薄 + */ + @Override + public SysOperLog selectOperLogById(Long operId) + { + return operLogMapper.selectOperLogById(operId); + } + + /** + * 娓呯┖鎿嶄綔鏃ュ織 + */ + @Override + public void cleanOperLog() + { + operLogMapper.cleanOperLog(); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysPermissionServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysPermissionServiceImpl.java new file mode 100644 index 0000000..486c2d1 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysPermissionServiceImpl.java @@ -0,0 +1,66 @@ +package com.zhentao.system.service.impl; + +import java.util.HashSet; +import java.util.Set; + +import com.zhentao.system.service.ISysMenuService; +import com.zhentao.system.service.ISysPermissionService; +import com.zhentao.system.service.ISysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.zhentao.system.api.domain.SysUser; + +@Service +public class SysPermissionServiceImpl implements ISysPermissionService +{ + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysMenuService menuService; + + /** + * 鑾峰彇瑙掕壊鏁版嵁鏉冮檺 + * + * @param userId 鐢ㄦ埛Id + * @return 瑙掕壊鏉冮檺淇℃伅 + */ + @Override + public Set getRolePermission(Long userId) + { + Set roles = new HashSet(); + // 绠$悊鍛樻嫢鏈夋墍鏈夋潈闄 + if (SysUser.isAdmin(userId)) + { + roles.add("admin"); + } + else + { + roles.addAll(roleService.selectRolePermissionByUserId(userId)); + } + return roles; + } + + /** + * 鑾峰彇鑿滃崟鏁版嵁鏉冮檺 + * + * @param userId 鐢ㄦ埛Id + * @return 鑿滃崟鏉冮檺淇℃伅 + */ + @Override + public Set getMenuPermission(Long userId) + { + Set perms = new HashSet(); + // 绠$悊鍛樻嫢鏈夋墍鏈夋潈闄 + if (SysUser.isAdmin(userId)) + { + perms.add("*:*:*"); + } + else + { + perms.addAll(menuService.selectMenuPermsByUserId(userId)); + } + return perms; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysPostServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..649b920 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysPostServiceImpl.java @@ -0,0 +1,181 @@ +package com.zhentao.system.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.exception.CustomException; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.system.domain.SysPost; +import com.zhentao.system.mapper.SysPostMapper; +import com.zhentao.system.mapper.SysUserPostMapper; +import com.zhentao.system.service.ISysPostService; + +/** + * 宀椾綅淇℃伅 鏈嶅姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysPostServiceImpl implements ISysPostService +{ + @Autowired + private SysPostMapper postMapper; + + @Autowired + private SysUserPostMapper userPostMapper; + + /** + * 鏌ヨ宀椾綅淇℃伅闆嗗悎 + * + * @param post 宀椾綅淇℃伅 + * @return 宀椾綅淇℃伅闆嗗悎 + */ + @Override + public List selectPostList(SysPost post) + { + return postMapper.selectPostList(post); + } + + /** + * 鏌ヨ鎵鏈夊矖浣 + * + * @return 宀椾綅鍒楄〃 + */ + @Override + public List selectPostAll() + { + return postMapper.selectPostAll(); + } + + /** + * 閫氳繃宀椾綅ID鏌ヨ宀椾綅淇℃伅 + * + * @param postId 宀椾綅ID + * @return 瑙掕壊瀵硅薄淇℃伅 + */ + @Override + public SysPost selectPostById(Long postId) + { + return postMapper.selectPostById(postId); + } + + /** + * 鏍规嵁鐢ㄦ埛ID鑾峰彇宀椾綅閫夋嫨妗嗗垪琛 + * + * @param userId 鐢ㄦ埛ID + * @return 閫変腑宀椾綅ID鍒楄〃 + */ + @Override + public List selectPostListByUserId(Long userId) + { + return postMapper.selectPostListByUserId(userId); + } + + /** + * 鏍¢獙宀椾綅鍚嶇О鏄惁鍞竴 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkPostNameUnique(SysPost post) + { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + SysPost info = postMapper.checkPostNameUnique(post.getPostName()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙宀椾綅缂栫爜鏄惁鍞竴 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkPostCodeUnique(SysPost post) + { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + SysPost info = postMapper.checkPostCodeUnique(post.getPostCode()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 閫氳繃宀椾綅ID鏌ヨ宀椾綅浣跨敤鏁伴噺 + * + * @param postId 宀椾綅ID + * @return 缁撴灉 + */ + @Override + public int countUserPostById(Long postId) + { + return userPostMapper.countUserPostById(postId); + } + + /** + * 鍒犻櫎宀椾綅淇℃伅 + * + * @param postId 宀椾綅ID + * @return 缁撴灉 + */ + @Override + public int deletePostById(Long postId) + { + return postMapper.deletePostById(postId); + } + + /** + * 鎵归噺鍒犻櫎宀椾綅淇℃伅 + * + * @param postIds 闇瑕佸垹闄ょ殑宀椾綅ID + * @return 缁撴灉 + * @throws Exception 寮傚父 + */ + @Override + public int deletePostByIds(Long[] postIds) + { + for (Long postId : postIds) + { + SysPost post = selectPostById(postId); + if (countUserPostById(postId) > 0) + { + throw new CustomException(String.format("%1$s宸插垎閰,涓嶈兘鍒犻櫎", post.getPostName())); + } + } + return postMapper.deletePostByIds(postIds); + } + + /** + * 鏂板淇濆瓨宀椾綅淇℃伅 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertPost(SysPost post) + { + return postMapper.insertPost(post); + } + + /** + * 淇敼淇濆瓨宀椾綅淇℃伅 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updatePost(SysPost post) + { + return postMapper.updatePost(post); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysRoleServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..03df266 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,329 @@ +package com.zhentao.system.service.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.zhentao.system.domain.SysRoleDept; +import com.zhentao.system.domain.SysRoleMenu; +import com.zhentao.system.mapper.SysRoleDeptMapper; +import com.zhentao.system.mapper.SysRoleMapper; +import com.zhentao.system.mapper.SysRoleMenuMapper; +import com.zhentao.system.mapper.SysUserRoleMapper; +import com.zhentao.system.service.ISysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.exception.CustomException; +import com.zhentao.common.core.utils.SpringUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.datascope.annotation.DataScope; +import com.zhentao.system.api.domain.SysRole; + +/** + * 瑙掕壊 涓氬姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysRoleServiceImpl implements ISysRoleService +{ + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysRoleMenuMapper roleMenuMapper; + + @Autowired + private SysUserRoleMapper userRoleMapper; + + @Autowired + private SysRoleDeptMapper roleDeptMapper; + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瑙掕壊鏁版嵁 + * + * @param role 瑙掕壊淇℃伅 + * @return 瑙掕壊鏁版嵁闆嗗悎淇℃伅 + */ + @Override + @DataScope(deptAlias = "d") + public List selectRoleList(SysRole role) + { + return roleMapper.selectRoleList(role); + } + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺 + * + * @param userId 鐢ㄦ埛ID + * @return 鏉冮檺鍒楄〃 + */ + @Override + public Set selectRolePermissionByUserId(Long userId) + { + List perms = roleMapper.selectRolePermissionByUserId(userId); + Set permsSet = new HashSet<>(); + for (SysRole perm : perms) + { + if (StringUtils.isNotNull(perm)) + { + permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); + } + } + return permsSet; + } + + /** + * 鏌ヨ鎵鏈夎鑹 + * + * @return 瑙掕壊鍒楄〃 + */ + @Override + public List selectRoleAll() + { + return SpringUtils.getAopProxy(this).selectRoleList(new SysRole()); + } + + /** + * 鏍规嵁鐢ㄦ埛ID鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛 + * + * @param userId 鐢ㄦ埛ID + * @return 閫変腑瑙掕壊ID鍒楄〃 + */ + @Override + public List selectRoleListByUserId(Long userId) + { + return roleMapper.selectRoleListByUserId(userId); + } + + /** + * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @return 瑙掕壊瀵硅薄淇℃伅 + */ + @Override + public SysRole selectRoleById(Long roleId) + { + return roleMapper.selectRoleById(roleId); + } + + /** + * 鏍¢獙瑙掕壊鍚嶇О鏄惁鍞竴 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkRoleNameUnique(SysRole role) + { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙瑙掕壊鏉冮檺鏄惁鍞竴 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkRoleKeyUnique(SysRole role) + { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙瑙掕壊鏄惁鍏佽鎿嶄綔 + * + * @param role 瑙掕壊淇℃伅 + */ + @Override + public void checkRoleAllowed(SysRole role) + { + if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()) + { + throw new CustomException("涓嶅厑璁告搷浣滆秴绾х鐞嗗憳瑙掕壊"); + } + } + + /** + * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊浣跨敤鏁伴噺 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + @Override + public int countUserRoleByRoleId(Long roleId) + { + return userRoleMapper.countUserRoleByRoleId(roleId); + } + + /** + * 鏂板淇濆瓨瑙掕壊淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int insertRole(SysRole role) + { + // 鏂板瑙掕壊淇℃伅 + roleMapper.insertRole(role); + return insertRoleMenu(role); + } + + /** + * 淇敼淇濆瓨瑙掕壊淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int updateRole(SysRole role) + { + // 淇敼瑙掕壊淇℃伅 + roleMapper.updateRole(role); + // 鍒犻櫎瑙掕壊涓庤彍鍗曞叧鑱 + roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId()); + return insertRoleMenu(role); + } + + /** + * 淇敼瑙掕壊鐘舵 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateRoleStatus(SysRole role) + { + return roleMapper.updateRole(role); + } + + /** + * 淇敼鏁版嵁鏉冮檺淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int authDataScope(SysRole role) + { + // 淇敼瑙掕壊淇℃伅 + roleMapper.updateRole(role); + // 鍒犻櫎瑙掕壊涓庨儴闂ㄥ叧鑱 + roleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId()); + // 鏂板瑙掕壊鍜岄儴闂ㄤ俊鎭紙鏁版嵁鏉冮檺锛 + return insertRoleDept(role); + } + + /** + * 鏂板瑙掕壊鑿滃崟淇℃伅 + * + * @param role 瑙掕壊瀵硅薄 + */ + public int insertRoleMenu(SysRole role) + { + int rows = 1; + // 鏂板鐢ㄦ埛涓庤鑹茬鐞 + List list = new ArrayList(); + for (Long menuId : role.getMenuIds()) + { + SysRoleMenu rm = new SysRoleMenu(); + rm.setRoleId(role.getRoleId()); + rm.setMenuId(menuId); + list.add(rm); + } + if (list.size() > 0) + { + rows = roleMenuMapper.batchRoleMenu(list); + } + return rows; + } + + /** + * 鏂板瑙掕壊閮ㄩ棬淇℃伅(鏁版嵁鏉冮檺) + * + * @param role 瑙掕壊瀵硅薄 + */ + public int insertRoleDept(SysRole role) + { + int rows = 1; + // 鏂板瑙掕壊涓庨儴闂紙鏁版嵁鏉冮檺锛夌鐞 + List list = new ArrayList(); + for (Long deptId : role.getDeptIds()) + { + SysRoleDept rd = new SysRoleDept(); + rd.setRoleId(role.getRoleId()); + rd.setDeptId(deptId); + list.add(rd); + } + if (list.size() > 0) + { + rows = roleDeptMapper.batchRoleDept(list); + } + return rows; + } + + /** + * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + @Override + @Transactional + public int deleteRoleById(Long roleId) + { + // 鍒犻櫎瑙掕壊涓庤彍鍗曞叧鑱 + roleMenuMapper.deleteRoleMenuByRoleId(roleId); + // 鍒犻櫎瑙掕壊涓庨儴闂ㄥ叧鑱 + roleDeptMapper.deleteRoleDeptByRoleId(roleId); + return roleMapper.deleteRoleById(roleId); + } + + /** + * 鎵归噺鍒犻櫎瑙掕壊淇℃伅 + * + * @param roleIds 闇瑕佸垹闄ょ殑瑙掕壊ID + * @return 缁撴灉 + */ + @Override + @Transactional + public int deleteRoleByIds(Long[] roleIds) + { + for (Long roleId : roleIds) + { + checkRoleAllowed(new SysRole(roleId)); + SysRole role = selectRoleById(roleId); + if (countUserRoleByRoleId(roleId) > 0) + { + throw new CustomException(String.format("%1$s宸插垎閰,涓嶈兘鍒犻櫎", role.getRoleName())); + } + } + // 鍒犻櫎瑙掕壊涓庤彍鍗曞叧鑱 + roleMenuMapper.deleteRoleMenu(roleIds); + // 鍒犻櫎瑙掕壊涓庨儴闂ㄥ叧鑱 + roleDeptMapper.deleteRoleDept(roleIds); + return roleMapper.deleteRoleByIds(roleIds); + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysUserOnlineServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysUserOnlineServiceImpl.java new file mode 100644 index 0000000..9345b7a --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysUserOnlineServiceImpl.java @@ -0,0 +1,89 @@ +package com.zhentao.system.service.impl; + +import org.springframework.stereotype.Service; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.system.api.model.LoginUser; +import com.zhentao.system.domain.SysUserOnline; +import com.zhentao.system.service.ISysUserOnlineService; + +/** + * 鍦ㄧ嚎鐢ㄦ埛 鏈嶅姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysUserOnlineServiceImpl implements ISysUserOnlineService +{ + /** + * 閫氳繃鐧诲綍鍦板潃鏌ヨ淇℃伅 + * + * @param ipaddr 鐧诲綍鍦板潃 + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + @Override + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) + { + if (StringUtils.equals(ipaddr, user.getIpaddr())) + { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 閫氳繃鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 + * + * @param userName 鐢ㄦ埛鍚嶇О + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + @Override + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) + { + if (StringUtils.equals(userName, user.getUsername())) + { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 閫氳繃鐧诲綍鍦板潃/鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 + * + * @param ipaddr 鐧诲綍鍦板潃 + * @param userName 鐢ㄦ埛鍚嶇О + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + @Override + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) + { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) + { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 璁剧疆鍦ㄧ嚎鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛 + */ + @Override + public SysUserOnline loginUserToUserOnline(LoginUser user) + { + if (StringUtils.isNull(user)) + { + return null; + } + SysUserOnline sysUserOnline = new SysUserOnline(); + sysUserOnline.setTokenId(user.getToken()); + sysUserOnline.setUserName(user.getUsername()); + sysUserOnline.setIpaddr(user.getIpaddr()); + sysUserOnline.setLoginTime(user.getLoginTime()); + return sysUserOnline; + } +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysUserServiceImpl.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..e310b53 --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/service/impl/SysUserServiceImpl.java @@ -0,0 +1,464 @@ +package com.zhentao.system.service.impl; + +import java.util.ArrayList; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.zhentao.common.core.constant.UserConstants; +import com.zhentao.common.core.exception.CustomException; +import com.zhentao.common.core.utils.SecurityUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.datascope.annotation.DataScope; +import com.zhentao.system.api.domain.SysRole; +import com.zhentao.system.api.domain.SysUser; +import com.zhentao.system.domain.SysPost; +import com.zhentao.system.domain.SysUserPost; +import com.zhentao.system.domain.SysUserRole; +import com.zhentao.system.mapper.SysPostMapper; +import com.zhentao.system.mapper.SysRoleMapper; +import com.zhentao.system.mapper.SysUserMapper; +import com.zhentao.system.mapper.SysUserPostMapper; +import com.zhentao.system.mapper.SysUserRoleMapper; +import com.zhentao.system.service.ISysConfigService; +import com.zhentao.system.service.ISysUserService; + +/** + * 鐢ㄦ埛 涓氬姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysUserServiceImpl implements ISysUserService +{ + private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); + + @Autowired + private SysUserMapper userMapper; + + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysPostMapper postMapper; + + @Autowired + private SysUserRoleMapper userRoleMapper; + + @Autowired + private SysUserPostMapper userPostMapper; + + @Autowired + private ISysConfigService configService; + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鐢ㄦ埛鍒楄〃 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectUserList(SysUser user) + { + return userMapper.selectUserList(user); + } + + /** + * 閫氳繃鐢ㄦ埛鍚嶆煡璇㈢敤鎴 + * + * @param userName 鐢ㄦ埛鍚 + * @return 鐢ㄦ埛瀵硅薄淇℃伅 + */ + @Override + public SysUser selectUserByUserName(String userName) + { + return userMapper.selectUserByUserName(userName); + } + + /** + * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛ID + * @return 鐢ㄦ埛瀵硅薄淇℃伅 + */ + @Override + public SysUser selectUserById(Long userId) + { + return userMapper.selectUserById(userId); + } + + /** + * 鏌ヨ鐢ㄦ埛鎵灞炶鑹茬粍 + * + * @param userName 鐢ㄦ埛鍚 + * @return 缁撴灉 + */ + @Override + public String selectUserRoleGroup(String userName) + { + List list = roleMapper.selectRolesByUserName(userName); + StringBuffer idsStr = new StringBuffer(); + for (SysRole role : list) + { + idsStr.append(role.getRoleName()).append(","); + } + if (StringUtils.isNotEmpty(idsStr.toString())) + { + return idsStr.substring(0, idsStr.length() - 1); + } + return idsStr.toString(); + } + + /** + * 鏌ヨ鐢ㄦ埛鎵灞炲矖浣嶇粍 + * + * @param userName 鐢ㄦ埛鍚 + * @return 缁撴灉 + */ + @Override + public String selectUserPostGroup(String userName) + { + List list = postMapper.selectPostsByUserName(userName); + StringBuffer idsStr = new StringBuffer(); + for (SysPost post : list) + { + idsStr.append(post.getPostName()).append(","); + } + if (StringUtils.isNotEmpty(idsStr.toString())) + { + return idsStr.substring(0, idsStr.length() - 1); + } + return idsStr.toString(); + } + + /** + * 鏍¢獙鐢ㄦ埛鍚嶇О鏄惁鍞竴 + * + * @param userName 鐢ㄦ埛鍚嶇О + * @return 缁撴灉 + */ + @Override + public String checkUserNameUnique(String userName) + { + int count = userMapper.checkUserNameUnique(userName); + if (count > 0) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙鐢ㄦ埛鍚嶇О鏄惁鍞竴 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return + */ + @Override + public String checkPhoneUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙email鏄惁鍞竴 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return + */ + @Override + public String checkEmailUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkEmailUnique(user.getEmail()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙鐢ㄦ埛鏄惁鍏佽鎿嶄綔 + * + * @param user 鐢ㄦ埛淇℃伅 + */ + @Override + public void checkUserAllowed(SysUser user) + { + if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) + { + throw new CustomException("涓嶅厑璁告搷浣滆秴绾х鐞嗗憳鐢ㄦ埛"); + } + } + + /** + * 鏂板淇濆瓨鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int insertUser(SysUser user) + { + // 鏂板鐢ㄦ埛淇℃伅 + int rows = userMapper.insertUser(user); + // 鏂板鐢ㄦ埛宀椾綅鍏宠仈 + insertUserPost(user); + // 鏂板鐢ㄦ埛涓庤鑹茬鐞 + insertUserRole(user); + return rows; + } + + /** + * 淇敼淇濆瓨鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int updateUser(SysUser user) + { + Long userId = user.getUserId(); + // 鍒犻櫎鐢ㄦ埛涓庤鑹插叧鑱 + userRoleMapper.deleteUserRoleByUserId(userId); + // 鏂板鐢ㄦ埛涓庤鑹茬鐞 + insertUserRole(user); + // 鍒犻櫎鐢ㄦ埛涓庡矖浣嶅叧鑱 + userPostMapper.deleteUserPostByUserId(userId); + // 鏂板鐢ㄦ埛涓庡矖浣嶇鐞 + insertUserPost(user); + return userMapper.updateUser(user); + } + + /** + * 淇敼鐢ㄦ埛鐘舵 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateUserStatus(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 淇敼鐢ㄦ埛鍩烘湰淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateUserProfile(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 淇敼鐢ㄦ埛澶村儚 + * + * @param userName 鐢ㄦ埛鍚 + * @param avatar 澶村儚鍦板潃 + * @return 缁撴灉 + */ + @Override + public boolean updateUserAvatar(String userName, String avatar) + { + return userMapper.updateUserAvatar(userName, avatar) > 0; + } + + /** + * 閲嶇疆鐢ㄦ埛瀵嗙爜 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + @Override + public int resetPwd(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 閲嶇疆鐢ㄦ埛瀵嗙爜 + * + * @param userName 鐢ㄦ埛鍚 + * @param password 瀵嗙爜 + * @return 缁撴灉 + */ + @Override + public int resetUserPwd(String userName, String password) + { + return userMapper.resetUserPwd(userName, password); + } + + /** + * 鏂板鐢ㄦ埛瑙掕壊淇℃伅 + * + * @param user 鐢ㄦ埛瀵硅薄 + */ + public void insertUserRole(SysUser user) + { + Long[] roles = user.getRoleIds(); + if (StringUtils.isNotNull(roles)) + { + // 鏂板鐢ㄦ埛涓庤鑹茬鐞 + List list = new ArrayList(); + for (Long roleId : roles) + { + SysUserRole ur = new SysUserRole(); + ur.setUserId(user.getUserId()); + ur.setRoleId(roleId); + list.add(ur); + } + if (list.size() > 0) + { + userRoleMapper.batchUserRole(list); + } + } + } + + /** + * 鏂板鐢ㄦ埛宀椾綅淇℃伅 + * + * @param user 鐢ㄦ埛瀵硅薄 + */ + public void insertUserPost(SysUser user) + { + Long[] posts = user.getPostIds(); + if (StringUtils.isNotNull(posts)) + { + // 鏂板鐢ㄦ埛涓庡矖浣嶇鐞 + List list = new ArrayList(); + for (Long postId : posts) + { + SysUserPost up = new SysUserPost(); + up.setUserId(user.getUserId()); + up.setPostId(postId); + list.add(up); + } + if (list.size() > 0) + { + userPostMapper.batchUserPost(list); + } + } + } + + /** + * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛ID + * @return 缁撴灉 + */ + @Override + @Transactional + public int deleteUserById(Long userId) + { + // 鍒犻櫎鐢ㄦ埛涓庤鑹插叧鑱 + userRoleMapper.deleteUserRoleByUserId(userId); + // 鍒犻櫎鐢ㄦ埛涓庡矖浣嶈〃 + userPostMapper.deleteUserPostByUserId(userId); + return userMapper.deleteUserById(userId); + } + + /** + * 鎵归噺鍒犻櫎鐢ㄦ埛淇℃伅 + * + * @param userIds 闇瑕佸垹闄ょ殑鐢ㄦ埛ID + * @return 缁撴灉 + */ + @Override + @Transactional + public int deleteUserByIds(Long[] userIds) + { + for (Long userId : userIds) + { + checkUserAllowed(new SysUser(userId)); + } + // 鍒犻櫎鐢ㄦ埛涓庤鑹插叧鑱 + userRoleMapper.deleteUserRole(userIds); + // 鍒犻櫎鐢ㄦ埛涓庡矖浣嶅叧鑱 + userPostMapper.deleteUserPost(userIds); + return userMapper.deleteUserByIds(userIds); + } + + /** + * 瀵煎叆鐢ㄦ埛鏁版嵁 + * + * @param userList 鐢ㄦ埛鏁版嵁鍒楄〃 + * @param isUpdateSupport 鏄惁鏇存柊鏀寔锛屽鏋滃凡瀛樺湪锛屽垯杩涜鏇存柊鏁版嵁 + * @param operName 鎿嶄綔鐢ㄦ埛 + * @return 缁撴灉 + */ + @Override + public String importUser(List userList, Boolean isUpdateSupport, String operName) + { + if (StringUtils.isNull(userList) || userList.size() == 0) + { + throw new CustomException("瀵煎叆鐢ㄦ埛鏁版嵁涓嶈兘涓虹┖锛"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + String password = configService.selectConfigByKey("sys.user.initPassword"); + for (SysUser user : userList) + { + try + { + // 楠岃瘉鏄惁瀛樺湪杩欎釜鐢ㄦ埛 + SysUser u = userMapper.selectUserByUserName(user.getUserName()); + if (StringUtils.isNull(u)) + { + user.setPassword(SecurityUtils.encryptPassword(password)); + user.setCreateBy(operName); + this.insertUser(user); + successNum++; + successMsg.append("
" + successNum + "銆佽处鍙 " + user.getUserName() + " 瀵煎叆鎴愬姛"); + } + else if (isUpdateSupport) + { + user.setUpdateBy(operName); + this.updateUser(user); + successNum++; + successMsg.append("
" + successNum + "銆佽处鍙 " + user.getUserName() + " 鏇存柊鎴愬姛"); + } + else + { + failureNum++; + failureMsg.append("
" + failureNum + "銆佽处鍙 " + user.getUserName() + " 宸插瓨鍦"); + } + } + catch (Exception e) + { + failureNum++; + String msg = "
" + failureNum + "銆佽处鍙 " + user.getUserName() + " 瀵煎叆澶辫触锛"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + } + if (failureNum > 0) + { + failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細"); + throw new CustomException(failureMsg.toString()); + } + else + { + successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏 " + successNum + " 鏉★紝鏁版嵁濡備笅锛"); + } + return successMsg.toString(); + } + +} diff --git a/smart-modules/smart-system/src/main/java/com/zhentao/system/utils/DictUtils.java b/smart-modules/smart-system/src/main/java/com/zhentao/system/utils/DictUtils.java new file mode 100644 index 0000000..3e6ac5a --- /dev/null +++ b/smart-modules/smart-system/src/main/java/com/zhentao/system/utils/DictUtils.java @@ -0,0 +1,65 @@ +package com.zhentao.system.utils; + +import java.util.Collection; +import java.util.List; +import com.zhentao.common.core.constant.Constants; +import com.zhentao.common.core.utils.SpringUtils; +import com.zhentao.common.core.utils.StringUtils; +import com.zhentao.common.redis.service.RedisService; +import com.zhentao.system.domain.SysDictData; + +/** + * 瀛楀吀宸ュ叿绫 + * + * @author ruoyi + */ +public class DictUtils +{ + /** + * 璁剧疆瀛楀吀缂撳瓨 + * + * @param key 鍙傛暟閿 + * @param dictDatas 瀛楀吀鏁版嵁鍒楄〃 + */ + public static void setDictCache(String key, List dictDatas) + { + SpringUtils.getBean(RedisService.class).setCacheObject(getCacheKey(key), dictDatas); + } + + /** + * 鑾峰彇瀛楀吀缂撳瓨 + * + * @param key 鍙傛暟閿 + * @return dictDatas 瀛楀吀鏁版嵁鍒楄〃 + */ + public static List getDictCache(String key) + { + Object cacheObj = SpringUtils.getBean(RedisService.class).getCacheObject(getCacheKey(key)); + if (StringUtils.isNotNull(cacheObj)) + { + List dictDatas = StringUtils.cast(cacheObj); + return dictDatas; + } + return null; + } + + /** + * 娓呯┖瀛楀吀缂撳瓨 + */ + public static void clearDictCache() + { + Collection keys = SpringUtils.getBean(RedisService.class).keys(Constants.SYS_DICT_KEY + "*"); + SpringUtils.getBean(RedisService.class).deleteObject(keys); + } + + /** + * 璁剧疆cache key + * + * @param configKey 鍙傛暟閿 + * @return 缂撳瓨閿甼ey + */ + public static String getCacheKey(String configKey) + { + return Constants.SYS_DICT_KEY + configKey; + } +} diff --git a/smart-modules/smart-system/src/main/resources/banner.txt b/smart-modules/smart-system/src/main/resources/banner.txt new file mode 100644 index 0000000..fbd45f5 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ ___ _ _ ___ | |_ ___ _ __ ___ +| '__|| | | | / _ \ | | | || ||______|/ __|| | | |/ __|| __| / _ \| '_ ` _ \ +| | | |_| || (_) || |_| || | \__ \| |_| |\__ \| |_ | __/| | | | | | +|_| \__,_| \___/ \__, ||_| |___/ \__, ||___/ \__| \___||_| |_| |_| + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/smart-modules/smart-system/src/main/resources/bootstrap.yml b/smart-modules/smart-system/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..08c9725 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/bootstrap.yml @@ -0,0 +1,27 @@ +# Tomcat +server: + port: 9201 + +# Spring +spring: + application: + # 搴旂敤鍚嶇О + name: ruoyi-system + profiles: + # 鐜閰嶇疆 + active: dev + cloud: + nacos: + discovery: + # 鏈嶅姟娉ㄥ唽鍦板潃 + server-addr: 8.130.77.16:8848 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + config: + # 閰嶇疆涓績鍦板潃 + server-addr: 8.130.77.16:8848 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + # 閰嶇疆鏂囦欢鏍煎紡 + file-extension: yml + # 鍏变韩閰嶇疆 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} diff --git a/smart-modules/smart-system/src/main/resources/logback.xml b/smart-modules/smart-system/src/main/resources/logback.xml new file mode 100644 index 0000000..0154e28 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/smart-modules/smart-system/src/main/resources/mapper/SmartCsMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/SmartCsMapper.xml new file mode 100644 index 0000000..9c0df5c --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/SmartCsMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + id,cs + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysConfigMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysConfigMapper.xml new file mode 100644 index 0000000..d74b43d --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysConfigMapper.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark + from sys_config + + + + + + + and config_id = #{configId} + + + and config_key = #{configKey} + + + + + + + + + + + + insert into sys_config ( + config_name, + config_key, + config_value, + config_type, + create_by, + remark, + create_time + )values( + #{configName}, + #{configKey}, + #{configValue}, + #{configType}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_config + + config_name = #{configName}, + config_key = #{configKey}, + config_value = #{configValue}, + config_type = #{configType}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where config_id = #{configId} + + + + delete from sys_config where config_id = #{configId} + + + + delete from sys_config where config_id in + + #{configId} + + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysDeptMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysDeptMapper.xml new file mode 100644 index 0000000..b9c4f55 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time + from sys_dept d + + + + + + + + + + + + + + + + + + + + insert into sys_dept( + dept_id, + parent_id, + dept_name, + ancestors, + order_num, + leader, + phone, + email, + status, + create_by, + create_time + )values( + #{deptId}, + #{parentId}, + #{deptName}, + #{ancestors}, + #{orderNum}, + #{leader}, + #{phone}, + #{email}, + #{status}, + #{createBy}, + sysdate() + ) + + + + update sys_dept + + parent_id = #{parentId}, + dept_name = #{deptName}, + ancestors = #{ancestors}, + order_num = #{orderNum}, + leader = #{leader}, + phone = #{phone}, + email = #{email}, + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where dept_id = #{deptId} + + + + update sys_dept set ancestors = + + when #{item.deptId} then #{item.ancestors} + + where dept_id in + + #{item.deptId} + + + + + update sys_dept + + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where dept_id in (${ancestors}) + + + + update sys_dept set del_flag = '2' where dept_id = #{deptId} + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysDictDataMapper.xml new file mode 100644 index 0000000..449f1b7 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + select dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark + from sys_dict_data + + + + + + + + + + + + + + delete from sys_dict_data where dict_code = #{dictCode} + + + + delete from sys_dict_data where dict_code in + + #{dictCode} + + + + + update sys_dict_data + + dict_sort = #{dictSort}, + dict_label = #{dictLabel}, + dict_value = #{dictValue}, + dict_type = #{dictType}, + css_class = #{cssClass}, + list_class = #{listClass}, + is_default = #{isDefault}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_code = #{dictCode} + + + + update sys_dict_data set dict_type = #{newDictType} where dict_type = #{oldDictType} + + + + insert into sys_dict_data( + dict_sort, + dict_label, + dict_value, + dict_type, + css_class, + list_class, + is_default, + status, + remark, + create_by, + create_time + )values( + #{dictSort}, + #{dictLabel}, + #{dictValue}, + #{dictType}, + #{cssClass}, + #{listClass}, + #{isDefault}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysDictTypeMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysDictTypeMapper.xml new file mode 100644 index 0000000..ef85927 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysDictTypeMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + select dict_id, dict_name, dict_type, status, create_by, create_time, remark + from sys_dict_type + + + + + + + + + + + + + + delete from sys_dict_type where dict_id = #{dictId} + + + + delete from sys_dict_type where dict_id in + + #{dictId} + + + + + update sys_dict_type + + dict_name = #{dictName}, + dict_type = #{dictType}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_id = #{dictId} + + + + insert into sys_dict_type( + dict_name, + dict_type, + status, + remark, + create_by, + create_time + )values( + #{dictName}, + #{dictType}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysLogininforMapper.xml new file mode 100644 index 0000000..340c9e4 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + insert into sys_logininfor (user_name, status, ipaddr, msg, access_time) + values (#{userName}, #{status}, #{ipaddr}, #{msg}, sysdate()) + + + + + + delete from sys_logininfor where info_id in + + #{infoId} + + + + + truncate table sys_logininfor + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysMenuMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysMenuMapper.xml new file mode 100644 index 0000000..67045d6 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time + from sys_menu + + + + + + + + + + + + + + + + + + + + + + + + update sys_menu + + menu_name = #{menuName}, + parent_id = #{parentId}, + order_num = #{orderNum}, + path = #{path}, + component = #{component}, + is_frame = #{isFrame}, + is_cache = #{isCache}, + menu_type = #{menuType}, + visible = #{visible}, + status = #{status}, + perms = #{perms}, + icon = #{icon}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where menu_id = #{menuId} + + + + insert into sys_menu( + menu_id, + parent_id, + menu_name, + order_num, + path, + component, + is_frame, + is_cache, + menu_type, + visible, + status, + perms, + icon, + remark, + create_by, + create_time + )values( + #{menuId}, + #{parentId}, + #{menuName}, + #{orderNum}, + #{path}, + #{component}, + #{isFrame}, + #{isCache}, + #{menuType}, + #{visible}, + #{status}, + #{perms}, + #{icon}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_menu where menu_id = #{menuId} + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysNoticeMapper.xml new file mode 100644 index 0000000..c40d8d0 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysNoticeMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + select notice_id, notice_title, notice_type, cast(notice_content as char) as notice_content, status, create_by, create_time, update_by, update_time, remark + from sys_notice + + + + + + + + insert into sys_notice ( + notice_title, + notice_type, + notice_content, + status, + remark, + create_by, + create_time + )values( + #{noticeTitle}, + #{noticeType}, + #{noticeContent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_notice + + notice_title = #{noticeTitle}, + notice_type = #{noticeType}, + notice_content = #{noticeContent}, + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where notice_id = #{noticeId} + + + + delete from sys_notice where notice_id = #{noticeId} + + + + delete from sys_notice where notice_id in + + #{noticeId} + + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysOperLogMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysOperLogMapper.xml new file mode 100644 index 0000000..d10e15a --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysOperLogMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_param, json_result, status, error_msg, oper_time + from sys_oper_log + + + + insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_param, json_result, status, error_msg, oper_time) + values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, sysdate()) + + + + + + delete from sys_oper_log where oper_id in + + #{operId} + + + + + + + truncate table sys_oper_log + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysPostMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysPostMapper.xml new file mode 100644 index 0000000..0744421 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysPostMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + select post_id, post_code, post_name, post_sort, status, create_by, create_time, remark + from sys_post + + + + + + + + + + + + + + + + + + update sys_post + + post_code = #{postCode}, + post_name = #{postName}, + post_sort = #{postSort}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where post_id = #{postId} + + + + insert into sys_post( + post_id, + post_code, + post_name, + post_sort, + status, + remark, + create_by, + create_time + )values( + #{postId}, + #{postCode}, + #{postName}, + #{postSort}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_post where post_id = #{postId} + + + + delete from sys_post where post_id in + + #{postId} + + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml new file mode 100644 index 0000000..0aff4eb --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_role_dept where role_id=#{roleId} + + + + + + delete from sys_role_dept where role_id in + + #{roleId} + + + + + insert into sys_role_dept(role_id, dept_id) values + + (#{item.roleId},#{item.deptId}) + + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysRoleMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysRoleMapper.xml new file mode 100644 index 0000000..206f1b3 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly, + r.status, r.del_flag, r.create_time, r.remark + from sys_role r + left join sys_user_role ur on ur.role_id = r.role_id + left join sys_user u on u.user_id = ur.user_id + left join sys_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + + + + + + + + insert into sys_role( + role_id, + role_name, + role_key, + role_sort, + data_scope, + menu_check_strictly, + dept_check_strictly, + status, + remark, + create_by, + create_time + )values( + #{roleId}, + #{roleName}, + #{roleKey}, + #{roleSort}, + #{dataScope}, + #{menuCheckStrictly}, + #{deptCheckStrictly}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_role + + role_name = #{roleName}, + role_key = #{roleKey}, + role_sort = #{roleSort}, + data_scope = #{dataScope}, + menu_check_strictly = #{menuCheckStrictly}, + dept_check_strictly = #{deptCheckStrictly}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where role_id = #{roleId} + + + + update sys_user set status = #{status} where user_id = #{userId} + + + + delete from sys_role where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id in + + #{roleId} + + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml new file mode 100644 index 0000000..9591eef --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + delete from sys_role_menu where role_id=#{roleId} + + + + delete from sys_role_menu where role_id in + + #{roleId} + + + + + insert into sys_role_menu(role_id, menu_id) values + + (#{item.roleId},#{item.menuId}) + + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysUserMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysUserMapper.xml new file mode 100644 index 0000000..b1ab20e --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, + d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status, + r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status + from sys_user u + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role ur on u.user_id = ur.user_id + left join sys_role r on r.role_id = ur.role_id + + + + + + + + + + + + + + + + insert into sys_user( + user_id, + dept_id, + user_name, + nick_name, + email, + avatar, + phonenumber, + sex, + password, + status, + create_by, + remark, + create_time + )values( + #{userId}, + #{deptId}, + #{userName}, + #{nickName}, + #{email}, + #{avatar}, + #{phonenumber}, + #{sex}, + #{password}, + #{status}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_user + + dept_id = #{deptId}, + user_name = #{userName}, + nick_name = #{nickName}, + email = #{email}, + phonenumber = #{phonenumber}, + sex = #{sex}, + avatar = #{avatar}, + password = #{password}, + status = #{status}, + login_ip = #{loginIp}, + login_date = #{loginDate}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where user_id = #{userId} + + + + update sys_user set status = #{status} where user_id = #{userId} + + + + update sys_user set avatar = #{avatar} where user_name = #{userName} + + + + update sys_user set password = #{password} where user_name = #{userName} + + + + delete from sys_user where user_id = #{userId} + + + + update sys_user set del_flag = '2' where user_id in + + #{userId} + + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysUserPostMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysUserPostMapper.xml new file mode 100644 index 0000000..2cf4c01 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysUserPostMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_user_post where user_id=#{userId} + + + + + + delete from sys_user_post where user_id in + + #{userId} + + + + + insert into sys_user_post(user_id, post_id) values + + (#{item.userId},#{item.postId}) + + + + diff --git a/smart-modules/smart-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/smart-modules/smart-system/src/main/resources/mapper/system/SysUserRoleMapper.xml new file mode 100644 index 0000000..cdacb21 --- /dev/null +++ b/smart-modules/smart-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + delete from sys_user_role where user_id=#{userId} + + + + + + delete from sys_user_role where user_id in + + #{userId} + + + + + insert into sys_user_role(user_id, role_id) values + + (#{item.userId},#{item.roleId}) + + + + + delete from sys_user_role where user_id=#{userId} and role_id=#{roleId} + + + + delete from sys_user_role where role_id=#{roleId} and user_id in + + #{userId} + + + diff --git a/smart-visual/pom.xml b/smart-visual/pom.xml new file mode 100644 index 0000000..e89989b --- /dev/null +++ b/smart-visual/pom.xml @@ -0,0 +1,22 @@ + + + + com.ruoyi + CloudParking + 2.5.0 + + 4.0.0 + + + smart-monitor + + + smart-visual + pom + + + ruoyi-visual鍥惧舰鍖栫鐞嗘ā鍧 + + + diff --git a/smart-visual/smart-monitor/pom.xml b/smart-visual/smart-monitor/pom.xml new file mode 100644 index 0000000..ee7c570 --- /dev/null +++ b/smart-visual/smart-monitor/pom.xml @@ -0,0 +1,75 @@ + + + com.ruoyi + smart-visual + 2.5.0 + + 4.0.0 + + smart-visual-monitor + + + smart-visual-monitor鐩戞帶涓績 + + + + + + + de.codecentric + spring-boot-admin-starter-server + ${spring-boot-admin.version} + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-security + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/smart-visual/smart-monitor/src/main/java/com/zhentao/modules/monitor/RuoYiMonitorApplication.java b/smart-visual/smart-monitor/src/main/java/com/zhentao/modules/monitor/RuoYiMonitorApplication.java new file mode 100644 index 0000000..839b584 --- /dev/null +++ b/smart-visual/smart-monitor/src/main/java/com/zhentao/modules/monitor/RuoYiMonitorApplication.java @@ -0,0 +1,30 @@ +package com.zhentao.modules.monitor; + +import de.codecentric.boot.admin.server.config.EnableAdminServer; +import org.springframework.boot.SpringApplication; +import org.springframework.cloud.client.SpringCloudApplication; + +/** + * 鐩戞帶涓績 + * + * @author ruoyi + */ +@EnableAdminServer +@SpringCloudApplication +public class RuoYiMonitorApplication +{ + public static void main(String[] args) + { + SpringApplication.run(RuoYiMonitorApplication.class, args); + System.out.println("(鈾モ棤鈥库棤)锞夛緸 鐩戞帶涓績鍚姩鎴愬姛 醿(麓凇`醿)锞 \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} diff --git a/smart-visual/smart-monitor/src/main/java/com/zhentao/modules/monitor/config/WebSecurityConfigurer.java b/smart-visual/smart-monitor/src/main/java/com/zhentao/modules/monitor/config/WebSecurityConfigurer.java new file mode 100644 index 0000000..1d51f30 --- /dev/null +++ b/smart-visual/smart-monitor/src/main/java/com/zhentao/modules/monitor/config/WebSecurityConfigurer.java @@ -0,0 +1,49 @@ +package com.zhentao.modules.monitor.config; + +import de.codecentric.boot.admin.server.config.AdminServerProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; + +/** + * 鐩戞帶鏉冮檺閰嶇疆 + * + * @author ruoyi + */ +@Configuration +public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter +{ + private final String adminContextPath; + + public WebSecurityConfigurer(AdminServerProperties adminServerProperties) + { + this.adminContextPath = adminServerProperties.getContextPath(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception + { + SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); + successHandler.setTargetUrlParameter("redirectTo"); + successHandler.setDefaultTargetUrl(adminContextPath + "/"); + + http + .headers().frameOptions().disable() + .and().authorizeRequests() + .antMatchers(adminContextPath + "/assets/**" + , adminContextPath + "/login" + , adminContextPath + "/actuator/**" + , adminContextPath + "/instances/**" + ).permitAll() + .anyRequest().authenticated() + .and() + .formLogin().loginPage(adminContextPath + "/login") + .successHandler(successHandler).and() + .logout().logoutUrl(adminContextPath + "/logout") + .and() + .httpBasic().and() + .csrf() + .disable(); + } +} diff --git a/smart-visual/smart-monitor/src/main/resources/banner.txt b/smart-visual/smart-monitor/src/main/resources/banner.txt new file mode 100644 index 0000000..ecaf8a4 --- /dev/null +++ b/smart-visual/smart-monitor/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ _ + (_) (_)| | + _ __ _ _ ___ _ _ _ ______ _ __ ___ ___ _ __ _ | |_ ___ _ __ +| '__|| | | | / _ \ | | | || ||______|| '_ ` _ \ / _ \ | '_ \ | || __| / _ \ | '__| +| | | |_| || (_) || |_| || | | | | | | || (_) || | | || || |_ | (_) || | +|_| \__,_| \___/ \__, ||_| |_| |_| |_| \___/ |_| |_||_| \__| \___/ |_| + __/ | + |___/ \ No newline at end of file diff --git a/smart-visual/smart-monitor/src/main/resources/bootstrap.yml b/smart-visual/smart-monitor/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..aeac51e --- /dev/null +++ b/smart-visual/smart-monitor/src/main/resources/bootstrap.yml @@ -0,0 +1,27 @@ +# Tomcat +server: + port: 9100 + +# Spring +spring: + application: + # 搴旂敤鍚嶇О + name: ruoyi-monitor + profiles: + # 鐜閰嶇疆 + active: dev + cloud: + nacos: + discovery: + # 鏈嶅姟娉ㄥ唽鍦板潃 + server-addr: 8.130.77.16:8848 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + config: + # 閰嶇疆涓績鍦板潃 + server-addr: 8.130.77.16:8848 + namespace: db6edaf2-fce3-471b-a288-d8bbd194f5e2 + # 閰嶇疆鏂囦欢鏍煎紡 + file-extension: yml + # 鍏变韩閰嶇疆 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} diff --git a/smart-visual/smart-monitor/src/main/resources/logback.xml b/smart-visual/smart-monitor/src/main/resources/logback.xml new file mode 100644 index 0000000..ab95c68 --- /dev/null +++ b/smart-visual/smart-monitor/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sql/quartz.sql b/sql/quartz.sql new file mode 100644 index 0000000..55665e2 --- /dev/null +++ b/sql/quartz.sql @@ -0,0 +1,170 @@ +-- ---------------------------- +-- 1銆佸瓨鍌ㄦ瘡涓涓凡閰嶇疆鐨 jobDetail 鐨勮缁嗕俊鎭 +-- ---------------------------- +drop table if exists QRTZ_JOB_DETAILS; +create table QRTZ_JOB_DETAILS ( + sched_name varchar(120) not null, + job_name varchar(200) not null, + job_group varchar(200) not null, + description varchar(250) null, + job_class_name varchar(250) not null, + is_durable varchar(1) not null, + is_nonconcurrent varchar(1) not null, + is_update_data varchar(1) not null, + requests_recovery varchar(1) not null, + job_data blob null, + primary key (sched_name,job_name,job_group) +) engine=innodb; + +-- ---------------------------- +-- 2銆 瀛樺偍宸查厤缃殑 Trigger 鐨勪俊鎭 +-- ---------------------------- +drop table if exists QRTZ_TRIGGERS; +create table QRTZ_TRIGGERS ( + sched_name varchar(120) not null, + trigger_name varchar(200) not null, + trigger_group varchar(200) not null, + job_name varchar(200) not null, + job_group varchar(200) not null, + description varchar(250) null, + next_fire_time bigint(13) null, + prev_fire_time bigint(13) null, + priority integer null, + trigger_state varchar(16) not null, + trigger_type varchar(8) not null, + start_time bigint(13) not null, + end_time bigint(13) null, + calendar_name varchar(200) null, + misfire_instr smallint(2) null, + job_data blob null, + primary key (sched_name,trigger_name,trigger_group), + foreign key (sched_name,job_name,job_group) references QRTZ_JOB_DETAILS(sched_name,job_name,job_group) +) engine=innodb; + +-- ---------------------------- +-- 3銆 瀛樺偍绠鍗曠殑 Trigger锛屽寘鎷噸澶嶆鏁帮紝闂撮殧锛屼互鍙婂凡瑙﹀彂鐨勬鏁 +-- ---------------------------- +drop table if exists QRTZ_SIMPLE_TRIGGERS; +create table QRTZ_SIMPLE_TRIGGERS ( + sched_name varchar(120) not null, + trigger_name varchar(200) not null, + trigger_group varchar(200) not null, + repeat_count bigint(7) not null, + repeat_interval bigint(12) not null, + times_triggered bigint(10) not null, + primary key (sched_name,trigger_name,trigger_group), + foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group) +) engine=innodb; + +-- ---------------------------- +-- 4銆 瀛樺偍 Cron Trigger锛屽寘鎷 Cron 琛ㄨ揪寮忓拰鏃跺尯淇℃伅 +-- ---------------------------- +drop table if exists QRTZ_CRON_TRIGGERS; +create table QRTZ_CRON_TRIGGERS ( + sched_name varchar(120) not null, + trigger_name varchar(200) not null, + trigger_group varchar(200) not null, + cron_expression varchar(200) not null, + time_zone_id varchar(80), + primary key (sched_name,trigger_name,trigger_group), + foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group) +) engine=innodb; + +-- ---------------------------- +-- 5銆 Trigger 浣滀负 Blob 绫诲瀷瀛樺偍(鐢ㄤ簬 Quartz 鐢ㄦ埛鐢 JDBC 鍒涘缓浠栦滑鑷繁瀹氬埗鐨 Trigger 绫诲瀷锛孞obStore 骞朵笉鐭ラ亾濡備綍瀛樺偍瀹炰緥鐨勬椂鍊) +-- ---------------------------- +drop table if exists QRTZ_BLOB_TRIGGERS; +create table QRTZ_BLOB_TRIGGERS ( + sched_name varchar(120) not null, + trigger_name varchar(200) not null, + trigger_group varchar(200) not null, + blob_data blob null, + primary key (sched_name,trigger_name,trigger_group), + foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group) +) engine=innodb; + +-- ---------------------------- +-- 6銆 浠 Blob 绫诲瀷瀛樺偍瀛樻斁鏃ュ巻淇℃伅锛 quartz鍙厤缃竴涓棩鍘嗘潵鎸囧畾涓涓椂闂磋寖鍥 +-- ---------------------------- +drop table if exists QRTZ_CALENDARS; +create table QRTZ_CALENDARS ( + sched_name varchar(120) not null, + calendar_name varchar(200) not null, + calendar blob not null, + primary key (sched_name,calendar_name) +) engine=innodb; + +-- ---------------------------- +-- 7銆 瀛樺偍宸叉殏鍋滅殑 Trigger 缁勭殑淇℃伅 +-- ---------------------------- +drop table if exists QRTZ_PAUSED_TRIGGER_GRPS; +create table QRTZ_PAUSED_TRIGGER_GRPS ( + sched_name varchar(120) not null, + trigger_group varchar(200) not null, + primary key (sched_name,trigger_group) +) engine=innodb; + +-- ---------------------------- +-- 8銆 瀛樺偍涓庡凡瑙﹀彂鐨 Trigger 鐩稿叧鐨勭姸鎬佷俊鎭紝浠ュ強鐩歌仈 Job 鐨勬墽琛屼俊鎭 +-- ---------------------------- +drop table if exists QRTZ_FIRED_TRIGGERS; +create table QRTZ_FIRED_TRIGGERS ( + sched_name varchar(120) not null, + entry_id varchar(95) not null, + trigger_name varchar(200) not null, + trigger_group varchar(200) not null, + instance_name varchar(200) not null, + fired_time bigint(13) not null, + sched_time bigint(13) not null, + priority integer not null, + state varchar(16) not null, + job_name varchar(200) null, + job_group varchar(200) null, + is_nonconcurrent varchar(1) null, + requests_recovery varchar(1) null, + primary key (sched_name,entry_id) +) engine=innodb; + +-- ---------------------------- +-- 9銆 瀛樺偍灏戦噺鐨勬湁鍏 Scheduler 鐨勭姸鎬佷俊鎭紝鍋囧鏄敤浜庨泦缇や腑锛屽彲浠ョ湅鍒板叾浠栫殑 Scheduler 瀹炰緥 +-- ---------------------------- +drop table if exists QRTZ_SCHEDULER_STATE; +create table QRTZ_SCHEDULER_STATE ( + sched_name varchar(120) not null, + instance_name varchar(200) not null, + last_checkin_time bigint(13) not null, + checkin_interval bigint(13) not null, + primary key (sched_name,instance_name) +) engine=innodb; + +-- ---------------------------- +-- 10銆 瀛樺偍绋嬪簭鐨勬偛瑙傞攣鐨勪俊鎭(鍋囧浣跨敤浜嗘偛瑙傞攣) +-- ---------------------------- +drop table if exists QRTZ_LOCKS; +create table QRTZ_LOCKS ( + sched_name varchar(120) not null, + lock_name varchar(40) not null, + primary key (sched_name,lock_name) +) engine=innodb; + +drop table if exists QRTZ_SIMPROP_TRIGGERS; +create table QRTZ_SIMPROP_TRIGGERS ( + sched_name varchar(120) not null, + trigger_name varchar(200) not null, + trigger_group varchar(200) not null, + str_prop_1 varchar(512) null, + str_prop_2 varchar(512) null, + str_prop_3 varchar(512) null, + int_prop_1 int null, + int_prop_2 int null, + long_prop_1 bigint null, + long_prop_2 bigint null, + dec_prop_1 numeric(13,4) null, + dec_prop_2 numeric(13,4) null, + bool_prop_1 varchar(1) null, + bool_prop_2 varchar(1) null, + primary key (sched_name,trigger_name,trigger_group), + foreign key (sched_name,trigger_name,trigger_group) references QRTZ_TRIGGERS(sched_name,trigger_name,trigger_group) +) engine=innodb; + +commit; \ No newline at end of file diff --git a/sql/ry_20210108.sql b/sql/ry_20210108.sql new file mode 100644 index 0000000..b983cc5 --- /dev/null +++ b/sql/ry_20210108.sql @@ -0,0 +1,693 @@ +-- ---------------------------- +-- 1銆侀儴闂ㄨ〃 +-- ---------------------------- +drop table if exists sys_dept; +create table sys_dept ( + dept_id bigint(20) not null auto_increment comment '閮ㄩ棬id', + parent_id bigint(20) default 0 comment '鐖堕儴闂╥d', + ancestors varchar(50) default '' comment '绁栫骇鍒楄〃', + dept_name varchar(30) default '' comment '閮ㄩ棬鍚嶇О', + order_num int(4) default 0 comment '鏄剧ず椤哄簭', + leader varchar(20) default null comment '璐熻矗浜', + phone varchar(11) default null comment '鑱旂郴鐢佃瘽', + email varchar(50) default null comment '閭', + status char(1) default '0' comment '閮ㄩ棬鐘舵侊紙0姝e父 1鍋滅敤锛', + del_flag char(1) default '0' comment '鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + primary key (dept_id) +) engine=innodb auto_increment=200 comment = '閮ㄩ棬琛'; + +-- ---------------------------- +-- 鍒濆鍖-閮ㄩ棬琛ㄦ暟鎹 +-- ---------------------------- +insert into sys_dept values(100, 0, '0', '鑻ヤ緷绉戞妧', 0, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(101, 100, '0,100', '娣卞湷鎬诲叕鍙', 1, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(102, 100, '0,100', '闀挎矙鍒嗗叕鍙', 2, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(103, 101, '0,100,101', '鐮斿彂閮ㄩ棬', 1, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(104, 101, '0,100,101', '甯傚満閮ㄩ棬', 2, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(105, 101, '0,100,101', '娴嬭瘯閮ㄩ棬', 3, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(106, 101, '0,100,101', '璐㈠姟閮ㄩ棬', 4, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(107, 101, '0,100,101', '杩愮淮閮ㄩ棬', 5, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(108, 102, '0,100,102', '甯傚満閮ㄩ棬', 1, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(109, 102, '0,100,102', '璐㈠姟閮ㄩ棬', 2, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); + + +-- ---------------------------- +-- 2銆佺敤鎴蜂俊鎭〃 +-- ---------------------------- +drop table if exists sys_user; +create table sys_user ( + user_id bigint(20) not null auto_increment comment '鐢ㄦ埛ID', + dept_id bigint(20) default null comment '閮ㄩ棬ID', + user_name varchar(30) not null comment '鐢ㄦ埛璐﹀彿', + nick_name varchar(30) not null comment '鐢ㄦ埛鏄电О', + user_type varchar(2) default '00' comment '鐢ㄦ埛绫诲瀷锛00绯荤粺鐢ㄦ埛锛', + email varchar(50) default '' comment '鐢ㄦ埛閭', + phonenumber varchar(11) default '' comment '鎵嬫満鍙风爜', + sex char(1) default '0' comment '鐢ㄦ埛鎬у埆锛0鐢 1濂 2鏈煡锛', + avatar varchar(100) default '' comment '澶村儚鍦板潃', + password varchar(100) default '' comment '瀵嗙爜', + status char(1) default '0' comment '甯愬彿鐘舵侊紙0姝e父 1鍋滅敤锛', + del_flag char(1) default '0' comment '鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛', + login_ip varchar(50) default '' comment '鏈鍚庣櫥褰旾P', + login_date datetime comment '鏈鍚庣櫥褰曟椂闂', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (user_id) +) engine=innodb auto_increment=100 comment = '鐢ㄦ埛淇℃伅琛'; + +-- ---------------------------- +-- 鍒濆鍖-鐢ㄦ埛淇℃伅琛ㄦ暟鎹 +-- ---------------------------- +insert into sys_user values(1, 103, 'admin', '鑻ヤ緷', '00', 'ry@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', '2018-03-16 11-33-00', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绠$悊鍛'); +insert into sys_user values(2, 105, 'ry', '鑻ヤ緷', '00', 'ry@qq.com', '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', '2018-03-16 11-33-00', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '娴嬭瘯鍛'); + + +-- ---------------------------- +-- 3銆佸矖浣嶄俊鎭〃 +-- ---------------------------- +drop table if exists sys_post; +create table sys_post +( + post_id bigint(20) not null auto_increment comment '宀椾綅ID', + post_code varchar(64) not null comment '宀椾綅缂栫爜', + post_name varchar(50) not null comment '宀椾綅鍚嶇О', + post_sort int(4) not null comment '鏄剧ず椤哄簭', + status char(1) not null comment '鐘舵侊紙0姝e父 1鍋滅敤锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (post_id) +) engine=innodb comment = '宀椾綅淇℃伅琛'; + +-- ---------------------------- +-- 鍒濆鍖-宀椾綅淇℃伅琛ㄦ暟鎹 +-- ---------------------------- +insert into sys_post values(1, 'ceo', '钁d簨闀', 1, '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_post values(2, 'se', '椤圭洰缁忕悊', 2, '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_post values(3, 'hr', '浜哄姏璧勬簮', 3, '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_post values(4, 'user', '鏅氬憳宸', 4, '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); + + +-- ---------------------------- +-- 4銆佽鑹蹭俊鎭〃 +-- ---------------------------- +drop table if exists sys_role; +create table sys_role ( + role_id bigint(20) not null auto_increment comment '瑙掕壊ID', + role_name varchar(30) not null comment '瑙掕壊鍚嶇О', + role_key varchar(100) not null comment '瑙掕壊鏉冮檺瀛楃涓', + role_sort int(4) not null comment '鏄剧ず椤哄簭', + data_scope char(1) default '1' comment '鏁版嵁鑼冨洿锛1锛氬叏閮ㄦ暟鎹潈闄 2锛氳嚜瀹氭暟鎹潈闄 3锛氭湰閮ㄩ棬鏁版嵁鏉冮檺 4锛氭湰閮ㄩ棬鍙婁互涓嬫暟鎹潈闄愶級', + menu_check_strictly tinyint(1) default 1 comment '鑿滃崟鏍戦夋嫨椤规槸鍚﹀叧鑱旀樉绀', + dept_check_strictly tinyint(1) default 1 comment '閮ㄩ棬鏍戦夋嫨椤规槸鍚﹀叧鑱旀樉绀', + status char(1) not null comment '瑙掕壊鐘舵侊紙0姝e父 1鍋滅敤锛', + del_flag char(1) default '0' comment '鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (role_id) +) engine=innodb auto_increment=100 comment = '瑙掕壊淇℃伅琛'; + +-- ---------------------------- +-- 鍒濆鍖-瑙掕壊淇℃伅琛ㄦ暟鎹 +-- ---------------------------- +insert into sys_role values('1', '瓒呯骇绠$悊鍛', 'admin', 1, 1, 1, 1, '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瓒呯骇绠$悊鍛'); +insert into sys_role values('2', '鏅氳鑹', 'common', 2, 2, 1, 1, '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏅氳鑹'); + + +-- ---------------------------- +-- 5銆佽彍鍗曟潈闄愯〃 +-- ---------------------------- +drop table if exists sys_menu; +create table sys_menu ( + menu_id bigint(20) not null auto_increment comment '鑿滃崟ID', + menu_name varchar(50) not null comment '鑿滃崟鍚嶇О', + parent_id bigint(20) default 0 comment '鐖惰彍鍗旾D', + order_num int(4) default 0 comment '鏄剧ず椤哄簭', + path varchar(200) default '' comment '璺敱鍦板潃', + component varchar(255) default null comment '缁勪欢璺緞', + is_frame int(1) default 1 comment '鏄惁涓哄閾撅紙0鏄 1鍚︼級', + is_cache int(1) default 0 comment '鏄惁缂撳瓨锛0缂撳瓨 1涓嶇紦瀛橈級', + menu_type char(1) default '' comment '鑿滃崟绫诲瀷锛圡鐩綍 C鑿滃崟 F鎸夐挳锛', + visible char(1) default 0 comment '鑿滃崟鐘舵侊紙0鏄剧ず 1闅愯棌锛', + status char(1) default 0 comment '鑿滃崟鐘舵侊紙0姝e父 1鍋滅敤锛', + perms varchar(100) default null comment '鏉冮檺鏍囪瘑', + icon varchar(100) default '#' comment '鑿滃崟鍥炬爣', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default '' comment '澶囨敞', + primary key (menu_id) +) engine=innodb auto_increment=2000 comment = '鑿滃崟鏉冮檺琛'; + +-- ---------------------------- +-- 鍒濆鍖-鑿滃崟淇℃伅琛ㄦ暟鎹 +-- ---------------------------- +-- 涓绾ц彍鍗 +insert into sys_menu values('1', '绯荤粺绠$悊', '0', '1', 'system', null, 1, 0, 'M', '0', '0', '', 'system', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺绠$悊鐩綍'); +insert into sys_menu values('2', '绯荤粺鐩戞帶', '0', '2', 'monitor', null, 1, 0, 'M', '0', '0', '', 'monitor', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺鐩戞帶鐩綍'); +insert into sys_menu values('3', '绯荤粺宸ュ叿', '0', '3', 'tool', null, 1, 0, 'M', '0', '0', '', 'tool', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺宸ュ叿鐩綍'); +insert into sys_menu values('4', '鑻ヤ緷瀹樼綉', '0', '4', 'http://ruoyi.vip', null , 0, 0, 'M', '0', '0', '', 'guide', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鑻ヤ緷瀹樼綉鍦板潃'); +-- 浜岀骇鑿滃崟 +insert into sys_menu values('100', '鐢ㄦ埛绠$悊', '1', '1', 'user', 'system/user/index', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鐢ㄦ埛绠$悊鑿滃崟'); +insert into sys_menu values('101', '瑙掕壊绠$悊', '1', '2', 'role', 'system/role/index', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瑙掕壊绠$悊鑿滃崟'); +insert into sys_menu values('102', '鑿滃崟绠$悊', '1', '3', 'menu', 'system/menu/index', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鑿滃崟绠$悊鑿滃崟'); +insert into sys_menu values('103', '閮ㄩ棬绠$悊', '1', '4', 'dept', 'system/dept/index', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '閮ㄩ棬绠$悊鑿滃崟'); +insert into sys_menu values('104', '宀椾綅绠$悊', '1', '5', 'post', 'system/post/index', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '宀椾綅绠$悊鑿滃崟'); +insert into sys_menu values('105', '瀛楀吀绠$悊', '1', '6', 'dict', 'system/dict/index', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀛楀吀绠$悊鑿滃崟'); +insert into sys_menu values('106', '鍙傛暟璁剧疆', '1', '7', 'config', 'system/config/index', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍙傛暟璁剧疆鑿滃崟'); +insert into sys_menu values('107', '閫氱煡鍏憡', '1', '9', 'notice', 'system/notice/index', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '閫氱煡鍏憡鑿滃崟'); +insert into sys_menu values('108', '鏃ュ織绠$悊', '1', '10', 'log', '', 1, 0, 'M', '0', '0', '', 'log', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏃ュ織绠$悊鑿滃崟'); +insert into sys_menu values('109', '鍦ㄧ嚎鐢ㄦ埛', '2', '1', 'online', 'monitor/online/index', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍦ㄧ嚎鐢ㄦ埛鑿滃崟'); +insert into sys_menu values('110', '瀹氭椂浠诲姟', '2', '2', 'job', 'monitor/job/index', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀹氭椂浠诲姟鑿滃崟'); +insert into sys_menu values('111', 'Sentinel鎺у埗鍙', '2', '3', 'http://localhost:8718', '', 1, 0, 'C', '0', '0', 'monitor:sentinel:list', 'sentinel', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '娴侀噺鎺у埗鑿滃崟'); +insert into sys_menu values('112', 'Nacos鎺у埗鍙', '2', '4', 'http://localhost:8848/nacos', '', 1, 0, 'C', '0', '0', 'monitor:nacos:list', 'nacos', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏈嶅姟娌荤悊鑿滃崟'); +insert into sys_menu values('113', 'Admin鎺у埗鍙', '2', '5', 'http://localhost:9100/login', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏈嶅姟鐩戞帶鑿滃崟'); +insert into sys_menu values('114', '琛ㄥ崟鏋勫缓', '3', '1', 'build', 'tool/build/index', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '琛ㄥ崟鏋勫缓鑿滃崟'); +insert into sys_menu values('115', '浠g爜鐢熸垚', '3', '2', 'gen', 'tool/gen/index', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '浠g爜鐢熸垚鑿滃崟'); +insert into sys_menu values('116', '绯荤粺鎺ュ彛', '3', '3', 'http://localhost:8080/swagger-ui.html', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺鎺ュ彛鑿滃崟'); +-- 涓夌骇鑿滃崟 +insert into sys_menu values('500', '鎿嶄綔鏃ュ織', '108', '1', 'operlog', 'system/operlog/index', 1, 0, 'C', '0', '0', 'system:operlog:list', 'form', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎿嶄綔鏃ュ織鑿滃崟'); +insert into sys_menu values('501', '鐧诲綍鏃ュ織', '108', '2', 'logininfor', 'system/logininfor/index', 1, 0, 'C', '0', '0', 'system:logininfor:list', 'logininfor', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鐧诲綍鏃ュ織鑿滃崟'); +-- 鐢ㄦ埛绠$悊鎸夐挳 +insert into sys_menu values('1001', '鐢ㄦ埛鏌ヨ', '100', '1', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1002', '鐢ㄦ埛鏂板', '100', '2', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1003', '鐢ㄦ埛淇敼', '100', '3', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1004', '鐢ㄦ埛鍒犻櫎', '100', '4', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1005', '鐢ㄦ埛瀵煎嚭', '100', '5', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1006', '鐢ㄦ埛瀵煎叆', '100', '6', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1007', '閲嶇疆瀵嗙爜', '100', '7', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 瑙掕壊绠$悊鎸夐挳 +insert into sys_menu values('1008', '瑙掕壊鏌ヨ', '101', '1', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1009', '瑙掕壊鏂板', '101', '2', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1010', '瑙掕壊淇敼', '101', '3', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1011', '瑙掕壊鍒犻櫎', '101', '4', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1012', '瑙掕壊瀵煎嚭', '101', '5', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 鑿滃崟绠$悊鎸夐挳 +insert into sys_menu values('1013', '鑿滃崟鏌ヨ', '102', '1', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1014', '鑿滃崟鏂板', '102', '2', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1015', '鑿滃崟淇敼', '102', '3', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1016', '鑿滃崟鍒犻櫎', '102', '4', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 閮ㄩ棬绠$悊鎸夐挳 +insert into sys_menu values('1017', '閮ㄩ棬鏌ヨ', '103', '1', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1018', '閮ㄩ棬鏂板', '103', '2', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1019', '閮ㄩ棬淇敼', '103', '3', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1020', '閮ㄩ棬鍒犻櫎', '103', '4', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 宀椾綅绠$悊鎸夐挳 +insert into sys_menu values('1021', '宀椾綅鏌ヨ', '104', '1', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1022', '宀椾綅鏂板', '104', '2', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1023', '宀椾綅淇敼', '104', '3', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1024', '宀椾綅鍒犻櫎', '104', '4', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1025', '宀椾綅瀵煎嚭', '104', '5', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 瀛楀吀绠$悊鎸夐挳 +insert into sys_menu values('1026', '瀛楀吀鏌ヨ', '105', '1', '#', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1027', '瀛楀吀鏂板', '105', '2', '#', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1028', '瀛楀吀淇敼', '105', '3', '#', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1029', '瀛楀吀鍒犻櫎', '105', '4', '#', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1030', '瀛楀吀瀵煎嚭', '105', '5', '#', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 鍙傛暟璁剧疆鎸夐挳 +insert into sys_menu values('1031', '鍙傛暟鏌ヨ', '106', '1', '#', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1032', '鍙傛暟鏂板', '106', '2', '#', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1033', '鍙傛暟淇敼', '106', '3', '#', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1034', '鍙傛暟鍒犻櫎', '106', '4', '#', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1035', '鍙傛暟瀵煎嚭', '106', '5', '#', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 閫氱煡鍏憡鎸夐挳 +insert into sys_menu values('1041', '鍏憡鏌ヨ', '107', '1', '#', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1042', '鍏憡鏂板', '107', '2', '#', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1043', '鍏憡淇敼', '107', '3', '#', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1044', '鍏憡鍒犻櫎', '107', '4', '#', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 鎿嶄綔鏃ュ織鎸夐挳 +insert into sys_menu values('1045', '鎿嶄綔鏌ヨ', '500', '1', '#', '', 1, 0, 'F', '0', '0', 'system:operlog:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1046', '鎿嶄綔鍒犻櫎', '500', '2', '#', '', 1, 0, 'F', '0', '0', 'system:operlog:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1047', '鏃ュ織瀵煎嚭', '500', '4', '#', '', 1, 0, 'F', '0', '0', 'system:operlog:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 鐧诲綍鏃ュ織鎸夐挳 +insert into sys_menu values('1048', '鐧诲綍鏌ヨ', '501', '1', '#', '', 1, 0, 'F', '0', '0', 'system:logininfor:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1049', '鐧诲綍鍒犻櫎', '501', '2', '#', '', 1, 0, 'F', '0', '0', 'system:logininfor:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1050', '鏃ュ織瀵煎嚭', '501', '3', '#', '', 1, 0, 'F', '0', '0', 'system:logininfor:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 鍦ㄧ嚎鐢ㄦ埛鎸夐挳 +insert into sys_menu values('1051', '鍦ㄧ嚎鏌ヨ', '109', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1052', '鎵归噺寮洪', '109', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1053', '鍗曟潯寮洪', '109', '3', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 瀹氭椂浠诲姟鎸夐挳 +insert into sys_menu values('1054', '浠诲姟鏌ヨ', '110', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1055', '浠诲姟鏂板', '110', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1056', '浠诲姟淇敼', '110', '3', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1057', '浠诲姟鍒犻櫎', '110', '4', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1058', '鐘舵佷慨鏀', '110', '5', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1059', '浠诲姟瀵煎嚭', '110', '7', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 浠g爜鐢熸垚鎸夐挳 +insert into sys_menu values('1060', '鐢熸垚鏌ヨ', '115', '1', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1061', '鐢熸垚淇敼', '115', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1062', '鐢熸垚鍒犻櫎', '115', '3', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1063', '瀵煎叆浠g爜', '115', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1064', '棰勮浠g爜', '115', '4', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1065', '鐢熸垚浠g爜', '115', '5', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); + + +-- ---------------------------- +-- 6銆佺敤鎴峰拰瑙掕壊鍏宠仈琛 鐢ㄦ埛N-1瑙掕壊 +-- ---------------------------- +drop table if exists sys_user_role; +create table sys_user_role ( + user_id bigint(20) not null comment '鐢ㄦ埛ID', + role_id bigint(20) not null comment '瑙掕壊ID', + primary key(user_id, role_id) +) engine=innodb comment = '鐢ㄦ埛鍜岃鑹插叧鑱旇〃'; + +-- ---------------------------- +-- 鍒濆鍖-鐢ㄦ埛鍜岃鑹插叧鑱旇〃鏁版嵁 +-- ---------------------------- +insert into sys_user_role values ('1', '1'); +insert into sys_user_role values ('2', '2'); + + +-- ---------------------------- +-- 7銆佽鑹插拰鑿滃崟鍏宠仈琛 瑙掕壊1-N鑿滃崟 +-- ---------------------------- +drop table if exists sys_role_menu; +create table sys_role_menu ( + role_id bigint(20) not null comment '瑙掕壊ID', + menu_id bigint(20) not null comment '鑿滃崟ID', + primary key(role_id, menu_id) +) engine=innodb comment = '瑙掕壊鍜岃彍鍗曞叧鑱旇〃'; + +-- ---------------------------- +-- 鍒濆鍖-瑙掕壊鍜岃彍鍗曞叧鑱旇〃鏁版嵁 +-- ---------------------------- +insert into sys_role_menu values ('2', '1'); +insert into sys_role_menu values ('2', '2'); +insert into sys_role_menu values ('2', '3'); +insert into sys_role_menu values ('2', '4'); +insert into sys_role_menu values ('2', '100'); +insert into sys_role_menu values ('2', '101'); +insert into sys_role_menu values ('2', '102'); +insert into sys_role_menu values ('2', '103'); +insert into sys_role_menu values ('2', '104'); +insert into sys_role_menu values ('2', '105'); +insert into sys_role_menu values ('2', '106'); +insert into sys_role_menu values ('2', '107'); +insert into sys_role_menu values ('2', '108'); +insert into sys_role_menu values ('2', '109'); +insert into sys_role_menu values ('2', '110'); +insert into sys_role_menu values ('2', '111'); +insert into sys_role_menu values ('2', '112'); +insert into sys_role_menu values ('2', '113'); +insert into sys_role_menu values ('2', '114'); +insert into sys_role_menu values ('2', '115'); +insert into sys_role_menu values ('2', '116'); +insert into sys_role_menu values ('2', '500'); +insert into sys_role_menu values ('2', '501'); +insert into sys_role_menu values ('2', '1000'); +insert into sys_role_menu values ('2', '1001'); +insert into sys_role_menu values ('2', '1002'); +insert into sys_role_menu values ('2', '1003'); +insert into sys_role_menu values ('2', '1004'); +insert into sys_role_menu values ('2', '1005'); +insert into sys_role_menu values ('2', '1006'); +insert into sys_role_menu values ('2', '1007'); +insert into sys_role_menu values ('2', '1008'); +insert into sys_role_menu values ('2', '1009'); +insert into sys_role_menu values ('2', '1010'); +insert into sys_role_menu values ('2', '1011'); +insert into sys_role_menu values ('2', '1012'); +insert into sys_role_menu values ('2', '1013'); +insert into sys_role_menu values ('2', '1014'); +insert into sys_role_menu values ('2', '1015'); +insert into sys_role_menu values ('2', '1016'); +insert into sys_role_menu values ('2', '1017'); +insert into sys_role_menu values ('2', '1018'); +insert into sys_role_menu values ('2', '1019'); +insert into sys_role_menu values ('2', '1020'); +insert into sys_role_menu values ('2', '1021'); +insert into sys_role_menu values ('2', '1022'); +insert into sys_role_menu values ('2', '1023'); +insert into sys_role_menu values ('2', '1024'); +insert into sys_role_menu values ('2', '1025'); +insert into sys_role_menu values ('2', '1026'); +insert into sys_role_menu values ('2', '1027'); +insert into sys_role_menu values ('2', '1028'); +insert into sys_role_menu values ('2', '1029'); +insert into sys_role_menu values ('2', '1030'); +insert into sys_role_menu values ('2', '1031'); +insert into sys_role_menu values ('2', '1032'); +insert into sys_role_menu values ('2', '1033'); +insert into sys_role_menu values ('2', '1034'); +insert into sys_role_menu values ('2', '1035'); +insert into sys_role_menu values ('2', '1036'); +insert into sys_role_menu values ('2', '1037'); +insert into sys_role_menu values ('2', '1038'); +insert into sys_role_menu values ('2', '1039'); +insert into sys_role_menu values ('2', '1040'); +insert into sys_role_menu values ('2', '1041'); +insert into sys_role_menu values ('2', '1042'); +insert into sys_role_menu values ('2', '1043'); +insert into sys_role_menu values ('2', '1044'); +insert into sys_role_menu values ('2', '1045'); +insert into sys_role_menu values ('2', '1046'); +insert into sys_role_menu values ('2', '1047'); +insert into sys_role_menu values ('2', '1048'); +insert into sys_role_menu values ('2', '1049'); +insert into sys_role_menu values ('2', '1050'); +insert into sys_role_menu values ('2', '1051'); +insert into sys_role_menu values ('2', '1052'); +insert into sys_role_menu values ('2', '1053'); +insert into sys_role_menu values ('2', '1054'); +insert into sys_role_menu values ('2', '1055'); +insert into sys_role_menu values ('2', '1056'); +insert into sys_role_menu values ('2', '1057'); +insert into sys_role_menu values ('2', '1058'); +insert into sys_role_menu values ('2', '1059'); +insert into sys_role_menu values ('2', '1060'); +insert into sys_role_menu values ('2', '1061'); +insert into sys_role_menu values ('2', '1062'); +insert into sys_role_menu values ('2', '1063'); +insert into sys_role_menu values ('2', '1064'); +insert into sys_role_menu values ('2', '1065'); + +-- ---------------------------- +-- 8銆佽鑹插拰閮ㄩ棬鍏宠仈琛 瑙掕壊1-N閮ㄩ棬 +-- ---------------------------- +drop table if exists sys_role_dept; +create table sys_role_dept ( + role_id bigint(20) not null comment '瑙掕壊ID', + dept_id bigint(20) not null comment '閮ㄩ棬ID', + primary key(role_id, dept_id) +) engine=innodb comment = '瑙掕壊鍜岄儴闂ㄥ叧鑱旇〃'; + +-- ---------------------------- +-- 鍒濆鍖-瑙掕壊鍜岄儴闂ㄥ叧鑱旇〃鏁版嵁 +-- ---------------------------- +insert into sys_role_dept values ('2', '100'); +insert into sys_role_dept values ('2', '101'); +insert into sys_role_dept values ('2', '105'); + + +-- ---------------------------- +-- 9銆佺敤鎴蜂笌宀椾綅鍏宠仈琛 鐢ㄦ埛1-N宀椾綅 +-- ---------------------------- +drop table if exists sys_user_post; +create table sys_user_post +( + user_id bigint(20) not null comment '鐢ㄦ埛ID', + post_id bigint(20) not null comment '宀椾綅ID', + primary key (user_id, post_id) +) engine=innodb comment = '鐢ㄦ埛涓庡矖浣嶅叧鑱旇〃'; + +-- ---------------------------- +-- 鍒濆鍖-鐢ㄦ埛涓庡矖浣嶅叧鑱旇〃鏁版嵁 +-- ---------------------------- +insert into sys_user_post values ('1', '1'); +insert into sys_user_post values ('2', '2'); + + +-- ---------------------------- +-- 10銆佹搷浣滄棩蹇楄褰 +-- ---------------------------- +drop table if exists sys_oper_log; +create table sys_oper_log ( + oper_id bigint(20) not null auto_increment comment '鏃ュ織涓婚敭', + title varchar(50) default '' comment '妯″潡鏍囬', + business_type int(2) default 0 comment '涓氬姟绫诲瀷锛0鍏跺畠 1鏂板 2淇敼 3鍒犻櫎锛', + method varchar(100) default '' comment '鏂规硶鍚嶇О', + request_method varchar(10) default '' comment '璇锋眰鏂瑰紡', + operator_type int(1) default 0 comment '鎿嶄綔绫诲埆锛0鍏跺畠 1鍚庡彴鐢ㄦ埛 2鎵嬫満绔敤鎴凤級', + oper_name varchar(50) default '' comment '鎿嶄綔浜哄憳', + dept_name varchar(50) default '' comment '閮ㄩ棬鍚嶇О', + oper_url varchar(255) default '' comment '璇锋眰URL', + oper_ip varchar(50) default '' comment '涓绘満鍦板潃', + oper_location varchar(255) default '' comment '鎿嶄綔鍦扮偣', + oper_param varchar(2000) default '' comment '璇锋眰鍙傛暟', + json_result varchar(2000) default '' comment '杩斿洖鍙傛暟', + status int(1) default 0 comment '鎿嶄綔鐘舵侊紙0姝e父 1寮傚父锛', + error_msg varchar(2000) default '' comment '閿欒娑堟伅', + oper_time datetime comment '鎿嶄綔鏃堕棿', + primary key (oper_id) +) engine=innodb auto_increment=100 comment = '鎿嶄綔鏃ュ織璁板綍'; + + +-- ---------------------------- +-- 11銆佸瓧鍏哥被鍨嬭〃 +-- ---------------------------- +drop table if exists sys_dict_type; +create table sys_dict_type +( + dict_id bigint(20) not null auto_increment comment '瀛楀吀涓婚敭', + dict_name varchar(100) default '' comment '瀛楀吀鍚嶇О', + dict_type varchar(100) default '' comment '瀛楀吀绫诲瀷', + status char(1) default '0' comment '鐘舵侊紙0姝e父 1鍋滅敤锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (dict_id), + unique (dict_type) +) engine=innodb auto_increment=100 comment = '瀛楀吀绫诲瀷琛'; + +insert into sys_dict_type values(1, '鐢ㄦ埛鎬у埆', 'sys_user_sex', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鐢ㄦ埛鎬у埆鍒楄〃'); +insert into sys_dict_type values(2, '鑿滃崟鐘舵', 'sys_show_hide', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鑿滃崟鐘舵佸垪琛'); +insert into sys_dict_type values(3, '绯荤粺寮鍏', 'sys_normal_disable', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺寮鍏冲垪琛'); +insert into sys_dict_type values(4, '浠诲姟鐘舵', 'sys_job_status', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '浠诲姟鐘舵佸垪琛'); +insert into sys_dict_type values(5, '浠诲姟鍒嗙粍', 'sys_job_group', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '浠诲姟鍒嗙粍鍒楄〃'); +insert into sys_dict_type values(6, '绯荤粺鏄惁', 'sys_yes_no', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺鏄惁鍒楄〃'); +insert into sys_dict_type values(7, '閫氱煡绫诲瀷', 'sys_notice_type', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '閫氱煡绫诲瀷鍒楄〃'); +insert into sys_dict_type values(8, '閫氱煡鐘舵', 'sys_notice_status', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '閫氱煡鐘舵佸垪琛'); +insert into sys_dict_type values(9, '鎿嶄綔绫诲瀷', 'sys_oper_type', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎿嶄綔绫诲瀷鍒楄〃'); +insert into sys_dict_type values(10, '绯荤粺鐘舵', 'sys_common_status', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鐧诲綍鐘舵佸垪琛'); +insert into sys_dict_type values(11, '鎺堟潈绫诲瀷', 'sys_grant_type', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎺堟潈绫诲瀷鍒楄〃'); + + +-- ---------------------------- +-- 12銆佸瓧鍏告暟鎹〃 +-- ---------------------------- +drop table if exists sys_dict_data; +create table sys_dict_data +( + dict_code bigint(20) not null auto_increment comment '瀛楀吀缂栫爜', + dict_sort int(4) default 0 comment '瀛楀吀鎺掑簭', + dict_label varchar(100) default '' comment '瀛楀吀鏍囩', + dict_value varchar(100) default '' comment '瀛楀吀閿', + dict_type varchar(100) default '' comment '瀛楀吀绫诲瀷', + css_class varchar(100) default null comment '鏍峰紡灞炴э紙鍏朵粬鏍峰紡鎵╁睍锛', + list_class varchar(100) default null comment '琛ㄦ牸鍥炴樉鏍峰紡', + is_default char(1) default 'N' comment '鏄惁榛樿锛圷鏄 N鍚︼級', + status char(1) default '0' comment '鐘舵侊紙0姝e父 1鍋滅敤锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (dict_code) +) engine=innodb auto_increment=100 comment = '瀛楀吀鏁版嵁琛'; + +insert into sys_dict_data values(1, 1, '鐢', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎬у埆鐢'); +insert into sys_dict_data values(2, 2, '濂', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎬у埆濂'); +insert into sys_dict_data values(3, 3, '鏈煡', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎬у埆鏈煡'); +insert into sys_dict_data values(4, 1, '鏄剧ず', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏄剧ず鑿滃崟'); +insert into sys_dict_data values(5, 2, '闅愯棌', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '闅愯棌鑿滃崟'); +insert into sys_dict_data values(6, 1, '姝e父', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '姝e父鐘舵'); +insert into sys_dict_data values(7, 2, '鍋滅敤', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍋滅敤鐘舵'); +insert into sys_dict_data values(8, 1, '姝e父', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '姝e父鐘舵'); +insert into sys_dict_data values(9, 2, '鏆傚仠', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍋滅敤鐘舵'); +insert into sys_dict_data values(10, 1, '榛樿', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '榛樿鍒嗙粍'); +insert into sys_dict_data values(11, 2, '绯荤粺', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺鍒嗙粍'); +insert into sys_dict_data values(12, 1, '鏄', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺榛樿鏄'); +insert into sys_dict_data values(13, 2, '鍚', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺榛樿鍚'); +insert into sys_dict_data values(14, 1, '閫氱煡', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '閫氱煡'); +insert into sys_dict_data values(15, 2, '鍏憡', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍏憡'); +insert into sys_dict_data values(16, 1, '姝e父', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '姝e父鐘舵'); +insert into sys_dict_data values(17, 2, '鍏抽棴', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍏抽棴鐘舵'); +insert into sys_dict_data values(18, 1, '鏂板', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏂板鎿嶄綔'); +insert into sys_dict_data values(19, 2, '淇敼', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '淇敼鎿嶄綔'); +insert into sys_dict_data values(20, 3, '鍒犻櫎', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍒犻櫎鎿嶄綔'); +insert into sys_dict_data values(21, 4, '鎺堟潈', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎺堟潈鎿嶄綔'); +insert into sys_dict_data values(22, 5, '瀵煎嚭', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀵煎嚭鎿嶄綔'); +insert into sys_dict_data values(23, 6, '瀵煎叆', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀵煎叆鎿嶄綔'); +insert into sys_dict_data values(24, 7, '寮洪', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '寮洪鎿嶄綔'); +insert into sys_dict_data values(25, 8, '鐢熸垚浠g爜', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鐢熸垚鎿嶄綔'); +insert into sys_dict_data values(26, 9, '娓呯┖鏁版嵁', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '娓呯┖鎿嶄綔'); +insert into sys_dict_data values(27, 1, '鎴愬姛', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '姝e父鐘舵'); +insert into sys_dict_data values(28, 2, '澶辫触', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍋滅敤鐘舵'); +insert into sys_dict_data values(29, 1, '鎺堟潈鐮佹ā寮', 'authorization_code', 'sys_grant_type', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎺堟潈鐮佹ā寮'); +insert into sys_dict_data values(30, 2, '瀵嗙爜妯″紡', 'password', 'sys_grant_type', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀵嗙爜妯″紡'); +insert into sys_dict_data values(31, 3, '瀹㈡埛绔ā寮', 'client_credentials', 'sys_grant_type', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀹㈡埛绔ā寮'); +insert into sys_dict_data values(32, 4, '绠鍖栨ā寮', 'implicit', 'sys_grant_type', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绠鍖栨ā寮'); +insert into sys_dict_data values(33, 5, '鍒锋柊妯″紡', 'refresh_token', 'sys_grant_type', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍒锋柊妯″紡'); + + +-- ---------------------------- +-- 13銆佸弬鏁伴厤缃〃 +-- ---------------------------- +drop table if exists sys_config; +create table sys_config ( + config_id int(5) not null auto_increment comment '鍙傛暟涓婚敭', + config_name varchar(100) default '' comment '鍙傛暟鍚嶇О', + config_key varchar(100) default '' comment '鍙傛暟閿悕', + config_value varchar(500) default '' comment '鍙傛暟閿', + config_type char(1) default 'N' comment '绯荤粺鍐呯疆锛圷鏄 N鍚︼級', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (config_id) +) engine=innodb auto_increment=100 comment = '鍙傛暟閰嶇疆琛'; + +insert into sys_config values(1, '涓绘鏋堕〉-榛樿鐨偆鏍峰紡鍚嶇О', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '钃濊壊 skin-blue銆佺豢鑹 skin-green銆佺传鑹 skin-purple銆佺孩鑹 skin-red銆侀粍鑹 skin-yellow' ); +insert into sys_config values(2, '鐢ㄦ埛绠$悊-璐﹀彿鍒濆瀵嗙爜', 'sys.user.initPassword', '123456', 'Y', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍒濆鍖栧瘑鐮 123456' ); +insert into sys_config values(3, '涓绘鏋堕〉-渚ц竟鏍忎富棰', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '娣辫壊涓婚theme-dark锛屾祬鑹蹭富棰榯heme-light' ); + + +-- ---------------------------- +-- 14銆佺郴缁熻闂褰 +-- ---------------------------- +drop table if exists sys_logininfor; +create table sys_logininfor ( + info_id bigint(20) not null auto_increment comment '璁块棶ID', + user_name varchar(50) default '' comment '鐢ㄦ埛璐﹀彿', + ipaddr varchar(50) default '' comment '鐧诲綍IP鍦板潃', + status char(1) default '0' comment '鐧诲綍鐘舵侊紙0鎴愬姛 1澶辫触锛', + msg varchar(255) default '' comment '鎻愮ず淇℃伅', + access_time datetime comment '璁块棶鏃堕棿', + primary key (info_id) +) engine=innodb auto_increment=100 comment = '绯荤粺璁块棶璁板綍'; + + +-- ---------------------------- +-- 15銆佸畾鏃朵换鍔¤皟搴﹁〃 +-- ---------------------------- +drop table if exists sys_job; +create table sys_job ( + job_id bigint(20) not null auto_increment comment '浠诲姟ID', + job_name varchar(64) default '' comment '浠诲姟鍚嶇О', + job_group varchar(64) default 'DEFAULT' comment '浠诲姟缁勫悕', + invoke_target varchar(500) not null comment '璋冪敤鐩爣瀛楃涓', + cron_expression varchar(255) default '' comment 'cron鎵ц琛ㄨ揪寮', + misfire_policy varchar(20) default '3' comment '璁″垝鎵ц閿欒绛栫暐锛1绔嬪嵆鎵ц 2鎵ц涓娆 3鏀惧純鎵ц锛', + concurrent char(1) default '1' comment '鏄惁骞跺彂鎵ц锛0鍏佽 1绂佹锛', + status char(1) default '0' comment '鐘舵侊紙0姝e父 1鏆傚仠锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default '' comment '澶囨敞淇℃伅', + primary key (job_id, job_name, job_group) +) engine=innodb auto_increment=100 comment = '瀹氭椂浠诲姟璋冨害琛'; + +insert into sys_job values(1, '绯荤粺榛樿锛堟棤鍙傦級', 'DEFAULT', 'ryTask.ryNoParams', '0/10 * * * * ?', '3', '1', '1', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_job values(2, '绯荤粺榛樿锛堟湁鍙傦級', 'DEFAULT', 'ryTask.ryParams(\'ry\')', '0/15 * * * * ?', '3', '1', '1', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_job values(3, '绯荤粺榛樿锛堝鍙傦級', 'DEFAULT', 'ryTask.ryMultipleParams(\'ry\', true, 2000L, 316.50D, 100)', '0/20 * * * * ?', '3', '1', '1', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); + + +-- ---------------------------- +-- 16銆佸畾鏃朵换鍔¤皟搴︽棩蹇楄〃 +-- ---------------------------- +drop table if exists sys_job_log; +create table sys_job_log ( + job_log_id bigint(20) not null auto_increment comment '浠诲姟鏃ュ織ID', + job_name varchar(64) not null comment '浠诲姟鍚嶇О', + job_group varchar(64) not null comment '浠诲姟缁勫悕', + invoke_target varchar(500) not null comment '璋冪敤鐩爣瀛楃涓', + job_message varchar(500) comment '鏃ュ織淇℃伅', + status char(1) default '0' comment '鎵ц鐘舵侊紙0姝e父 1澶辫触锛', + exception_info varchar(2000) default '' comment '寮傚父淇℃伅', + create_time datetime comment '鍒涘缓鏃堕棿', + primary key (job_log_id) +) engine=innodb comment = '瀹氭椂浠诲姟璋冨害鏃ュ織琛'; + + +-- ---------------------------- +-- 17銆侀氱煡鍏憡琛 +-- ---------------------------- +drop table if exists sys_notice; +create table sys_notice ( + notice_id int(4) not null auto_increment comment '鍏憡ID', + notice_title varchar(50) not null comment '鍏憡鏍囬', + notice_type char(1) not null comment '鍏憡绫诲瀷锛1閫氱煡 2鍏憡锛', + notice_content longblob default null comment '鍏憡鍐呭', + status char(1) default '0' comment '鍏憡鐘舵侊紙0姝e父 1鍏抽棴锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(255) default null comment '澶囨敞', + primary key (notice_id) +) engine=innodb auto_increment=10 comment = '閫氱煡鍏憡琛'; + +-- ---------------------------- +-- 鍒濆鍖-鍏憡淇℃伅琛ㄦ暟鎹 +-- ---------------------------- +insert into sys_notice values('1', '娓╅Θ鎻愰啋锛2018-07-01 鑻ヤ緷鏂扮増鏈彂甯冨暒', '2', '鏂扮増鏈唴瀹', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绠$悊鍛'); +insert into sys_notice values('2', '缁存姢閫氱煡锛2018-07-01 鑻ヤ緷绯荤粺鍑屾櫒缁存姢', '1', '缁存姢鍐呭', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绠$悊鍛'); + + +-- ---------------------------- +-- 18銆佷唬鐮佺敓鎴愪笟鍔¤〃 +-- ---------------------------- +drop table if exists gen_table; +create table gen_table ( + table_id bigint(20) not null auto_increment comment '缂栧彿', + table_name varchar(200) default '' comment '琛ㄥ悕绉', + table_comment varchar(500) default '' comment '琛ㄦ弿杩', + sub_table_name varchar(64) default null comment '鍏宠仈瀛愯〃鐨勮〃鍚', + sub_table_fk_name varchar(64) default null comment '瀛愯〃鍏宠仈鐨勫閿悕', + class_name varchar(100) default '' comment '瀹炰綋绫诲悕绉', + tpl_category varchar(200) default 'crud' comment '浣跨敤鐨勬ā鏉匡紙crud鍗曡〃鎿嶄綔 tree鏍戣〃鎿嶄綔锛', + package_name varchar(100) comment '鐢熸垚鍖呰矾寰', + module_name varchar(30) comment '鐢熸垚妯″潡鍚', + business_name varchar(30) comment '鐢熸垚涓氬姟鍚', + function_name varchar(50) comment '鐢熸垚鍔熻兘鍚', + function_author varchar(50) comment '鐢熸垚鍔熻兘浣滆', + gen_type char(1) default '0' comment '鐢熸垚浠g爜鏂瑰紡锛0zip鍘嬬缉鍖 1鑷畾涔夎矾寰勶級', + gen_path varchar(200) default '/' comment '鐢熸垚璺緞锛堜笉濉粯璁ら」鐩矾寰勶級', + options varchar(1000) comment '鍏跺畠鐢熸垚閫夐」', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (table_id) +) engine=innodb auto_increment=1 comment = '浠g爜鐢熸垚涓氬姟琛'; + + +-- ---------------------------- +-- 19銆佷唬鐮佺敓鎴愪笟鍔¤〃瀛楁 +-- ---------------------------- +drop table if exists gen_table_column; +create table gen_table_column ( + column_id bigint(20) not null auto_increment comment '缂栧彿', + table_id varchar(64) comment '褰掑睘琛ㄧ紪鍙', + column_name varchar(200) comment '鍒楀悕绉', + column_comment varchar(500) comment '鍒楁弿杩', + column_type varchar(100) comment '鍒楃被鍨', + java_type varchar(500) comment 'JAVA绫诲瀷', + java_field varchar(200) comment 'JAVA瀛楁鍚', + is_pk char(1) comment '鏄惁涓婚敭锛1鏄級', + is_increment char(1) comment '鏄惁鑷锛1鏄級', + is_required char(1) comment '鏄惁蹇呭~锛1鏄級', + is_insert char(1) comment '鏄惁涓烘彃鍏ュ瓧娈碉紙1鏄級', + is_edit char(1) comment '鏄惁缂栬緫瀛楁锛1鏄級', + is_list char(1) comment '鏄惁鍒楄〃瀛楁锛1鏄級', + is_query char(1) comment '鏄惁鏌ヨ瀛楁锛1鏄級', + query_type varchar(200) default 'EQ' comment '鏌ヨ鏂瑰紡锛堢瓑浜庛佷笉绛変簬銆佸ぇ浜庛佸皬浜庛佽寖鍥达級', + html_type varchar(200) comment '鏄剧ず绫诲瀷锛堟枃鏈銆佹枃鏈煙銆佷笅鎷夋銆佸閫夋銆佸崟閫夋銆佹棩鏈熸帶浠讹級', + dict_type varchar(200) default '' comment '瀛楀吀绫诲瀷', + sort int comment '鎺掑簭', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + primary key (column_id) +) engine=innodb auto_increment=1 comment = '浠g爜鐢熸垚涓氬姟琛ㄥ瓧娈'; diff --git a/sql/ry_config_20210128.sql b/sql/ry_config_20210128.sql new file mode 100644 index 0000000..66d8f5b --- /dev/null +++ b/sql/ry_config_20210128.sql @@ -0,0 +1,216 @@ +DROP DATABASE IF EXISTS `ry-config`; + +CREATE DATABASE `smart-config` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +USE `smart-config`; + +/******************************************/ +/* 琛ㄥ悕绉 = config_info */ +/******************************************/ +CREATE TABLE `config_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(255) DEFAULT NULL, + `content` longtext NOT NULL COMMENT 'content', + `md5` varchar(32) DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '淇敼鏃堕棿', + `src_user` text COMMENT 'source user', + `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip', + `app_name` varchar(128) DEFAULT NULL, + `tenant_id` varchar(128) DEFAULT '' COMMENT '绉熸埛瀛楁', + `c_desc` varchar(256) DEFAULT NULL, + `c_use` varchar(64) DEFAULT NULL, + `effect` varchar(64) DEFAULT NULL, + `type` varchar(64) DEFAULT NULL, + `c_schema` text, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; + +insert into config_info(id, data_id, group_id, content, md5, gmt_create, gmt_modified, src_user, src_ip, app_name, tenant_id, c_desc, c_use, effect, type, c_schema) values +(1,'application-dev.yml','DEFAULT_GROUP','spring:\n main:\n allow-bean-definition-overriding: true\n autoconfigure:\n exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n\n#璇锋眰澶勭悊鐨勮秴鏃舵椂闂碶nribbon:\n ReadTimeout: 10000\n ConnectTimeout: 10000\n\n# feign 閰嶇疆\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# 鏆撮湶鐩戞帶绔偣\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\'\n','c07e6f7321493f6d5390d0a08bffb75a','2019-11-29 16:31:20','2020-12-21 15:29:24',NULL,'0:0:0:0:0:0:0:1','','','閫氱敤閰嶇疆','null','null','yaml','null'), +(2,'ruoyi-gateway-dev.yml','DEFAULT_GROUP','spring:\r\n redis:\r\n host: localhost\r\n port: 6379\r\n password: \r\n cloud:\r\n gateway:\r\n discovery:\r\n locator:\r\n lowerCaseServiceId: true\r\n enabled: true\r\n routes:\r\n # 璁よ瘉涓績\r\n - id: ruoyi-auth\r\n uri: lb://ruoyi-auth\r\n predicates:\r\n - Path=/auth/**\r\n filters:\r\n # 楠岃瘉鐮佸鐞哱r\n - CacheRequestFilter\r\n - ValidateCodeFilter\r\n - StripPrefix=1\r\n # 浠g爜鐢熸垚\r\n - id: ruoyi-gen\r\n uri: lb://ruoyi-gen\r\n predicates:\r\n - Path=/code/**\r\n filters:\r\n - StripPrefix=1\r\n # 瀹氭椂浠诲姟\r\n - id: ruoyi-job\r\n uri: lb://ruoyi-job\r\n predicates:\r\n - Path=/schedule/**\r\n filters:\r\n - StripPrefix=1\r\n # 绯荤粺妯″潡\r\n - id: ruoyi-system\r\n uri: lb://ruoyi-system\r\n predicates:\r\n - Path=/system/**\r\n filters:\r\n - StripPrefix=1\r\n # 鏂囦欢鏈嶅姟\r\n - id: ruoyi-file\r\n uri: lb://ruoyi-file\r\n predicates:\r\n - Path=/file/**\r\n filters:\r\n - StripPrefix=1\r\n\r\n# 涓嶆牎楠岀櫧鍚嶅崟\r\nignore:\r\n whites:\r\n - /auth/logout\r\n - /auth/login\r\n - /*/v2/api-docs\r\n - /csrf\r\n','ef4a58daf989827334b3aac1c9d68392','2020-05-14 14:17:55','2020-11-18 17:53:23',NULL,'0:0:0:0:0:0:0:1','','','缃戝叧妯″潡','null','null','yaml','null'), +(3,'ruoyi-auth-dev.yml','DEFAULT_GROUP','spring: \r\n datasource:\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\r\n username: root\r\n password: password\r\n redis:\r\n host: localhost\r\n port: 6379\r\n password: \r\n','868c15010a7a15c027d4c90a48aabb3e','2020-11-20 00:00:00','2020-11-20 00:00:00',NULL,'0:0:0:0:0:0:0:1','','','璁よ瘉涓績','null','null','yaml','null'), +(4,'ruoyi-monitor-dev.yml','DEFAULT_GROUP','# spring\r\nspring: \r\n security:\r\n user:\r\n name: ruoyi\r\n password: 123456\r\n boot:\r\n admin:\r\n ui:\r\n title: 鑻ヤ緷鏈嶅姟鐘舵佺洃鎺r\n','d8997d0707a2fd5d9fc4e8409da38129','2020-11-20 00:00:00','2020-12-21 16:28:07',NULL,'0:0:0:0:0:0:0:1','','','鐩戞帶涓績','null','null','yaml','null'), +(5,'ruoyi-system-dev.yml','DEFAULT_GROUP','# spring閰嶇疆\r\nspring: \r\n redis:\r\n host: localhost\r\n port: 6379\r\n password: \r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n dynamic:\r\n druid:\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n maxWait: 60000\r\n timeBetweenEvictionRunsMillis: 60000\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n filters: stat,wall,slf4j\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n datasource:\r\n # 涓诲簱鏁版嵁婧怽r\n master:\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\r\n username: root\r\n password: password\r\n # 浠庡簱鏁版嵁婧怽r\n # slave:\r\n # username: \r\n # password: \r\n # url: \r\n # driver-class-name: \r\n # seata: true # 寮鍚痵eata浠g悊锛屽紑鍚悗榛樿姣忎釜鏁版嵁婧愰兘浠g悊锛屽鏋滄煇涓笉闇瑕佷唬鐞嗗彲鍗曠嫭鍏抽棴\r\n\r\n# seata閰嶇疆\r\nseata:\r\n # 榛樿鍏抽棴锛屽闇鍚敤spring.datasource.dynami.seata闇瑕佸悓鏃跺紑鍚痋r\n enabled: false\r\n # Seata 搴旂敤缂栧彿锛岄粯璁や负 ${spring.application.name}\r\n application-id: ${spring.application.name}\r\n # Seata 浜嬪姟缁勭紪鍙凤紝鐢ㄤ簬 TC 闆嗙兢鍚峔r\n tx-service-group: ${spring.application.name}-group\r\n # 鍏抽棴鑷姩浠g悊\r\n enable-auto-data-source-proxy: false\r\n # 鏈嶅姟閰嶇疆椤筡r\n service:\r\n # 铏氭嫙缁勫拰鍒嗙粍鐨勬槧灏刓r\n vgroup-mapping:\r\n ruoyi-system-group: default\r\n config:\r\n type: nacos\r\n nacos:\r\n serverAddr: 127.0.0.1:8848\r\n group: SEATA_GROUP\r\n namespace:\r\n registry:\r\n type: nacos\r\n nacos:\r\n application: seata-server\r\n server-addr: 127.0.0.1:8848\r\n namespace:\r\n\r\n# mybatis閰嶇疆\r\nmybatis:\r\n # 鎼滅储鎸囧畾鍖呭埆鍚峔r\n typeAliasesPackage: com.ruoyi.system\r\n # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵鏈夌殑mapper.xml鏄犲皠鏂囦欢\r\n mapperLocations: classpath:mapper/**/*.xml\r\n\r\n# swagger閰嶇疆\r\nswagger:\r\n title: 绯荤粺妯″潡鎺ュ彛鏂囨。\r\n license: Powered By ruoyi\r\n licenseUrl: https://ruoyi.vip','ac8913dee679e65bb7d482df5f267d4e','2020-11-20 00:00:00','2021-01-27 10:42:25',NULL,'0:0:0:0:0:0:0:1','','','绯荤粺妯″潡','null','null','yaml','null'), +(6,'ruoyi-gen-dev.yml','DEFAULT_GROUP','# spring閰嶇疆\r\nspring: \r\n redis:\r\n host: localhost\r\n port: 6379\r\n password: \r\n datasource: \r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\r\n username: root\r\n password: password\r\n\r\n# mybatis閰嶇疆\r\nmybatis:\r\n # 鎼滅储鎸囧畾鍖呭埆鍚峔r\n typeAliasesPackage: com.ruoyi.gen.domain\r\n # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵鏈夌殑mapper.xml鏄犲皠鏂囦欢\r\n mapperLocations: classpath:mapper/**/*.xml\r\n\r\n# swagger閰嶇疆\r\nswagger:\r\n title: 浠g爜鐢熸垚鎺ュ彛鏂囨。\r\n license: Powered By ruoyi\r\n licenseUrl: https://ruoyi.vip\r\n\r\n# 浠g爜鐢熸垚\r\ngen: \r\n # 浣滆匼r\n author: ruoyi\r\n # 榛樿鐢熸垚鍖呰矾寰 system 闇鏀规垚鑷繁鐨勬ā鍧楀悕绉 濡 system monitor tool\r\n packageName: com.ruoyi.system\r\n # 鑷姩鍘婚櫎琛ㄥ墠缂锛岄粯璁ゆ槸false\r\n autoRemovePre: false\r\n # 琛ㄥ墠缂锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛塡r\n tablePrefix: sys_\r\n','8c79f64a4cca9b821a03dc8b27a2d8eb','2020-11-20 00:00:00','2021-01-26 10:36:45',NULL,'0:0:0:0:0:0:0:1','','','浠g爜鐢熸垚','null','null','yaml','null'), +(7,'ruoyi-job-dev.yml','DEFAULT_GROUP','# spring閰嶇疆\r\nspring: \r\n redis:\r\n host: localhost\r\n port: 6379\r\n password: \r\n datasource:\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\r\n username: root\r\n password: password\r\n\r\n# mybatis閰嶇疆\r\nmybatis:\r\n # 鎼滅储鎸囧畾鍖呭埆鍚峔r\n typeAliasesPackage: com.ruoyi.job.domain\r\n # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵鏈夌殑mapper.xml鏄犲皠鏂囦欢\r\n mapperLocations: classpath:mapper/**/*.xml\r\n\r\n# swagger閰嶇疆\r\nswagger:\r\n title: 瀹氭椂浠诲姟鎺ュ彛鏂囨。\r\n license: Powered By ruoyi\r\n licenseUrl: https://ruoyi.vip\r\n','d6dfade9a2c93c463ae857cd503cb172','2020-11-20 00:00:00','2021-01-26 10:36:04',NULL,'0:0:0:0:0:0:0:1','','','瀹氭椂浠诲姟','null','null','yaml','null'), +(8,'ruoyi-file-dev.yml','DEFAULT_GROUP','# 鏈湴鏂囦欢涓婁紶 \r\nfile:\r\n domain: http://127.0.0.1:9300\r\n path: D:/ruoyi/uploadPath\r\n prefix: /statics\r\n\r\n# FastDFS閰嶇疆\r\nfdfs:\r\n domain: http://8.129.231.12\r\n soTimeout: 3000\r\n connectTimeout: 2000\r\n trackerList: 8.129.231.12:22122\r\n\r\n# Minio閰嶇疆\r\nminio:\r\n url: http://8.129.231.12:9000\r\n accessKey: minioadmin\r\n secretKey: minioadmin\r\n bucketName: test','5382b93f3d8059d6068c0501fdd41195','2020-11-20 00:00:00','2020-12-21 21:01:59',NULL,'0:0:0:0:0:0:0:1','','','鏂囦欢鏈嶅姟','null','null','yaml','null'), +(9,'sentinel-ruoyi-gateway','DEFAULT_GROUP','[\r\n {\r\n \"resource\": \"ruoyi-auth\",\r\n \"count\": 500,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"ruoyi-system\",\r\n \"count\": 1000,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"ruoyi-gen\",\r\n \"count\": 200,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"ruoyi-job\",\r\n \"count\": 300,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n }\r\n]','9f3a3069261598f74220bc47958ec252','2020-11-20 00:00:00','2020-11-20 00:00:00',NULL,'0:0:0:0:0:0:0:1','','','闄愭祦绛栫暐','null','null','json','null'); + + +/******************************************/ +/* 琛ㄥ悕绉 = config_info_aggr */ +/******************************************/ +CREATE TABLE `config_info_aggr` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(255) NOT NULL COMMENT 'group_id', + `datum_id` varchar(255) NOT NULL COMMENT 'datum_id', + `content` longtext NOT NULL COMMENT '鍐呭', + `gmt_modified` datetime NOT NULL COMMENT '淇敼鏃堕棿', + `app_name` varchar(128) DEFAULT NULL, + `tenant_id` varchar(128) DEFAULT '' COMMENT '绉熸埛瀛楁', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='澧炲姞绉熸埛瀛楁'; + + +/******************************************/ +/* 琛ㄥ悕绉 = config_info_beta */ +/******************************************/ +CREATE TABLE `config_info_beta` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) NOT NULL COMMENT 'group_id', + `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', + `content` longtext NOT NULL COMMENT 'content', + `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps', + `md5` varchar(32) DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '淇敼鏃堕棿', + `src_user` text COMMENT 'source user', + `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip', + `tenant_id` varchar(128) DEFAULT '' COMMENT '绉熸埛瀛楁', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta'; + +/******************************************/ +/* 琛ㄥ悕绉 = config_info_tag */ +/******************************************/ +CREATE TABLE `config_info_tag` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', + `tag_id` varchar(128) NOT NULL COMMENT 'tag_id', + `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', + `content` longtext NOT NULL COMMENT 'content', + `md5` varchar(32) DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '淇敼鏃堕棿', + `src_user` text COMMENT 'source user', + `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag'; + +/******************************************/ +/* 琛ㄥ悕绉 = config_tags_relation */ +/******************************************/ +CREATE TABLE `config_tags_relation` ( + `id` bigint(20) NOT NULL COMMENT 'id', + `tag_name` varchar(128) NOT NULL COMMENT 'tag_name', + `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', + `nid` bigint(20) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`nid`), + UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; + +/******************************************/ +/* 琛ㄥ悕绉 = group_capacity */ +/******************************************/ +CREATE TABLE `group_capacity` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '涓婚敭ID', + `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID锛岀┖瀛楃琛ㄧず鏁翠釜闆嗙兢', + `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '閰嶉锛0琛ㄧず浣跨敤榛樿鍊', + `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '浣跨敤閲', + `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '鍗曚釜閰嶇疆澶у皬涓婇檺锛屽崟浣嶄负瀛楄妭锛0琛ㄧず浣跨敤榛樿鍊', + `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '鑱氬悎瀛愰厤缃渶澶т釜鏁帮紝锛0琛ㄧず浣跨敤榛樿鍊', + `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '鍗曚釜鑱氬悎鏁版嵁鐨勫瓙閰嶇疆澶у皬涓婇檺锛屽崟浣嶄负瀛楄妭锛0琛ㄧず浣跨敤榛樿鍊', + `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '鏈澶у彉鏇村巻鍙叉暟閲', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '淇敼鏃堕棿', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_group_id` (`group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='闆嗙兢銆佸悇Group瀹归噺淇℃伅琛'; + +/******************************************/ +/* 琛ㄥ悕绉 = his_config_info */ +/******************************************/ +CREATE TABLE `his_config_info` ( + `id` bigint(64) unsigned NOT NULL, + `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `data_id` varchar(255) NOT NULL, + `group_id` varchar(128) NOT NULL, + `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', + `content` longtext NOT NULL, + `md5` varchar(32) DEFAULT NULL, + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `src_user` text, + `src_ip` varchar(20) DEFAULT NULL, + `op_type` char(10) DEFAULT NULL, + `tenant_id` varchar(128) DEFAULT '' COMMENT '绉熸埛瀛楁', + PRIMARY KEY (`nid`), + KEY `idx_gmt_create` (`gmt_create`), + KEY `idx_gmt_modified` (`gmt_modified`), + KEY `idx_did` (`data_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='澶氱鎴锋敼閫'; + + +/******************************************/ +/* 鏁版嵁搴撳叏鍚 = nacos_config */ +/* 琛ㄥ悕绉 = tenant_capacity */ +/******************************************/ +CREATE TABLE `tenant_capacity` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '涓婚敭ID', + `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', + `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '閰嶉锛0琛ㄧず浣跨敤榛樿鍊', + `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '浣跨敤閲', + `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '鍗曚釜閰嶇疆澶у皬涓婇檺锛屽崟浣嶄负瀛楄妭锛0琛ㄧず浣跨敤榛樿鍊', + `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '鑱氬悎瀛愰厤缃渶澶т釜鏁', + `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '鍗曚釜鑱氬悎鏁版嵁鐨勫瓙閰嶇疆澶у皬涓婇檺锛屽崟浣嶄负瀛楄妭锛0琛ㄧず浣跨敤榛樿鍊', + `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '鏈澶у彉鏇村巻鍙叉暟閲', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '淇敼鏃堕棿', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='绉熸埛瀹归噺淇℃伅琛'; + + +CREATE TABLE `tenant_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `kp` varchar(128) NOT NULL COMMENT 'kp', + `tenant_id` varchar(128) default '' COMMENT 'tenant_id', + `tenant_name` varchar(128) default '' COMMENT 'tenant_name', + `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc', + `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source', + `gmt_create` bigint(20) NOT NULL COMMENT '鍒涘缓鏃堕棿', + `gmt_modified` bigint(20) NOT NULL COMMENT '淇敼鏃堕棿', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; + +CREATE TABLE `users` ( + `username` varchar(50) NOT NULL PRIMARY KEY, + `password` varchar(500) NOT NULL, + `enabled` boolean NOT NULL +); + +CREATE TABLE `roles` ( + `username` varchar(50) NOT NULL, + `role` varchar(50) NOT NULL, + UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE +); + +CREATE TABLE `permissions` ( + `role` varchar(50) NOT NULL, + `resource` varchar(512) NOT NULL, + `action` varchar(8) NOT NULL, + UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE +); + +INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); + +INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN'); diff --git a/sql/ry_seata_20210128.sql b/sql/ry_seata_20210128.sql new file mode 100644 index 0000000..b983cc5 --- /dev/null +++ b/sql/ry_seata_20210128.sql @@ -0,0 +1,693 @@ +-- ---------------------------- +-- 1銆侀儴闂ㄨ〃 +-- ---------------------------- +drop table if exists sys_dept; +create table sys_dept ( + dept_id bigint(20) not null auto_increment comment '閮ㄩ棬id', + parent_id bigint(20) default 0 comment '鐖堕儴闂╥d', + ancestors varchar(50) default '' comment '绁栫骇鍒楄〃', + dept_name varchar(30) default '' comment '閮ㄩ棬鍚嶇О', + order_num int(4) default 0 comment '鏄剧ず椤哄簭', + leader varchar(20) default null comment '璐熻矗浜', + phone varchar(11) default null comment '鑱旂郴鐢佃瘽', + email varchar(50) default null comment '閭', + status char(1) default '0' comment '閮ㄩ棬鐘舵侊紙0姝e父 1鍋滅敤锛', + del_flag char(1) default '0' comment '鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + primary key (dept_id) +) engine=innodb auto_increment=200 comment = '閮ㄩ棬琛'; + +-- ---------------------------- +-- 鍒濆鍖-閮ㄩ棬琛ㄦ暟鎹 +-- ---------------------------- +insert into sys_dept values(100, 0, '0', '鑻ヤ緷绉戞妧', 0, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(101, 100, '0,100', '娣卞湷鎬诲叕鍙', 1, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(102, 100, '0,100', '闀挎矙鍒嗗叕鍙', 2, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(103, 101, '0,100,101', '鐮斿彂閮ㄩ棬', 1, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(104, 101, '0,100,101', '甯傚満閮ㄩ棬', 2, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(105, 101, '0,100,101', '娴嬭瘯閮ㄩ棬', 3, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(106, 101, '0,100,101', '璐㈠姟閮ㄩ棬', 4, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(107, 101, '0,100,101', '杩愮淮閮ㄩ棬', 5, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(108, 102, '0,100,102', '甯傚満閮ㄩ棬', 1, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); +insert into sys_dept values(109, 102, '0,100,102', '璐㈠姟閮ㄩ棬', 2, '鑻ヤ緷', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); + + +-- ---------------------------- +-- 2銆佺敤鎴蜂俊鎭〃 +-- ---------------------------- +drop table if exists sys_user; +create table sys_user ( + user_id bigint(20) not null auto_increment comment '鐢ㄦ埛ID', + dept_id bigint(20) default null comment '閮ㄩ棬ID', + user_name varchar(30) not null comment '鐢ㄦ埛璐﹀彿', + nick_name varchar(30) not null comment '鐢ㄦ埛鏄电О', + user_type varchar(2) default '00' comment '鐢ㄦ埛绫诲瀷锛00绯荤粺鐢ㄦ埛锛', + email varchar(50) default '' comment '鐢ㄦ埛閭', + phonenumber varchar(11) default '' comment '鎵嬫満鍙风爜', + sex char(1) default '0' comment '鐢ㄦ埛鎬у埆锛0鐢 1濂 2鏈煡锛', + avatar varchar(100) default '' comment '澶村儚鍦板潃', + password varchar(100) default '' comment '瀵嗙爜', + status char(1) default '0' comment '甯愬彿鐘舵侊紙0姝e父 1鍋滅敤锛', + del_flag char(1) default '0' comment '鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛', + login_ip varchar(50) default '' comment '鏈鍚庣櫥褰旾P', + login_date datetime comment '鏈鍚庣櫥褰曟椂闂', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (user_id) +) engine=innodb auto_increment=100 comment = '鐢ㄦ埛淇℃伅琛'; + +-- ---------------------------- +-- 鍒濆鍖-鐢ㄦ埛淇℃伅琛ㄦ暟鎹 +-- ---------------------------- +insert into sys_user values(1, 103, 'admin', '鑻ヤ緷', '00', 'ry@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', '2018-03-16 11-33-00', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绠$悊鍛'); +insert into sys_user values(2, 105, 'ry', '鑻ヤ緷', '00', 'ry@qq.com', '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', '2018-03-16 11-33-00', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '娴嬭瘯鍛'); + + +-- ---------------------------- +-- 3銆佸矖浣嶄俊鎭〃 +-- ---------------------------- +drop table if exists sys_post; +create table sys_post +( + post_id bigint(20) not null auto_increment comment '宀椾綅ID', + post_code varchar(64) not null comment '宀椾綅缂栫爜', + post_name varchar(50) not null comment '宀椾綅鍚嶇О', + post_sort int(4) not null comment '鏄剧ず椤哄簭', + status char(1) not null comment '鐘舵侊紙0姝e父 1鍋滅敤锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (post_id) +) engine=innodb comment = '宀椾綅淇℃伅琛'; + +-- ---------------------------- +-- 鍒濆鍖-宀椾綅淇℃伅琛ㄦ暟鎹 +-- ---------------------------- +insert into sys_post values(1, 'ceo', '钁d簨闀', 1, '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_post values(2, 'se', '椤圭洰缁忕悊', 2, '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_post values(3, 'hr', '浜哄姏璧勬簮', 3, '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_post values(4, 'user', '鏅氬憳宸', 4, '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); + + +-- ---------------------------- +-- 4銆佽鑹蹭俊鎭〃 +-- ---------------------------- +drop table if exists sys_role; +create table sys_role ( + role_id bigint(20) not null auto_increment comment '瑙掕壊ID', + role_name varchar(30) not null comment '瑙掕壊鍚嶇О', + role_key varchar(100) not null comment '瑙掕壊鏉冮檺瀛楃涓', + role_sort int(4) not null comment '鏄剧ず椤哄簭', + data_scope char(1) default '1' comment '鏁版嵁鑼冨洿锛1锛氬叏閮ㄦ暟鎹潈闄 2锛氳嚜瀹氭暟鎹潈闄 3锛氭湰閮ㄩ棬鏁版嵁鏉冮檺 4锛氭湰閮ㄩ棬鍙婁互涓嬫暟鎹潈闄愶級', + menu_check_strictly tinyint(1) default 1 comment '鑿滃崟鏍戦夋嫨椤规槸鍚﹀叧鑱旀樉绀', + dept_check_strictly tinyint(1) default 1 comment '閮ㄩ棬鏍戦夋嫨椤规槸鍚﹀叧鑱旀樉绀', + status char(1) not null comment '瑙掕壊鐘舵侊紙0姝e父 1鍋滅敤锛', + del_flag char(1) default '0' comment '鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (role_id) +) engine=innodb auto_increment=100 comment = '瑙掕壊淇℃伅琛'; + +-- ---------------------------- +-- 鍒濆鍖-瑙掕壊淇℃伅琛ㄦ暟鎹 +-- ---------------------------- +insert into sys_role values('1', '瓒呯骇绠$悊鍛', 'admin', 1, 1, 1, 1, '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瓒呯骇绠$悊鍛'); +insert into sys_role values('2', '鏅氳鑹', 'common', 2, 2, 1, 1, '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏅氳鑹'); + + +-- ---------------------------- +-- 5銆佽彍鍗曟潈闄愯〃 +-- ---------------------------- +drop table if exists sys_menu; +create table sys_menu ( + menu_id bigint(20) not null auto_increment comment '鑿滃崟ID', + menu_name varchar(50) not null comment '鑿滃崟鍚嶇О', + parent_id bigint(20) default 0 comment '鐖惰彍鍗旾D', + order_num int(4) default 0 comment '鏄剧ず椤哄簭', + path varchar(200) default '' comment '璺敱鍦板潃', + component varchar(255) default null comment '缁勪欢璺緞', + is_frame int(1) default 1 comment '鏄惁涓哄閾撅紙0鏄 1鍚︼級', + is_cache int(1) default 0 comment '鏄惁缂撳瓨锛0缂撳瓨 1涓嶇紦瀛橈級', + menu_type char(1) default '' comment '鑿滃崟绫诲瀷锛圡鐩綍 C鑿滃崟 F鎸夐挳锛', + visible char(1) default 0 comment '鑿滃崟鐘舵侊紙0鏄剧ず 1闅愯棌锛', + status char(1) default 0 comment '鑿滃崟鐘舵侊紙0姝e父 1鍋滅敤锛', + perms varchar(100) default null comment '鏉冮檺鏍囪瘑', + icon varchar(100) default '#' comment '鑿滃崟鍥炬爣', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default '' comment '澶囨敞', + primary key (menu_id) +) engine=innodb auto_increment=2000 comment = '鑿滃崟鏉冮檺琛'; + +-- ---------------------------- +-- 鍒濆鍖-鑿滃崟淇℃伅琛ㄦ暟鎹 +-- ---------------------------- +-- 涓绾ц彍鍗 +insert into sys_menu values('1', '绯荤粺绠$悊', '0', '1', 'system', null, 1, 0, 'M', '0', '0', '', 'system', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺绠$悊鐩綍'); +insert into sys_menu values('2', '绯荤粺鐩戞帶', '0', '2', 'monitor', null, 1, 0, 'M', '0', '0', '', 'monitor', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺鐩戞帶鐩綍'); +insert into sys_menu values('3', '绯荤粺宸ュ叿', '0', '3', 'tool', null, 1, 0, 'M', '0', '0', '', 'tool', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺宸ュ叿鐩綍'); +insert into sys_menu values('4', '鑻ヤ緷瀹樼綉', '0', '4', 'http://ruoyi.vip', null , 0, 0, 'M', '0', '0', '', 'guide', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鑻ヤ緷瀹樼綉鍦板潃'); +-- 浜岀骇鑿滃崟 +insert into sys_menu values('100', '鐢ㄦ埛绠$悊', '1', '1', 'user', 'system/user/index', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鐢ㄦ埛绠$悊鑿滃崟'); +insert into sys_menu values('101', '瑙掕壊绠$悊', '1', '2', 'role', 'system/role/index', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瑙掕壊绠$悊鑿滃崟'); +insert into sys_menu values('102', '鑿滃崟绠$悊', '1', '3', 'menu', 'system/menu/index', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鑿滃崟绠$悊鑿滃崟'); +insert into sys_menu values('103', '閮ㄩ棬绠$悊', '1', '4', 'dept', 'system/dept/index', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '閮ㄩ棬绠$悊鑿滃崟'); +insert into sys_menu values('104', '宀椾綅绠$悊', '1', '5', 'post', 'system/post/index', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '宀椾綅绠$悊鑿滃崟'); +insert into sys_menu values('105', '瀛楀吀绠$悊', '1', '6', 'dict', 'system/dict/index', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀛楀吀绠$悊鑿滃崟'); +insert into sys_menu values('106', '鍙傛暟璁剧疆', '1', '7', 'config', 'system/config/index', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍙傛暟璁剧疆鑿滃崟'); +insert into sys_menu values('107', '閫氱煡鍏憡', '1', '9', 'notice', 'system/notice/index', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '閫氱煡鍏憡鑿滃崟'); +insert into sys_menu values('108', '鏃ュ織绠$悊', '1', '10', 'log', '', 1, 0, 'M', '0', '0', '', 'log', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏃ュ織绠$悊鑿滃崟'); +insert into sys_menu values('109', '鍦ㄧ嚎鐢ㄦ埛', '2', '1', 'online', 'monitor/online/index', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍦ㄧ嚎鐢ㄦ埛鑿滃崟'); +insert into sys_menu values('110', '瀹氭椂浠诲姟', '2', '2', 'job', 'monitor/job/index', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀹氭椂浠诲姟鑿滃崟'); +insert into sys_menu values('111', 'Sentinel鎺у埗鍙', '2', '3', 'http://localhost:8718', '', 1, 0, 'C', '0', '0', 'monitor:sentinel:list', 'sentinel', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '娴侀噺鎺у埗鑿滃崟'); +insert into sys_menu values('112', 'Nacos鎺у埗鍙', '2', '4', 'http://localhost:8848/nacos', '', 1, 0, 'C', '0', '0', 'monitor:nacos:list', 'nacos', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏈嶅姟娌荤悊鑿滃崟'); +insert into sys_menu values('113', 'Admin鎺у埗鍙', '2', '5', 'http://localhost:9100/login', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏈嶅姟鐩戞帶鑿滃崟'); +insert into sys_menu values('114', '琛ㄥ崟鏋勫缓', '3', '1', 'build', 'tool/build/index', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '琛ㄥ崟鏋勫缓鑿滃崟'); +insert into sys_menu values('115', '浠g爜鐢熸垚', '3', '2', 'gen', 'tool/gen/index', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '浠g爜鐢熸垚鑿滃崟'); +insert into sys_menu values('116', '绯荤粺鎺ュ彛', '3', '3', 'http://localhost:8080/swagger-ui.html', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺鎺ュ彛鑿滃崟'); +-- 涓夌骇鑿滃崟 +insert into sys_menu values('500', '鎿嶄綔鏃ュ織', '108', '1', 'operlog', 'system/operlog/index', 1, 0, 'C', '0', '0', 'system:operlog:list', 'form', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎿嶄綔鏃ュ織鑿滃崟'); +insert into sys_menu values('501', '鐧诲綍鏃ュ織', '108', '2', 'logininfor', 'system/logininfor/index', 1, 0, 'C', '0', '0', 'system:logininfor:list', 'logininfor', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鐧诲綍鏃ュ織鑿滃崟'); +-- 鐢ㄦ埛绠$悊鎸夐挳 +insert into sys_menu values('1001', '鐢ㄦ埛鏌ヨ', '100', '1', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1002', '鐢ㄦ埛鏂板', '100', '2', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1003', '鐢ㄦ埛淇敼', '100', '3', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1004', '鐢ㄦ埛鍒犻櫎', '100', '4', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1005', '鐢ㄦ埛瀵煎嚭', '100', '5', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1006', '鐢ㄦ埛瀵煎叆', '100', '6', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1007', '閲嶇疆瀵嗙爜', '100', '7', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 瑙掕壊绠$悊鎸夐挳 +insert into sys_menu values('1008', '瑙掕壊鏌ヨ', '101', '1', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1009', '瑙掕壊鏂板', '101', '2', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1010', '瑙掕壊淇敼', '101', '3', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1011', '瑙掕壊鍒犻櫎', '101', '4', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1012', '瑙掕壊瀵煎嚭', '101', '5', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 鑿滃崟绠$悊鎸夐挳 +insert into sys_menu values('1013', '鑿滃崟鏌ヨ', '102', '1', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1014', '鑿滃崟鏂板', '102', '2', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1015', '鑿滃崟淇敼', '102', '3', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1016', '鑿滃崟鍒犻櫎', '102', '4', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 閮ㄩ棬绠$悊鎸夐挳 +insert into sys_menu values('1017', '閮ㄩ棬鏌ヨ', '103', '1', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1018', '閮ㄩ棬鏂板', '103', '2', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1019', '閮ㄩ棬淇敼', '103', '3', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1020', '閮ㄩ棬鍒犻櫎', '103', '4', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 宀椾綅绠$悊鎸夐挳 +insert into sys_menu values('1021', '宀椾綅鏌ヨ', '104', '1', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1022', '宀椾綅鏂板', '104', '2', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1023', '宀椾綅淇敼', '104', '3', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1024', '宀椾綅鍒犻櫎', '104', '4', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1025', '宀椾綅瀵煎嚭', '104', '5', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 瀛楀吀绠$悊鎸夐挳 +insert into sys_menu values('1026', '瀛楀吀鏌ヨ', '105', '1', '#', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1027', '瀛楀吀鏂板', '105', '2', '#', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1028', '瀛楀吀淇敼', '105', '3', '#', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1029', '瀛楀吀鍒犻櫎', '105', '4', '#', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1030', '瀛楀吀瀵煎嚭', '105', '5', '#', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 鍙傛暟璁剧疆鎸夐挳 +insert into sys_menu values('1031', '鍙傛暟鏌ヨ', '106', '1', '#', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1032', '鍙傛暟鏂板', '106', '2', '#', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1033', '鍙傛暟淇敼', '106', '3', '#', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1034', '鍙傛暟鍒犻櫎', '106', '4', '#', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1035', '鍙傛暟瀵煎嚭', '106', '5', '#', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 閫氱煡鍏憡鎸夐挳 +insert into sys_menu values('1041', '鍏憡鏌ヨ', '107', '1', '#', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1042', '鍏憡鏂板', '107', '2', '#', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1043', '鍏憡淇敼', '107', '3', '#', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1044', '鍏憡鍒犻櫎', '107', '4', '#', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 鎿嶄綔鏃ュ織鎸夐挳 +insert into sys_menu values('1045', '鎿嶄綔鏌ヨ', '500', '1', '#', '', 1, 0, 'F', '0', '0', 'system:operlog:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1046', '鎿嶄綔鍒犻櫎', '500', '2', '#', '', 1, 0, 'F', '0', '0', 'system:operlog:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1047', '鏃ュ織瀵煎嚭', '500', '4', '#', '', 1, 0, 'F', '0', '0', 'system:operlog:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 鐧诲綍鏃ュ織鎸夐挳 +insert into sys_menu values('1048', '鐧诲綍鏌ヨ', '501', '1', '#', '', 1, 0, 'F', '0', '0', 'system:logininfor:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1049', '鐧诲綍鍒犻櫎', '501', '2', '#', '', 1, 0, 'F', '0', '0', 'system:logininfor:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1050', '鏃ュ織瀵煎嚭', '501', '3', '#', '', 1, 0, 'F', '0', '0', 'system:logininfor:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 鍦ㄧ嚎鐢ㄦ埛鎸夐挳 +insert into sys_menu values('1051', '鍦ㄧ嚎鏌ヨ', '109', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1052', '鎵归噺寮洪', '109', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1053', '鍗曟潯寮洪', '109', '3', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 瀹氭椂浠诲姟鎸夐挳 +insert into sys_menu values('1054', '浠诲姟鏌ヨ', '110', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1055', '浠诲姟鏂板', '110', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1056', '浠诲姟淇敼', '110', '3', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1057', '浠诲姟鍒犻櫎', '110', '4', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1058', '鐘舵佷慨鏀', '110', '5', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1059', '浠诲姟瀵煎嚭', '110', '7', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +-- 浠g爜鐢熸垚鎸夐挳 +insert into sys_menu values('1060', '鐢熸垚鏌ヨ', '115', '1', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1061', '鐢熸垚淇敼', '115', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1062', '鐢熸垚鍒犻櫎', '115', '3', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1063', '瀵煎叆浠g爜', '115', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1064', '棰勮浠g爜', '115', '4', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_menu values('1065', '鐢熸垚浠g爜', '115', '5', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); + + +-- ---------------------------- +-- 6銆佺敤鎴峰拰瑙掕壊鍏宠仈琛 鐢ㄦ埛N-1瑙掕壊 +-- ---------------------------- +drop table if exists sys_user_role; +create table sys_user_role ( + user_id bigint(20) not null comment '鐢ㄦ埛ID', + role_id bigint(20) not null comment '瑙掕壊ID', + primary key(user_id, role_id) +) engine=innodb comment = '鐢ㄦ埛鍜岃鑹插叧鑱旇〃'; + +-- ---------------------------- +-- 鍒濆鍖-鐢ㄦ埛鍜岃鑹插叧鑱旇〃鏁版嵁 +-- ---------------------------- +insert into sys_user_role values ('1', '1'); +insert into sys_user_role values ('2', '2'); + + +-- ---------------------------- +-- 7銆佽鑹插拰鑿滃崟鍏宠仈琛 瑙掕壊1-N鑿滃崟 +-- ---------------------------- +drop table if exists sys_role_menu; +create table sys_role_menu ( + role_id bigint(20) not null comment '瑙掕壊ID', + menu_id bigint(20) not null comment '鑿滃崟ID', + primary key(role_id, menu_id) +) engine=innodb comment = '瑙掕壊鍜岃彍鍗曞叧鑱旇〃'; + +-- ---------------------------- +-- 鍒濆鍖-瑙掕壊鍜岃彍鍗曞叧鑱旇〃鏁版嵁 +-- ---------------------------- +insert into sys_role_menu values ('2', '1'); +insert into sys_role_menu values ('2', '2'); +insert into sys_role_menu values ('2', '3'); +insert into sys_role_menu values ('2', '4'); +insert into sys_role_menu values ('2', '100'); +insert into sys_role_menu values ('2', '101'); +insert into sys_role_menu values ('2', '102'); +insert into sys_role_menu values ('2', '103'); +insert into sys_role_menu values ('2', '104'); +insert into sys_role_menu values ('2', '105'); +insert into sys_role_menu values ('2', '106'); +insert into sys_role_menu values ('2', '107'); +insert into sys_role_menu values ('2', '108'); +insert into sys_role_menu values ('2', '109'); +insert into sys_role_menu values ('2', '110'); +insert into sys_role_menu values ('2', '111'); +insert into sys_role_menu values ('2', '112'); +insert into sys_role_menu values ('2', '113'); +insert into sys_role_menu values ('2', '114'); +insert into sys_role_menu values ('2', '115'); +insert into sys_role_menu values ('2', '116'); +insert into sys_role_menu values ('2', '500'); +insert into sys_role_menu values ('2', '501'); +insert into sys_role_menu values ('2', '1000'); +insert into sys_role_menu values ('2', '1001'); +insert into sys_role_menu values ('2', '1002'); +insert into sys_role_menu values ('2', '1003'); +insert into sys_role_menu values ('2', '1004'); +insert into sys_role_menu values ('2', '1005'); +insert into sys_role_menu values ('2', '1006'); +insert into sys_role_menu values ('2', '1007'); +insert into sys_role_menu values ('2', '1008'); +insert into sys_role_menu values ('2', '1009'); +insert into sys_role_menu values ('2', '1010'); +insert into sys_role_menu values ('2', '1011'); +insert into sys_role_menu values ('2', '1012'); +insert into sys_role_menu values ('2', '1013'); +insert into sys_role_menu values ('2', '1014'); +insert into sys_role_menu values ('2', '1015'); +insert into sys_role_menu values ('2', '1016'); +insert into sys_role_menu values ('2', '1017'); +insert into sys_role_menu values ('2', '1018'); +insert into sys_role_menu values ('2', '1019'); +insert into sys_role_menu values ('2', '1020'); +insert into sys_role_menu values ('2', '1021'); +insert into sys_role_menu values ('2', '1022'); +insert into sys_role_menu values ('2', '1023'); +insert into sys_role_menu values ('2', '1024'); +insert into sys_role_menu values ('2', '1025'); +insert into sys_role_menu values ('2', '1026'); +insert into sys_role_menu values ('2', '1027'); +insert into sys_role_menu values ('2', '1028'); +insert into sys_role_menu values ('2', '1029'); +insert into sys_role_menu values ('2', '1030'); +insert into sys_role_menu values ('2', '1031'); +insert into sys_role_menu values ('2', '1032'); +insert into sys_role_menu values ('2', '1033'); +insert into sys_role_menu values ('2', '1034'); +insert into sys_role_menu values ('2', '1035'); +insert into sys_role_menu values ('2', '1036'); +insert into sys_role_menu values ('2', '1037'); +insert into sys_role_menu values ('2', '1038'); +insert into sys_role_menu values ('2', '1039'); +insert into sys_role_menu values ('2', '1040'); +insert into sys_role_menu values ('2', '1041'); +insert into sys_role_menu values ('2', '1042'); +insert into sys_role_menu values ('2', '1043'); +insert into sys_role_menu values ('2', '1044'); +insert into sys_role_menu values ('2', '1045'); +insert into sys_role_menu values ('2', '1046'); +insert into sys_role_menu values ('2', '1047'); +insert into sys_role_menu values ('2', '1048'); +insert into sys_role_menu values ('2', '1049'); +insert into sys_role_menu values ('2', '1050'); +insert into sys_role_menu values ('2', '1051'); +insert into sys_role_menu values ('2', '1052'); +insert into sys_role_menu values ('2', '1053'); +insert into sys_role_menu values ('2', '1054'); +insert into sys_role_menu values ('2', '1055'); +insert into sys_role_menu values ('2', '1056'); +insert into sys_role_menu values ('2', '1057'); +insert into sys_role_menu values ('2', '1058'); +insert into sys_role_menu values ('2', '1059'); +insert into sys_role_menu values ('2', '1060'); +insert into sys_role_menu values ('2', '1061'); +insert into sys_role_menu values ('2', '1062'); +insert into sys_role_menu values ('2', '1063'); +insert into sys_role_menu values ('2', '1064'); +insert into sys_role_menu values ('2', '1065'); + +-- ---------------------------- +-- 8銆佽鑹插拰閮ㄩ棬鍏宠仈琛 瑙掕壊1-N閮ㄩ棬 +-- ---------------------------- +drop table if exists sys_role_dept; +create table sys_role_dept ( + role_id bigint(20) not null comment '瑙掕壊ID', + dept_id bigint(20) not null comment '閮ㄩ棬ID', + primary key(role_id, dept_id) +) engine=innodb comment = '瑙掕壊鍜岄儴闂ㄥ叧鑱旇〃'; + +-- ---------------------------- +-- 鍒濆鍖-瑙掕壊鍜岄儴闂ㄥ叧鑱旇〃鏁版嵁 +-- ---------------------------- +insert into sys_role_dept values ('2', '100'); +insert into sys_role_dept values ('2', '101'); +insert into sys_role_dept values ('2', '105'); + + +-- ---------------------------- +-- 9銆佺敤鎴蜂笌宀椾綅鍏宠仈琛 鐢ㄦ埛1-N宀椾綅 +-- ---------------------------- +drop table if exists sys_user_post; +create table sys_user_post +( + user_id bigint(20) not null comment '鐢ㄦ埛ID', + post_id bigint(20) not null comment '宀椾綅ID', + primary key (user_id, post_id) +) engine=innodb comment = '鐢ㄦ埛涓庡矖浣嶅叧鑱旇〃'; + +-- ---------------------------- +-- 鍒濆鍖-鐢ㄦ埛涓庡矖浣嶅叧鑱旇〃鏁版嵁 +-- ---------------------------- +insert into sys_user_post values ('1', '1'); +insert into sys_user_post values ('2', '2'); + + +-- ---------------------------- +-- 10銆佹搷浣滄棩蹇楄褰 +-- ---------------------------- +drop table if exists sys_oper_log; +create table sys_oper_log ( + oper_id bigint(20) not null auto_increment comment '鏃ュ織涓婚敭', + title varchar(50) default '' comment '妯″潡鏍囬', + business_type int(2) default 0 comment '涓氬姟绫诲瀷锛0鍏跺畠 1鏂板 2淇敼 3鍒犻櫎锛', + method varchar(100) default '' comment '鏂规硶鍚嶇О', + request_method varchar(10) default '' comment '璇锋眰鏂瑰紡', + operator_type int(1) default 0 comment '鎿嶄綔绫诲埆锛0鍏跺畠 1鍚庡彴鐢ㄦ埛 2鎵嬫満绔敤鎴凤級', + oper_name varchar(50) default '' comment '鎿嶄綔浜哄憳', + dept_name varchar(50) default '' comment '閮ㄩ棬鍚嶇О', + oper_url varchar(255) default '' comment '璇锋眰URL', + oper_ip varchar(50) default '' comment '涓绘満鍦板潃', + oper_location varchar(255) default '' comment '鎿嶄綔鍦扮偣', + oper_param varchar(2000) default '' comment '璇锋眰鍙傛暟', + json_result varchar(2000) default '' comment '杩斿洖鍙傛暟', + status int(1) default 0 comment '鎿嶄綔鐘舵侊紙0姝e父 1寮傚父锛', + error_msg varchar(2000) default '' comment '閿欒娑堟伅', + oper_time datetime comment '鎿嶄綔鏃堕棿', + primary key (oper_id) +) engine=innodb auto_increment=100 comment = '鎿嶄綔鏃ュ織璁板綍'; + + +-- ---------------------------- +-- 11銆佸瓧鍏哥被鍨嬭〃 +-- ---------------------------- +drop table if exists sys_dict_type; +create table sys_dict_type +( + dict_id bigint(20) not null auto_increment comment '瀛楀吀涓婚敭', + dict_name varchar(100) default '' comment '瀛楀吀鍚嶇О', + dict_type varchar(100) default '' comment '瀛楀吀绫诲瀷', + status char(1) default '0' comment '鐘舵侊紙0姝e父 1鍋滅敤锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (dict_id), + unique (dict_type) +) engine=innodb auto_increment=100 comment = '瀛楀吀绫诲瀷琛'; + +insert into sys_dict_type values(1, '鐢ㄦ埛鎬у埆', 'sys_user_sex', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鐢ㄦ埛鎬у埆鍒楄〃'); +insert into sys_dict_type values(2, '鑿滃崟鐘舵', 'sys_show_hide', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鑿滃崟鐘舵佸垪琛'); +insert into sys_dict_type values(3, '绯荤粺寮鍏', 'sys_normal_disable', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺寮鍏冲垪琛'); +insert into sys_dict_type values(4, '浠诲姟鐘舵', 'sys_job_status', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '浠诲姟鐘舵佸垪琛'); +insert into sys_dict_type values(5, '浠诲姟鍒嗙粍', 'sys_job_group', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '浠诲姟鍒嗙粍鍒楄〃'); +insert into sys_dict_type values(6, '绯荤粺鏄惁', 'sys_yes_no', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺鏄惁鍒楄〃'); +insert into sys_dict_type values(7, '閫氱煡绫诲瀷', 'sys_notice_type', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '閫氱煡绫诲瀷鍒楄〃'); +insert into sys_dict_type values(8, '閫氱煡鐘舵', 'sys_notice_status', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '閫氱煡鐘舵佸垪琛'); +insert into sys_dict_type values(9, '鎿嶄綔绫诲瀷', 'sys_oper_type', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎿嶄綔绫诲瀷鍒楄〃'); +insert into sys_dict_type values(10, '绯荤粺鐘舵', 'sys_common_status', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鐧诲綍鐘舵佸垪琛'); +insert into sys_dict_type values(11, '鎺堟潈绫诲瀷', 'sys_grant_type', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎺堟潈绫诲瀷鍒楄〃'); + + +-- ---------------------------- +-- 12銆佸瓧鍏告暟鎹〃 +-- ---------------------------- +drop table if exists sys_dict_data; +create table sys_dict_data +( + dict_code bigint(20) not null auto_increment comment '瀛楀吀缂栫爜', + dict_sort int(4) default 0 comment '瀛楀吀鎺掑簭', + dict_label varchar(100) default '' comment '瀛楀吀鏍囩', + dict_value varchar(100) default '' comment '瀛楀吀閿', + dict_type varchar(100) default '' comment '瀛楀吀绫诲瀷', + css_class varchar(100) default null comment '鏍峰紡灞炴э紙鍏朵粬鏍峰紡鎵╁睍锛', + list_class varchar(100) default null comment '琛ㄦ牸鍥炴樉鏍峰紡', + is_default char(1) default 'N' comment '鏄惁榛樿锛圷鏄 N鍚︼級', + status char(1) default '0' comment '鐘舵侊紙0姝e父 1鍋滅敤锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (dict_code) +) engine=innodb auto_increment=100 comment = '瀛楀吀鏁版嵁琛'; + +insert into sys_dict_data values(1, 1, '鐢', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎬у埆鐢'); +insert into sys_dict_data values(2, 2, '濂', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎬у埆濂'); +insert into sys_dict_data values(3, 3, '鏈煡', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎬у埆鏈煡'); +insert into sys_dict_data values(4, 1, '鏄剧ず', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏄剧ず鑿滃崟'); +insert into sys_dict_data values(5, 2, '闅愯棌', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '闅愯棌鑿滃崟'); +insert into sys_dict_data values(6, 1, '姝e父', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '姝e父鐘舵'); +insert into sys_dict_data values(7, 2, '鍋滅敤', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍋滅敤鐘舵'); +insert into sys_dict_data values(8, 1, '姝e父', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '姝e父鐘舵'); +insert into sys_dict_data values(9, 2, '鏆傚仠', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍋滅敤鐘舵'); +insert into sys_dict_data values(10, 1, '榛樿', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '榛樿鍒嗙粍'); +insert into sys_dict_data values(11, 2, '绯荤粺', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺鍒嗙粍'); +insert into sys_dict_data values(12, 1, '鏄', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺榛樿鏄'); +insert into sys_dict_data values(13, 2, '鍚', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绯荤粺榛樿鍚'); +insert into sys_dict_data values(14, 1, '閫氱煡', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '閫氱煡'); +insert into sys_dict_data values(15, 2, '鍏憡', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍏憡'); +insert into sys_dict_data values(16, 1, '姝e父', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '姝e父鐘舵'); +insert into sys_dict_data values(17, 2, '鍏抽棴', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍏抽棴鐘舵'); +insert into sys_dict_data values(18, 1, '鏂板', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鏂板鎿嶄綔'); +insert into sys_dict_data values(19, 2, '淇敼', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '淇敼鎿嶄綔'); +insert into sys_dict_data values(20, 3, '鍒犻櫎', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍒犻櫎鎿嶄綔'); +insert into sys_dict_data values(21, 4, '鎺堟潈', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎺堟潈鎿嶄綔'); +insert into sys_dict_data values(22, 5, '瀵煎嚭', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀵煎嚭鎿嶄綔'); +insert into sys_dict_data values(23, 6, '瀵煎叆', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀵煎叆鎿嶄綔'); +insert into sys_dict_data values(24, 7, '寮洪', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '寮洪鎿嶄綔'); +insert into sys_dict_data values(25, 8, '鐢熸垚浠g爜', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鐢熸垚鎿嶄綔'); +insert into sys_dict_data values(26, 9, '娓呯┖鏁版嵁', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '娓呯┖鎿嶄綔'); +insert into sys_dict_data values(27, 1, '鎴愬姛', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '姝e父鐘舵'); +insert into sys_dict_data values(28, 2, '澶辫触', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍋滅敤鐘舵'); +insert into sys_dict_data values(29, 1, '鎺堟潈鐮佹ā寮', 'authorization_code', 'sys_grant_type', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鎺堟潈鐮佹ā寮'); +insert into sys_dict_data values(30, 2, '瀵嗙爜妯″紡', 'password', 'sys_grant_type', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀵嗙爜妯″紡'); +insert into sys_dict_data values(31, 3, '瀹㈡埛绔ā寮', 'client_credentials', 'sys_grant_type', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '瀹㈡埛绔ā寮'); +insert into sys_dict_data values(32, 4, '绠鍖栨ā寮', 'implicit', 'sys_grant_type', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绠鍖栨ā寮'); +insert into sys_dict_data values(33, 5, '鍒锋柊妯″紡', 'refresh_token', 'sys_grant_type', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍒锋柊妯″紡'); + + +-- ---------------------------- +-- 13銆佸弬鏁伴厤缃〃 +-- ---------------------------- +drop table if exists sys_config; +create table sys_config ( + config_id int(5) not null auto_increment comment '鍙傛暟涓婚敭', + config_name varchar(100) default '' comment '鍙傛暟鍚嶇О', + config_key varchar(100) default '' comment '鍙傛暟閿悕', + config_value varchar(500) default '' comment '鍙傛暟閿', + config_type char(1) default 'N' comment '绯荤粺鍐呯疆锛圷鏄 N鍚︼級', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (config_id) +) engine=innodb auto_increment=100 comment = '鍙傛暟閰嶇疆琛'; + +insert into sys_config values(1, '涓绘鏋堕〉-榛樿鐨偆鏍峰紡鍚嶇О', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '钃濊壊 skin-blue銆佺豢鑹 skin-green銆佺传鑹 skin-purple銆佺孩鑹 skin-red銆侀粍鑹 skin-yellow' ); +insert into sys_config values(2, '鐢ㄦ埛绠$悊-璐﹀彿鍒濆瀵嗙爜', 'sys.user.initPassword', '123456', 'Y', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '鍒濆鍖栧瘑鐮 123456' ); +insert into sys_config values(3, '涓绘鏋堕〉-渚ц竟鏍忎富棰', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '娣辫壊涓婚theme-dark锛屾祬鑹蹭富棰榯heme-light' ); + + +-- ---------------------------- +-- 14銆佺郴缁熻闂褰 +-- ---------------------------- +drop table if exists sys_logininfor; +create table sys_logininfor ( + info_id bigint(20) not null auto_increment comment '璁块棶ID', + user_name varchar(50) default '' comment '鐢ㄦ埛璐﹀彿', + ipaddr varchar(50) default '' comment '鐧诲綍IP鍦板潃', + status char(1) default '0' comment '鐧诲綍鐘舵侊紙0鎴愬姛 1澶辫触锛', + msg varchar(255) default '' comment '鎻愮ず淇℃伅', + access_time datetime comment '璁块棶鏃堕棿', + primary key (info_id) +) engine=innodb auto_increment=100 comment = '绯荤粺璁块棶璁板綍'; + + +-- ---------------------------- +-- 15銆佸畾鏃朵换鍔¤皟搴﹁〃 +-- ---------------------------- +drop table if exists sys_job; +create table sys_job ( + job_id bigint(20) not null auto_increment comment '浠诲姟ID', + job_name varchar(64) default '' comment '浠诲姟鍚嶇О', + job_group varchar(64) default 'DEFAULT' comment '浠诲姟缁勫悕', + invoke_target varchar(500) not null comment '璋冪敤鐩爣瀛楃涓', + cron_expression varchar(255) default '' comment 'cron鎵ц琛ㄨ揪寮', + misfire_policy varchar(20) default '3' comment '璁″垝鎵ц閿欒绛栫暐锛1绔嬪嵆鎵ц 2鎵ц涓娆 3鏀惧純鎵ц锛', + concurrent char(1) default '1' comment '鏄惁骞跺彂鎵ц锛0鍏佽 1绂佹锛', + status char(1) default '0' comment '鐘舵侊紙0姝e父 1鏆傚仠锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default '' comment '澶囨敞淇℃伅', + primary key (job_id, job_name, job_group) +) engine=innodb auto_increment=100 comment = '瀹氭椂浠诲姟璋冨害琛'; + +insert into sys_job values(1, '绯荤粺榛樿锛堟棤鍙傦級', 'DEFAULT', 'ryTask.ryNoParams', '0/10 * * * * ?', '3', '1', '1', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_job values(2, '绯荤粺榛樿锛堟湁鍙傦級', 'DEFAULT', 'ryTask.ryParams(\'ry\')', '0/15 * * * * ?', '3', '1', '1', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); +insert into sys_job values(3, '绯荤粺榛樿锛堝鍙傦級', 'DEFAULT', 'ryTask.ryMultipleParams(\'ry\', true, 2000L, 316.50D, 100)', '0/20 * * * * ?', '3', '1', '1', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); + + +-- ---------------------------- +-- 16銆佸畾鏃朵换鍔¤皟搴︽棩蹇楄〃 +-- ---------------------------- +drop table if exists sys_job_log; +create table sys_job_log ( + job_log_id bigint(20) not null auto_increment comment '浠诲姟鏃ュ織ID', + job_name varchar(64) not null comment '浠诲姟鍚嶇О', + job_group varchar(64) not null comment '浠诲姟缁勫悕', + invoke_target varchar(500) not null comment '璋冪敤鐩爣瀛楃涓', + job_message varchar(500) comment '鏃ュ織淇℃伅', + status char(1) default '0' comment '鎵ц鐘舵侊紙0姝e父 1澶辫触锛', + exception_info varchar(2000) default '' comment '寮傚父淇℃伅', + create_time datetime comment '鍒涘缓鏃堕棿', + primary key (job_log_id) +) engine=innodb comment = '瀹氭椂浠诲姟璋冨害鏃ュ織琛'; + + +-- ---------------------------- +-- 17銆侀氱煡鍏憡琛 +-- ---------------------------- +drop table if exists sys_notice; +create table sys_notice ( + notice_id int(4) not null auto_increment comment '鍏憡ID', + notice_title varchar(50) not null comment '鍏憡鏍囬', + notice_type char(1) not null comment '鍏憡绫诲瀷锛1閫氱煡 2鍏憡锛', + notice_content longblob default null comment '鍏憡鍐呭', + status char(1) default '0' comment '鍏憡鐘舵侊紙0姝e父 1鍏抽棴锛', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(255) default null comment '澶囨敞', + primary key (notice_id) +) engine=innodb auto_increment=10 comment = '閫氱煡鍏憡琛'; + +-- ---------------------------- +-- 鍒濆鍖-鍏憡淇℃伅琛ㄦ暟鎹 +-- ---------------------------- +insert into sys_notice values('1', '娓╅Θ鎻愰啋锛2018-07-01 鑻ヤ緷鏂扮増鏈彂甯冨暒', '2', '鏂扮増鏈唴瀹', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绠$悊鍛'); +insert into sys_notice values('2', '缁存姢閫氱煡锛2018-07-01 鑻ヤ緷绯荤粺鍑屾櫒缁存姢', '1', '缁存姢鍐呭', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '绠$悊鍛'); + + +-- ---------------------------- +-- 18銆佷唬鐮佺敓鎴愪笟鍔¤〃 +-- ---------------------------- +drop table if exists gen_table; +create table gen_table ( + table_id bigint(20) not null auto_increment comment '缂栧彿', + table_name varchar(200) default '' comment '琛ㄥ悕绉', + table_comment varchar(500) default '' comment '琛ㄦ弿杩', + sub_table_name varchar(64) default null comment '鍏宠仈瀛愯〃鐨勮〃鍚', + sub_table_fk_name varchar(64) default null comment '瀛愯〃鍏宠仈鐨勫閿悕', + class_name varchar(100) default '' comment '瀹炰綋绫诲悕绉', + tpl_category varchar(200) default 'crud' comment '浣跨敤鐨勬ā鏉匡紙crud鍗曡〃鎿嶄綔 tree鏍戣〃鎿嶄綔锛', + package_name varchar(100) comment '鐢熸垚鍖呰矾寰', + module_name varchar(30) comment '鐢熸垚妯″潡鍚', + business_name varchar(30) comment '鐢熸垚涓氬姟鍚', + function_name varchar(50) comment '鐢熸垚鍔熻兘鍚', + function_author varchar(50) comment '鐢熸垚鍔熻兘浣滆', + gen_type char(1) default '0' comment '鐢熸垚浠g爜鏂瑰紡锛0zip鍘嬬缉鍖 1鑷畾涔夎矾寰勶級', + gen_path varchar(200) default '/' comment '鐢熸垚璺緞锛堜笉濉粯璁ら」鐩矾寰勶級', + options varchar(1000) comment '鍏跺畠鐢熸垚閫夐」', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + remark varchar(500) default null comment '澶囨敞', + primary key (table_id) +) engine=innodb auto_increment=1 comment = '浠g爜鐢熸垚涓氬姟琛'; + + +-- ---------------------------- +-- 19銆佷唬鐮佺敓鎴愪笟鍔¤〃瀛楁 +-- ---------------------------- +drop table if exists gen_table_column; +create table gen_table_column ( + column_id bigint(20) not null auto_increment comment '缂栧彿', + table_id varchar(64) comment '褰掑睘琛ㄧ紪鍙', + column_name varchar(200) comment '鍒楀悕绉', + column_comment varchar(500) comment '鍒楁弿杩', + column_type varchar(100) comment '鍒楃被鍨', + java_type varchar(500) comment 'JAVA绫诲瀷', + java_field varchar(200) comment 'JAVA瀛楁鍚', + is_pk char(1) comment '鏄惁涓婚敭锛1鏄級', + is_increment char(1) comment '鏄惁鑷锛1鏄級', + is_required char(1) comment '鏄惁蹇呭~锛1鏄級', + is_insert char(1) comment '鏄惁涓烘彃鍏ュ瓧娈碉紙1鏄級', + is_edit char(1) comment '鏄惁缂栬緫瀛楁锛1鏄級', + is_list char(1) comment '鏄惁鍒楄〃瀛楁锛1鏄級', + is_query char(1) comment '鏄惁鏌ヨ瀛楁锛1鏄級', + query_type varchar(200) default 'EQ' comment '鏌ヨ鏂瑰紡锛堢瓑浜庛佷笉绛変簬銆佸ぇ浜庛佸皬浜庛佽寖鍥达級', + html_type varchar(200) comment '鏄剧ず绫诲瀷锛堟枃鏈銆佹枃鏈煙銆佷笅鎷夋銆佸閫夋銆佸崟閫夋銆佹棩鏈熸帶浠讹級', + dict_type varchar(200) default '' comment '瀛楀吀绫诲瀷', + sort int comment '鎺掑簭', + create_by varchar(64) default '' comment '鍒涘缓鑰', + create_time datetime comment '鍒涘缓鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊鑰', + update_time datetime comment '鏇存柊鏃堕棿', + primary key (column_id) +) engine=innodb auto_increment=1 comment = '浠g爜鐢熸垚涓氬姟琛ㄥ瓧娈'; -- Gitee