From af02378f959717b79ba3a602f900ac71dee7b940 Mon Sep 17 00:00:00 2001 From: tzy Date: Sun, 9 Nov 2025 19:21:01 +0800 Subject: [PATCH] 1 --- .github/FUNDING.yml | 1 + .gitignore | 46 + .vscode/settings.json | 3 + LICENSE | 20 + README.md | 94 + README_INTEGRATION.md | 243 +++ README_MQTT_OPTIONAL.md | 182 ++ bin/clean.bat | 12 + bin/package.bat | 12 + bin/run-tomcat.bat | 14 + doc/若依环境使用手册.docx | Bin 0 -> 428430 bytes pom.xml | 322 +++ ry.bat | 67 + ry.sh | 86 + sql/README_DATABASE_DESIGN.md | 154 ++ sql/bms_battery.sql | 74 + sql/bms_battery_data.sql | 83 + sql/bms_box_device.sql | 54 + sql/bms_device.sql | 38 + sql/quartz.sql | 174 ++ sql/ry_20250522.sql | 704 ++++++ .../java/com/evobms/EVOBMSApplication.java | 30 + .../com/evobms/RuoYiServletInitializer.java | 18 + .../common/constant/BboxApiConstants.java | 26 + .../common/constant/CacheConstants.java | 44 + .../com/evobms/common/constant/Constants.java | 173 ++ .../evobms/common/constant/GenConstants.java | 117 + .../evobms/common/constant/HttpStatus.java | 94 + .../common/constant/ScheduleConstants.java | 50 + .../evobms/common/constant/UserConstants.java | 81 + .../evobms/common/core/text/CharsetKit.java | 86 + .../com/evobms/common/core/text/Convert.java | 1012 +++++++++ .../evobms/common/core/text/StrFormatter.java | 92 + .../com/evobms/common/enums/HttpMethod.java | 36 + .../com/evobms/common/enums/UserStatus.java | 30 + .../common/exception/DemoModeException.java | 15 + .../common/exception/GlobalException.java | 58 + .../common/exception/ServiceException.java | 74 + .../common/exception/UtilException.java | 26 + .../common/exception/base/BaseException.java | 97 + .../common/exception/file/FileException.java | 19 + .../FileNameLengthLimitExceededException.java | 16 + .../file/FileSizeLimitExceededException.java | 16 + .../exception/file/FileUploadException.java | 61 + .../file/InvalidExtensionException.java | 80 + .../common/exception/job/TaskException.java | 34 + .../exception/user/BlackListException.java | 16 + .../exception/user/CaptchaException.java | 16 + .../user/CaptchaExpireException.java | 16 + .../common/exception/user/UserException.java | 18 + .../user/UserNotExistsException.java | 16 + .../user/UserPasswordNotMatchException.java | 16 + ...UserPasswordRetryLimitExceedException.java | 16 + .../evobms/common/filter/HttpDumpFilter.java | 98 + .../filter/PropertyPreExcludeFilter.java | 24 + .../evobms/common/filter/RefererFilter.java | 77 + .../common/filter/RepeatableFilter.java | 52 + .../filter/RepeatedlyRequestWrapper.java | 76 + .../com/evobms/common/filter/XssFilter.java | 75 + .../filter/XssHttpServletRequestWrapper.java | 111 + .../evobms/common/utils/AesEcbPkcs5Utils.java | 44 + .../java/com/evobms/common/utils/Arith.java | 113 + .../com/evobms/common/utils/DateUtils.java | 191 ++ .../evobms/common/utils/DesensitizedUtil.java | 49 + .../com/evobms/common/utils/DictUtils.java | 239 +++ .../evobms/common/utils/ExceptionUtil.java | 39 + .../com/evobms/common/utils/LogUtils.java | 18 + .../com/evobms/common/utils/MessageUtils.java | 26 + .../com/evobms/common/utils/PageUtils.java | 35 + .../evobms/common/utils/SecurityUtils.java | 176 ++ .../com/evobms/common/utils/ServletUtils.java | 218 ++ .../com/evobms/common/utils/StringUtils.java | 722 +++++++ .../java/com/evobms/common/utils/Threads.java | 99 + .../evobms/common/utils/bean/BeanUtils.java | 110 + .../common/utils/bean/BeanValidators.java | 24 + .../common/utils/file/FileTypeUtils.java | 76 + .../common/utils/file/FileUploadUtils.java | 260 +++ .../evobms/common/utils/file/FileUtils.java | 303 +++ .../evobms/common/utils/file/ImageUtils.java | 98 + .../common/utils/file/MimeTypeUtils.java | 59 + .../evobms/common/utils/html/EscapeUtil.java | 167 ++ .../evobms/common/utils/html/HTMLFilter.java | 570 +++++ .../evobms/common/utils/http/HttpHelper.java | 55 + .../evobms/common/utils/http/HttpUtils.java | 293 +++ .../evobms/common/utils/ip/AddressUtils.java | 56 + .../com/evobms/common/utils/ip/IpUtils.java | 382 ++++ .../common/utils/job/AbstractQuartzJob.java | 106 + .../evobms/common/utils/job/CronUtils.java | 63 + .../common/utils/job/JobInvokeUtil.java | 182 ++ .../QuartzDisallowConcurrentExecution.java | 21 + .../common/utils/job/QuartzJobExecution.java | 19 + .../common/utils/job/ScheduleUtils.java | 141 ++ .../common/utils/poi/ExcelHandlerAdapter.java | 24 + .../evobms/common/utils/poi/ExcelUtil.java | 1893 +++++++++++++++++ .../common/utils/reflect/ReflectUtils.java | 410 ++++ .../com/evobms/common/utils/sign/Base64.java | 291 +++ .../evobms/common/utils/sign/Md5Utils.java | 67 + .../common/utils/spring/SpringUtils.java | 164 ++ .../com/evobms/common/utils/sql/SqlUtil.java | 70 + .../com/evobms/common/utils/uuid/IdUtils.java | 49 + .../com/evobms/common/utils/uuid/Seq.java | 86 + .../com/evobms/common/utils/uuid/UUID.java | 484 +++++ src/main/java/com/evobms/common/xss/Xss.java | 27 + .../com/evobms/common/xss/XssValidator.java | 39 + .../framework/aspectj/DataScopeAspect.java | 184 ++ .../framework/aspectj/DataSourceAspect.java | 72 + .../evobms/framework/aspectj/LogAspect.java | 256 +++ .../framework/aspectj/RateLimiterAspect.java | 89 + .../aspectj/lang/annotation/Anonymous.java | 19 + .../aspectj/lang/annotation/DataScope.java | 33 + .../aspectj/lang/annotation/DataSource.java | 28 + .../aspectj/lang/annotation/Excel.java | 197 ++ .../aspectj/lang/annotation/Excels.java | 18 + .../aspectj/lang/annotation/Log.java | 51 + .../aspectj/lang/annotation/RateLimiter.java | 40 + .../aspectj/lang/annotation/Sensitive.java | 24 + .../aspectj/lang/enums/BusinessStatus.java | 20 + .../aspectj/lang/enums/BusinessType.java | 59 + .../aspectj/lang/enums/DataSourceType.java | 19 + .../aspectj/lang/enums/DesensitizedType.java | 59 + .../aspectj/lang/enums/LimitType.java | 20 + .../aspectj/lang/enums/OperatorType.java | 24 + .../framework/config/ApplicationConfig.java | 30 + .../framework/config/CaptchaConfig.java | 83 + .../evobms/framework/config/DruidConfig.java | 126 ++ .../config/FastJson2JsonRedisSerializer.java | 52 + .../evobms/framework/config/FilterConfig.java | 80 + .../evobms/framework/config/GenConfig.java | 79 + .../evobms/framework/config/I18nConfig.java | 43 + .../framework/config/KaptchaTextCreator.java | 68 + .../evobms/framework/config/MqttConfig.java | 189 ++ .../framework/config/MyBatisConfig.java | 132 ++ .../framework/config/MybatisPlusConfig.java | 33 + .../evobms/framework/config/RedisConfig.java | 69 + .../framework/config/ResourcesConfig.java | 71 + .../evobms/framework/config/RuoYiConfig.java | 111 + .../framework/config/ScheduleConfig.java | 57 + .../framework/config/SecurityConfig.java | 141 ++ .../config/SensitiveJsonSerializer.java | 67 + .../evobms/framework/config/ServerConfig.java | 32 + .../framework/config/SwaggerConfig.java | 124 ++ .../framework/config/ThreadPoolConfig.java | 63 + .../config/properties/DruidProperties.java | 89 + .../properties/PermitAllUrlProperties.java | 73 + .../datasource/DynamicDataSource.java | 26 + .../DynamicDataSourceContextHolder.java | 45 + .../interceptor/RepeatSubmitInterceptor.java | 56 + .../interceptor/annotation/RepeatSubmit.java | 31 + .../impl/SameUrlDataInterceptor.java | 110 + .../framework/manager/AsyncManager.java | 55 + .../framework/manager/ShutdownManager.java | 39 + .../manager/factory/AsyncFactory.java | 102 + .../evobms/framework/redis/RedisCache.java | 268 +++ .../evobms/framework/security/LoginBody.java | 69 + .../evobms/framework/security/LoginUser.java | 266 +++ .../framework/security/RegisterBody.java | 11 + .../context/AuthenticationContextHolder.java | 28 + .../context/PermissionContextHolder.java | 27 + .../filter/JwtAuthenticationTokenFilter.java | 44 + .../handle/AuthenticationEntryPointImpl.java | 34 + .../handle/LogoutSuccessHandlerImpl.java | 52 + .../security/service/PermissionService.java | 159 ++ .../security/service/SysLoginService.java | 176 ++ .../security/service/SysPasswordService.java | 86 + .../service/SysPermissionService.java | 88 + .../security/service/SysRegisterService.java | 117 + .../security/service/TokenService.java | 236 ++ .../service/UserDetailsServiceImpl.java | 65 + .../com/evobms/framework/task/RyTask.java | 28 + .../web/controller/BaseController.java | 194 ++ .../framework/web/domain/AjaxResult.java | 216 ++ .../framework/web/domain/BaseEntity.java | 118 + .../com/evobms/framework/web/domain/R.java | 115 + .../evobms/framework/web/domain/Server.java | 240 +++ .../framework/web/domain/TreeEntity.java | 79 + .../framework/web/domain/TreeSelect.java | 93 + .../framework/web/domain/server/Cpu.java | 101 + .../framework/web/domain/server/Jvm.java | 130 ++ .../framework/web/domain/server/Mem.java | 61 + .../framework/web/domain/server/Sys.java | 84 + .../framework/web/domain/server/SysFile.java | 114 + .../web/exception/GlobalExceptionHandler.java | 145 ++ .../evobms/framework/web/page/PageDomain.java | 101 + .../framework/web/page/TableDataInfo.java | 85 + .../framework/web/page/TableSupport.java | 56 + .../controller/ExtremeValuesController.java | 104 + .../project/Battery/domain/ExtremeValues.java | 255 +++ .../Battery/mapper/ExtremeValuesMapper.java | 61 + .../service/IExtremeValuesService.java | 61 + .../impl/ExtremeValuesServiceImpl.java | 96 + .../bms/controller/BmsDeviceController.java | 196 ++ .../GBT32960ExtremeDataExtractor.java | 333 +++ .../controller/GBT32960ExtremeDataParser.java | 220 ++ .../bms/controller/GBT32960FullDecoder.java | 300 +++ .../bms/controller/GBT32960MqttReceiver.java | 49 + .../bms/controller/MqttPublishController.java | 226 ++ .../bms/controller/MqttTestController.java | 97 + .../evobms/project/bms/domain/BmsDevice.java | 203 ++ .../project/bms/mapper/BmsDeviceMapper.java | 43 + .../bms/service/IBmsDeviceService.java | 80 + .../project/bms/service/MqttService.java | 933 ++++++++ .../service/impl/BmsDeviceServiceImpl.java | 115 + .../project/common/CaptchaController.java | 98 + .../project/common/CommonController.java | 162 ++ .../iot/controller/IotAuthController.java | 636 ++++++ .../iot/controller/IotOtaController.java | 78 + .../iot/service/DeviceTokenService.java | 114 + .../iot/service/IotDeviceTokenService.java | 55 + .../monitor/controller/CacheController.java | 121 ++ .../monitor/controller/ServerController.java | 27 + .../monitor/controller/SysJobController.java | 185 ++ .../controller/SysJobLogController.java | 92 + .../controller/SysLogininforController.java | 82 + .../controller/SysOperlogController.java | 69 + .../controller/SysUserOnlineController.java | 83 + .../project/monitor/domain/SysCache.java | 81 + .../evobms/project/monitor/domain/SysJob.java | 171 ++ .../project/monitor/domain/SysJobLog.java | 155 ++ .../project/monitor/domain/SysLogininfor.java | 144 ++ .../project/monitor/domain/SysOperLog.java | 269 +++ .../project/monitor/domain/SysUserOnline.java | 113 + .../monitor/mapper/SysJobLogMapper.java | 64 + .../project/monitor/mapper/SysJobMapper.java | 67 + .../monitor/mapper/SysLogininforMapper.java | 42 + .../monitor/mapper/SysOperLogMapper.java | 48 + .../monitor/service/ISysJobLogService.java | 56 + .../monitor/service/ISysJobService.java | 102 + .../service/ISysLogininforService.java | 40 + .../monitor/service/ISysOperLogService.java | 48 + .../service/impl/SysJobLogServiceImpl.java | 87 + .../service/impl/SysJobServiceImpl.java | 261 +++ .../impl/SysLogininforServiceImpl.java | 65 + .../service/impl/SysOperLogServiceImpl.java | 76 + .../ota/controller/OtaTasksController.java | 103 + .../evobms/project/ota/domain/OtaTasks.java | 165 ++ .../project/ota/mapper/OtaTasksMapper.java | 61 + .../project/ota/service/IOtaTasksService.java | 61 + .../ota/service/impl/OtaTasksServiceImpl.java | 105 + .../controller/BmsDevicesController.java | 98 + .../controller/SysConfigController.java | 133 ++ .../system/controller/SysDeptController.java | 132 ++ .../controller/SysDictDataController.java | 121 ++ .../controller/SysDictTypeController.java | 131 ++ .../system/controller/SysIndexController.java | 29 + .../system/controller/SysLoginController.java | 131 ++ .../system/controller/SysMenuController.java | 142 ++ .../controller/SysNoticeController.java | 91 + .../system/controller/SysPostController.java | 129 ++ .../controller/SysProfileController.java | 148 ++ .../controller/SysRegisterController.java | 38 + .../system/controller/SysRoleController.java | 262 +++ .../system/controller/SysUserController.java | 256 +++ .../project/system/domain/BmsDevices.java | 59 + .../project/system/domain/SysConfig.java | 111 + .../evobms/project/system/domain/SysDept.java | 203 ++ .../project/system/domain/SysDictData.java | 176 ++ .../project/system/domain/SysDictType.java | 96 + .../evobms/project/system/domain/SysMenu.java | 274 +++ .../project/system/domain/SysNotice.java | 102 + .../evobms/project/system/domain/SysPost.java | 124 ++ .../evobms/project/system/domain/SysRole.java | 241 +++ .../project/system/domain/SysRoleDept.java | 46 + .../project/system/domain/SysRoleMenu.java | 46 + .../evobms/project/system/domain/SysUser.java | 338 +++ .../project/system/domain/SysUserPost.java | 46 + .../project/system/domain/SysUserRole.java | 46 + .../project/system/domain/vo/MetaVo.java | 106 + .../project/system/domain/vo/RouterVo.java | 148 ++ .../system/mapper/BmsDevicesMapper.java | 61 + .../system/mapper/SysConfigMapper.java | 76 + .../project/system/mapper/SysDeptMapper.java | 118 + .../system/mapper/SysDictDataMapper.java | 95 + .../system/mapper/SysDictTypeMapper.java | 83 + .../project/system/mapper/SysMenuMapper.java | 125 ++ .../system/mapper/SysNoticeMapper.java | 60 + .../project/system/mapper/SysPostMapper.java | 99 + .../system/mapper/SysRoleDeptMapper.java | 44 + .../project/system/mapper/SysRoleMapper.java | 107 + .../system/mapper/SysRoleMenuMapper.java | 44 + .../project/system/mapper/SysUserMapper.java | 147 ++ .../system/mapper/SysUserPostMapper.java | 44 + .../system/mapper/SysUserRoleMapper.java | 62 + .../system/service/IBmsDevicesService.java | 61 + .../system/service/ISysConfigService.java | 89 + .../system/service/ISysDeptService.java | 124 ++ .../system/service/ISysDictDataService.java | 60 + .../system/service/ISysDictTypeService.java | 98 + .../system/service/ISysMenuService.java | 144 ++ .../system/service/ISysNoticeService.java | 60 + .../system/service/ISysPostService.java | 99 + .../system/service/ISysRoleService.java | 173 ++ .../system/service/ISysUserOnlineService.java | 48 + .../system/service/ISysUserService.java | 217 ++ .../service/impl/BmsDevicesServiceImpl.java | 96 + .../service/impl/SysConfigServiceImpl.java | 229 ++ .../service/impl/SysDeptServiceImpl.java | 338 +++ .../service/impl/SysDictDataServiceImpl.java | 111 + .../service/impl/SysDictTypeServiceImpl.java | 223 ++ .../service/impl/SysMenuServiceImpl.java | 543 +++++ .../service/impl/SysNoticeServiceImpl.java | 92 + .../service/impl/SysPostServiceImpl.java | 178 ++ .../service/impl/SysRoleServiceImpl.java | 427 ++++ .../impl/SysUserOnlineServiceImpl.java | 96 + .../service/impl/SysUserServiceImpl.java | 565 +++++ .../tool/gen/controller/GenController.java | 263 +++ .../project/tool/gen/domain/GenTable.java | 385 ++++ .../tool/gen/domain/GenTableColumn.java | 373 ++++ .../tool/gen/mapper/GenTableColumnMapper.java | 60 + .../tool/gen/mapper/GenTableMapper.java | 91 + .../service/GenTableColumnServiceImpl.java | 68 + .../tool/gen/service/GenTableServiceImpl.java | 531 +++++ .../gen/service/IGenTableColumnService.java | 44 + .../tool/gen/service/IGenTableService.java | 130 ++ .../project/tool/gen/util/GenUtils.java | 257 +++ .../tool/gen/util/VelocityInitializer.java | 34 + .../project/tool/gen/util/VelocityUtils.java | 408 ++++ .../project/tool/swagger/TestController.java | 183 ++ .../META-INF/spring-devtools.properties | 1 + src/main/resources/application-druid.yml | 61 + src/main/resources/application.yml | 218 ++ src/main/resources/banner.txt | 24 + src/main/resources/i18n/messages.properties | 38 + src/main/resources/logback-spring.xml | 44 + src/main/resources/logback.xml | 93 + .../BatteryData/ExtremeValuesMapper.xml | 137 ++ .../resources/mybatis/OTA/OtaTasksMapper.xml | 111 + .../resources/mybatis/bms/BmsDeviceMapper.xml | 66 + .../mybatis/monitor/SysLogininforMapper.xml | 57 + .../mybatis/monitor/SysOperLogMapper.xml | 87 + src/main/resources/mybatis/mybatis-config.xml | 20 + .../mybatis/system/BmsDevicesMapper.xml | 109 + .../mybatis/system/SysConfigMapper.xml | 117 + .../mybatis/system/SysDeptMapper.xml | 159 ++ .../mybatis/system/SysDictDataMapper.xml | 124 ++ .../mybatis/system/SysDictTypeMapper.xml | 105 + .../mybatis/system/SysJobLogMapper.xml | 94 + .../resources/mybatis/system/SysJobMapper.xml | 111 + .../mybatis/system/SysMenuMapper.xml | 206 ++ .../mybatis/system/SysNoticeMapper.xml | 89 + .../mybatis/system/SysPostMapper.xml | 122 ++ .../mybatis/system/SysRoleDeptMapper.xml | 34 + .../mybatis/system/SysRoleMapper.xml | 152 ++ .../mybatis/system/SysRoleMenuMapper.xml | 34 + .../mybatis/system/SysUserMapper.xml | 227 ++ .../mybatis/system/SysUserPostMapper.xml | 34 + .../mybatis/system/SysUserRoleMapper.xml | 44 + .../mybatis/tool/GenTableColumnMapper.xml | 127 ++ .../resources/mybatis/tool/GenTableMapper.xml | 210 ++ src/main/resources/ota/0.0.1.bin | Bin 0 -> 124828 bytes src/main/resources/ota/1.0.2.bin | 1 + src/main/resources/ota/2.2.1.bin | Bin 0 -> 124756 bytes src/main/resources/vm/java/controller.java.vm | 115 + src/main/resources/vm/java/domain.java.vm | 105 + src/main/resources/vm/java/mapper.java.vm | 91 + src/main/resources/vm/java/service.java.vm | 61 + .../resources/vm/java/serviceImpl.java.vm | 169 ++ src/main/resources/vm/java/sub-domain.java.vm | 76 + src/main/resources/vm/js/api.js.vm | 44 + src/main/resources/vm/sql/sql.vm | 22 + src/main/resources/vm/vue/index-tree.vue.vm | 505 +++++ src/main/resources/vm/vue/index.vue.vm | 602 ++++++ .../resources/vm/vue/v3/index-tree.vue.vm | 474 +++++ src/main/resources/vm/vue/v3/index.vue.vm | 590 +++++ src/main/resources/vm/xml/mapper.xml.vm | 140 ++ 羿动新能源-BBOX接口规范 v1.1.pdf | Bin 0 -> 1858997 bytes 365 files changed, 46801 insertions(+) create mode 100644 .github/FUNDING.yml create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README_INTEGRATION.md create mode 100644 README_MQTT_OPTIONAL.md create mode 100644 bin/clean.bat create mode 100644 bin/package.bat create mode 100644 bin/run-tomcat.bat create mode 100644 doc/若依环境使用手册.docx create mode 100644 pom.xml create mode 100644 ry.bat create mode 100644 ry.sh create mode 100644 sql/README_DATABASE_DESIGN.md create mode 100644 sql/bms_battery.sql create mode 100644 sql/bms_battery_data.sql create mode 100644 sql/bms_box_device.sql create mode 100644 sql/bms_device.sql create mode 100644 sql/quartz.sql create mode 100644 sql/ry_20250522.sql create mode 100644 src/main/java/com/evobms/EVOBMSApplication.java create mode 100644 src/main/java/com/evobms/RuoYiServletInitializer.java create mode 100644 src/main/java/com/evobms/common/constant/BboxApiConstants.java create mode 100644 src/main/java/com/evobms/common/constant/CacheConstants.java create mode 100644 src/main/java/com/evobms/common/constant/Constants.java create mode 100644 src/main/java/com/evobms/common/constant/GenConstants.java create mode 100644 src/main/java/com/evobms/common/constant/HttpStatus.java create mode 100644 src/main/java/com/evobms/common/constant/ScheduleConstants.java create mode 100644 src/main/java/com/evobms/common/constant/UserConstants.java create mode 100644 src/main/java/com/evobms/common/core/text/CharsetKit.java create mode 100644 src/main/java/com/evobms/common/core/text/Convert.java create mode 100644 src/main/java/com/evobms/common/core/text/StrFormatter.java create mode 100644 src/main/java/com/evobms/common/enums/HttpMethod.java create mode 100644 src/main/java/com/evobms/common/enums/UserStatus.java create mode 100644 src/main/java/com/evobms/common/exception/DemoModeException.java create mode 100644 src/main/java/com/evobms/common/exception/GlobalException.java create mode 100644 src/main/java/com/evobms/common/exception/ServiceException.java create mode 100644 src/main/java/com/evobms/common/exception/UtilException.java create mode 100644 src/main/java/com/evobms/common/exception/base/BaseException.java create mode 100644 src/main/java/com/evobms/common/exception/file/FileException.java create mode 100644 src/main/java/com/evobms/common/exception/file/FileNameLengthLimitExceededException.java create mode 100644 src/main/java/com/evobms/common/exception/file/FileSizeLimitExceededException.java create mode 100644 src/main/java/com/evobms/common/exception/file/FileUploadException.java create mode 100644 src/main/java/com/evobms/common/exception/file/InvalidExtensionException.java create mode 100644 src/main/java/com/evobms/common/exception/job/TaskException.java create mode 100644 src/main/java/com/evobms/common/exception/user/BlackListException.java create mode 100644 src/main/java/com/evobms/common/exception/user/CaptchaException.java create mode 100644 src/main/java/com/evobms/common/exception/user/CaptchaExpireException.java create mode 100644 src/main/java/com/evobms/common/exception/user/UserException.java create mode 100644 src/main/java/com/evobms/common/exception/user/UserNotExistsException.java create mode 100644 src/main/java/com/evobms/common/exception/user/UserPasswordNotMatchException.java create mode 100644 src/main/java/com/evobms/common/exception/user/UserPasswordRetryLimitExceedException.java create mode 100644 src/main/java/com/evobms/common/filter/HttpDumpFilter.java create mode 100644 src/main/java/com/evobms/common/filter/PropertyPreExcludeFilter.java create mode 100644 src/main/java/com/evobms/common/filter/RefererFilter.java create mode 100644 src/main/java/com/evobms/common/filter/RepeatableFilter.java create mode 100644 src/main/java/com/evobms/common/filter/RepeatedlyRequestWrapper.java create mode 100644 src/main/java/com/evobms/common/filter/XssFilter.java create mode 100644 src/main/java/com/evobms/common/filter/XssHttpServletRequestWrapper.java create mode 100644 src/main/java/com/evobms/common/utils/AesEcbPkcs5Utils.java create mode 100644 src/main/java/com/evobms/common/utils/Arith.java create mode 100644 src/main/java/com/evobms/common/utils/DateUtils.java create mode 100644 src/main/java/com/evobms/common/utils/DesensitizedUtil.java create mode 100644 src/main/java/com/evobms/common/utils/DictUtils.java create mode 100644 src/main/java/com/evobms/common/utils/ExceptionUtil.java create mode 100644 src/main/java/com/evobms/common/utils/LogUtils.java create mode 100644 src/main/java/com/evobms/common/utils/MessageUtils.java create mode 100644 src/main/java/com/evobms/common/utils/PageUtils.java create mode 100644 src/main/java/com/evobms/common/utils/SecurityUtils.java create mode 100644 src/main/java/com/evobms/common/utils/ServletUtils.java create mode 100644 src/main/java/com/evobms/common/utils/StringUtils.java create mode 100644 src/main/java/com/evobms/common/utils/Threads.java create mode 100644 src/main/java/com/evobms/common/utils/bean/BeanUtils.java create mode 100644 src/main/java/com/evobms/common/utils/bean/BeanValidators.java create mode 100644 src/main/java/com/evobms/common/utils/file/FileTypeUtils.java create mode 100644 src/main/java/com/evobms/common/utils/file/FileUploadUtils.java create mode 100644 src/main/java/com/evobms/common/utils/file/FileUtils.java create mode 100644 src/main/java/com/evobms/common/utils/file/ImageUtils.java create mode 100644 src/main/java/com/evobms/common/utils/file/MimeTypeUtils.java create mode 100644 src/main/java/com/evobms/common/utils/html/EscapeUtil.java create mode 100644 src/main/java/com/evobms/common/utils/html/HTMLFilter.java create mode 100644 src/main/java/com/evobms/common/utils/http/HttpHelper.java create mode 100644 src/main/java/com/evobms/common/utils/http/HttpUtils.java create mode 100644 src/main/java/com/evobms/common/utils/ip/AddressUtils.java create mode 100644 src/main/java/com/evobms/common/utils/ip/IpUtils.java create mode 100644 src/main/java/com/evobms/common/utils/job/AbstractQuartzJob.java create mode 100644 src/main/java/com/evobms/common/utils/job/CronUtils.java create mode 100644 src/main/java/com/evobms/common/utils/job/JobInvokeUtil.java create mode 100644 src/main/java/com/evobms/common/utils/job/QuartzDisallowConcurrentExecution.java create mode 100644 src/main/java/com/evobms/common/utils/job/QuartzJobExecution.java create mode 100644 src/main/java/com/evobms/common/utils/job/ScheduleUtils.java create mode 100644 src/main/java/com/evobms/common/utils/poi/ExcelHandlerAdapter.java create mode 100644 src/main/java/com/evobms/common/utils/poi/ExcelUtil.java create mode 100644 src/main/java/com/evobms/common/utils/reflect/ReflectUtils.java create mode 100644 src/main/java/com/evobms/common/utils/sign/Base64.java create mode 100644 src/main/java/com/evobms/common/utils/sign/Md5Utils.java create mode 100644 src/main/java/com/evobms/common/utils/spring/SpringUtils.java create mode 100644 src/main/java/com/evobms/common/utils/sql/SqlUtil.java create mode 100644 src/main/java/com/evobms/common/utils/uuid/IdUtils.java create mode 100644 src/main/java/com/evobms/common/utils/uuid/Seq.java create mode 100644 src/main/java/com/evobms/common/utils/uuid/UUID.java create mode 100644 src/main/java/com/evobms/common/xss/Xss.java create mode 100644 src/main/java/com/evobms/common/xss/XssValidator.java create mode 100644 src/main/java/com/evobms/framework/aspectj/DataScopeAspect.java create mode 100644 src/main/java/com/evobms/framework/aspectj/DataSourceAspect.java create mode 100644 src/main/java/com/evobms/framework/aspectj/LogAspect.java create mode 100644 src/main/java/com/evobms/framework/aspectj/RateLimiterAspect.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/annotation/Anonymous.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/annotation/DataScope.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/annotation/DataSource.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/annotation/Excel.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/annotation/Excels.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/annotation/Log.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/annotation/RateLimiter.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/annotation/Sensitive.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/enums/BusinessStatus.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/enums/BusinessType.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/enums/DataSourceType.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/enums/DesensitizedType.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/enums/LimitType.java create mode 100644 src/main/java/com/evobms/framework/aspectj/lang/enums/OperatorType.java create mode 100644 src/main/java/com/evobms/framework/config/ApplicationConfig.java create mode 100644 src/main/java/com/evobms/framework/config/CaptchaConfig.java create mode 100644 src/main/java/com/evobms/framework/config/DruidConfig.java create mode 100644 src/main/java/com/evobms/framework/config/FastJson2JsonRedisSerializer.java create mode 100644 src/main/java/com/evobms/framework/config/FilterConfig.java create mode 100644 src/main/java/com/evobms/framework/config/GenConfig.java create mode 100644 src/main/java/com/evobms/framework/config/I18nConfig.java create mode 100644 src/main/java/com/evobms/framework/config/KaptchaTextCreator.java create mode 100644 src/main/java/com/evobms/framework/config/MqttConfig.java create mode 100644 src/main/java/com/evobms/framework/config/MyBatisConfig.java create mode 100644 src/main/java/com/evobms/framework/config/MybatisPlusConfig.java create mode 100644 src/main/java/com/evobms/framework/config/RedisConfig.java create mode 100644 src/main/java/com/evobms/framework/config/ResourcesConfig.java create mode 100644 src/main/java/com/evobms/framework/config/RuoYiConfig.java create mode 100644 src/main/java/com/evobms/framework/config/ScheduleConfig.java create mode 100644 src/main/java/com/evobms/framework/config/SecurityConfig.java create mode 100644 src/main/java/com/evobms/framework/config/SensitiveJsonSerializer.java create mode 100644 src/main/java/com/evobms/framework/config/ServerConfig.java create mode 100644 src/main/java/com/evobms/framework/config/SwaggerConfig.java create mode 100644 src/main/java/com/evobms/framework/config/ThreadPoolConfig.java create mode 100644 src/main/java/com/evobms/framework/config/properties/DruidProperties.java create mode 100644 src/main/java/com/evobms/framework/config/properties/PermitAllUrlProperties.java create mode 100644 src/main/java/com/evobms/framework/datasource/DynamicDataSource.java create mode 100644 src/main/java/com/evobms/framework/datasource/DynamicDataSourceContextHolder.java create mode 100644 src/main/java/com/evobms/framework/interceptor/RepeatSubmitInterceptor.java create mode 100644 src/main/java/com/evobms/framework/interceptor/annotation/RepeatSubmit.java create mode 100644 src/main/java/com/evobms/framework/interceptor/impl/SameUrlDataInterceptor.java create mode 100644 src/main/java/com/evobms/framework/manager/AsyncManager.java create mode 100644 src/main/java/com/evobms/framework/manager/ShutdownManager.java create mode 100644 src/main/java/com/evobms/framework/manager/factory/AsyncFactory.java create mode 100644 src/main/java/com/evobms/framework/redis/RedisCache.java create mode 100644 src/main/java/com/evobms/framework/security/LoginBody.java create mode 100644 src/main/java/com/evobms/framework/security/LoginUser.java create mode 100644 src/main/java/com/evobms/framework/security/RegisterBody.java create mode 100644 src/main/java/com/evobms/framework/security/context/AuthenticationContextHolder.java create mode 100644 src/main/java/com/evobms/framework/security/context/PermissionContextHolder.java create mode 100644 src/main/java/com/evobms/framework/security/filter/JwtAuthenticationTokenFilter.java create mode 100644 src/main/java/com/evobms/framework/security/handle/AuthenticationEntryPointImpl.java create mode 100644 src/main/java/com/evobms/framework/security/handle/LogoutSuccessHandlerImpl.java create mode 100644 src/main/java/com/evobms/framework/security/service/PermissionService.java create mode 100644 src/main/java/com/evobms/framework/security/service/SysLoginService.java create mode 100644 src/main/java/com/evobms/framework/security/service/SysPasswordService.java create mode 100644 src/main/java/com/evobms/framework/security/service/SysPermissionService.java create mode 100644 src/main/java/com/evobms/framework/security/service/SysRegisterService.java create mode 100644 src/main/java/com/evobms/framework/security/service/TokenService.java create mode 100644 src/main/java/com/evobms/framework/security/service/UserDetailsServiceImpl.java create mode 100644 src/main/java/com/evobms/framework/task/RyTask.java create mode 100644 src/main/java/com/evobms/framework/web/controller/BaseController.java create mode 100644 src/main/java/com/evobms/framework/web/domain/AjaxResult.java create mode 100644 src/main/java/com/evobms/framework/web/domain/BaseEntity.java create mode 100644 src/main/java/com/evobms/framework/web/domain/R.java create mode 100644 src/main/java/com/evobms/framework/web/domain/Server.java create mode 100644 src/main/java/com/evobms/framework/web/domain/TreeEntity.java create mode 100644 src/main/java/com/evobms/framework/web/domain/TreeSelect.java create mode 100644 src/main/java/com/evobms/framework/web/domain/server/Cpu.java create mode 100644 src/main/java/com/evobms/framework/web/domain/server/Jvm.java create mode 100644 src/main/java/com/evobms/framework/web/domain/server/Mem.java create mode 100644 src/main/java/com/evobms/framework/web/domain/server/Sys.java create mode 100644 src/main/java/com/evobms/framework/web/domain/server/SysFile.java create mode 100644 src/main/java/com/evobms/framework/web/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/evobms/framework/web/page/PageDomain.java create mode 100644 src/main/java/com/evobms/framework/web/page/TableDataInfo.java create mode 100644 src/main/java/com/evobms/framework/web/page/TableSupport.java create mode 100644 src/main/java/com/evobms/project/Battery/controller/ExtremeValuesController.java create mode 100644 src/main/java/com/evobms/project/Battery/domain/ExtremeValues.java create mode 100644 src/main/java/com/evobms/project/Battery/mapper/ExtremeValuesMapper.java create mode 100644 src/main/java/com/evobms/project/Battery/service/IExtremeValuesService.java create mode 100644 src/main/java/com/evobms/project/Battery/service/impl/ExtremeValuesServiceImpl.java create mode 100644 src/main/java/com/evobms/project/bms/controller/BmsDeviceController.java create mode 100644 src/main/java/com/evobms/project/bms/controller/GBT32960ExtremeDataExtractor.java create mode 100644 src/main/java/com/evobms/project/bms/controller/GBT32960ExtremeDataParser.java create mode 100644 src/main/java/com/evobms/project/bms/controller/GBT32960FullDecoder.java create mode 100644 src/main/java/com/evobms/project/bms/controller/GBT32960MqttReceiver.java create mode 100644 src/main/java/com/evobms/project/bms/controller/MqttPublishController.java create mode 100644 src/main/java/com/evobms/project/bms/controller/MqttTestController.java create mode 100644 src/main/java/com/evobms/project/bms/domain/BmsDevice.java create mode 100644 src/main/java/com/evobms/project/bms/mapper/BmsDeviceMapper.java create mode 100644 src/main/java/com/evobms/project/bms/service/IBmsDeviceService.java create mode 100644 src/main/java/com/evobms/project/bms/service/MqttService.java create mode 100644 src/main/java/com/evobms/project/bms/service/impl/BmsDeviceServiceImpl.java create mode 100644 src/main/java/com/evobms/project/common/CaptchaController.java create mode 100644 src/main/java/com/evobms/project/common/CommonController.java create mode 100644 src/main/java/com/evobms/project/iot/controller/IotAuthController.java create mode 100644 src/main/java/com/evobms/project/iot/controller/IotOtaController.java create mode 100644 src/main/java/com/evobms/project/iot/service/DeviceTokenService.java create mode 100644 src/main/java/com/evobms/project/iot/service/IotDeviceTokenService.java create mode 100644 src/main/java/com/evobms/project/monitor/controller/CacheController.java create mode 100644 src/main/java/com/evobms/project/monitor/controller/ServerController.java create mode 100644 src/main/java/com/evobms/project/monitor/controller/SysJobController.java create mode 100644 src/main/java/com/evobms/project/monitor/controller/SysJobLogController.java create mode 100644 src/main/java/com/evobms/project/monitor/controller/SysLogininforController.java create mode 100644 src/main/java/com/evobms/project/monitor/controller/SysOperlogController.java create mode 100644 src/main/java/com/evobms/project/monitor/controller/SysUserOnlineController.java create mode 100644 src/main/java/com/evobms/project/monitor/domain/SysCache.java create mode 100644 src/main/java/com/evobms/project/monitor/domain/SysJob.java create mode 100644 src/main/java/com/evobms/project/monitor/domain/SysJobLog.java create mode 100644 src/main/java/com/evobms/project/monitor/domain/SysLogininfor.java create mode 100644 src/main/java/com/evobms/project/monitor/domain/SysOperLog.java create mode 100644 src/main/java/com/evobms/project/monitor/domain/SysUserOnline.java create mode 100644 src/main/java/com/evobms/project/monitor/mapper/SysJobLogMapper.java create mode 100644 src/main/java/com/evobms/project/monitor/mapper/SysJobMapper.java create mode 100644 src/main/java/com/evobms/project/monitor/mapper/SysLogininforMapper.java create mode 100644 src/main/java/com/evobms/project/monitor/mapper/SysOperLogMapper.java create mode 100644 src/main/java/com/evobms/project/monitor/service/ISysJobLogService.java create mode 100644 src/main/java/com/evobms/project/monitor/service/ISysJobService.java create mode 100644 src/main/java/com/evobms/project/monitor/service/ISysLogininforService.java create mode 100644 src/main/java/com/evobms/project/monitor/service/ISysOperLogService.java create mode 100644 src/main/java/com/evobms/project/monitor/service/impl/SysJobLogServiceImpl.java create mode 100644 src/main/java/com/evobms/project/monitor/service/impl/SysJobServiceImpl.java create mode 100644 src/main/java/com/evobms/project/monitor/service/impl/SysLogininforServiceImpl.java create mode 100644 src/main/java/com/evobms/project/monitor/service/impl/SysOperLogServiceImpl.java create mode 100644 src/main/java/com/evobms/project/ota/controller/OtaTasksController.java create mode 100644 src/main/java/com/evobms/project/ota/domain/OtaTasks.java create mode 100644 src/main/java/com/evobms/project/ota/mapper/OtaTasksMapper.java create mode 100644 src/main/java/com/evobms/project/ota/service/IOtaTasksService.java create mode 100644 src/main/java/com/evobms/project/ota/service/impl/OtaTasksServiceImpl.java create mode 100644 src/main/java/com/evobms/project/system/controller/BmsDevicesController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysConfigController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysDeptController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysDictDataController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysDictTypeController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysIndexController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysLoginController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysMenuController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysNoticeController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysPostController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysProfileController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysRegisterController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysRoleController.java create mode 100644 src/main/java/com/evobms/project/system/controller/SysUserController.java create mode 100644 src/main/java/com/evobms/project/system/domain/BmsDevices.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysConfig.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysDept.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysDictData.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysDictType.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysMenu.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysNotice.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysPost.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysRole.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysRoleDept.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysRoleMenu.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysUser.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysUserPost.java create mode 100644 src/main/java/com/evobms/project/system/domain/SysUserRole.java create mode 100644 src/main/java/com/evobms/project/system/domain/vo/MetaVo.java create mode 100644 src/main/java/com/evobms/project/system/domain/vo/RouterVo.java create mode 100644 src/main/java/com/evobms/project/system/mapper/BmsDevicesMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysConfigMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysDeptMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysDictDataMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysDictTypeMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysMenuMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysNoticeMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysPostMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysRoleDeptMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysRoleMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysRoleMenuMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysUserMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysUserPostMapper.java create mode 100644 src/main/java/com/evobms/project/system/mapper/SysUserRoleMapper.java create mode 100644 src/main/java/com/evobms/project/system/service/IBmsDevicesService.java create mode 100644 src/main/java/com/evobms/project/system/service/ISysConfigService.java create mode 100644 src/main/java/com/evobms/project/system/service/ISysDeptService.java create mode 100644 src/main/java/com/evobms/project/system/service/ISysDictDataService.java create mode 100644 src/main/java/com/evobms/project/system/service/ISysDictTypeService.java create mode 100644 src/main/java/com/evobms/project/system/service/ISysMenuService.java create mode 100644 src/main/java/com/evobms/project/system/service/ISysNoticeService.java create mode 100644 src/main/java/com/evobms/project/system/service/ISysPostService.java create mode 100644 src/main/java/com/evobms/project/system/service/ISysRoleService.java create mode 100644 src/main/java/com/evobms/project/system/service/ISysUserOnlineService.java create mode 100644 src/main/java/com/evobms/project/system/service/ISysUserService.java create mode 100644 src/main/java/com/evobms/project/system/service/impl/BmsDevicesServiceImpl.java create mode 100644 src/main/java/com/evobms/project/system/service/impl/SysConfigServiceImpl.java create mode 100644 src/main/java/com/evobms/project/system/service/impl/SysDeptServiceImpl.java create mode 100644 src/main/java/com/evobms/project/system/service/impl/SysDictDataServiceImpl.java create mode 100644 src/main/java/com/evobms/project/system/service/impl/SysDictTypeServiceImpl.java create mode 100644 src/main/java/com/evobms/project/system/service/impl/SysMenuServiceImpl.java create mode 100644 src/main/java/com/evobms/project/system/service/impl/SysNoticeServiceImpl.java create mode 100644 src/main/java/com/evobms/project/system/service/impl/SysPostServiceImpl.java create mode 100644 src/main/java/com/evobms/project/system/service/impl/SysRoleServiceImpl.java create mode 100644 src/main/java/com/evobms/project/system/service/impl/SysUserOnlineServiceImpl.java create mode 100644 src/main/java/com/evobms/project/system/service/impl/SysUserServiceImpl.java create mode 100644 src/main/java/com/evobms/project/tool/gen/controller/GenController.java create mode 100644 src/main/java/com/evobms/project/tool/gen/domain/GenTable.java create mode 100644 src/main/java/com/evobms/project/tool/gen/domain/GenTableColumn.java create mode 100644 src/main/java/com/evobms/project/tool/gen/mapper/GenTableColumnMapper.java create mode 100644 src/main/java/com/evobms/project/tool/gen/mapper/GenTableMapper.java create mode 100644 src/main/java/com/evobms/project/tool/gen/service/GenTableColumnServiceImpl.java create mode 100644 src/main/java/com/evobms/project/tool/gen/service/GenTableServiceImpl.java create mode 100644 src/main/java/com/evobms/project/tool/gen/service/IGenTableColumnService.java create mode 100644 src/main/java/com/evobms/project/tool/gen/service/IGenTableService.java create mode 100644 src/main/java/com/evobms/project/tool/gen/util/GenUtils.java create mode 100644 src/main/java/com/evobms/project/tool/gen/util/VelocityInitializer.java create mode 100644 src/main/java/com/evobms/project/tool/gen/util/VelocityUtils.java create mode 100644 src/main/java/com/evobms/project/tool/swagger/TestController.java create mode 100644 src/main/resources/META-INF/spring-devtools.properties create mode 100644 src/main/resources/application-druid.yml create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/banner.txt create mode 100644 src/main/resources/i18n/messages.properties create mode 100644 src/main/resources/logback-spring.xml create mode 100644 src/main/resources/logback.xml create mode 100644 src/main/resources/mybatis/BatteryData/ExtremeValuesMapper.xml create mode 100644 src/main/resources/mybatis/OTA/OtaTasksMapper.xml create mode 100644 src/main/resources/mybatis/bms/BmsDeviceMapper.xml create mode 100644 src/main/resources/mybatis/monitor/SysLogininforMapper.xml create mode 100644 src/main/resources/mybatis/monitor/SysOperLogMapper.xml create mode 100644 src/main/resources/mybatis/mybatis-config.xml create mode 100644 src/main/resources/mybatis/system/BmsDevicesMapper.xml create mode 100644 src/main/resources/mybatis/system/SysConfigMapper.xml create mode 100644 src/main/resources/mybatis/system/SysDeptMapper.xml create mode 100644 src/main/resources/mybatis/system/SysDictDataMapper.xml create mode 100644 src/main/resources/mybatis/system/SysDictTypeMapper.xml create mode 100644 src/main/resources/mybatis/system/SysJobLogMapper.xml create mode 100644 src/main/resources/mybatis/system/SysJobMapper.xml create mode 100644 src/main/resources/mybatis/system/SysMenuMapper.xml create mode 100644 src/main/resources/mybatis/system/SysNoticeMapper.xml create mode 100644 src/main/resources/mybatis/system/SysPostMapper.xml create mode 100644 src/main/resources/mybatis/system/SysRoleDeptMapper.xml create mode 100644 src/main/resources/mybatis/system/SysRoleMapper.xml create mode 100644 src/main/resources/mybatis/system/SysRoleMenuMapper.xml create mode 100644 src/main/resources/mybatis/system/SysUserMapper.xml create mode 100644 src/main/resources/mybatis/system/SysUserPostMapper.xml create mode 100644 src/main/resources/mybatis/system/SysUserRoleMapper.xml create mode 100644 src/main/resources/mybatis/tool/GenTableColumnMapper.xml create mode 100644 src/main/resources/mybatis/tool/GenTableMapper.xml create mode 100644 src/main/resources/ota/0.0.1.bin create mode 100644 src/main/resources/ota/1.0.2.bin create mode 100644 src/main/resources/ota/2.2.1.bin create mode 100644 src/main/resources/vm/java/controller.java.vm create mode 100644 src/main/resources/vm/java/domain.java.vm create mode 100644 src/main/resources/vm/java/mapper.java.vm create mode 100644 src/main/resources/vm/java/service.java.vm create mode 100644 src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 src/main/resources/vm/java/sub-domain.java.vm create mode 100644 src/main/resources/vm/js/api.js.vm create mode 100644 src/main/resources/vm/sql/sql.vm create mode 100644 src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 src/main/resources/vm/vue/index.vue.vm create mode 100644 src/main/resources/vm/vue/v3/index-tree.vue.vm create mode 100644 src/main/resources/vm/vue/v3/index.vue.vm create mode 100644 src/main/resources/vm/xml/mapper.xml.vm create mode 100644 羿动新能源-BBOX接口规范 v1.1.pdf diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..e8a49c9 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: http://doc.ruoyi.vip/bms-vue/other/donate.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..09bdfea --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +###################################################################### +# 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 + +### JRebel ### +rebel.xml +### NetBeans ### +nbproject/private/ +build/* +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +###################################################################### +# Others +*.log +*.xml.versionsBackup +*.swp + +!*/build/*.java +!*/build/*.html +!*/build/*.xml \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7b016a8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.compile.nullAnalysis.mode": "automatic" +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8564f29 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 RuoYi + +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. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..10c6b52 --- /dev/null +++ b/README.md @@ -0,0 +1,94 @@ +

+ logo +

+

RuoYi v3.9.0

+

基于SpringBoot+Vue前后端分离的Java快速开发框架

+

+ + + +

+ +## 平台简介 + +* 本仓库为RuoYi-Vue的单应用版本,保持同步更新。 +* 配套前端代码地址[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue/tree/master/ruoyi-ui),技术栈([Vue2](https://cn.vuejs.org) + [Element](https://github.com/ElemeFE/element) + [Vue CLI](https://cli.vuejs.org/zh))。 +* 配套前端代码地址[RuoYi-Vue3](https://gitcode.com/yangzongzhuan/RuoYi-Vue3),技术栈([Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev))。 +* 前端采用Vue、Element UI。 +* 后端采用Spring Boot、Spring Security、Redis & Jwt。 +* 权限认证使用Jwt,支持多终端认证系统。 +* 支持加载动态权限菜单,多方式轻松权限控制。 +* 高效率开发,使用代码生成器可以一键生成前后端代码。 +* 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) +* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)   + +## 内置功能 + +1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 +2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 +3. 岗位管理:配置系统用户所属担任职务。 +4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 +5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 +6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 +7. 参数管理:对系统动态配置常用参数。 +8. 通知公告:系统通知公告信息发布维护。 +9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 +10. 登录日志:系统登录日志记录查询包含登录异常。 +11. 在线用户:当前系统中活跃用户状态监控。 +12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 +13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 +14. 系统接口:根据业务代码自动生成相关的api接口文档。 +15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 +16. 缓存监控:对系统的缓存信息查询,命令统计等。 +17. 在线构建器:拖动表单元素生成相应的HTML代码。 +18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 + +## 在线体验 + +- admin/admin123 +- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 + +演示地址:http://vue.ruoyi.vip +文档地址:http://doc.ruoyi.vip + +## 演示图 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +## 若依前后端分离交流群 + +QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/已满-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![加入QQ群](https://img.shields.io/badge/已满-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![加入QQ群](https://img.shields.io/badge/已满-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![加入QQ群](https://img.shields.io/badge/已满-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![加入QQ群](https://img.shields.io/badge/已满-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![加入QQ群](https://img.shields.io/badge/已满-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![加入QQ群](https://img.shields.io/badge/已满-136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [![加入QQ群](https://img.shields.io/badge/已满-143961921-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [![加入QQ群](https://img.shields.io/badge/已满-174951577-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [![加入QQ群](https://img.shields.io/badge/已满-161281055-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [![加入QQ群](https://img.shields.io/badge/已满-138988063-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [![加入QQ群](https://img.shields.io/badge/已满-151450850-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [![加入QQ群](https://img.shields.io/badge/已满-224622315-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [![加入QQ群](https://img.shields.io/badge/已满-287842588-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [![加入QQ群](https://img.shields.io/badge/已满-187944233-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) [![加入QQ群](https://img.shields.io/badge/已满-228578329-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329) [![加入QQ群](https://img.shields.io/badge/已满-191164766-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=GsOo-OLz53J8y_9TPoO6XXSGNRTgbFxA&authKey=R7Uy%2Feq%2BZsoKNqHvRKhiXpypW7DAogoWapOawUGHokJSBIBIre2%2FoiAZeZBSLuBc&noverify=0&group_code=191164766) [![加入QQ群](https://img.shields.io/badge/174569686-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=PmYavuzsOthVqfdAPbo4uAeIbu7Ttjgc&authKey=p52l8%2FXa4PS1JcEmS3VccKSwOPJUZ1ZfQ69MEKzbrooNUljRtlKjvsXf04bxNp3G&noverify=0&group_code=174569686) 点击按钮入群。 \ No newline at end of file diff --git a/README_INTEGRATION.md b/README_INTEGRATION.md new file mode 100644 index 0000000..8b94431 --- /dev/null +++ b/README_INTEGRATION.md @@ -0,0 +1,243 @@ +# EvoBMS MyBatis-Plus 和 MQTT 集成说明 + +## 概述 + +本项目已成功集成了 MyBatis-Plus 和 MQTT 功能,为 EVO 电池管理系统提供了强大的数据持久化和实时通信能力。 + +## MyBatis-Plus 集成 + +### 1. 依赖配置 + +已在 `pom.xml` 中添加以下依赖: +- `mybatis-plus-boot-starter`: MyBatis-Plus 核心依赖 +- `mybatis-plus-generator`: 代码生成器 +- `freemarker`: 模板引擎 + +### 2. 配置文件 + +在 `application.yml` 中添加了 MyBatis-Plus 配置: +```yaml +mybatis-plus: + mapper-locations: classpath*:mybatis/**/*Mapper.xml + type-aliases-package: com.evobms.project.**.domain + global-config: + db-config: + id-type: AUTO + field-strategy: NOT_NULL + logic-delete-field: delFlag + logic-delete-value: 2 + logic-not-delete-value: 0 +``` + +### 3. 核心功能 + +#### 3.1 实体类注解 +- `@TableName`: 指定表名 +- `@TableId`: 主键配置 +- `@TableLogic`: 逻辑删除 +- `@Version`: 乐观锁 + +#### 3.2 Mapper 接口 +继承 `BaseMapper` 获得基础 CRUD 操作: +```java +@Mapper +public interface BmsDeviceMapper extends BaseMapper { + // 自定义方法 +} +``` + +#### 3.3 Service 层 +继承 `IService` 和 `ServiceImpl`: +```java +public interface IBmsDeviceService extends IService {} + +@Service +public class BmsDeviceServiceImpl extends ServiceImpl + implements IBmsDeviceService {} +``` + +### 4. 示例代码 + +#### BmsDevice 实体类 +位置:`src/main/java/com/evobms/project/bms/domain/BmsDevice.java` + +包含完整的 BMS 设备属性,使用了 MyBatis-Plus 注解。 + +#### 数据库表 +执行 `sql/bms_device.sql` 创建示例表和数据。 + +## MQTT 集成 + +### 1. 依赖配置 + +已添加 MQTT 相关依赖: +- `spring-integration-mqtt`: Spring Integration MQTT 支持 +- `org.eclipse.paho.client.mqttv3`: Eclipse Paho MQTT 客户端 + +### 2. 配置文件 + +在 `application.yml` 中添加了 MQTT 配置: +```yaml +mqtt: + host: tcp://localhost:1883 + clientId: evobms-client + username: + password: + connectionTimeout: 30 + keepAliveInterval: 60 + subscribeTopic: evobms/+/data + publishTopic: evobms/command +``` + +### 3. 核心组件 + +#### 3.1 MqttConfig 配置类 +位置:`src/main/java/com/evobms/framework/config/MqttConfig.java` + +提供了: +- MQTT 客户端工厂配置 +- 消息接收通道 +- 消息发送通道 +- 消息处理器 + +#### 3.2 MqttService 服务类 +位置:`src/main/java/com/evobms/project/bms/service/MqttService.java` + +提供了: +- 发送 MQTT 消息 +- 处理设备数据 +- 设备控制命令 +- 设备状态查询 + +### 4. 使用示例 + +#### 发送消息 +```java +@Autowired +private MqttService mqttService; + +// 发送设备控制命令 +mqttService.sendDeviceCommand("BMS001", "STATUS_QUERY"); + +// 发送自定义消息 +mqttService.sendMessage("evobms/test", "Hello MQTT"); +``` + +#### 接收消息 +消息会自动通过配置的消息处理器处理,支持设备数据自动更新。 + +## API 接口 + +### BmsDeviceController + +位置:`src/main/java/com/evobms/project/bms/controller/BmsDeviceController.java` + +提供了完整的 RESTful API: + +- `GET /bms/device/list` - 查询设备列表 +- `GET /bms/device/{deviceId}` - 获取设备详情 +- `POST /bms/device` - 新增设备 +- `PUT /bms/device` - 修改设备 +- `DELETE /bms/device/{deviceIds}` - 删除设备 +- `PUT /bms/device/status` - 批量更新状态 +- `POST /bms/device/queryStatus/{deviceCode}` - 查询设备状态 +- `POST /bms/device/restart/{deviceCode}` - 重启设备 +- `POST /bms/device/config/{deviceCode}` - 配置设备 +- `POST /bms/device/mqtt/send` - 发送 MQTT 消息 +- `GET /bms/device/statistics` - 获取统计信息 + +## 使用建议 + +### 1. MyBatis-Plus 最佳实践 + +1. **实体类设计**: + - 使用合适的注解标注字段 + - 继承 BaseEntity 获得公共字段 + - 合理使用逻辑删除和乐观锁 + +2. **查询优化**: + - 使用 QueryWrapper 构建复杂查询 + - 合理使用分页插件 + - 避免 N+1 查询问题 + +3. **代码生成**: + - 使用 MyBatis-Plus 代码生成器快速生成基础代码 + - 自定义模板适应项目需求 + +### 2. MQTT 最佳实践 + +1. **主题设计**: + - 使用层次化主题结构:`evobms/{deviceCode}/{dataType}` + - 合理使用通配符订阅 + +2. **消息格式**: + - 使用 JSON 格式传输数据 + - 包含时间戳和设备标识 + +3. **错误处理**: + - 实现消息重试机制 + - 记录通信日志 + - 处理连接断开重连 + +### 3. 安全考虑 + +1. **数据库安全**: + - 使用参数化查询防止 SQL 注入 + - 合理设置数据库权限 + +2. **MQTT 安全**: + - 配置用户名密码认证 + - 使用 TLS 加密传输 + - 限制主题访问权限 + +## 扩展功能 + +### 1. 数据监控 +- 实时设备状态监控 +- 历史数据分析 +- 告警机制 + +### 2. 设备管理 +- 设备注册和注销 +- 固件升级 +- 参数配置 + +### 3. 数据分析 +- 电池性能分析 +- 故障预测 +- 能耗统计 + +## 故障排除 + +### 常见问题 + +1. **MyBatis-Plus 相关**: + - 检查实体类注解配置 + - 确认 Mapper 扫描路径 + - 验证数据库连接配置 + +2. **MQTT 相关**: + - 检查 MQTT 服务器连接 + - 确认主题订阅配置 + - 验证消息格式 + +### 日志配置 + +在 `application.yml` 中调整日志级别: +```yaml +logging: + level: + com.evobms: debug + com.baomidou.mybatisplus: debug + org.springframework.integration.mqtt: debug +``` + +## 总结 + +通过集成 MyBatis-Plus 和 MQTT,EvoBMS 系统具备了: +- 强大的数据持久化能力 +- 实时的设备通信功能 +- 完整的 RESTful API +- 灵活的扩展机制 + +这为构建现代化的电池管理系统提供了坚实的技术基础。 \ No newline at end of file diff --git a/README_MQTT_OPTIONAL.md b/README_MQTT_OPTIONAL.md new file mode 100644 index 0000000..7d3c321 --- /dev/null +++ b/README_MQTT_OPTIONAL.md @@ -0,0 +1,182 @@ +# MQTT 可选配置说明 + +## 概述 + +为了让项目在没有 MQTT 服务器的情况下也能正常启动,我们对 MQTT 功能进行了可选配置。现在您可以通过配置文件控制是否启用 MQTT 功能。 + +## 配置方式 + +### 1. 禁用 MQTT(默认) + +在 `application.yml` 中设置: + +```yaml +mqtt: + enabled: false # 禁用MQTT功能 + host: tcp://localhost:1883 + # ... 其他配置 +``` + +当 `mqtt.enabled` 设置为 `false` 时: +- MQTT 配置类不会被加载 +- MQTT 服务不会启动 +- 项目可以正常启动,不会因为连接不到 MQTT 服务器而失败 + +### 2. 启用 MQTT + +当您准备好 MQTT 服务器后,可以启用 MQTT 功能: + +```yaml +mqtt: + enabled: true # 启用MQTT功能 + host: tcp://your-mqtt-server:1883 + clientId: evobms-client + username: your-username + password: your-password + # ... 其他配置 +``` + +## 功能影响 + +### MQTT 禁用时 + +1. **正常功能**: + - 所有基础的 BMS 设备管理功能正常工作 + - 数据库操作正常 + - Web API 正常响应 + - MyBatis-Plus 功能正常 + +2. **受限功能**: + - 无法发送 MQTT 消息 + - 无法接收设备实时数据 + - 以下 API 会返回友好的错误信息: + - `POST /bms/device/queryStatus/{deviceCode}` - 查询设备状态 + - `POST /bms/device/restart/{deviceCode}` - 重启设备 + - `POST /bms/device/config/{deviceCode}` - 配置设备 + - `POST /bms/device/mqtt/send` - 发送 MQTT 消息 + +### MQTT 启用时 + +所有功能正常工作,包括: +- 实时设备数据接收 +- 设备远程控制 +- MQTT 消息发送和接收 +- 设备状态查询 + +## 技术实现 + +### 1. 条件配置 + +使用 Spring Boot 的 `@ConditionalOnProperty` 注解: + +```java +@Configuration +@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true") +public class MqttConfig { + // MQTT配置只有在mqtt.enabled=true时才会加载 +} + +@Service +@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true") +public class MqttService { + // MQTT服务只有在mqtt.enabled=true时才会加载 +} +``` + +### 2. 可选依赖注入 + +在 Controller 中使用可选的依赖注入: + +```java +@Autowired(required = false) +private MqttService mqttService; + +public AjaxResult someMethod() { + if (mqttService != null) { + // MQTT功能可用 + mqttService.doSomething(); + return success("操作成功"); + } else { + // MQTT功能不可用 + return error("MQTT服务未启用"); + } +} +``` + +## 使用建议 + +### 开发阶段 + +1. **初期开发**:设置 `mqtt.enabled: false`,专注于核心业务功能开发 +2. **功能测试**:可以使用内存数据库或模拟数据进行测试 +3. **集成测试**:准备好 MQTT 服务器后,设置 `mqtt.enabled: true` 进行完整测试 + +### 生产环境 + +1. **部署前**:确保 MQTT 服务器已准备就绪 +2. **配置检查**:验证 MQTT 连接参数正确 +3. **启用功能**:设置 `mqtt.enabled: true` +4. **监控日志**:观察 MQTT 连接状态和消息处理情况 + +## MQTT 服务器推荐 + +### 1. 开发测试 + +- **Eclipse Mosquitto**:轻量级,易于安装 + ```bash + # Docker 方式启动 + docker run -it -p 1883:1883 eclipse-mosquitto + ``` + +- **EMQX**:功能丰富,有 Web 管理界面 + ```bash + # Docker 方式启动 + docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx + ``` + +### 2. 生产环境 + +- **EMQX Enterprise**:企业级功能,高可用 +- **AWS IoT Core**:云服务,免运维 +- **Azure IoT Hub**:微软云服务 +- **阿里云 IoT Platform**:阿里云物联网平台 + +## 故障排除 + +### 常见问题 + +1. **项目启动失败** + - 检查 `mqtt.enabled` 是否设置为 `false` + - 确认没有其他 MQTT 相关的强制依赖 + +2. **MQTT 功能不工作** + - 检查 `mqtt.enabled` 是否设置为 `true` + - 验证 MQTT 服务器连接参数 + - 查看应用日志中的 MQTT 连接信息 + +3. **API 返回错误** + - 确认是否需要 MQTT 功能 + - 检查错误信息,判断是配置问题还是服务器问题 + +### 日志配置 + +在 `application.yml` 中添加 MQTT 相关日志: + +```yaml +logging: + level: + com.evobms.framework.config.MqttConfig: debug + com.evobms.project.bms.service.MqttService: debug + org.springframework.integration.mqtt: debug +``` + +## 总结 + +通过这种可选配置方式,您可以: + +1. **灵活开发**:在没有 MQTT 服务器时也能正常开发和测试 +2. **渐进集成**:先完成核心功能,再集成 MQTT 功能 +3. **环境适配**:不同环境可以有不同的 MQTT 配置 +4. **故障隔离**:MQTT 服务器问题不会影响整个应用的启动 + +这样的设计让您的 EvoBMS 系统更加健壮和灵活! \ No newline at end of file diff --git a/bin/clean.bat b/bin/clean.bat new file mode 100644 index 0000000..24c0974 --- /dev/null +++ b/bin/clean.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [Ϣ] target· +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 [Ϣ] Weḅ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-tomcat.bat b/bin/run-tomcat.bat new file mode 100644 index 0000000..53f936d --- /dev/null +++ b/bin/run-tomcat.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [Ϣ] ʹǶTomcatWeb̡ +echo. + +%~d0 +cd %~dp0 + +cd .. +title %cd% +set MAVEN_OPTS=%MAVEN_OPTS% -Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m +call mvn clean spring-boot:run -Dmaven.test.skip=true -U + +pause \ No newline at end of file diff --git a/doc/若依环境使用手册.docx b/doc/若依环境使用手册.docx new file mode 100644 index 0000000000000000000000000000000000000000..9e4daef4d9be2e445419109a02eaf321cd4d537e GIT binary patch literal 428430 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 +HtCx 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 Rli)_iWGz7fMupr%QDEgRC> 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%0DfC-!Au^tv1-R|XemvERC8O1`5!u;Z5%iD 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

K#u)l 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

)q;tSdIrAwYxlSM|Hl};Y` zr5R8(3C0p9ebkH^@QOcQ)@CK0uf!xZ|MYktzMF$*^k{Pg$EOb?u63BQ*s}1Yp42Zm zW?Y3<@3jV@Fs4(R=$V)>T)o|n$792RV57<4O#Je*$18bG9GmJ^;d@;~dLCO`s6L(B zY^39`^s*%pN)yiq6KB6v^QY?bYSwV7PvVQKWDiM*XjS!QaOpYe5OWi!gh z8L5=i@%71&t@e+HQPZoV!XfU{5$-7^VrU!FlKoqlEDLb_AxIxk_Dl2T+qa!8RR><* zSQRa9PaLn#KH=d`$s$P5AwBC5VQISD(L9Ti3ZlgdH)G=uA5h-IE5E67;uvs#Y`lyRIX)A`?@8cU3$X-c+kTKFzE^w)V zfguD-=}`qG6N?Y63Z9q5P)`3;*n~p@x6;2N;ji@M_&6-zxym?>y-qeTvD`+r3_1|+ z?Y%{Y_inkZ>oV{%w9@xW%WYiVRWza$RB_apuW8Ys!n9sf5QF<*ILZ&bnF|_0?b|e2 zIaN~Xw{#bk4_`>42sSlwG8yb&6jq;>`9_uWdphLG_DOLF5plyR;^7w1B)Xrk zX|GqAZGtQa!{4Dm@xwFfSXl)4>@&xNgQNh4yr##qlYNmS2m{~h!E$vFR@`Sg-q{s* z1?pmmUDSjJs#?v>O`Qfz%BsiuDTKypPGk7~CMJoV?41&3d^TE2Jtj ziDQ$0y3s3UaLbbPJmPO%E4?o`SwH5o+&UCxw@fR4TuzC0vy=b>Ft1bop+)u$Qq-d3^6? zQcT8mP%`(_7w)gWg1!&U0JtS~wdN+uAU;&K%VM*CtlwUCjW#SfZGCP#Knr*9F=g|4 z`SN`@4wQMd4KnICrAG*A!e+lvA+;!92F%Diwi?>V@H0(1D;d zOI0P!R2@aQD929A7w_-)p2pd&eeX{0pTlMh<|B;J%^@oub`S4_MPSR<^G!F3ShZN;zR86`?HgUXa962*B|QJLNnWfZE4}c zy3!k!MD(9Mvd4l!gy4;5n{`HK0n*N}j~D!c2t0!Iv5~k~4f^5D&mZ%zOC$d3Mo2aV z_=Iw)rD%|NUB<)l8b(upC?8IoQ!qFS`Wg-#-uH8bI{Rw+zuPowVU-yvR}m`t(8iw8^7f@ScXYQWD@p6J$HU-E!*qb#1=r%kg*%qNVKS; zyNB;nNSzW-Ug@&p|D4dwZVTD&Nuf^Rr!|xy)ORsi9#c8$WW)fOk;}qpZEk)*M_&nMQawb_LNExjZUS_D%K{#27Je?r#wo+mslHh7F;U25w*}1tm zG5#TA>2ye`iEp^4S{rJIFj3o5f)wIKYRyZ*A--EAfD zkBEytj4W7xAOlAzMX#%~5sKa?Z8$+DMf{A3-iAN#Ha^e5cdv;L^iDrMk08DdQssJF znsRL8D>i1X-R^5c{;S5%rlo4*=0i+0bo={GfT0zq;sZg!d~k6+)%g9y z#Z*8|h&qhGo)DU_u=7D~zY_r|Q8>Ytwh7w{aQ@E|3}Nwfp!hB--_68hxj&~EMTtUT z9Iy=o7SSPtX?z32-$AYKk@VuNoe64e^sC@+2Gfao4jq#N&nh>-E`%V+QF>BQoe)HN zaKMg9miYmo_keTo5CIL8=|$|@&D*0@GYRPAuPh>Gd5DI$X0~7Jd16zf=pg3RO4*e& zUtQ14DfP)*?RJSeF6V?F8k1ol42W=VuYATBv|kmX`f>z@5x=Sl84olG(o?sSbTxbt zy=q|85H%fO=1g77fx^7u0lTJ^D$Oq`DXFTGjcVvLtvB=HR&{QI_%S$>8Ezy)|7Q2| zWRsmJ%gJ*Et9&#Cjni&@R56VZBT?&A8O52!JqOPDXW#pUh`@;2;z&Fd|J!-}sHBxW zvH0eu>PxxY*vhM7dgPJ)@m;$6w@ZJ9@CmW_5s4;F*2bnZb+xMCI&m*`8VsT%4;T~U zNWzl5Ok6$NW)%5Z;hfu2#bT?Kx`X?ZIazehghYJIryT9$V=Lbshwa}Ori01!te@_# zO*@GX@-&_=R3{AHzy&aW5mN_9-?ox*X73YY#ogV-?~peC(3wmXR^{41G7zgp0_zsT zyXB-737}|?S*b#*Lj6IYxZbm%)A((tT!&S!u^Gd#Q4HlnUps$ICKQqj%GW7MaCi6b z5+LtSeSz@6jV^%u$l8;;9>MRWO&)~K@qf6%OIJxgVK1v;a&N@ZBi&)sP*0t*+l8Xi zANB^ZJ=RmVm{E%{+i<2RUP24nnYzUpvWYP>9t3EoGFQ;rDU?W-^tFEZJ&dt?_kE#6 zr$48}i8$vP8!QtD1v9u@Z(UhgSy)(zlSRz_1Jau*Q#5os7wo*nvw7q(G8vZbyusD@ z)SAydm5e^LG5fZLe8t^z39146dM!a?U$miLSim#(n!f&fuHFK3-Z028^?Q9FMjM6r zxy7so785^UL_8|C_~&av1bP^OzENCt?*&qq#4jFOS*wbgD!)z|3OE|N%@}x$!~?4@ zMvZoA`orr43S|fo2~RP=MO=Y-9bhjZprNH`bRdwK7KP1PY));wnzXxp6_5DYoEH7# zA)}=okF`3-{^7lIzteZ2B9n&6 zlf%F8Lkd-tK(m|G<0DI9##0=z2(C^_Y`9zZYr(h`B#N{`n3UuNFU;k1sp&c? z@s@y=Zp#s|lIiza!w3=zL&5VLIOse*tU^V+*;zK#Ec}K-F*P&YqDQivn&9)*M)S!G zPL*G_foKyElxV&@vK8u2w4$!1XUrZC~`=ZKh$R&xeNGd z+#Bu6c_JwHZ?Jd}tmc~OtQG=OdHsBvcmlWp;P4KM*C_!oX0wFRK0b-WU`Qy_altw) zBw(w;0wazgj}^j^0N+PaAHrEJh}sTkG9SX-jf?QbMl8_#m`Bo(gHAl42)we=Zm8;n zF&Pu?2q@m%6zjdk6%xoS?$nx899{~9ubE+kk-UCaBeD4x~kxAC1UFCoK_M6PqM z^!lQUEDwbJ9}!}59)*v)sjwj9+|{Cz7}E%mBcXjw8kg^&Pk*&9>+&|L($CQFiu%a zKzA4pR|oITW{@s&Ls`iH*xBE0W)e$;Tp#>D7$f?4u;> z&C!OlLz3+o$Q@?d1Ca#^_;%k3^Q{m_!aX4M+N0S}bmWNW@%*6t?xg7MX6A(Wke>69 zc54lk_7?`5T}&vr(HS~S$uG8@8%&9*RMHiw1EEIZTJaP{IIG@#oI)DC_^B1js1`FYgKxY0#Bq7!634COd%+ z29aOZsKL~40QI%CdDp4+Yw^G&YttE}ex7CB)-9|pf2H3KHSMDn3FSOUzgRZ{1$^}R z#tnjme2+bCW&Y3P1-vKwTd7&)?oKVPfh>32a|V!FX_{>(eLlx)%S$+W-U+_nDLMY~ zqiu^}4`-EwcCTOa>nj5#-C#VD{{jzD`|~ka*-lg!C^Xr(iuk*bv6bc=E<;LtMLSH> zX`X*)@3-?S7-NY-G;W1vp3lnKk_bzYC5=4AB3;e_G{cR$Rqu~;vzzsMGvm=KQP=gU zA@#Ha?yY`X_2Niq?voaX_EVG@beOOgA}1;td-s+-`K!UgAE|iPZRxC|j z40!bGKr#EqXIAbupH9D^kuJac5Al+oAjHiQ-$g-2lLv5An7RB0Icx@1krW?IsLaoZ z06z6RRd8|E$L_Ewk;T#6k$JOWmK7)hr(@Ftxw%Mlq$EUaf#-$0Vne+csi&sX|$DDT`u@% zbOcUc&Pl+b5PUd-(%CF&=o*pxMsRGmJBNcm3q$2zQz!iOaIHS?2f3e&(vJn;`h3_H z=Rdt9x<(4RnH8W(yeeJ%^jhgH!ieK=(qoec47QI{UK1#OVH^L3B3~qjVNo@b2(Sso zhr}Dg$+1yw*({)Z?ALufnteumN3Z5^#6govt|T>P!&6R1HBqty!r4bKjYMG;1uwZ~ za>rwahAtcvsL1*^>02MNxmtq5bd5#siV{7+SPBLAtWuR<^ik?1Ie&iWw|*qG_D-u= z*7sJ&>q(%54no<_xE+wG5XCXL-0q&0KGkP?Uzgj@QA!i;%g!|I|6CRpfK29j=*<=U z@V#I5730&yGQ-EvsW7)XwtqNpgY)k8YE0a+inB&+-~5e+_L9=q$0cHiG&rrpnS`?T z^ek}{;U6P$gw)q;-}c?Ecf@*fuW_tdTEwZjs1hE*akzFlkmu29Q~)adDsx`{h1Ud+%8Rr z81*e!6aoXssy@vS8uI0{>-`0IEe}E9(vxF* zv~Oipw*B+r<(hJ-l8=djn>-mB!Q+`dCcA7Vm*_wPV*h&ni9WUY{;6y@I=k*WLuM7d ztklVjvyEb;+*Fs+0m+!m*dn2L?6=glbLOn$3v{SsRprTnN^J>jW6D|ASJENDj9}~J zeZO}9uCb1HBPxS7m2ua~pVY3k%a#{*%1o);fdNRAYBXNu2$@9v;|4uM&r}ip#pA_Z z;~$6OlHRN=BeCO9R{i{Zl&Q31=E-bQM#Qqe5wO6k5Ol>E?amqAV&N{gYSHKdc}0-q zI!lY}46-rb&<~g99d3j^VPUbnk&n4+9_O=Y-78WYzlIjjzX&AgJ7~0Z)gYl%DsiU9 zukh_~624%ZB%RJ>DN^q^pSo`!v7*UJJs!rzf&OIO|Nt4>ddh+|iz+1VGjx*w8-g9?WDk+is$aGk_Y zYg%5I2WjFFjkI+sq&lqcoQj=%gU_F1^Qv40Pm+U18$zY1Gd^%g;EZ(qbKSLR9jqIrdW)P%B?FlTSb}uvLVQSJzI6Oh5url& zgE4^y>bQ#rNV7aqh-u-5Wtx(BCx8I*jI2furMd_RuSj^MAD8KWUGy*Yxgib#Rd?2b zWUp$kyGru=E!=ES*x+tntu1B)S~{SN#8K@9Gojx{rAs-X1QSfsEo9i`R6$`M&ymSs z-`x>e=nJFV?Ux*h*0+&PXjVu0L`e&m2SjIWa0=c5eV&Kk&o1U&gdWIpg~el(rR~V^ z{ip~h*CA^S=#Z=e3IyRkafD!LZXv~lNC9dnXaR^XSoA`pNo|&_SD1f>`F1&2CfH-B z)7RDT?l?OrOe#ACPz*C-sc~)gm*~Ulk+P#;#Wl!daLO?72>YwJ@0bGrHtLAt8mbEc zR{V=`E~}01Fb53`Gk%L{tRuiU2|kwHaJ>{CHXxJe{N(V~9LxF_golI{$`d*M_am5x z#d%z6lBRPHoFaE?%s^fUpId-jCKY-dXn;P1dfNBwxLBcD_k?TbUs>f795A`dT)L_C z5W>tHzb#yY@{Z+m&^La0T}Wp*DwA;p5Jayh#89-tVg+dew-p_A4}o?$jZj#x(ee4v z*M+bfl2mNw#L`WoP5LN;8T*C5xI*V^Wte2~`%wy{7Tal~G#;pS2zN>~5cG`HOW9ax zpJzZF(^n>aY^FJbe*_rH8VQKcuDsRj`=UD7zcgwbpz}7E=R;7ga(U}4J0eGu5KJgG zvjvYge0jS-#8+q@ae_)sjeUdfPsO-XM0T6^qNSHIO<-TQ?nKA?1TiR7zU)Km?Ra`D|)ln?_lpz>fnx5 z`30LGfGRjkMF3d=RVLxU6DB9vMLRuDR1#>Q=aHv< z8G8eA^i3C=Xn2B1PP}^vX@MohjfmQ2kPjE(tg7Q_`a-CvX+3c-?EBK1ji`GEux(xu zN;!g@H=~RErEyQI*}le@sy4a{nR*rchl2>Xw^_WN0L(z>~mx1avEG0*S|}6-|pei++)LK zQy|wZ(M^I@m0>6TT!}1%>+t8kUv2Wqz(!`ZY12!@FL>i*6&6Do9`s-Gw5y2OWE-Os z49w%tyTt9&)dE$Hb9PUbS62*}kdWDArUODS+AN!VDhCal4BLrrv$PJiY#h2}Bjd0e zHyW6vS8GaUW@bzb$YM6HI~xlNaP^D8-d_p$zPwHWE4Bo=;e4bN8*dr!I- zewh#KbX?CrekogyGw}A6+YO;Z!=FoRlGz90>NIN5BqZos{8#T`Lz}+X-i(#j&BerB9Vm4#y}$A zLFmY+j07R@Nr7JK@14?SX2O3v#$@?=uR#!sbgbkG^D_?`{YO_g7#q&>I%UM|1`h9d zO<~*=mhc)+*X>_b51NZi^s5CR42b`A6FeCQ&B4_F?cfgano*OnjMec81x3}iAEq?O z9ElbMt%yos-PKrrS!LetrPU+^rC1_ic0DCxz{fyGJ-I#JF1$F*y*wW~@NE;>jH`8F z0r@E?WkUZSXT&mJV_KMJ@me)j`mZxG?~ARPQ(rbrE+QZQ`1>1pJqZ{=fKL)nfxom! zZHNFjK>k@xnfqIBUWgASki}>8%5!8_1%Z;8+tN491O+I*>6+k93kd#-?>WqpP)w9- zJ!Ic0Pj2lPb-Kscs>*mSLO-5|s*N+Q_y?fTd^^vrIF?^^3y=poRE#Aa9v($<*+{*7 zne#|I5B@lJV$!Lb+<>lg)^zmhI&GrRm8eQ_WqNPv`Z;E>ZKoo^;PY@>Z+LL=SA z2XZn5jXjQB=Yl~|#DfJhtJ3Gk#w1abvDe+m8M$Hn{KQnV$$~WH;EGu_a&!Ulq)`K4 zYC)mJ*1{FI>(Sq^4boxhu+g-QfkG%p=8wET3PE2X&>v%vj!Khp5DempJS7!O-IQ#< zm&%~q1FNYd?OlcV;Q#xQGsQl8ReCp7GXuiAoKX~e&8U|Ypg{2jDivmf-!U52oeMAd zTJq43TrXzgJC5u!2-i!nYaBgBNViB%X`)CUf>k!9Unnw?!BlP(s(GZDlJ){9& ztb0yboz+uP--Vh6zeY3N|AZvMCIVng0H73G*iB13qAsUR=?qOO)U;cJDAP&7#B!bC z&f7G|+3Izrw9XVTK&?uW$oMqaOtR6>hrudEepw3OC}E zFQf3lQ#XBLqVeb=f1?XMiu|`D{2HeWeiU6Fg0Xi=PnYZxg5~n)q&et+74i5pNzN;l zX+72EC)YDn#?sGs<+=%*elj)5)BrmGDCFOm!?z(t6#xbLf+LE&3qc-~Tqa;C{tl;% zOPqHAecIeIN4}aXFAL8Dd8kc7 z%=9%jl{T3Gyu{tG_@P8WvP#&X3%S?jl+aSQqQVpA%LxfHEAWunx6eXdKmZci)})D) z$C1t_jLQWDZ1onfU+S)~bc?Fkuuq}|MxD0v6Xwf1?O1t@pgsUJObEGG%Lj%-7=#z% z4H`I%ex4vGCSSogf*LS5X_r`m%Hjm~B0{+d1Jp6=kyNg;@*?nnC(4HcJ6Qa4qg_vV zFYt$=K4d}K7Sg5nnbyjJ@G&(FwVadF6SGr^&685^I|Y;?w_2IjFe3i}_-Z zf*}E}JBl%@BRJhnCI60@=lTEBEnYVFnEK=MW-E|zdYC}9hqn$!40Y0Z2k?pd0O zCini-@&t2xf;~Suf~O`XFF0KPF3#S7Fhmu?0+4h|C5ar>BbksI%}ABj^I;A~w9MQ! zGE|!nl9s|usvN_lkK6(zWgshT4D{V(g~0$Il&)i(1{IslSUn}h;2^m(dqCG6XJQA2 zKmz+|R@?XtLk&56&y;Ml<2aUNkrdI&)=cm|fuiqy|YSe3H45OM3#PLyj0a}r==G?zd1L^OnqwW3`;cTY=sqO6Q5gDIY+;Q9=#svg)fyY3_YE_0wZdvtt z?ntWqWc!SA6DOcIpLhCMH4p(pDculfVq^T9VLX`Isb5L>7U6S4+i3&%!AeV3U-US1 z*FHcKozzpk>b7;jbtU|lgS;#$ItD$A9c>@Q!EYa&dIxm~rMnnqMfUjA(e?WYJT+~4 z&-U%orKUb_Pq$~t`-0aK8szgeTC^X)(02^@jv?nT3`wV3Q6RJET)q7>5`$i|#xfat zVgh<h@st(_!U5-ideYVo3`luDr8RTP|J>h_Uw1Ao43( zU~$aiqR=9H=0ROH24MkKWRiN?w63>D+o#Wq*Wk-Grh_hOIjRZOTa$Asxpkza9hE^} z$_mtW3i#5%XBZn<3lDNOf19mJERG0Sq=PS2OmOocV5hDyEI}R(7u)XHUJsMQZwN%^ zYO$^MD;h6TowbNn%}tgFws0jiUNz}VoVO@Jn_~fp7_HH0oVX_PN`kt;K?mfA@{FZn zv0rYkEb((Z4T)c--k$EwZ9Ts|LV6)*k9Fvsry7_3QCx3Iv@vJjZ!(mE3Xk4jUWAnb ztYs>#E5pM(=>5G-ig@b8Jyk0-|M<)4#>3mDRx`9bPn(zd^E+>T-dhx|G=@QPOY~Q% zaSYy`3ArY(v@=!mGqThqUd8R!s)dHHG^FF6jx{1j;sU(LO#NH|uWQ;vlUr=%fS~@`$^eYrYncgq-9fw*@m!%7Ms4RG)5jG_t_zaNrCV{ zubwcpHGymkFkb2jq2yj{rCR?{ZEs{v{oGYrT9{i}SX+D0NL57i|H(Qm@%feHI+Nw> zV()^V#i+3ijdxzWzBq3-Y;T%wB7Rd}`i>$$A*@rF)ybri!A0#?(geJCl~xK&xeao! z)ZN+oEMn1gM3{@rtE9g9@0qbRU(vS?2%v?=U@Gw~-~X>-A=Xi-NG1m63n&mnjT``A zWtH>I#Vc25vKAedGfxBtG-09;t3EzvgmHJP%c*i6`uVmeQGo~iS64i;U_1jEE2Le@ zc(@?pCitKWMrva9A`6|bNcenqarrxXR8!i_X#WXgA@U7(LSJFAKu@mVS#tFnbdX$ zYXi^|a0Du(a_&22$D4+ROTpbPjd;`YgNS2It`Ky)z;w?t+$_@-}Pe$PGe_XVHQqT|I&TJD7&%x!}X$^>3yqe17OlA zh9Ym7MBxj4JI}fbwAs|vZ)50zZ@iT@_{p#i>4 zq&cgSyi1H~KaN@w7*@^TlY}7>#06xKQ)_jaBL#aDKO5gAmh4cU*A3M~O2b_WM%j5J z6M#H<7Ne{V{VrsiXF9sXZ?JqVA>I$KALl4y?+bN6KHHjtKiIcRQ!nC!667-YGgx84 z@R8p7cTrX_2z+u=ZrR*63Gcgb5E9YD$*4v~&X_nVxd+k+jQ{Rc)2JQ0yaH{whzHCL z4D5y^ehI)%k*#)f6k&|Ex0C}1`{xE;TQ>q8P*5$O4H)EA#HGTuKF;{YYhg2cCdMWe zV(*Bwa)tO07}I^Pvq$M7_P~_hb%m?K#38bt5Flrsozq-8ki>fLydxnlCvyq_PC2A! z#V5Kqz>mX4PnC&3OI<{xEOw6+UH2sN$dQzp5t1XB8yIq7wlN&Mz+jyA`8yMy`C zE^sahF`0(x0b|o42C@BCSPG{kL->TaVt>V6FSZarpS7Ee=H9zTKC~t#{&YLmc>6Zo zFLthtvjNoaj3~!PyA)L-1@>8z2SzEsf?^Ygq{l;uDCu@wTYu?uMV4J=Y{-^;QOXKb zh$f2<+5lHloDf!*=6ZhpQ$~`U&86*mYw^?4b1w>9+?!toQe~U#{nU;iZum)8O8HIV zD4=W77E!Y;fOcKh);eaa0&VV2=oKZ$W($p!uX!D{I-37>#s z@HbDr0Yz)8*Q0lh{q|}yNv(^>2BUvam7e@3_XVw$|RYVc<@|gu<>K4sHrin z=QTRc5;aZ_jB|e5=TN=F9UWhDT;u+-Xw47ybZQB*;CJfj?x*=1lpNsFP;G;#AADCi zwxRwZS)9F20txeOnN-`WA-cfO7AgyE>8Xf^GnS^zH(&i?n`PF<2p=~>urmM);>qKP zeiHvZJBKN_G+TyU`ad}ZOG1}uKXL7jaG2Dcz{~|ZvERrnbmp*r6;2{QjiLFSbfgM) zZAoT>lAeB{ENqrCxF0^YXD@$Yb2tXcM96A8%IQr5fC>n7G7U&8pT_8%X+1JDL6hbP z{?&l-D@T74VXvw)njarrZEiP5U2#RAe+vCIj=l>-^EjSI1JlM*gn7IU@?;_cjcS-e z(J&5hzap5Gkd#uUDb z2q1xdB2(Bg(f$bc#RWpJ|1WrNE`og49w65H@Avu~QJ)h+B`vvXDS-ZdE=MLVzdhi@MZ$2FzW!&*~@2zcZ8PlIEb$>iS^Id~B zTc2=|2*3cq<|2CfzTt^Cp@0Q|kW90K4On>!i$lVK3h9)gsB+jJjt^SS4U{LtM}0kQ zSKcux8^V5{3jQn>0agv@Q6j6c37{k7Dv)09a(Rp#Bnwv$2jWFwT!LS9W&IcIb5xr>p#0~u8&h8jKenIuY%lZFx!lrI`2x+k-hB9= z1>aVH+(L(7LM5C&D13FJ`f0TK#3_vs>kYGOw4%*f3~WG80jyx zu+*`ti4eFZ`vr5!YpY;h4~ctkwiV&1{|x6P46Otgcz0x`w0WxxdQhk-Hg@U4@+l8f zW#K3-k)8)`+Sf#|-=c4C$D@sKttRtWFvN3^{v554ND218Y@YN69SFXE8|iHOSD#+CNM^Ryl3;nlHau^Q&s5Zpx$ z0psf`(sTA^rA1YQL>f7u3bsjvf(KqHhGbOKDpsM&AU53?UZBtTJy32tYs8?UeP`=^ zB3|8pFpXL}2cljz<#DK<+gGV_(W0&DZKfLMpAiocfR=22wd!Q--q7v$gy}-rk#^DK z&?AU*SZP@@QUWJx$2=d@8I=MuEHnVL_OeJ0-B^;}2l#l5?JzExsgqX7BX+<+O_75L z**LUcFI@`g=@s``zSxdtdWiY|DYo*7oXPgySA7NqeBEE{y3I9+LgtFys z>6$g+q>02Z{FMJ;#g<8~1rDn{dAA|vNd++!>Qm|iQK`iV-PREUmt4(dQBs(v!Cc`3 z4OgKb<3Wev18~8SAI*bGtkgB&iKdsI72i8YX%ziCO+kRMt(fHt5;OSYnXtf3Q;mq9Uj!DoVO@o*N6OljHd1%uRFsnoTm=EM0dA? zZGV0z;;>z}7anBSXfTEr9J{#>R40J|vSg2lK)=;mGMf|D6`~ZUT^2?F)xyAh!ofiV zm54Jhg}U<{1ezf!ko-HuIyLDW2=Hk5RX*t@i?4r9EL7X9*1gf(!DIDUrV4uofv+&j zs$)l0D#8Cl-A$D1A{4*dmWndWiS6oN64euDow}pn|B*ftD92>Vpi#cME(2f`KnfB= z6k&r}cj0v{8)dm|JC*dIJI70t0b6YaZq3v_K|nvR`8*e~3V7PUHhH`Z zO=JeBr62UwV9jvUA5o0g6rthwY%mGwz~1k--o0rM-#eL3ITh&=9i{fgKFCUNXYiP1 zFj!NQ$?*-&NiosU=>|Huoq+OK#I=dQL|}swG2)78`W`uD5wt%=+T*qNP=@nhmdiaz z+BBeAbY=yC?~mQc<`I+bag~45ub7c8ZmkKSYlI6lieUviX&_>*hT1`Jf8_-d2S`RV zupls0{dTKKH#$4{rgzjki64UMtO092dEc#i zA1aL)<6&!c+I}A-NMc87N5NxIR6#6_Q?+UtWz<^mX;XL>@(uZi0l@AeeDv4>j{11X zO`PZ|4Bd93R;>3hk^Gv_%Idpg1~qm;<|bAZ`_Uq+LO*@cIdSabq!XH2XuqSsHz#Hi zBIcg|o#{_7*j;NE$h=M-Dqo_rH&l66K8s3+LrcM542gxL{SfreuBqE;8z+4kh3)y} zA^wWK`;Z=yJ!#uHA8Sf%qKd`*^SD_SXoeW&4L5xCQCXOAPB1jXX3pWPHaQ^S^F@3} zYsEt87i543@xngKmUhdEV}Dzg1oGGabJxu)?OT5<3YaJp|_V zA2uFm!iMPck$&BK|FsZl0TD)yC?#-UuNugJa~X-BrXX4*qm(3EB<3LkWXODa%$2ua z3=+mS7pUM4elxv|jPn4>FY=y(A^|RYO2+6mEWf@TRNcVhXVnKXl}62F{lqYepqZkJ z+d0!MgxqTzguHh;?yPDVl0A3PICJT>%6J|-=H@Kew8jQbwg?#Cz&&K5CY4T4Q~yTI z^IS(luqm`GrK{Hzdo1XK?Sh97<|lF z!nvxLsc1Z)2OCgxm8#Y0;l((N*h<$%k-x<%)Tw_wladxSsbVaFzOAy`R^KueC7(Z*R6Q zWB1hcaIu=RDzmxR6%Ut974f3SrW~=WxVB;mM?!+qT8*3NfN$6jf4a*cT`_w&67lll z0uhyrFbI8OJs>gX?73|p|7D!>WUaLrh0Z2PX*WO7wR zfVJ;A>6{`~q`$(1@HgoCE?uNk+@rlFj1*Ik26A!GV*-$x??UBVqptKRC%*C1!eHkTZn|{+7dwC zhYf{j0W>bC6P6OIsss^rvtFwU7rt)&+cd87wiP?T;aFXeKx$NLa@(#3$2f^UBM8%# zKAOVroK}PBS4Uw80>I~Iag*Sgm>G6a#eFx`3b zgfQF!To_B0t?BcK)|#+2M7uiCzipImGd}Dp^8!hNeI!O*uw)urzZ~+E#NTh?Py@zU zOP+yCI0Z^;6%A^#LBFJ#NlXW{L*WuKOHGxh0`dZ0c8eTj z52!P&(*_^lDWr7_*%gcu6aT6Tecb}G!Y19kbZ>@Z}jzoDPd8@91)t++(^7GshVR zMoNA1o&F0~V4xE(ogiA9u0~r+4^NaFx(+r@ zDZJ7qdjIiNEd*f{TRdmz$e)E?AVwK54ch)IV~7dEAsj^;_4u84cP{ke?laX$ z+{@p3w0r%Y4uS|=aBmzK2@>QOYuL8!rO$gF(+S2AkXVnV+~#eyzb#>}>l7E>Nwj(j zTaIn;+8gi(JZS_D^mnxOnD7tRJCAgX#|74QIrupDN@jW5i@9e@)tv4L*}iD0bcll9 z_oLUt}7>*<;tkCG_D(+YEo33n-PSvI`AApKsV=n)~8*goW{9!=#a zE1f0?uR0lth4B>YdzTo!&Rvym>u8<8K*Yb-3SrOMCEplayb=~;!2EXQSOf}_!H{bV zSL;kw-#2D+MEpb<_@cpFztz;~8vK65#AZC7FxXV$2`jcj;jqr*6u!iyCh>+{q z{u>_-A`rgc&Sc`PIvcKjpTU$=KlVWL42tQR$Ah9HT>lI`c^A{b`i+Mzzv-Wn-DnXm zv1@c^sZ>1FD#rX|FJ+Vtc27ET~;J zx!AfP6cN`7VZWhuZhg<1jI0f7`!g)B#SJA}jTpgh(}ok$JD{rGrtib09pLW9^}DkE z+a+k)OeRMnnz;so?GFj^C`)HgS0!HXP!()_-Pn{1l0xyc=fa%21~cq!Jo9X7Ph<=* z&itoIC)p0GjR4Y5UzFJHN^WSpp5U0J!3;g7Y%O$U`o@D4aPIa`X&9#`JLcYBGMcKr z#$9Za)7rB+Tbyp}vy&{lLkzsF5U(OUHZF@{w*AB2+S$r>84M&xTZ;vs5Uk#pLSySN z8mtOv_gcsZeRzw|l1xq0hWaxcG49h%b-V{;4pYrOmKtYoxANb z2#r^SIf!Q)YD^Cr+O#5$Z5|V=aA65Pc$RHj)B`qXSa$T0m?9a*Q@0srn}JU@U*}wB z8oc^Oro(ZYC^>NGcyVCV>%k414E16((93n#J1$6CgR>{jkL%o5BhT1)a#|gSd1@B5 zW}uYN{5apsZcZ?PQQ9-F>dU06)(8X}{KcRWN0%Z4@hzHjeOvRsoCC5slyyVdq@{Z^FT{Jc%yAsj5h$2@RxQq+(EIj9^uKm=1|$1{cdFCm2wvNCCHU5=+W%d?p#8 z!P(R1Iq{ElrhBLn$wy)9_0fKo4D#+Mz&uaOa7kcOYpV}gta520LPWx4 zPyJF^k1oB-1m;REFUzXFS$% zbOfH-=MB~h`P;pNho-h@P|CqO$m#+ykT1 zleKP12y1e$p1y;xYyZQ>mw;aCT#|vAjvLzAv2mN`6GGqj1ondL+s4?c7nyg30XTVp zb*BUSwy8~m^bY+qy-ix@LYda|GjDD6L)6X@*~hMhU^PJ|f*Zk)jb~rS)B)R;??;|Y zEq_vK0y)-ms7QIY+e?t=XC(@uAvq`RFPvzx+}Cf}pHNUx?9~<4RY!Y}BL-ril!fd21m%F7zvJqfcs-w1R)-@a=* zzsUZ$clIMh{{|o6ab^mzN&bZmLK)b-JJ<9A2`Pj1E(Q(V&#INYFR|7d{%?_^yAzYN zx1<&>fkMTtkuu8NLG-txZ@}TKtsgp1-*LjGuR1}zk5|qRuU1j}JuF9!o<-0;TuX)>Xxu-;K)YCEqul ztBQs%5BSdux@%4X;$Qb=lWv@^4-8x47M%`zhn(!-y~v<^m5_~p`|bZu(LN>s#L0!; zZ{)(_f-z zdf>{x<_oJ9e(_?;Z|8iTj~Mu<`z~e{;~z}Bxp&jMZVhhx{o=`O16r}VgTnFbd^)I^ z658o~bQ`{a>w4q{Z}1U49n01C!FwtZLy7r14({ILz0h&MHLmvKcU6ULxWEtYIXMe7 z(dKB}&3EzMJu;!D=s5n4oL)MKi zTmrQF^R|ju6_cfpi@l5lng@|-aMj^>wnQf>5Y2jp+6Jm-yKapB9)gjUw>I+0#(5i0 zK*w8yodvWV1J7zPqJ71LTi9`o9+Y9msU_CAvq|9ha4}`?^XGx*pWWB7L*fvCb-mNa zoxOl~yH@5rn-t|7|07}!2lh?A+ne--XA%LlOKk~&n3N`&U`q+u_j>?# z?5EfNy&V$O_YYh2derm4EDnYc{`8MY?0?8c&Wu{DG8Xl#Mb$znwX}nFfA-|XAkqtK@o@Ru~xXIzu zx(@Id*l9gm^S?5neTAU!EGQc-#&gc8geA+DUfg z8gE8Z`>z&O4Gr2kZMv0pa&$<#wa3YCw#=X>vYM5iJ$@%>`Z5%Ieba|5g7182<4g-E z0kPPUWFA#RuSUD2plSEF=4LpQhrvYpAuj0Bu(=$OtIk-=PUe65KW2WqzDpRpe-4ue zown>Bv|shJ13NsZ1K$5(_^x(1zPkcC8^hkt=;xKO4*++5TK?iXZJFpFKBn&9SJU%4 ztns3%yvjCo+pcj+=?vt|sNFB0(8{HpXrGQx4q#3wl6H#98=jm&7=DOdikfrG$xA^P zVH+5mlRiaRUU^zHSU5IS!RJ9tZB1oGEaiB&VV({OyP7q7u(X0D!?T7xG>5+6n%x`F zQ~31z*&q7x-vxf#A^e(aCj72DAq_6?TO_J8)HB`a@q_^PUO>dh3H@Vai~~_y0w_ZX zFw;v*Mt=~_{kB|oWk<2qtHb!tI;ue$RK?)-j>eC+($H5|?S-QK@ICUx`wjy`*!=eA zzxsoKqtD{UIYEZ%D_~1bU^FEIj@NRnHuRh&)ixyu zK?mNNkj$8Z`lW(kmRz4-L=wP51qZnhavJ1**YsQ43QkDH)rHy!53Uu_PfaEV>2}L5 z%G2x1?f$_0-Cdijq0`AKYs=pAT4mfoYCk{wSzbI%YDyn$5yjn%%w^laxW7^n>Hnt@cG=y|KYAD&DHA)WiuFP0$ zG&0wS#Kd%vEjmuYrv_X9exEILnq7E)4+5%Pau(>EW#33yPc;NAvjF(pFM4le zV`)7RB{u$Ba;Kf8H+L>{V>M1F@Nb(Z1RdckH@4C%L9`_nbSv_pMfRUsq>}jNfx5;%N2Eone4N~Y^wBbO+d8X!b}|n&$39|L`Fd@QiAd&do5;TIC1SD2nzqSkrcj1Ked98_)=WMDbbuokm7?#fiKi zPWr1fM>tX^?g@D!m^HnCowwReCo_hqL(~l2fmwD@5P6@*ZvP#a7&u-y-!38>Q66_d z45kspYAAh}Hx3J=V_^hZ=p;n)uWQ_3QH&h}3+Qe{4C$;Y$dW>GN5q7h23vM8AK)Mf zD@scRpg(E!RW^o4iUZrC+2}Ck5=lu8^e0P&2F0sjh-&R!dVVwC5??^6_uz|h%iGlZZEHBE z2(*EI*EF66s!et{K(_Iz9?eYCjTt+8lk%y9mA*+6t4w{|)kT5K4?`zLOLpzFO>e9IZ&Z3nKmCZ?w~MN< zdBrYh9U|=YaA;BN%%|mhXJUOGBlsUNF?zNiIXmrlLzq$Pr7mFbm62PezJa4%&_uhP zWig(w|40*F?c2>j(v*|C0fO!_tWJuD0MaesspEcq+AR3d_~o&agUDpw_Gi$ZmCw`k zJrb#|d!f>101{YtMo_SDxqRJ-7$5}Gk(K9$gajVvY`08b8MF!2|5X(@!~iFwAWwuy zf;_8lB?$AI1Oi8_2jS10>FVJ>5%fr8jL5H!porEwrF_;Ol}zDB>h>*C zTn;R)!C*zv{FGVG9yRqmIE1UaVZb)9)uIy3r;{n~<-5j5QI-^ydkgqU#^>|ToyG;c zm%-Mjv`Ys~MV?2Wj&o z;QIu%B{kDSxUV#j4KD@m1fCqzM;0sCe)QcDLd75F+^{flM5Bi~g?}^DkL)EwIG@4I z*s(poRfD*dLZ&?$oZ3y^b~^>!5eCU^7H2=@hDK!(o=k=3Jbd=HH^Rdk-ugn$u}9)y zedqh?mOdW`QbLG^2>w@svM_xZ8c_}-H7s}N`dbGsmr0iOnw_B$VJw%VH|Vp87jfH# zP8l-hy7HZ=VKT%&tA=Vs)Ava<_lMmYgEpW$UDk!Tc4jqdBKXRI)85h01+K<*4l{z! zaq7#E3mqHocAG$fRK1`1Jbg+3180HUFuz|Hp^Sms)t7q3A)=j_5aSO;OHU|>-LrD*iDb>ufg$^od`DB@4*N|x zWq)0y?DFZediGWSc>o@kh0els!hf98WCI{FVo_&>$!M7>V; zt6^M+%Pkqtmg%mCh`c-W`0eLUe1nhJk2kAs&8reHwx7PGeH#O8k4}ACT-97ee#enY zM1kA;A3VWVlk;6QjssYTHA#Vn84q+r|8e^ctAecI8@1;+$ z_k_{lsy6`%l?--66n@j%79HkZ?pb4E-;oM(@+`6mrd$MGfl8b@Q7!ss2ckY%!%YYz;6#WbPNpH@XGE+Z`{TCB4VqK z!?WUbpwjF43I7PpL~$4u@iK6-Sb;bEVwC2s#Fs#UUqOWR`5}2@R9>U0i462TS(+~% z`&BuK*q0PbYQ#i=a54J}98i!SepHla`I972p{_(>t)cXn z3QS!j#jAsW@ngK-t!04a2~PHP{O-$7myM>yjzUcybX!N?08E;Wh_d6TO|{^!x|Z3RFP24P+8ASsOr2X@Fr}?O{$wAZTBIHyGLP3wptV-7MLf>d z$h)aeMO$)KH>A8bD=X#y6CzLk1cjxl_8T!{m)=-a=wAprpgcJ9IA!p>f@Dbvwu(jPQ;^DFn~5w1Ava#RDoQNO!32s0f}7{DCzQ)Pask_sFcWc- zeACgEeZ+Wjm5NzxDySi>(L#$G1}_w=Y%4iuH;&_vyzGAq1O?kWKq+jI6aJK{AcW5k z93&^|mXo{FhJ+|*a7nWobn-8I=_j#De#%#CQUkFMBr?yTl4+kvlxMK7ar{F>GL*%M;b73;mbh0Gc!(ZW! zG-c*kjM&WE&xv4rakFGi@GPya{LvHaN3D0IkUlhoK9O5u7t&%EqGo5I#d}O;v=i@m z9r*7%#P#@chf4>C2f@B`gg*fZ9Sa1cZS0mZfF(5gZ?rxVSD^Bvrwm*+<-!X!#KBJ( zwr~tnYkb3bb_f&5ukvwikzF7O;{psu7r|JYG>I|;-91Ox!WRGjB4@s9ptlAQH~oVx$U z?&U~Zj#xvjhylPlcu;g$k{?l|Kb|yjg-9g&zpt|JJ&^(_>bmR>ZFva%I3Oi!Sl*uP zMqJX*S^$t#(3)tUl8|u(;nBOKsFDy4F3fojb0l8ebJ6nOfQ-D}b>5wuegiIpY~n|%bme0m7^IsGUag1W+qx5 zj1chy`C`L zwwS1gTK!GXd1!9Z4enPS!ahop`5L<>9hOvB*y8Ch>E~dU`@mC0b-O~ul(N2PwEmUX znw|+qaQ=0ZQAz_ebn#k_JwNiZ1Mqc|v>>)^=c#xS_?=e!IaMSc+-&EVW#;D@Ts+a_7?6Pp2X|S^wZZd1nyl7TE%T86xC5Y9i@(Ee*EuqNPip_CfPZF;BZdc$ai(RI9cIxfS2)x=DlpnG=-ighP&=&iyizo|>#z{6hO^Opx|X`eaMtCfw}8e#wsE`vJEQS-Au zuk-V^35_s-uZRR%!HOux*b1+^HuozM<-Ep zHJ@7A<_=SBv(@o?q_r{+{dVBdAjcT*OLFXZmvO9 z`H4$xAfmoCuJOxGz|U7td@W%iv>G}f$^lm^gz5gVHsfzT1pO<%rmkPaaD^`=2ym02 zf|N;T!?ygtAM#K;Fkfs6bTQUs8WkGIX~)YwZ{< zu(r23J&q?cZniyoeWuwI8#T)0GCywvcaAbPSIO7{6HgULggj^BM5y+@y^Mt(UlUA$Y`~ z)HFc4*<9#2b=F5uZ`6e-?FFkPELw)tj ziW+yjw%@8?-=4K4Wn(??TY?PK^+l}t`xPZBoa0dcl20M#q*4S1Q!4tK`YIlTK(6cp zA{w>-A+8=50F_Qgmod2e*N`Al&Ke#313cEbccPpoQfSaZJrq?r*RG)K(PM>#hFOH* zV~q+?Yowe>xklu5%nssVHrL(q^iUY^gwYyax#ncK#Q2agA|;Ti=-ek zci+!?JDF5s)A_ZnR?a>*7VYNYAp9iuZDM9a05VAW)ljHk8Yb0{MIE$DWDzA$(Hlh^ z&fR*q%wTq4@o31TkoolyHPLZ$wvTj@kgY43f`9R)LU@PZo{;wbAS5-f;?c0=r0PqE z5R@Gvn1Ji3|0I6|bcq`M3_E6yZ?|@KG%|^3chs(Q|Mn4XUh@;|xrnBY#0_JfI_h4? z&QV63kBGs4xsh33NSM)Zpng$V3tS3!i7_=fjbMM=dJ~e?0y$n1W$at1P zIq~1d)W|j?m?BAw5GW9&!auY52W0Q#)XUmAe-*UX5}op)k|262Z=3r9X2p7eA1`2E ziQoMM4446RV zZIN;rD$2h~7J9Ff=W+>#k*XxCwZprpfDqciJ~=bW23wg`;>{{;3{*5!4GQEKk+-P@ z%HbaQ;Q}(0Tyjh7d<~hzAjkE%zSno5lR_dVj9|ytU|lA|_=(@G%3=6=A8b{vdL!qJL4mm1e(J`<^$AAop zhu2c=(!#v&_F>+>1wUd_hi4Df4hc{}iO6vaCr15-C5DKpllY5i{i6TXDGV+deaBo@ zP2S=#>NpQ9N6F`qDNrSFhqr|v*%GrU1I<6xu*Y)C)YCNS6~svx zF*_eT%eS&jVxav3|QX3s)9ynqO>9U$Q(Nk>t`aRAj(W7XFI)2PSAOw z>hKppvm=eEK4@FHLreOZW0!f*;KL& zdKr<{)!+)_-onPKT4%3;+?qlG%@hJ7(b2#N(J{dMW369>%=5(HLWyeUl2U`$&QR4W zqOf&KW5I+B+R_H`3zka(bdr^L4PEEYdch-I0cP9W3xay6HG-HFmXqo+ykD&sMZh2Y zv{WGwdk931I$#!e(6J3GctOp}82z%%-8(8#oB)kP5PgrQS!L|Kk6E|p`RG3C5|MEq zoG|ai7rBA^iyG(h!Ee_)Q`D@xmVIfnlwKc$e36FiC7vK0j;6I$xr2F!V^Iz7hxVknpNj6)RlO!xWRME9DHG@(6f4G~!ZM>3X`zD=)U zJX~IA9Sb~FWUQT?Wt?TAIWzQSm3aFyafGV}vJ~86ZuLq%G0%thp`=+V3LL!2gAbKv zpvtR#&zuCn$aGUBh}KDI0Ud3{MHJ6&YQ)uy5BWY_;k|0sW!Hu>8Dk0<n@ zs5lqGx*59MZ}Su3PE&fW5<-TLzaG~j#vkOC5!A*pkinj1RY|zb*pv7>?>qj{++s@K(vbj39et_(cpJwfx9!yL&Gl znk`$GX)f+aw|4x^u-?MSq_c~2Zs>@!eUwEAvhTJiBot0!&ZydzFXe=_PXaNRXhnnd z;-39#RpMnP^ZysXVje`EBs<1_K`SPUve_e6a~K_d3?c{&S_Xs)3P12P2pf$y)bq>v zhXp%%PmTdOadNAIgLM6peVBvV0K$v2ZenejxoU@_O?`RENWcv%ceGatBWkwTXv?b5 zmwi>|ek8O@(dq)-3uT8%MKw7nN>#N!?(rUq@YQElfyfrBVgP@m z%IbU8TQvE5vD25hl(D)9(LQ;cZ#8KSw0we)$)@*5^6=e~e+!yvm1&0z)REr&NYdY) zP`(ZBR4dQr*bzj+hau0`h$gmsx7w^+K9B3{4T-qVyOYAiUmkG;AN%{<%JvyHF7_Gk zgC@k-=f#wa9cH)rf+zT&uYSn}{k>2@V_M1$Ys@mHlOp!o^>bCop)b~c^O+6-O=Xj3 zJ`}C7?P*Y0gb3qi<59D;av6zu->nBkxFqJQ&&xiN&-j70g81)F56f}*8y=rEh936Y zks*Qv*>A00l&#huSJ$=E*S-oG8lZ_Ab!LtBntCGU)XFAU@E4e6qg2|1qwaK&{*$yg zEuL!Jpks9Xyy2Bz(0Xe7dBOGY*;!;0=2ey%a9e$Y z5~bxuD0*RV2M7O+V}+U4b+)VMDnf6OU^H6m5)yr7CeFefx7Ht;A-Ju8fj8CyDJQ?eVz>y%1A!9!r* zmn0^1QOn7HEIv8u#+eG8R&cw#j3`ymn8fhbs1H38X~s|N)sxg~#(@SO=PK-;$%4pS z^J};bd1wK~k`twR*_)P+2I|IJp zp{Q@>Y=c@*QEy=CQnUtN3*kFyGU_Rp_FSC>+B`c^!%DTnCRKDtoR$?7u=L(K)l>tD z$f@*GZ7MV80DW1!yUZnf5p0W(q|Z!9y!0nP%ta)Spq$vB1zvs-6*(qUrqK@(vsA^F z^3qF9`5iU0W+?Ma!yI5)M_b2W-+gpJs2ZtNBSC3>mF?Y#bUQYeFY~H?k;nBjyH)7i zeMe1$j?xYZC-O@DKmk6$MwVIjk5)X0=^Q4Pb&>aikq!n8XBkr;k;Yt-9wE6Dcy&;gk$? znH|Z&9Frlo@hn1=uCascObvO?ohNu0cBbW5d<5U8hzh)AP1DnxQr> zHbwH!q#TQSfi5@r=KAUb406IA5d0+?&xku2PKs&BJ*5XS=-R`p=@+ajC~#9y<*tT% zxn%8|C;$^XB(J2du1mV&7j2 zRvV_}v*8p9!xWvmg(9O<8j`Lo8il{cv;^1jZO^Ny#M-*!4(l8A#prVIqtc~+G-U=f z`T4*Nij6voqhC?3B9B)M6-H|Lm`TXa`-%3-^2bHdb`Ad>LUJ9;`}gJAFB=m^$A)AS z5M(RvMGEC9JU6q}^YpZs<-}wbgQB`DA?;$R>MYkc)=n@dfSbrH&pm8E6QYAB(*ylz zPWxUv&TTJDPeM2xI@Fxy<>mcMvd;MRoWTwxZ+>+(I&?T`0h-qGKOF|EZZ!LNEPY&M z=6Fr%asCdIY)Kng<)J;h_qnCn`mi_j#1zl25mY?kkK3_Tu!@L7D3iM>G6ok%JRCfX zD7beP*`7J(Jo`3u9B&BTP~_ZU68ik+bhvSznupxpVc(bg$g&&EOFOX0zv+Zx97;pt zTECx(@4n%XO$fMHty6e6i|}E2b2sm6-V!%$4Y;~h)yHZ0xRcerrH!OsCf<4bAlqzv zvivuXMbpGRXM5N`?O66^Xv_BuFIsGG%m?mJu0(*%gB?>!%byC^D7aT#mxZV7r3oaGAXud=+%fRWRU7Tt8=VHRov$eNELf(*yQ~HqkOn*q<>>mcvj&n#{!m zLiCZ|Aoc2R^C`!K6zuyI?av190d0k=Du}sMyGh62hNnLdb3!`3d*Eeke1(4IGt68i zV@k%T5pfVVJpgazEkb|R!;YW;JPy^~!*)n?in{-bMzx=7(729r~`}Hs>({UP#@Rh8BUbGYi&yJB+d{Ql%*k5({>I zvOANV4bHNi4rj)geMw5iX=3r~%)4cQ2P3$$mY(;G64wnC0q@+3aF4CBu#m*wih=WSTsQ{N5iMuNMIH1|29#UQsuTpLj8(PTzu-04Q0>;}Hi#CTs%eabZ_RBuedSrvFtA?5SM2pjCDSjY zG%8q~A<=kB>{{6IMeW+Af#eui;PUlZ*B8nYCWw)al2q62QyX${6n|wdqH%ey7ooOW zLpj1xClV++sh79>%LtT57?xBVfS5A)naK(Z3v&P{hX2B5+$>j)4mHY3%gXv(D9Ks7 z?KUpK6}#I2o)Mss2wmUn&gsk(H)7A6r2b?XniG6x+g0|hR5_*`>Oaa9%rMxh-cqqv z2~1lRlN!j!90%Lds(;}18`SxEySIbUSsw`6Jy3q9Tt76wd|Q)7bQIbx9-WdblT{Lq zMo-u!So;4`73{eO@xW&LsraM6-8ADHyn&Tt08tg5w7=*-kzg0F$m@S;ZH62kx2*}S ze&u8F16B`Vpl7bdy8yfbN211;(|HEWWqIgLNfIN3XyyJ?O3VJ6IDcBZ+6cwu&-=byirUYO#*N4zA9 zB8Zz0K8wb)G*HV?U?P@a<@Wt#? z1B;+a(<*4srwTjITmy&%Pu{F7SS1!65~Cc?cfL_jp?+R zndpO$2{1^*E9vB}y$_^NC}B>_bUz5I0<1wBpZmpDpDg0;>Luf|PYn0ru;Sp)Yz@&rwV6qa4Y{pm-P!6NvGlH+6}cXR(cO`QJx8SHM^)2#?#^Gu z8c)dzHG-b(qofoxT5k~?aq}B&(_GEc!*;eS-Y?Z(s>gONxoyqT5*x#3b~w%W?-h66 z)6~_t-~LPf4Qigia2kaxLmIybtx{Rl?AKm5WH$<}==gcWG_^R@j z*`{!M(WL~yao;)|`~Dy{ zuqA0H`31e-CTk(l%kL9pb5@N(LuG|4l5&^UJ4GEv9A;*OBST?Dae#6s$Q#)qkqTFs z92;u#re2!F3pE`(L10ad_mR_t)xK9*y*3aNpd_WEuURC@XAAQb$!AL_Sjksj`e|OV z$vfU7Gu(y#`x(!bJ;T$6yB-ddC19low3o%jpTT9C(M<*(E9fMnQicS{h1nZbK2zaMvq_f z+G~^M-%w|OO4?>7;hcA;`ha-Ep~Kv^(f6>!$JK%A3VQA1vWN|^Rdm@uX7JJ60bAsK ziX)Wt5b=Ad?zv0B^zZd~Hk&H2&JsOr^n&jM-?`K4wvcKKF!-5U_{zNYF*!Vgg|OFK z{5(pT2qyI7J*NXz(YNM?MTqULbl`e>zsBvsUvgc7rwnP*_RGZmNK4@HBR>3b>wi@B zH|u&kNM{xLEw1bH5Sb zx!YPb+sVY$?SB2Z$!%-mp1ndJ9^sWVKAy24*NYmF-vJzaksrRe;Rn|$uM0TZCHNue zu=npB7B-ourXi~bd(ybg=G zqEF!7!nZD~edv-j9a?&Ev-kGIU)xk~!KBzuvF?w$jJQ5|rnCIr>2dgobyeWt$@K`o z)9W&m&{WF%gOaKtiFi#f;53PV^`&1On$k2`m7E!|DO;UsPVakO&fL1w@mBdoY_?LX z*X)O?gP$Z4!C>Kj<0UPHtIIL=KEr9Ux~^;rIV z;T(|A#fw#>poACXgrmZcqG_|zsU+z4&DZ}6vF0H>{XFys>pdU4TlPv%pzt7Ac%u~C zBd-hV^=aPxl5UNK_Nrm`-9dsw+s`D6T(l=+sTJI+%i}4ons_6-hh7d6w)q_p?i~<6 z7eA^8N2H3nOt&%OQwB0;Hoi?hi`rQhrN7L9;Pa-|jyW&iH5uNJW^c7W9wM??Z@V}V zk2$6ZeW!aPKmrKUGkn*;K8Cv8_m;(T1aUtn0uc3n)Ot(l4vX!FbqtksId+e8Jbp?N5R+{P}ER`gC-gMZe-+OIl2=80}7g66Bo>$kj z9Vd>~<~niC!$&izSzsRq(ZR-|)Q3$vL{G}S64ncs418g=cn8BFe6E|Ru)7B~9F;L1<}{{tN^aQ7WNclS9BrF8Z$`1L3NHX>h3ET-=9+0Q zGPfDEaOYF3T@Wb_`E-rgHtr+J+;Il&lO>Z@{D3~i*0VjQCxq$Hh~y*@s)P%hjjOYn zoa>OSp$+rAog8HnkqDRhn!F6LrQ8=kIkn_27q6>=DHk&DM(0luhvY zK_;>A2aX4HYJd91p&(o-F)8G5~vR1=QMQ5Q;mzmrTa0U?YSTEA+x6r8KDo&zYaByxU8Au~f8*;z8{OLy zL(-f5@Glky+so3ns<$rSzE&2?jb{W<-LEMyyqy$3Hq&K+Vjj5CzXpb%(e&bEgdv%|x_U!=b2AGNKO|D*7Bcw5)zaXNbE@gb%wcgI~<9Q!Hc^`vR zzn)KnGiOhq${PwTlC#eazuQJ;Jg0WZpDgTY{scRMOD`vnGVHBgU^c5iV%b|U4shJu z5cOmN03`Ed%2ipNlp>Q^hI0>zp+l9qW(m28&&Sp;Hmsf^Z6DA3xb#7KdIHkMi8Kft zC-pAGz9lZx6^x%j2IxOY5t)s|CQ6f4nrtNYppef@w=J2z{|qob{WUi(0kKVhvNty>@vG_>4tvgg zq1OJejyKyYrc8U~{J0CQ#dgd3@S(jKQc8TI#c^@$ST-|Zrg16x&2f7Y68=(Vn1k&& zmj|d&Jf2K;@^ca664ys>IA8>pqz#^n^>w;^`}G5-`Q$ajF$?G6y4U+Cbe-jV55EU3 zBta27V-mC}SJA_02z(u%?c!@!VC7amHT-_wA~xCPgwzGMj`rzmcVDEA?$MBS!_(uY zU={ObYq#urWspB;Hn99&X(5ozu`bvrj+}6C!`g=_A4IBnGI-DD4>k(N5n)5|mu_lE z8u$0Lm@a+Udz~Y+&R)0ew$!O_QY4VdPG9?5c^?J^&qxMQ?IifutG*;b{&G?^tk^tG z$a1leH9U@K`H2-|NBltBg{L)=PMdtQuq@s+tcbl?H|X=twA_1KxqV=-lnc ztq($!Br$M>-JtWO(kqtz~+rrX3(xZRt>F3+>Em?4*z8#pRPo5D|o z%wlT)g}nn|x@qaCPP3O%-2U&gJQ@C(ZByiV9mpdGid-7fHOK~EIp0`91J{Qt&|wc3 z31)l7U`txP?y=f3mKs|3LP@$Gc8=&43v+HE6)ol^=I|+%-VsCXe|_h}JC-tQeP(tr z$gfrJvOKMKr(P8fB44?5o4_KK%~T?Oe)4<0c(sfmyZ7-~ha1<(GH5NzjMgj+_B^#J z`N3g2kFDe^J@0) zBgf$bwcO2cY|C<1!8n?0dq4ORG(i4v!RIFPVEo9#9*yUGrn7%xLuT?OTV@ahaeoHd zme6J!`#qlrVSM%X#=TiASf&g8MG|%i(FwG2TI+#+Yp5DeLF@yD2vr}rGRhOoODU~W z_t)x&0~LA%GVcau!>VZ^fhOHBWBdN*`d)Ac2Cu?gH8MEJEqDR418{x@X7(?1ajgpB zpLdf|C5Lh>J)W_3nwShYr_t)a7}z*yyXehTg1#lHR6_5nL?~11GP&$(KyVW>HJY-a zMQ2AU@(#c$dX3&J+PvK5cL2sK>zq$L1~ODeIp}t0RU3OQ8hJep3U+9tysB4p%oKCS zh)1;#ETx-0Sa7Kc_{htOy(`OC8H!V_3`w6S_#&8_$=sH6nP$yLRp<{zF&@g^>Rmp3 z3-RG_6$n6T+N^dy#n`-DcKiT8>{~iU;8XK?IsTRDG$a1Femk{IOUra>WHLXA&3Xti zH#69?x1sU_7b3$%Zw|`rDN5dy2J`7TPj@vKPn{i3*9CGj@P;5G(tMIbyn99rsjwtg z5ivGs!isS3hM37w9Yp9jLzLTG*ec+|ng%xb;f8xc%WZs6m{)(UIiOieIiq2h)_@H% z8A-K$6wInAfE9(Ams&Ap^9z)`F=*Lh$<&4H&}8!*KR7sOe2sM4JxbxJPT`kI32N07 zY7!7CFh4VP`M;?`2ve4Y!tn1Ux;2trJC8;M9+7pW-2x}#M0S|^F34tY$6-XuVSDS+ z-v~7c7C>;8IJ*2urm&vK5R1L>9m^y4m zLTr8Jw+n7(6;1^Z*3V&VdOwUk>~3BIcJyXT3GwHRetqqf5`InETruxy&_vgk>Wi*` zDGKI024;Lxb9psh;^4h=m)Ts$S`n;H!)pjL8PN|Xpq5var46T2e=ldW7 z3-%I5l-@wk5w^VYl$yEs>hxmtQD&EBmEb`YeQ$$Z8y}r{?j;vGbS_3qLX%6zix`_= zjsjA#8xwpDr4XeGFC2}W)B*gV_ANV3Q2ICT#g}Ot($y@QgM5{F{F@oXm(Xfn!M-Ye zp-BYMgFuOsa7iUG_S@M@J2-~dy6exP_L@T&tpw1lEq**MpqM+9k9=p1uMd#2Kf1*z06`evD)1gu9~(#79uFpc$mnT|R()F&yCgCak%1ufx3Md|OoJ{0OGaHr2>%&zn2r5vykvTBm!0M86kG z(;r+2Lb*nu%(u4F-oYt#xmckZiYyZ83$|4Ef@z~6~N>3}lc<{MOYX0%c( zZLX60szqz5c|TD49+>i|p3_P@ZsYVl6r;8K6MkTPb%8HZ)pdXxTVx|BtXHbrNx;&c z!ZFocO?`!eE)-?;sxXW$BP%_BVWL`gWB-xzgEZlYjdq%rDhSMP#a|#&S9xz1kdG@$ zy2-?&J_DOT0En2U&@CtfOZvT*QyT4CdG#bG z6GN0PP2R8P4m4(Y#Up-6QSDP(c~v}@Dc0;yb2wB}<%lfPbGI3;%lW^WRx*>unRL>= zd>MWaFl{8Jndcgg@57=mF}EKS-X zzlPcXL3J*thgHb{9m95e|7r(AzjleD$~**KXJ<%q>Hyq%QV6b`KaOf|5br+!v@Slb zUQ0G^VG3CypXbSP{i-MdFc>61GybaIheVn71*`6p5Eazw8ZiPm-`ZyDDg!=iSv)&r zHs;-xRH&=8;k*>g&3P#rR<_UKC~X?)bBB~Uw8A$0zbJ={zv->&|B5R9Iu!{lAMH|K zD!9&3n?C4QA|reoD-%r3(`i3$!Q(5CAeBBsc)qg}4yb24$c!vxu%Z;6~U6p&e$1{alx__sNwXaDTO&FB8i#lZ89j5E*8P5 z?9UZREYqmu)aVFeK1c8S-JznOz+-X&%J_n}C3JT1c4abvZB^3Iqh%HyB)>z}3Z{s~f&c2RFJijoCvY{4t#m9cEaf}Ip!14F3s zIM`Z9_B{%1tUv41dhk7%7AN|gXTd*;(}3vRCZLgST+9HPaD^ZuXaZ#=$sUoUC+> zUgA!2LOp9E9|}`NpA1Dwp7I9yQ*?w-QElD$OjZ@06=!+{6M~O;%553e$eKg|)gSN3 z%=v})j;NQ;pfpB2nXvHlWWcxm@rAk}CS4rga}Aafd~xTBj2Z{;W9z_R;A3aUw<^>O zvwKjMCICiV0BMaO@D4=2o&(1KXy3QTdcCjx2PDow{Q%VEq!BII06zQ|e_sMQV5sk} zCBl3d=`r~~Yp8Y8cyd;)7z0vwXfWd|(CWBIPK6pFmR6B5P&6GXPUELg%7{{zZZF7R zkEbtLu$NWE=K`X-hZ+skVj$1x$NQ!FuCl!h5_`j~wqE;1Xb_KO+-becZ;@IH>@7O3}gg z_x|l4Q8eSrGCEu#wy3d-v{0-NA%ESb2+reE04*qhCiQ`D}D1?=W)TP%#(Z&Ejvn_{NI=hu_s2a%bK~$=xYTvz)zrqa6n9-LF z`KrMmhYhjU%&O31Pe>Q_bgG=jwui-^i_|{%=F+MwEBKH~a@>i)1j*NN#&apwa?RM% zo_P5##u`ELvc_cG?^)+m8eD)KFj}sFHQm!Hf|K?CC`in;re2mVUq_=Nha2r(#ACgQ zocs3k8Vz#O;ZDn`Gx!c7_e9=e^}<165t@ZgQ&-uY3mU{(&)nz`6g z5)W+#!L@mmS zJKnlv=x5ez5$jm*bv&)IfrN>{K<8PjQ8FD@JRzv{X&p3$x8Nkk(`w+ z&t3CV1qKA*P5=Gbo+ziBqt<_ku@sIdu~&C_L1C1-<~25w@8oxX4JS)^YJQdp>Mw{m zX+%UYFkpaX73)LEJ(7!Hs)0@)vWLG5F1c0z+zB&?9ExDLx&FdI2aikdkICagWOwJb zb@b&k7Ud&520R+~_ABSfP(p9_buS>J5zx1`rx7eKsjD2gP~aMC1U5t>?g8avt_K~TqHNgQM;Onv0#!A1w7AP^__*}iI+6o7+9 zXpp|u_D1kA9`l)5jIocsGH0mvh_o|ywP}&4bp=NMga`E3u|Z@U*+Lu3vqKv(^LJE< zlnT@uuFDJ?5j|7v8TG6o13EOJYM|iMHRAkCTew2zl2DGh#yWKYRe^Bpuk=rxI+9gd+dh3BWh`g@5yfMA%)TShpOVFe1`m5}(ftAyo={^aMYE zFl_oAlG$u0<)}9rHrR78B!m`4VGpgd%-F$;w$f9I>0xqgWBCJtPsvs5B4rwT|zNs{6Z*$emui z9dmE7dGyxoV5bq9GsHyspbvOTKy0u%3^XGrg;(IZnYof*11rsvTZSe5*rWrkt^M>sXuE<2GW)9$80Gyayx&uOui$R(FbUS=7{!BT#xJknp>vP$ga5u2J#vxTzIR(Xkn+kZ` z9jaIv)0%FdNl&XtO8C&?&~7j3cP@`Ep>IBd&)$rI%8|llnvJA$vBmMKte{a5k zs?J`vIY_Zz|TG!;sn3SFs@5sBOOs z?ge8~aSOqdCl%tnOMd zk}U9bK2Fv~1`V`rLTe2jgpiazRRo)y}ojt0UE% z=fZEprtD(yd0`FLlg?pbYZyqCoiIBi>7Hx1)vni6ci9I3>7v7B^stP;?z!dy=}*mC z01N{(vWqC^ZN4wf1}P-pRZX;uy?6j^B}c?!<#Y^EQ08Vk)F>Uy*e;0?QLtpAn8u+mk9wo!_#hf409T}4GOVT z@2~_oa1R<~qU-mJX0P}qe<+8#HkLSbokC9KeLpDoWvq3rWcqwfj@wz=rV{xiAqE%w zLdj*Gus{!UZ`8KtSep;yd%@pt^n*IuRuyZh7wlkj8Fl3jfVR?4tfC^sX5&Jv^5>Px zSjks}^n6{~w``4=_N;Jon{C7k9_ZyRk`-z-TD*BMKRROL&RE0>XiWbwp*cXGVhIw6 zTryl~_U4j}F;{buflQj*Z1!hZY$$^t#RC_dNnyOCT4bksy}$(J1u8n};WQan{$Psm z|AQ_JAY_+mmRbqxNnZZ;;)r6A!Dv-BD~+fgQp42^{^R7lDD zun}BfoqhQVU-{jG^(0O$G#Um$Y_?i%7hnzHM_VWu`t0yP2{JmI99$Lz1YwwY`R{P` zM7NwZ@`@(IW&?L}OpU!!ba?B7#+=U0{#@z#(a#F#{88``$E;Obl9cmb{xhAeXdoK( zNKHsLeV7i3=wTgM2joH2=;16SyjcYv6Dis2qF)AMTPX+Qb2T!pi;>RE?YMPJakWg0 z3%hFMC7rZv#p(Sug#9#; z5OEBx3U`O46*wD%my`w+(~7cYU=4Ai#}!uui{&3h#Bo-z|_(jg8fKx&;`-Azi^e~ zLim#bjv61nCaC938D6tK)SW68I(*HlKa=-ByRAp-!8c&sLKWC*quNGG6>kmsHL7m; z!9_WQUUDp${?#P>`yc&-`B}vH9?o_E*CElKV7q>hUZ#?hslJ-DumO2gO|!We?x!v5 znJ4~>Hp-&iCUA>Kg#&h-Rc$`4rMiUEvj4<^AQoWJiXbya&?TFVw75E_kw*FBL#>2c z6{M$@r{d#6z4PbrXkGwh0FZ!bC^Z?tSkL&%=|wqg@_(pjjU<3wDa?0l;hFi}{-1c* zVZN%7TiEW}h4O#Q5(;D<#IOGlPBp?LEbiYg{sPVd0%pxzTBOtR|HKI<}Q34S7*Z=p4sMya7mprZ@W=K@W>6AZ94Nn&sHwrT=nj+-onY=h!XY?wq`FSdOpYvh0b?!V83s-c@HS$$_(z!(w;%Bl~S}gaR zGspbeN0kD+VrOeB6`r$8Jw@}_(bp3LS=Zt0cf=k7Wf?y(FshqrSw4E+{Xl}rfdhVpiX-l$7BuM*h5O#4P!_$3krL508vnixMT9 z&~MnKYn{fKjTO^(^HIPNb8h-4a~L@|scPJ|~$wEyr-2Fe#LvWQ`&k3j>5)^ORc zIU}d&T3_F*e_uKEH`+fZgojEgknA)E#cJUy)?Rli5bwp)8+#Prg&(_^1$A72+QQLy~N;BFl`PM^U z@5Z2%)mW`%VrvV1bjZ+ABT83 zI@Mmh{GVD$d3{FUrwib(n3T_|T{m-Os+G=RcK_ZxL%j98S-H!?1oPcpgIx;SQ+4CE z?o-91g$Nk2`(mR|5;OuMnf*05AMVH5`0%xkeb7_czRDlW%Aq3Ox_<>_P##7=dI<$> zZg)~vX=*)!m@wT8KzQ+aUEO+nMw{$;lDNN}lw+j;vhZb^2WOvF{7-nlm0({CbC?@o5pd2zYGedRpk>5l5MA@Cw9Nu-CrW4Bxy zei++bZXhFE-oWCYb!MiBx}H4@DJ9?owivD?tQe<*kZySjwG(pUypI! z@GFta$`{?0?`z%(FPP3BmGEn}NRaxso(+_nN&stlqbtJ-yZC5_WpA9jB6t}GQg_x? z+hz2qg0xc2HamP)Gg zp!eXGcr_s{s2pOCqp2m_wJx8TQF`*p4D}6MScz|Fa!5+1cb8u~;Bwd~5TrxPO5()- zS>F%DD-XZmc;84~af^VEo04CH;salL;>iYbS~D^V*f*uJIBNXKFNK`tD1X+Flasdw zPl4(0V7uB%1pLS6xd?OAFpDvdQd&ceLkgD`C;7cRVBs%TSk1SEFkzL$-m3%#bAXEV zyFun+L0Q1kP};`h{ztcP5ecwGEHSlarTTUfqJisdX9_6l;`9)c*y#~?`jiV+(dGnv z+;s3M&`b2EaLtrB*R+Wg{)$Zi0kW4+B(P8ooDMG;>JNk+9s8;nfX7Ahd8(^y$Awr7 z7VhVPln(K}W`HtULH`G2gNOyl7$V2>LIumWDLz&UCG(ehrjXKa#+cF8;BY_TK*MuA zVm%{r&1YnB`Lp8wS~!!Suc&ArOd^tlWFd6vW5Yv$_AJ14xJIU5 zy=92*&}d243a1jm&ia-94n0EFg3)rI_76jdKD98~OwKu1`2NSKsr-FS-`Rt{_lgi; z@)QapTb(mJUZRwSIw%W85sNYf!`-%4%>OVrQ}fyER2CYJql&FJ5PmU?2}*{aD{=hM z12RM>OIjf`@+VUufch@j4I^R)L~O+k8{$Ubwu~h9KE$uZ*?bk_Q+|O9&;*&lx85oa z7S8=)@_m_q6p+FetbH$v%o5WL(_BqN3UHZh?K_N2BLnjdwy#94rdMEupF_4>YW*1g{AfBIm-}&;$$Cr{HkTnb zUL|gw-1xUJ&;qqJqKg53uEflm0Zp#3e|um4u=A( zQ)KghKI{T!x504EZuN>92<5l;`9_ZWCB;Vb?R9gJCy&q!3>V>?+z3mj=xFVy*i<$%$~0-a9?Y&e6wA^Ps- zRaQ=+s>^MLqBEUd+l#BZj*AU;*4Vy4a&zskIvON@tOrfdmovphO~U^hfnlzGJ4=>y zdT-UwDz8@o7Z~Ujo*P*!>>FD`=$4DksT?OLi8|_s;T$4c6*ZQVpX>iPpk4 zg%&O$FH7|&`sN%EZaqJ7e;rrq74M@xbsyZwWWU|+nrn9cNwUygXRqD}VoA#jBtZ?f{uEHxVObk#)F)|d3jat|Hu(Yi8Jd0MkD*Ktv z!*LcbKVB7bxJolJEsoJ0f7`yV4Y_F5a^3bSQ5HiaHx296n*CzGx=-0T%h~(gY-HOd zJn)3;!*Wo}_qDscEjfD;6N$3Hd+Il#Wc#3jZy_Fy)-XsX?}z*yhZ%~4tYIAgy%`DW zhwIioZnKcW_GQIEaxKkqDmf&EUujM+E z%T^>pg1Ad7F2X2unrw(#NUQ$X*#*=Yw^Oesc|0ek!(6Yd88-nC$M-JbcCjwLuE~(> z>T(vjnl;5r!vM=Akfhkk+S7+&!6sl!hwMLYfQaH30Ew^@4c@>cuxhviiq-C|+YQ;s z;I&f};+?zgW*5)%&-81MigmlZD+=_iSn7G%1jPE9XR93~XNy9F`mVQB_HWNpymJqG zk83}a6T9T{atP$=ko0t&&SC8vGaqmUwc-7u%Ri3Mk_qeQLmw{?@MqpnwW9ydIVt z7O)Q*huSgpjzbw~PCb(?{E(H5^n-J1bRkxKt2Z!eb6eR@BiD!`MNgCKIirSXxvEB=w(Y(O zEGQWxs2}1QxBz52tAU$%gPgiWQM_VJ$Q z=duPHEkW5w-u*ne*V{Ud{XZG$E3Ho}g4j-9oOk$ay)K zi@>C38SHJZl_bF|S8hcg#~(Z#%>lq4eh~^`Wy)LQP?l3yI?6Rcx<$n&gD=hv-1x8zk(fU*R}s@QwRn;o2`yRn8JTVqLd$`F_&&ZUuzs1 zo3uJuoQeO?rSfU=<@ELOV0ZZ)J4U<3!D@Ff>UDf0jMAyRcPTO9OWd3|7fxI_QO5JR zkW&v+T}SS@J!W4pJ0}*A977GmTZCzLUnPD{G8~m`!4v zhbIGsijH6CT9Y#P2N|QmRS`yHWvh626HDi1oeJ62WKIT;Yio2?(8(;#69^A)H_4=l zkGCUfy=tDlSMY`Y}OlMA(KvR?V`I; zF)?GKSyj+$q6&h)6WAmMOGkD25QG!7eH%eR7%zbugJT1?ecl!r9@pux9(taJ?x9NG z3SlO^+!~i1S55Ewta?QxVoK781IG6jj{B0NPWy)Bg06d>Y~De z2wGZJO(Z%VDwri!`QbbW5YoSuN_D&d>J>k1KEXuID8I5n_eAe+gG%T_2Sj$Kv2G_1 zyhiAfxKxld0qk>*1MI9Fha3_V;^!@ZD@iylp~BK#aOv;6z~?vW&Up7)pd+zBOnT;! zf32GE={yajTx?S5_1s{|J-vM{1Fi79&+oGHw(O$J=j!}eNcN+5wLV{|Qau$oWy6a) zw6*X#SJbtL5(ur??vY$kY~JgE8(h#nX!+jYGK^py14(^?3PJYZ5f^WlfR5Ym^Ldxr zXtd-{vEE3xCf-Y2C|b<$IAiD24fR`aiAgIlO7{6mr!<4x$iRD>&85##;VB<9BNgZi7G%3rN*jR*XyC)-@6DLEbTBQrbE^;FIpb+8w`wv_3NlVQjFVl7 zP2s0DYPF}S09juCD586HA?0N+ggu}W#bn6jH6e7m-pL?!4qRvW*5q`Yi@k0ugLueN zGLiZ*$aEN4FsgZe>evI$7rjWU;rL;C#d>u&Yfp6Ub3JgCF~xYsd0x*!3OGmxP{1-2 z$w-gypf50}M9}cc+knWB;%eaV(K7kr?yxKEn?|M@w=I($t%;>0BM;7HS`8-5^fj!J zKF{raZ;&Np-_*b}N~?D}Xn5RD_moim^Zqcmr~BTFXif@_H-es|{$-bpk^+#Wo-2AJ zOH3sTc87;Ph)H$-3!RM40tjpVE;`V-jm9arx75S_AZ;y`v7np%v*ZX-t zaJ?<~`g)HKk8{mxY~ABic!V5|*VLr>=%d1sd!>%o2hX!u^YP5|$D6&3EzS2Kk*+MK zqI+lS8+EhnVZ6h*sfY`o+bnDLveFw*M`0tEwyz`$sAir#C`mloXLKMBto~U!LuSg8 zoZ%kEX4+0!x0owHGO z3jxA+FDGXG_1nv0Z%?9&a)E(h&I>WnTU;^g8l{lf7<>hG%QSYhDWjx@SXwhj^qQS& z@w1q|Pw6Mz?u`FDH@>~K>WE>?e8Gc1<=IL`!4vKZ>lbMA2ms6^(1O@M#H1zKgd>iq zl!eElo33^UbnSgf-tzAjW`1nJ?jPoMCF6g!8uuOJ2fz%F`R)icFRkW6B%1{Fe~4X+ zC^m;(iS1&wYz7R#4HvDpxFL~UAlfhbP^h2BvQxs?@KP&vlVlZY^6S7bG}_o1?DXwu zQ+oxgwpAAuDDMDvpW}c8M1Bg;l(x#PPiZEujpvx80E-kXY&NnM;_neESe%~&%QIg+ z$6l9B=P_80km04$_DX$b@La{J?Cv{i^I8bx&=Ad3_}4jH@`fTV0j)*s@==YaFV>J? zh#|#2x7SVNW}=W8#dAcX@t%wQSO}ZiXmt9CGlb`rZE@?E>~g*b@ky{!-$ zQu6t8Qu(LJ@-I*5XjGLp^u(}U>Drl>>~#mdM@0j*KAcBX!zPB7g7g4Z9-AHhudQWL zEXDdldU41M_5~uDnA{7OY;7gb{y^F*TQV^POV?P;-OW}077-GE^HDLdZe%t)MoBH% zw8$0F}@9lfVkXA^U~6!UStFZN|7lpdmq($KZQ{w}F|$&0rKm77UjG^|UCQ@~^k|%Nz&_ z6mVlRD3)IuIuP<2e?Ivn28g2&uky$(>8<#qf-V4EfZf80ESM{Yn9cD>ZmSoX%#cj4 zn9F&8H~v`<~)PmMxO1czg^){s7!cFU{jMz#V(K!hD^3Rzz#vsU^>L%8$TeWADj1Q}ZQt@* zg&eCiLIr>;0}ML~ur3-9+%B19cb{0F>l(A^N#Ko;!D4ymx=xEpUwG{KNLlbmT>9Mz z_3@VpoCi>>Y-g1m^I1TpSYYgnIeY;OjHmnKrR>WYbLf{uUhm5eKYU(fDx%bXIsC{M z;K|1K0fBDd6_;jnm6_jb*Rp(R7!6E&GuK~>Y5J1hSSn=KTIaQ}A)tJ*6-_2(HX5jH zIB>DvrPHy;=aJ+5T+aQSPt$(s@0(Upx?FA)yuV7S1XXEsV@4%X>?fDgQIh^EC?SAk zS-*z=3_j+cx}t5_J>+L&M2CxEFo_q|yr>UH`@u+uR21`TdOwx?IZ;(1+iSu3{`jVx zE!b+Qx%w!^=T2D1vjEvSzVwge#p6&@V&O!woB0KO(u4jeG z(Xy!uYvkVaf}BLafO>OIoShwK9!=h#XDKK_bTG3E(c=#WxD9OO&ot0dD&QP$Zyj-1 z%%)t?r(_8OxDo6uwNPC9VQ>Y{EcLrK+vaA$F~XC!zY^P(Vg+=5b&0 zG};j^<>-YaiK0y#*FHx;uetwn%caKmDf!d&^y5I9!r@AhG$XB#Tc}i5#K`a*H@4`W z_xF>mdOH4m`l; zoM8Y&6*Q3MaP%ru@m0J*%7=jK_1`qk@SgaM-|GxNX21{mcvf){)&X4lkWQ_%LeF5k z5C)buP-=sg+eJUGLn)N*yp}sx--_91HA+h`L-#(QN;bRq_2Qf9J#h@Gu9x#z$zWI` z6qvsnVswJfrk9*{9x_SSpOS*VKp{c*0>i~=H#aTiDMv8fp~W|LZ*-o=`k&HP(pW|t zgM`JCEMpw2nEITZ)Zn!Ta918TI zAcwcVV+nZVIpcKy^ZGvl>*|cl7bVFJu0kYrLvyg7SzkORq0tEeYo>f{G+b*LR65$2 z_X>*{)1y|=+oqBcj>g>6;Gn3+g8@3?@$b2V?&{CWZ>ErI^Mu z-9I4I7q&zG{11u1{1ga)y!tT5hI@As=)hAHl>Tn50HPQyaCPu9a=g3~_&d(Jky0-D?qA|c3 zezou88txN`*1USs&7Zw$=<29#pGSWFSDl&%_XCXFTu%(fpi#Sef84}CM^{M>PN>K- zH#eu%sK;cpQgf=wvW3ss!WHO)V~VqBKEL?&VP7?6x2yvj`?nnnC(@l5Y&xEmnHn1# zA3xh{zl**0Kq1X-x7EEf5D|mN&*#t|O0mqd`Jo22Tjy45_wIBV)fAKcXqGi)ciwJZ zF#kuG1R!8l>?|Jl8^8j3@BJv`2{o!9!}G0T9v)of8m!JIb6-%%zMF?GMrcxR|5~wa zwsKJ`U6=~H`S&S>!a2>&PX+NZr46{SSAwg+z}Nu^ugg zazux_?y!pS4XTy8;#7g^FEVA3 z+(0x+wf3hl*5#&2o?jp-erH_sEQ^`qej18C{AA#7B%SBLj_l0UR++kY2@2^4Vm$XDHC`>ib> zjh1pFsUy#$rktC#wLqS2HRxi!>NIBKs^QW$m$0WcPVsa?oo^mLrnbEI1B-a7((y7* z%*sLErB0ihZ!^lc>CIKNPUn10H%Er=aDiQ9ovR?$6R(g{6S<-=@;`q90?rXzqNBL3 zCThxsZlTUgC}Jf*Nyg9ZpGft>VRM=@9iev@ZvSq4=exjANpW5uW|&Adbjx7CP0LEk z%gf433l6Uk7jK}XA}9BAm}acg{3t=W=ipZ(@}k;>rI^;IGcaneZ>n?Uz3$gK)o=%A z%CWrKL1nhmo6CwR_>BR}uq0S&Fq?3Hw2nD zo{p()3+S4!ZFBzMwB`hxI=G|JGY@4ImGic&77N&2P-@=p9BV!8oQ=r4gvff- z9DRl$MMcFtY6zOO0&AREbh;%F(0mFf3x(>SFwA1d(dou@&K6a2(9VuX57!V#*f{Z?5h)*EUK@A z2m0GKbgl1#G6Fm=)tsKk#xe9uR&5zn_^L`)N==9IK27?THN!Tv{4Ht8SPlHN(^zuUT zH`khatnSQoVq{YAtFW-ZS3Ls>F3wQbM|r9sY`ko_ARa#hpqo{xEi*lRhU8Tjw$v3V z(Uupmk>5)1qp7LRk@-Wo57od1r$4|OALP?>+(uhZV?LH}URKO$NWhy*mo>TPjtX3s z{Gk20v=glBxi5EMIn&WsfHnvDxCY}VWy2U|g}etULaYZU`njUOjOBvL?AxUlVVL#Us=@TXWI zpI{C)F=ADr#Q`_#YvjHArxuou&Aysibc9gXGWYyKJ5b~ZrZ>9G5{hYz^$(j3kKNQB z6?aWM?%1H$jFq;}`$?YC0&3UVm6zY;6g3b7j{8C(W&?^vJU0bQaHa(&Cf!UK<|TUI zioVKXc}kE0b3^y_1F3;gP<~}(5jN=D4^zW!G7>jGU2 zMz~(Xj1Y+oVCub_KV<#*(Ygf3vo;GOX{G}Mhu`~cPfy167)5&rYpU4N*4nS44tw|v z=48g!%^lUWen>7Vs=!rD7A;U4J+wz<+axQh7RwqQ0=(b7NPb_En$1l=Dp=uOqAutLk@ofGC!>=}dN2@P`w<`% z&KV4Q&+`Zn#NkIhZEx-h^O^0CHm+~9NC-J_LFWAq{H|Vty_ne&EAVQnUDo=92Dt|M zdQc2bFyA;hnc!Pxlr0R=E&&yHdUHqls*~oRkcW!<)%}OFYsXTNMeVDNaMovIY#Dwb z3rXW>d$7;z-o1izlg}GLhZ!B&7hn&p+HSR}$*n_8Jcb|EJes{P;<6i35f53}emXC* zbMv~pnyI^vHqY~s9L)sxJI8K_e{_)rBGjQ$UYU8GH!m;QMXFIUwJ?eM<%vQ%vy(Sn z?66r)@o|5AJb>2spHH?{&2rc+t}6|0oMF}zTKvq%7N!OEI<*z+&b-KnDN;4U)J=am=&O;SZ?s4c= zA`lGFY1LbeMh~n;#j zX;r9Ih91Nw7~!jH8F|&ZDM0Eb7@eVi`K)&OT=)W};4wulfnFkpR7?aVqA7Zk6O6yy zo>t`7hu5K-%zQE1k9eOC`kmZ4Jtm{m)f|VTX(_oeB5px8-JAz1I68R)a)vmAHLP5x zsd{`WXP_sYkK0;Bh$axXpjna5JZTc06jzq-Y1iYtnS6js6EYH#^WB!m6_jRM5+-AU z1Gohs8?7db&1$hidpS+^E*w@yLJR^f?pG3rTt(6n?VVCu^)_##i}UGE{0jkOc^}Q# z;ns0~ob&f01-|aXH+G!coS8W)Z0NmWi%4Imi7vRCV8l4+w2HG)-MzFOydlkW>&;|uco~B8E+y6dO2!Cpiwf4Ev^K<3TA*r;#*y&1eR0A}gxSyObN*0!LFfS@&94w3AsRj z%3YTDks7Xl(e)wRd?=$}!9}GX{yW|R2@$j!ZoAtbQmfuV#Xn;0P{to<((x5`Y~rE! zu}5>5T1PNzkVxUM+ddT^5T{hyzX{rDPLCD;Tc#T!-sBSbet)`Djn>!Y2X?YhrDwuQ zuhx%%$5m%M9NW{=gG?eOQZiI){zi0jORrh9#%;H~T7nu7Gg5Mu=1WMK-tDVg<(XEwgoA{m9Yhy^<7t_(>nj+$q~v0jWPW4(pvzvC&z{V(sufBB9OgSTl*N^hd%kO%%-s!}A{yd!fn z2-b^i>ZiA)rx5%{6hZ>00tc~?l>CL=jz*QQTk@B?%^yV(5;)u>^9Qd!o&GRtV&?N; zyMk}b9`|nL-w`_1BuL+Se*b`g?f7{2Q18rj?tv&vsxzN9T&y;jPLmsTIZViJ&5T80 zdEMPGd5TCb6MBpTenBUPmY6J}=B>4l22<@<(BOHN=#&0O7u7CXbjV1THx(Nr4np z6WU*1B?3scgz{jGw9;)~884t2e0j~mm3EP8!~YW%wk=3#w_K_~y6q?7P(`LswB;)Q zZx@6g0>GH7{*0h;DB{52QE)Znzx=3t2?0_pszN}kJfVvy=lu7PC>;f!M&IzTNJ!FQ zl7C6Y(F~vhfz@(?yVVY+dW+Eua6n#sKk~(x0qT^%(^k5!q-Lglu>(;Zdr4V zEgUJBzvb1wp90ExXfC&{-pJBb1=SSEGsV+*PbLNfWTpWZ=}vCD?k*iyrPJ*%Jp~Bu z(oZ#1p^&6N#|in^e;gpmcuk_X#gETXlP59vzXP&Djd5 z3^B&|mlvx9!0)hu7W$V7XZ_^dn%^ad36M4N`HMB;{C02(OjKDuvKKo}HzyjRbbVSA zF*&XUwBs(SMiflT8gKCx-JkosF-KXDx{3?6KN~xGaNy?yRilDmumAozU&4JS54dq@ zacOUH`o+&U$Kn^n*i(L+&dI`*(fK^JO;_RZwOw7sxGmjqS{-<;)ud}R^ooZiC@<7T zbGXikkh)Jt6Fr=1v(}_Bg74CO{>>q>vQW79M1KKNvgQG=@o{~E^HfK{jlsJX;0_ExXBLXXA1G>H(9))6~7#ax(f~cGZ%~B~bU> z_!A9@Q!ay%y9&HeQLLFjx0k!za$XN$y4`0jZ97omx@|!ja}NCYFHwK14uG@pQM}kE zmfloya-27MJ_xsoLoOnpG;|Eaz}ZYh{T?(U?O+7FPqdFzifk0piaLP;hKnpz(sp)q zRl|D5o;**A#c)02uCKeFuSKb!<^}sy2f$J=RhW!;NdM^ss5Re*D$iKF+P6Y2gtG#R z^|&8?a=mV=FO956CEwm!fW_R-ViU$ZkUM<7imW0rW=3~F-!|4M0+>nO8duz_+%1}>x z4GKElaRkpRo9E1Rg}+3{gX=!LN1|5_SG2)X`AnLte&?2tYzOs-Rs6?1_rm+VWb@=d zGaHClms96f=lfk%9J$>4^U2V@DXnjnOd1<1nKXbRw{9-1eH`h?-*f*ziU}qG!WN)W z%|4|5mr6Y+K@=+-3+`pvM`>I$Ts0>0--F?YfHF9nC_+69XVu09B)+P&w1{@uGJV9~ z?%Wjo;H433ntY)HVC4%Ju#di>M{&4Nf1HiT-2NubkWe0DR9MXeoACmr3OH3mfyfvV zZYP_3@&9KvM8flnkBI5k+zm3p3zSrDQxBR~NVrv0vYTF-$yGO~vgtjT`Oa=qvy z|H#BF2oH}>+{pa`>`f=qq4)Le?ChY8=Y5IwA$xU4^28!S z4dD6PO$pL^E|=bv^S7Qpn$*mjKCOcM2LEeyp!(z|!J^GrulAr>?$%qKZR%tbe)zZ1 z2B@l`2Oq1zo5CLu2&(y4{eQ6*0Pr^as^Gi@SRV#ufeOXIf1n_Q0)Vc6$=0LyB7=q> zrTw?cP?-X>s{`v1b=O`8Rvn?Hgi7Ubm0;i3^^K z&VyIo1z@JWajca#H)hXNXt^vtR)QtzAhcklDe>$e05Ldjq;Hu%_wxohWpHCesTv+s zG+ssIi~4v4VWjHKT18|7vUu4JpQ;13<6z!HrI)9Z!rF6TW~~nXH{Hp>JnF4^gUPW1 zD-v289xUmgRi!{uo_$caK>IaCLmwN#byy+^B~k?$*BuUeMb4Fef(7enPC ztX{?&LnFsSF_$n}c;D$@;@hIT&ebeNdId2vA_sfkUgL1_4@&1 zi04J^N{P@Ebx7G#0V?_IgkUXM!_s1{mQ)9;NaDap{ZZd)9EaRyo%3if{X2noTc#&2 zrx#sj06i+EEPYp2(*3n#?a${h@e}-C&kbDnBh$^h(wo2yK=O}nk$2^HGs5!p1WUCJ z=)w)iPL#w?TwC02GW2&1=7*mxzCXJc`QBEwz0Fk&#?&}q%F6ZGL`=wBeQ6~7MC1T7 z7vTFfay>1>)XKx9SS#|2R@3G338po#F2Rd0UaGqI#F0VmuW^4kZdWf{K2p?057*C@ z#w(;l$ByLchMQ`qH*q`A*07`wO&^aXI*(Wk&Ns8~J1$tQ4lk~7v?t1XRtMd2gK}pN z_iu#c5;XjMj?vJ4Me^`a$(jUSjwFuW6?dl~yT!jI19lXuePUc#^a%EI_={py@(Cu0;EQ zfv|-eZ7iNb^=Zj|*_^@Ln5+#n6LVMAFF)laMHI!liK2zGEGwJw3N77=RMo?gUYr(Z zAFvOn03cge2pW1V9aTb5t%55-_KLGqP96ME0Iy9wKUtWWDLFE^5c0GH6$6bCCV(Rr zB!c4RVr185zvEni$fO~DFA(Tc?rBbdsX@T@@w&K&&mp9(tpQp|N9`%&C2z{ z$+@GO^&u03YO)sptE@B9N36h8eOUH;~{-5aC%L7pPe00_t`Yt=> zZB}MZ05yI(I~#9h18bv^UybCk7O2QDUY@-^-dWjO?_KOJkygCB)84I2RL<|IZxiL~ zYmpeXDJBwDHAoal!-5g5=RJ-WN3N^%3w~qws@rAF%9tfKa50Uo58RamBYKx?T#dRh zS`A`9+rR8ImtfOULy@VDWeFt}k`Ws*d`NbF3%1lKQRd2J|7MrXt?kmrTM zvU42G>{{}5=c=-PUY~kqSR8HXif7X5!G3PUAI3240vDd+Qzh64d~+&yu;yTKiNOoH z@C+bC^1v(F7i!8v4Wpa9d#cuvo z!sPbdVj|yKb0EEhX+^rek_J5d)ZC;#$U-Xu3e8%)3>n@c4i%Y@`?#-F$Vrhz0GE`H z0}o`oc;*6WZql5m)OiwYvJH&;FoT;|CIxxwfP%rXMB#LX`H`>oP9(cIaUGWShSz;P zZ06#m(b|cAV%4>evZd~DeX00*yf^Hpe3%prEz#xarl3=e+WlhqU5mT0q;Xq#&F^nm zBGK{dNy6iI%JbcUsmkss_Cb~HOpeT%5zf4dsw_wxGid@iX-C~oUXp%Y&) z^+(~3Dd}FSmyR6pAAc+^aih{v%D^-)T0HG6wmu5vyZkH>*JRT9X!0WPmt7k%d({fTgyuJ5s2bTdG+}N zFVe3?_X>4BTVKC?^GNdP@LAjq6V9BlCj16RvAjlEY)Q%4=W^|OI~;d6ngqeELDlcc zM{I5|wy<}Y$P2l$c>5H^n4abQV9Y5{V#>b$K5$6U7;u(%wW%n6E-hK>p4p{u7*(7}OK1p?nsZL{ zyeVm&kJ-Ft$g`%fW~n%DcTO$>*P(Pwc!jvCf_31b5sQ03Pwge4({S>?i4f0*O(<@6 zszdR+mRDAy&2H6_Za}Ule77wM_;$f5> zAvAYj~~id;P4pRu2LO`f*WN|ib)Gim9?v2H-smZHBG=YX6ZPAOK88o2M7hEsG! zr>43)?}tkj7Q)P&AKP)jWOxQQviG!9inMB&sj;{htSCqBg&Plq zggzt5NIB}=a>8sk8SX)o+TTdVr4(ygt4&r=J6@Me%U0Z8y}X6`6ToS;zwL}(zbKN0 zt`t*{MHGKupj&iac06A#MC4yB&ZQ)P0D(MZ?kE#i`$_!L-T~H9Mg{FLMHGbdNIolX_!VP3jbYP2>rgl^y;brzQ+Xh727gg2yXF;eUYc%ujueBubgBQ zX6LRMfcq%jT?2IpT<%oawc22|$F+wwYDy!mq%uRViUfIx&hiw9QueP{d!`JEi6)>c z)#oI?FW)HWc@Z28kdcM4-{e{CVTy-#k+H4vUqF&8)D>M*AV0t5R9~mYneIzaMVv2| zTW6-DEe*kf`tgy86;5qPsZiyr#Mi|`4SjBo)n;C>R6SyINYKV_60$B7tNhlkMAt|I zk-+oq+5R~^@K3rtMn546*1N-1n`i&IXi-~X7s(IlQL{U3#}61LaJ#IK>1+^98DNuga!1h zpncPdB+^fqVZJdo_#uav3rS(lZd4P^6GF_Rs?mX53bTet4Af(eq zG-9i&v2veOoROL6jtS^Wn{T4Mx^jOhi^*@uhQXPjI=?vFogKn5~hzGB&gfCcx9wdNxbu}UvjZS%>6ekb6f z#60UadqXZlD-h4d#htSh)!pE6)zokV#Um0H`)9GJ~A+EdB8>8;dc2;d_u7K(1aY~wnEBCGaoZ6&KhAZ zkR&^E;U@0;Rt0Hg=qP4d-%ofAOjr>FIZ((1yS>0KSUh4l1+b65LnbJ44*_ z^*n4>7~asEH1PBXOgTNN0}N=L-bFmO;N4KLz|ymO3q*i`9~6=}EO=yW0`Na^5$_ZZ_4)IBtVR_v>qpY78gpXyLV*Fn`vr|8&+( z7#prOFNICquhbZy3$Vf8KoyUGx?QI3VxJ5pNR$K>A{7o&^B2?rBVJ*jlm`=P&!HEe z7*eDKjX41?PT(2+Do`Zp2BYYKQEEc_=#+=?Ej#}Rkm8^~ZWKi8AAVvKmKuKxd8yP|Opml`D>=1oiqApOp_1NXeQGsP}@JyDk{%jjNJu zhA6=`5j#CL zK2qe#)rS5RPta5@vB2_IdpEAI`-0?+*{=+VgTV}#q_fMjs+e_WiK7rW4rpdF6zAsD z!s9#f_nsJ%dEwoh(b&96>vi3poc;aaUxA)K0}%K@{aOlT^~0iHrF5n&DoI0ax)ca0 z)Nts@1p`mKh;KWfCry}(ZTWmN^L}P;fft_%haeAWRgKR|N8s$?vt9-viMx4mpdej zIX8&KBa%C)+7~%ttYfMff*BRiL7^qun5uhqoulC}#VzljM;JuK5enqDY`@pYH+Xsn z3&D|@SM? zR)mquJqlE_prEr0T7ad+-iVtY z*>JIhAT%;+PC6||89I(?E^g>j-wnjmyr8b9gzv`~h?hiaOJZ=rv(Mn$PP9-6oeeKY z**S*tVgUCe*lr;0&w6k^fDfS#>)2een`wsYXg6%NjrwlMX8CXNOEQF+AOZ+lL&*NZ{~dMYgGd?xxjT& zym$X72M*Ms8oQ8-D|sPq-85un$Dp&)bne@X^N~tXQLlINQ{$P!2i;AjhpCDWA04?2 z`;LK5WS1~&N(N$4?V0(`$BDW6_LFn;V5b#w)L`D32PW~Om5p_xhr*nH60bMr{W8K# z%W+aIHk&z*CcTR`965b3^6`KGy{H#tE}!s#{H_Vs>`-nf?H zg%vmm^Jc6E50^(+eH-FE(k}Kvh|YG z9XB1do8ir~Uji$-zp6@2g@Y(cXLbtBCE@te67v*_*4`8}d=tXfHFUyrlEfiT60L^> zx#xOY4*6U3c0xJ z*7S6*e~c>YpRB_8aH@a2DC@7P>uA>Y{NDU{Z+|syf7QOX4LRDsL5Jzn zsr_o+{5ZI`T|0NssqXb&20ZEVYL#btRlDEM%+<=NPV#B#csn>fRm|;el+$(Aw!E4< zJ-u1O^Xuq%x3#<;%lOdfY^mvVX_< zloq5F<*|oqZpw+p1{gT9WuVK%#Tya`K7&eY6z`w0Sl9MwEU2fKtEylBj3(oEZne?- zJ>$xAx^;L$^a9PD*Uy5#SgUuDPw=|8d%D}IMtAW0c*YOIHmjQ!8&2%gPs==QY!i3$ zXABEml`(C5CZ9~`y;M3~s+9KPKwGBhqjHw>n7o$bHCTh|8#~tt5K?c>3ns?S6Z&_U z0!zll`cHYj;f+To^QZK@;ASDprMZlLs>~rl_wP)fOjSMDpbIuT7+-@fx4)Had^js&a~ec;R7_?EG7*yP4#vEXdO z@x3y_(S-@1Oj_%*zZ3UsK$HEj`Yba%wF;iR_IUcW!0)_}S}gB4xBm9}q-e0e>D08j zCVuCsj`{gc8PE7sU1DFxiObR#wYKn6U827%()TW^`M%%;g8AA3#H@IKV2UK9CR3!< z1%Y0ajC0xQpta|qTFTi+EBztQx|5|lP?JR-juYb~=}(9Njfbsy7wP)Tr0^iKIOkkv z$jBmY!-X?+Z=$*Ppp!KzdU0Qt%ygb3sKsz&CLHU{Ye7F&r?WTEt${9;JjV*VlL5Le z4&7jisblCqSYIF3(v@noS#Jc@%U1@R2GTm@+80e;KES6tg@*vSZrHkY6D ztU?^S>VFyRADL?g#5!abK%=gUlYwLn9x9U3m}QD^54)@c z{zhKw=9z$+d@;@mcg-4m3>YOuBnF!)bkX4g4Nd;d zi%t}j*Fqu`Q|MX8z><0llH0y`b!w zauY)+C!}m^`o)i0*&Cf95ISYV0L+?ful#6i;TjB~AMqyi5UQH<|1nxG=Q0@Y=#q%vhppR%OtfJgnVW6%(~)09GYx8UarXi<=vl`POktyd+A$^_W(ZRTOeH1VR9 za6Eq(k>FXL!eGj7$le0s%_9HBvClC2n~^5WB3CwBW%idN=%mcFD0kdxj8jk_!bP0m zMsdb59EYTn@`2yzlR5r0dy*ewZ*xYrElWaVj2|oqDV(R+RTq{4 zPrbgsM97P~(IzOT%|J_Xl&R=vrDkku2N|ms5kt9jbK;b*R0^owY4Uiij6Agc3aDuu z`HSC|QLzqar!{&^qDv_bm?R?h`9=XxilsIKDGd3VCb+ioN=#O+p1yH~JIFP|P9r3c zaHK|+D)>k6RO~B3`Ln;ur?|3{7Zsa|>OsXF`J&+NvpW-1iyRLuvG!NZG{DhUMng|( zI#tN_7QfejW$wU7&0qa)xWOdnvhvx=75rO7gfN`~wU@}S`=YW-eN_8tS$eYe8jPjxsLI=Fm!|vqvt9aSDbBh z5;i-3bzxAV@au>ZP5JIR=OyJh12soF^743QxGPInSy!%-%p~PI3B0?Ni9Q38;>yrkVT@!tddIBNp7_WP5Nx&e{ z*GN=S(LHdphhz&0s%XKY7>nior$ci}CMN9qEVRb2>Hf;Y$t0Ggq63o}fW45xpC!<> zzV5Yb;h4%UiXz`E!IgHYEt3ivd(bws z3J@)ZvkwEo?uY2PVMeufepqGa`c{{(893TOnA^0|BYzbaqhueY>mPfmj=j+5abAdP zFPEvASKAbq&2_xVMiL5%z@GW~K1d22EsAvT5S`Qj(yiqa`@nSOHG)-L`-{`){$UDD z)1mWAbB5kI?oRg6fJ@Ff-7m@{=hMuTBwqV`rVsZ$egl11 zv!4eNT4JoZXxu8h$?AY(E$3Q%xk+APO2?EsQJH+fCb&Xn~^h-Z7PX9+{D5#hniI}%$7>kf%m z63JKEMNts(F_q-1(1T!E#7kdEAhRq+x>;5xIldZbZ(!-HaMSs?E-vX{)m7VX zHuO|P4AXj8+4fqckMbbD%X8#d`YqSevad!tcoRo^b$`Zc5Cl3MBffT@IOX@z#4Z3& zO7*kVK)g7bXC*AWIfp$9t3Y*I@1|?c2|ujebmO;Xhg?tz`5#o8Q*$v>w#0OHCU^ z_tv~TeUu3rvpnJ-!j2quPQ2~OA`#@@-PS`IwET-ej)hx;=TSB5{G=kuo`N>U7EA5WgkF4H5h5g^nNpw=a{SZj6ii(K); zJhe{f_&t3%^t(ZFQ?{y#cz3%l@%%HoJF*%QRNo)je>a+; zc-Dd7e&YiI0DOFa0si;{{6~uJK031Rg9HFLcmaUV|CXX1-7HNU)V?{Ii<+967&-nW zPS>SbDXnlI4Q_0Vc|k^P%Pdy3$m zbum=9GJ|n7Zb?+wmo#AYQi(jj#^}fTWxg}*L7USSglc5A#~yp5G2d0oMs>N5*w-M% z3}toSKi093n7wO~9s~-DPY|u`t#T>1#q%l~p>aD}O;Tf*8)fc_+2y-}^9_B``sv6W zE?m)#q*fpm_44ToOWdSYhKuvtVKb4Dp>4t9C!reFMTSNrCZQF|$WxxfN9#PzMh@%? z9BE`^tDYxcyR8D#qpxEk+he$FtaHPGcT?n@{M5~|8Qdj@W@lV(whgzxzPPgSu~JuY z)rA{p*Ek+fC)#g>`QMzph)^|zbmfij_RU})b%H4eFg0yUHAG%Z`zW)QKB{{%(PtUQ znyv4roA@C$`XW`Mz%o4U5f29-ZrCR7VW#NM(eqm#jZ$cu&_~eTc zG)ZRfkc64O&+?6UH$%o<4;S2zvQcS@(lpa&UF{xP>)zSye`wscUJSXt>)970rM?mzH_?x)N<|&Cp&@iGEI*$f%ALTE$Ui!r z9*O}L;tzoZUtq!4<=(unu~wWU-NOTX%(pC4bkLMd9`;3b7kRcB;kS%?ZY2fGI=s@U zZjIyKQIEQd2La8&iD;z5+~%#V`h)}NopX(mSfMjE?$~aWU5jCguZ~la{A5YzoEGLq zElTyVwKr+#yy&%DlnyAYS49pfUJfrZB1~fc#f~`(kZOCQzryBka@Q&MC;cY)Mz^$QnMNd!j2<^mlyXh~FbihGg_kxC%>}eWs zNsFU<4OGSqd!qtz<3Hb%1t7QkKEr)G>kHJNRojfpn|}11&`R zG~IDv$BInnUNGjwRAuN49Es%fr*)_tgUtw}zY6b{=NQ-s>rk{z zIJin>mts&UWbyoW8S?1sP((~PG-sh3;Ug_(<)eAEg=54E>zJ+0h$-UQZpL~Tn*bziMA>5CIr^KBL9eW9n##w@R)jne zWHGc&01PJ=Yj%qal~5RNc50$OyU-|0&KKbvlh`z-VqmLS(+oi3;K6JHrv4P}f?XPi zY%j&kW0p3PH3Qj&Lc$@*mH(W_f-)}I!mb*7fn*}cqpm}t+dEnaIHe1l|9L_7z(-O% zkKq5%U|)=6BGTK1!F= zQt0XfxDh3I^X_j_(bYft0Y2BHYPQtTE?Edilz=8R=-Sti(lEwJr6zS#GyYTXkort`~hqdRx`EL%;Do^wG zhV8B3D^ZR-H2TpAXD&a}fipVni0fVXvF-0G*-a0=jy52%Tx{*fCN74^Thndjx5O$e znOH*J*~s&$OEk?xwRefm!0SdB&J5~9$bRBfd-23&Pq*acvB6ziU!_>1yl`m_lWJHC z%S)eM!Jv2W()Y{?jtdHQ{>T$G|mT49FQ^ z0Vn`QP7aPXR_a!k^xqs!tmN%&Y#kW?DAEaYzW^w*34t~L--mIO;P(Iqq`-^7cgPeE z>D=#gqB@H*f$fPH?(lZ2=+eYw^Fl{HHkLWnXWv|Jk}ujz5H8%q*KM8sSy?ZW1p~yE ztQnF%>t<>x3hcJAWZ+hGe+~~6cJNVivflVgpV7#i$$Lye6T~o?8x%!Cf73P&@m1aV z3%9DR;`Ob_Z=usiqf8U46i*?vT$!$>&z0+P9+DX?xruZQsHyt*&hx(^IrWOqUIcTh zEr2cpGFTqj7SLDEDp6CGUfz{i)h>0Hg~DIdz2zx6XZx`|&Q>q-s@ z?h9?aZ90Ge{7)R=uD5%l;Q)X$O#lE0^xu|chFC{5IWjay*t;p zhTtxqG_h4XYhQeBFQl;Orx7jvVzShMaE#SVi9|@5nq7>OZSMD_odUE@W~M{h`K(QJ zG95dXBvOorWP)p4wC!`uO~!`JM7ZnYM5~-x&P|`(Z^Fo+iitbt(JK;qe8}mg>bu9= ziTbz1I8$pD=U$HM;0iPEW%q}HNuT?PYliX6K=0!&a0Pdco1ltsiQ|Ya&Wbk2ldHGx zJP#y~_9*1c?EX>1OA})<6PP#Ob$QZSH5g!e2t68RtQsFQ4O0V{qVY?3yYsCte8dmNu~V`IS?h+)0X#IG4>d)7-QwP=Qgc{u z(5j5fO%ScexSd7rhe2{|Pew~Y!1m^j2VxwdETKS9g+Cah>-OZ2)^69+TJ>@I@WSrJ zkGa_>{G#_J+>bpxI3C74O!{2Q#p84MDKG;r?~9UyNsS?Z?(PKO8Ke~?{ZkI@R<=M` zc6<<`vb^2p0;h2>HWW=Og2{0!O)GA^9)tytO%f$i?$ZUmZ1$UaLIzA;8vySRS*C@aoWcSszjA8URJ-yI==$!YMg?8IF3rLloGjDR-+ zr|}Nm^0=oOcez(7LjA(ASxw((!uzrPirAPlvsf}sQ3g{2zwuydY$)DKG)TVw%o4cT zWuJFE&wP@tOOBu^_V{c}q(W@V^6eW^So_VC%xZ04h8&)1IYa#(Rxd;(%f_%_ypCV8 zOV;??7r5M;0R+zBSPm{FA+d2750f5`+NW6=|J#Zm>lm!{4jUQlY@g|i(v?(Seho|H z5bi0pV0mqNj2|5&;si0;E|tL330tM>ed%^>_sRz>?vUwi-7J}Fr#B) zjG6ku>6;5$#W$wX^#px=quKB2y>Ary+V*S7-uuUE8^W@^_jrRC0@2QEJNzIH0%iNB zfo2c1U^^y_05^o$-@RQN{;*J~Fauw;$K;5A`q_P|nksUbx!FwjLn#{Q*c3=Mbwo3A zu|<<+;|i@&Djl=XXE%aWsc!kCKHfABD8@ee3}7|V1IspLu>{P9N5T6xkehNzI0UhE zG3^KakQ@gl*po(th{i_LAhr=g*7s|JrWim_98U8!Jk5Z~alVcw(bpic0ZqiaCIc)H z*?>m>SAmuM!X3$DSLUzAluUqiwn)id#z7^>fHfJ}%PZRK634mCVRvN&7@eaf*TK<@ zE)Iv%d;^n`MT8*Airb*oorlr@#=&jS0{>N*O>a99JdI%ordq&(kxdu|*7-xG^g1|U zTVDXqd@Q@^TS6Q=NdKZBl^d#jc)JqOZ0d-Qt43d0ScpIkRhO`A>agO6B3um0sJkvt?_S48(>ZOd3g9R*u>wxFNu6rK&r zfbET`(|*FlZVp}iZsEmE7 zEJ_8FQR>{doyGL~-O&1c@oi!YLamXxI!keZk`da6UpzXIhWCg?FJEoxe6b7>lMaM4 z@=DS!sYi=8Z|HOUWz1R}HnRAAORhZbw>Uyx(fA7-7K|zkr#udXaY#9;76!A%R-qk* zx{C0L2vb?nxYB z@O_%G-b>7!r{%32P_;g4hi`Ozs$J}%-9~kh>hupo9H+&4WwoZ%nWDBYa0DSJbMb@h zK6cN|5*q}y>L*E^Kn%xWJ-!*EZJ~T}qLw@DL6RsN-k`a_oBCQ@crCf$CsxUWGkWLV zt}l?17p;W$YDfQBm`q5HkqnP~=1Qp>{PHb^Am~BoOC3$-2|fH9^bT@z@ytMcg){_9 zNU(EvEuM>+zt&-;DEGXDe^jO05Z44fYN0FHDmm$h1#%5V*5_EWvi}RJsO3FIl z=$YhIqFpLV)k+aAf|5w&95p^u5UZNC6BBRxj$JuHUeZV7%-fwpd#&$qL~Y%HzfDvo zOSgPFibO`${k7qrBpX|SolT8vHZX9XR^;K}#vttCM^0hDHd3Pn{s|=|tZ3qgVd`o_EWvtW6*$7f z)iK|eq|%namFje2OSc}i6ts(FLbS_M^?Kmr(SwM6+L0+Ka+x~LAulaCVA)MguSCdx9y}=!(QMAH%}Nt;5p|iu+@H~z zUh!A$i=cR0^XmTD!s+}1$r^ipM>N5f3+LXP=S1PPy<0D+5vakr(Z|`p-sVg=qX9cX(e1TC}_F#t3EjazH|Lu-va?jAQY|XtH z`7>nzc_$~R%EC&m{Kr~zFPL=D^Sjaqc~q5tY2pyc{?yY|)uu8r z#=AvmG>@CD3#ZVZ1WxZC=t^?;bb9YM*B3s`o_A@Za(dd{R|&Gc%d8%0(TP%+q#vc*5_VX&nzmp#hn1q@*g2k&)&q+;V)6}FDa1j&n00lI0!{H09g0`?;~KcI~0@=?$c)LCU^X5 z#)KB=KgO=sT9xm7;@A!r;N}~@A+%|J>}=gOG+$L%B&ROk?sWI zVEhLca~No05$ze2xqjqKr>%Rryjzw9G*`Q*Ww|133_tTT=1484oGHQt~?y-?TvrQ$P(EpQvej)wgotiJvV`*c4(^@B+&_N*-{X1b z;or_ufw2u?77ytF~R~k~n>XOZcO_k|E|g-^I4* z_srCmuu^+dG@pYmEeAczxg!TWKqAGQ^yfj-sZ8hj4u1LUl8X!7UA(;3U75?C1g|xSJ-?)M^KNa^STO=CZ96vv|)}Ur0U{UMYs@WeD z>Q~v<0rPdAj>L^8Mbk2=`M%GT`9d4g+K$bQ_mip{uoS$Y5sJwl-zCo%ed@y4ZqZu! za?5hm`eOh5K5FK{N9DIAf~I**3*Ku4I|(wteKS2G;~E&al_B}BTM!0>0*sc~I3WY1 zzn&-__Bks-yZ5!1O}uh*tQRoTTP2p9;O_7+b*gDZwooW(aPs5XarLGjr)$x(Ci54B zd`{U;pig8&?5DFH&Xk}_$}hd@6c%;OhQAss8FH1D`7uhPPWMUn_q0kuW`0|b988mo zbO&n$`>EFtUwb=F=@!XVzf?@af=h;n$Mf+)HZZ;?V%1DJli&0F?UyT)NziLs@ip4*rAN=%1f2*nQ zDA3qgJ7nq^+55*}xKK#Z#DJUX;w=b&Y+TB7Jbx5ppiUU4u|{^%0MDDK?ry!w6?Jt> zT6pQy8t~|?*XsP@Tr}u{o$0B2PipR71%tN+3|@B9;B^lO_V_P)330ns&=@Tvs4Q38 ztaejt#+otaq(#`3v>qNa?pyx7OFWoQ`&Bdd7z_n3FtSo<%IY1;37cxD4SrP`fU^X-A?m+FeO z0@$;Lfl{-ppA-BBJ!ft_U|+XF*RFXsIVjqwdWry*mMJY#&NOSNv&(ZoC#M&3+6K+` zjzp;=Mm8F1(dzYi7b+e!JZ*%hGcXVFcMe~>vRv{POiFexMXiZ{cvAm7TE%_0p;3R` z@50?p*p&cXXcgRM9yK87JgX2Xpk?do=VGpHM~NBsNYT+e4OhbOi#JA6?XtnwMCzQ;V~R_`*X7;JT? zX6}0X8QUc~N5NXHG1+jM`0!j@NFaxppX-a)hF-~%#dkE0FUgE7FHU`I%DxcX}a?hW&1tM_X=2UI1d!Qv{DGU54}*> zb;{VXzSQXUhc<0~g9B*AesjwOf2Xe>?Xj=tWqF6*C$c|ZySvX_DYqy!_S5NG3y+Z< zZ+;fK(u(?coNB0^seUHf&-2dM@Mef7tl%V*rkUk^th@fYSH{Q3y(f76d09DE4LJO!LAwsw?cvTgZy3c4d`N-C9=5l%krDr+56f;Ba$Gkh zkZxJy;D;m7Rg-{EqS27-J3S!I!9?9)-mqyl15Lr13Y z__3(SwUxPXBbHdEFi6(B1I{65kJv^vUE0U)5`Uh>d)8F%MHKIEs$q4x_4|q@1>?Aj z#0{!SR%L`~Ki|hK38fS!EA%KG3pJhKb8@<5CwV!%(z+=5nwGS(J+Bc;5Go@jRat#{ zRUb%fwGYitohV>p6+fqstU*YwJ$1;eVD_Imk$2ZGq)t7|JzrcSoM+HcP9!wP*HlYF zxYh>hb`_HI_Uc36{hy5UVWHpgZY@lzysyH_b{}6HEA^d7VSgHN=E^*e3; zi{#`)Zz{r&1MT(9X9oD8*EKeNt&WbandxU7)LOZiG#C$zpeCj^UM7jF*!4CuetngM zwYx6gY&odf8WO(tS$coQT_awWyInN;J(s-4!;XkP>d{$rD=l@cdP(1R;+o)x`fKeM z^!S!m2)hV72XdT!ipW`TAlC+OMR5Hc^kE)uRwS1mvMf!^Xl22RoY8{@e6E@Nr}kp&2+i+Q)$f0WK0ynINTdz_=os%q|usW=KPq!5C*n}9NpGAdCPnmvxD5Lian6h{zZ+@YlZs>0b-<_c9_w;X_4R+pFA#JOS zyM0)2UwV0l)T0`U%ywasR-6rV@7i0Tt2&j}I=FA2Fdp?}cpnpVM&4o-p)h>h8CkO; zrk=RUr$#fYwUO+ulG)<_YfcjyrzXY_>MVilJbK3y8o{8k8&WIz@OuxokX2IcQtn2{ zl=}T6U)G_LENToUkNlN<{Op*A`&M5xXufP2%C+oK*Bl<*CA&N4dL-zKovuQR$kWh) zu8IPMlWfl2+++K1*4>(M37-WSoj$E_u4Bsyzv6nFuw~EvP9qcFnJOWwGZZ3z>r8Gw zC-}nOWV*>#DDq2v!^??4Py8ez&4uTc(M_W(qI9%{kEe?@vgZ~nbbJ}mQ=ubidZ`?T zT3Ss|5v@)Il`Rkn^(2NFqi|Ln4_`zSPsxJ8MU*l9xHa$Cv?+d1+{YqCw59fLW5&mA z=x;c2WOUG6ht%YpGcsW1*(-s)scCiGYZqi(%(a$8*1aCw_LIj5)phY_VXF0hAb!QP z=ds!Md**2RYYJ85oMJlv)w=9gb#yvDYOL_uN4!8n>XZuC&Bz6uO%{@?*q{JzU^|d9 z+LSaZ5SKEV`VLk5`JcrY4J{1p(|_M>vIokzzJsA-06yHpNi@~=cMdw>MCaij>TG>B z&?5vv2qtqQa)Ml&C%(BKjXn>n_ z2ir^#a*m-QDjbT`ILt17R<#AqNDy)kg;6RTveY=_V>nnNB>{jSoDgRUi~;Plz12=(&t^N`v6BZ(Ws5QLnWGKt9ZryH3z)aEhrodF^g05SteRiL&{K&c3MewmajH;9yraPW+z%M(Wp z@(e5~L2WQSK$(xFte!jtMv6wENYH;L#3A$#M^rc*=zv5w8)kji*?~ mQ8JLPCy00em`0N};Gflnxe){$W5I15@XHb$Z$zUBKmHGjj;a6v literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..97f03fe --- /dev/null +++ b/pom.xml @@ -0,0 +1,322 @@ + + + 4.0.0 + + com.evobms + evobms + 3.9.0 + jar + + bms + http://www.ruoyi.vip + EVO电池管理系统 + + + org.springframework.boot + spring-boot-starter-parent + 2.5.15 + + + + + UTF-8 + UTF-8 + 1.8 + 3.1.1 + 1.4.7 + 2.0.58 + 1.2.23 + 2.19.0 + 1.21 + 0.9.1 + 2.3.3 + 3.0.0 + 4.1.2 + 6.8.3 + 2.3 + + 9.0.108 + 1.2.13 + 5.7.14 + 5.3.39 + + + + + + + org.springframework.boot + spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-devtools + true + + + + + org.springframework.boot + spring-boot-starter-security + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.apache.commons + commons-pool2 + + + + + mysql + mysql-connector-java + runtime + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.spring.boot.starter.version} + + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.1 + + + + + com.baomidou + mybatis-plus-generator + 3.5.3.1 + + + + + org.freemarker + freemarker + + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.apache.commons + commons-lang3 + + + + + commons-io + commons-io + ${commons.io.version} + + + + + eu.bitwalker + UserAgentUtils + ${bitwalker.version} + + + + + com.alibaba.fastjson2 + fastjson2 + ${fastjson.version} + + + + + org.springframework + spring-context-support + + + + + io.jsonwebtoken + jjwt + ${jwt.version} + + + + + javax.xml.bind + jaxb-api + + + + + io.springfox + springfox-boot-starter + ${swagger.version} + + + io.swagger + swagger-models + + + + + + + io.swagger + swagger-models + 1.6.2 + + + + + com.github.oshi + oshi-core + ${oshi.version} + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + + + org.quartz-scheduler + quartz + + + com.mchange + c3p0 + + + + + + + pro.fessional + kaptcha + ${kaptcha.version} + + + servlet-api + javax.servlet + + + + + + + org.springframework.integration + spring-integration-mqtt + + + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + 1.2.5 + + + org.projectlombok + lombok + provided + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + org.apache.maven.plugins + maven-compiler-plugin + + 14 + 14 + + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + false + + + + + diff --git a/ry.bat b/ry.bat new file mode 100644 index 0000000..d523e8c --- /dev/null +++ b/ry.bat @@ -0,0 +1,67 @@ +@echo off + +rem jarƽĿ¼ +set AppName=ruoyi.jar + +rem JVM +set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" + + +ECHO. + ECHO. [1] %AppName% + ECHO. [2] ر%AppName% + ECHO. [3] %AppName% + ECHO. [4] ״̬ %AppName% + ECHO. [5] +ECHO. + +ECHO.ѡĿ: +set /p ID= + IF "%id%"=="1" GOTO start + IF "%id%"=="2" GOTO stop + IF "%id%"=="3" GOTO restart + IF "%id%"=="4" GOTO status + IF "%id%"=="5" EXIT +PAUSE +:start + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if defined pid ( + echo %%is running + PAUSE + ) + +start javaw %JVM_OPTS% -jar %AppName% + +echo starting +echo Start %AppName% success... +goto:eof + +rem stopͨjpspid +:stop + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if not defined pid (echo process %AppName% does not exists) else ( + echo prepare to kill %image_name% + echo start kill %pid% ... + rem ݽIDkill + taskkill /f /pid %pid% + ) +goto:eof +:restart + call :stop + call :start +goto:eof +:status + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if not defined pid (echo process %AppName% is dead ) else ( + echo %image_name% is running + ) +goto:eof diff --git a/ry.sh b/ry.sh new file mode 100644 index 0000000..393bf9d --- /dev/null +++ b/ry.sh @@ -0,0 +1,86 @@ +#!/bin/sh +# ./ry.sh start 启动 stop 停止 restart 重启 status 状态 +AppName=target/ruoyi.jar + +# JVM参数 +JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" +APP_HOME=`pwd` +LOG_PATH=$APP_HOME/logs/$AppName.log + +if [ "$1" = "" ]; +then + echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m" + exit 1 +fi + +if [ "$AppName" = "" ]; +then + echo -e "\033[0;31m 未输入应用名 \033[0m" + exit 1 +fi + +function start() +{ + PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'` + + if [ x"$PID" != x"" ]; then + echo "$AppName is running..." + else + nohup java $JVM_OPTS -jar $AppName > /dev/null 2>&1 & + echo "Start $AppName success..." + fi +} + +function stop() +{ + echo "Stop $AppName" + + PID="" + query(){ + PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'` + } + + query + if [ x"$PID" != x"" ]; then + kill -TERM $PID + echo "$AppName (pid:$PID) exiting..." + while [ x"$PID" != x"" ] + do + sleep 1 + query + done + echo "$AppName exited." + else + echo "$AppName already stopped." + fi +} + +function restart() +{ + stop + sleep 2 + start +} + +function status() +{ + PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l` + if [ $PID != 0 ];then + echo "$AppName is running..." + else + echo "$AppName is not running..." + fi +} + +case $1 in + start) + start;; + stop) + stop;; + restart) + restart;; + status) + status;; + *) + +esac diff --git a/sql/README_DATABASE_DESIGN.md b/sql/README_DATABASE_DESIGN.md new file mode 100644 index 0000000..49da077 --- /dev/null +++ b/sql/README_DATABASE_DESIGN.md @@ -0,0 +1,154 @@ +# BMS 数据库设计说明 + +## 设计理念 + +针对您提出的"电池和设备的表建议分开,因为电池的需要有数据表且数据量很大"的需求,我们采用了**分离式设计**,将基础信息和实时数据分开存储,以优化性能和管理效率。 + +## 表结构设计 + +### 1. BOX设备表 (`bms_box_device`) + +**用途**: 存储BOX设备的基础信息和汇总数据 +- 设备基本信息(编号、名称、型号等) +- 设备配置信息(IP地址、通信协议等) +- 汇总统计数据(总容量、总电压、电池数量等) +- 设备状态和告警信息 + +### 2. 电池基础信息表 (`bms_battery`) + +**用途**: 存储电池的静态基础信息 +- 电池基本信息(编号、名称、型号等) +- 电池规格参数(额定容量、额定电压等) +- 电池配置信息(在BOX中的位置、保修信息等) +- **不包含实时数据**,避免频繁更新影响性能 + +### 3. 电池实时数据表 (`bms_battery_data`) + +**用途**: 专门存储电池的实时监测数据 +- 实时电压、电流、功率数据 +- SOC、SOH、温度等状态数据 +- 告警信息和运行状态 +- 支持大数据量存储和高频写入 + +## 设计优势 + +### 1. 性能优化 +- **读写分离**: 基础信息表读多写少,数据表写多读少 +- **索引优化**: 针对不同查询场景设计专门索引 +- **分区支持**: 数据表支持按时间分区,提高查询效率 + +### 2. 数据管理 +- **历史数据**: 实时数据表可保存完整历史记录 +- **数据清理**: 可按时间策略清理历史数据 +- **备份策略**: 基础信息和实时数据可采用不同备份策略 + +### 3. 扩展性 +- **水平扩展**: 数据表可按设备或时间进行分片 +- **垂直扩展**: 可根据需要增加新的监测指标 +- **多数据源**: 支持MQTT、Modbus、CAN等多种数据来源 + +## 关系模型 + +``` +bms_box_device (1) -----> (N) bms_battery + | + | (1) + | + v + (N) bms_battery_data +``` + +- 一个BOX设备包含多个电池(1:N) +- 一个电池产生多条实时数据记录(1:N) +- 通过外键约束保证数据一致性 + +## 查询场景 + +### 1. 设备概览查询 +```sql +-- 查询BOX设备及其电池概况 +SELECT b.box_name, b.battery_count, b.total_capacity, b.soc +FROM bms_box_device b +WHERE b.status = 1; +``` + +### 2. 电池实时状态查询 +```sql +-- 查询指定BOX下所有电池的最新状态 +SELECT bt.battery_name, bd.current_voltage, bd.soc, bd.temperature +FROM bms_battery bt +LEFT JOIN bms_battery_data bd ON bt.battery_id = bd.battery_id +WHERE bt.box_id = 1 + AND bd.collect_time = ( + SELECT MAX(collect_time) + FROM bms_battery_data + WHERE battery_id = bt.battery_id + ); +``` + +### 3. 历史数据分析 +```sql +-- 查询电池24小时内的数据趋势 +SELECT collect_time, current_voltage, soc, temperature +FROM bms_battery_data +WHERE battery_id = 1 + AND collect_time >= DATE_SUB(NOW(), INTERVAL 24 HOUR) +ORDER BY collect_time; +``` + +### 4. 告警数据查询 +```sql +-- 查询当前所有告警电池 +SELECT bt.battery_name, bd.alarm_info, bd.collect_time +FROM bms_battery bt +JOIN bms_battery_data bd ON bt.battery_id = bd.battery_id +WHERE bd.alarm_status = 1 + AND bd.collect_time >= DATE_SUB(NOW(), INTERVAL 1 HOUR); +``` + +## 性能优化建议 + +### 1. 索引策略 +- `bms_battery_data`表按`(battery_id, collect_time)`建立复合索引 +- 按查询频率建立单列索引(soc、temperature、alarm_status等) + +### 2. 分区策略 +```sql +-- 按月分区(已在SQL中提供示例) +ALTER TABLE bms_battery_data PARTITION BY RANGE (YEAR(collect_time)*100 + MONTH(collect_time)); +``` + +### 3. 数据清理策略 +```sql +-- 定期清理3个月前的历史数据 +DELETE FROM bms_battery_data +WHERE collect_time < DATE_SUB(NOW(), INTERVAL 3 MONTH); +``` + +### 4. 缓存策略 +- 最新数据缓存到Redis +- 设备状态汇总数据缓存 +- 告警信息实时推送 + +## 使用建议 + +1. **实时数据写入**: 建议使用批量插入提高性能 +2. **查询优化**: 尽量使用时间范围限制查询 +3. **监控告警**: 对数据表大小和查询性能进行监控 +4. **定期维护**: 定期执行表优化和统计信息更新 + +## 扩展功能 + +### 1. 数据压缩 +- 对历史数据进行压缩存储 +- 按时间粒度进行数据聚合 + +### 2. 实时计算 +- 使用流处理计算实时统计指标 +- 异常检测和预警 + +### 3. 数据同步 +- 支持多数据中心同步 +- 数据备份和恢复机制 + +这种设计既满足了大数据量存储的需求,又保证了查询性能和系统的可扩展性。 \ No newline at end of file diff --git a/sql/bms_battery.sql b/sql/bms_battery.sql new file mode 100644 index 0000000..b7a392e --- /dev/null +++ b/sql/bms_battery.sql @@ -0,0 +1,74 @@ +-- 电池基础信息表 +DROP TABLE IF EXISTS `bms_battery`; +CREATE TABLE `bms_battery` ( + `battery_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '电池ID', + `box_id` bigint(20) NOT NULL COMMENT 'BOX设备ID', + `battery_code` varchar(50) NOT NULL COMMENT '电池编号', + `battery_name` varchar(100) NOT NULL COMMENT '电池名称', + `battery_type` varchar(50) DEFAULT NULL COMMENT '电池类型(锂电池、铅酸电池等)', + `chemistry` varchar(50) DEFAULT NULL COMMENT '电池化学类型(LiFePO4、Li-ion等)', + `manufacturer` varchar(100) DEFAULT NULL COMMENT '制造商', + `model` varchar(100) DEFAULT NULL COMMENT '型号', + `serial_number` varchar(100) DEFAULT NULL COMMENT '序列号', + `production_date` date DEFAULT NULL COMMENT '生产日期', + `install_date` datetime DEFAULT NULL COMMENT '安装日期', + `position_in_box` int(11) NOT NULL COMMENT '在BOX中的位置(1-N)', + `rated_capacity` decimal(8,2) DEFAULT '0.00' COMMENT '额定容量(Ah)', + `rated_voltage` decimal(6,2) DEFAULT '0.00' COMMENT '额定电压(V)', + `max_charge_voltage` decimal(6,2) DEFAULT '0.00' COMMENT '最大充电电压(V)', + `min_discharge_voltage` decimal(6,2) DEFAULT '0.00' COMMENT '最小放电电压(V)', + `max_charge_current` decimal(8,2) DEFAULT '0.00' COMMENT '最大充电电流(A)', + `max_discharge_current` decimal(8,2) DEFAULT '0.00' COMMENT '最大放电电流(A)', + `status` tinyint(1) DEFAULT '1' COMMENT '电池状态(0停用 1启用 2维护 3报废)', + `warranty_start_date` date DEFAULT NULL COMMENT '保修开始日期', + `warranty_end_date` date DEFAULT NULL COMMENT '保修结束日期', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `version` int(11) DEFAULT '0' COMMENT '乐观锁版本号', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`battery_id`), + UNIQUE KEY `uk_battery_code` (`battery_code`), + UNIQUE KEY `uk_box_position` (`box_id`, `position_in_box`), + KEY `idx_box_id` (`box_id`), + KEY `idx_battery_type` (`battery_type`), + KEY `idx_status` (`status`), + CONSTRAINT `fk_battery_box` FOREIGN KEY (`box_id`) REFERENCES `bms_box_device` (`box_id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='电池基础信息表'; + +-- 插入电池基础信息示例数据(BOX001的8个电池) +INSERT INTO `bms_battery` VALUES +(1, 1, 'BAT001-01', 'BOX001-电池01', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250001', '2024-12-01', '2025-01-01 10:30:00', 1, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-01', '2027-01-01', 'admin', '2025-01-01 10:30:00', 'admin', '2025-01-22 10:30:00', '0', 0, 'BOX001位置1电池'), +(2, 1, 'BAT001-02', 'BOX001-电池02', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250002', '2024-12-01', '2025-01-01 10:30:00', 2, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-01', '2027-01-01', 'admin', '2025-01-01 10:30:00', 'admin', '2025-01-22 10:30:00', '0', 0, 'BOX001位置2电池'), +(3, 1, 'BAT001-03', 'BOX001-电池03', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250003', '2024-12-01', '2025-01-01 10:30:00', 3, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-01', '2027-01-01', 'admin', '2025-01-01 10:30:00', 'admin', '2025-01-22 10:30:00', '0', 0, 'BOX001位置3电池'), +(4, 1, 'BAT001-04', 'BOX001-电池04', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250004', '2024-12-01', '2025-01-01 10:30:00', 4, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-01', '2027-01-01', 'admin', '2025-01-01 10:30:00', 'admin', '2025-01-22 10:30:00', '0', 0, 'BOX001位置4电池'), +(5, 1, 'BAT001-05', 'BOX001-电池05', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250005', '2024-12-01', '2025-01-01 10:30:00', 5, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-01', '2027-01-01', 'admin', '2025-01-01 10:30:00', 'admin', '2025-01-22 10:30:00', '0', 0, 'BOX001位置5电池'), +(6, 1, 'BAT001-06', 'BOX001-电池06', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250006', '2024-12-01', '2025-01-01 10:30:00', 6, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-01', '2027-01-01', 'admin', '2025-01-01 10:30:00', 'admin', '2025-01-22 10:30:00', '0', 0, 'BOX001位置6电池'), +(7, 1, 'BAT001-07', 'BOX001-电池07', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250007', '2024-12-01', '2025-01-01 10:30:00', 7, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-01', '2027-01-01', 'admin', '2025-01-01 10:30:00', 'admin', '2025-01-22 10:30:00', '0', 0, 'BOX001位置7电池'), +(8, 1, 'BAT001-08', 'BOX001-电池08', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250008', '2024-12-01', '2025-01-01 10:30:00', 8, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-01', '2027-01-01', 'admin', '2025-01-01 10:30:00', 'admin', '2025-01-22 10:30:00', '0', 0, 'BOX001位置8电池'); + +-- 插入BOX002的12个电池基础信息 +INSERT INTO `bms_battery` VALUES +(9, 2, 'BAT002-01', 'BOX002-电池01', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250009', '2024-12-05', '2025-01-02 14:30:00', 1, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置1电池'), +(10, 2, 'BAT002-02', 'BOX002-电池02', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250010', '2024-12-05', '2025-01-02 14:30:00', 2, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置2电池'), +(11, 2, 'BAT002-03', 'BOX002-电池03', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250011', '2024-12-05', '2025-01-02 14:30:00', 3, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置3电池'), +(12, 2, 'BAT002-04', 'BOX002-电池04', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250012', '2024-12-05', '2025-01-02 14:30:00', 4, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置4电池'), +(13, 2, 'BAT002-05', 'BOX002-电池05', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250013', '2024-12-05', '2025-01-02 14:30:00', 5, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置5电池'), +(14, 2, 'BAT002-06', 'BOX002-电池06', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250014', '2024-12-05', '2025-01-02 14:30:00', 6, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置6电池'), +(15, 2, 'BAT002-07', 'BOX002-电池07', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250015', '2024-12-05', '2025-01-02 14:30:00', 7, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置7电池'), +(16, 2, 'BAT002-08', 'BOX002-电池08', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250016', '2024-12-05', '2025-01-02 14:30:00', 8, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置8电池'), +(17, 2, 'BAT002-09', 'BOX002-电池09', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250017', '2024-12-05', '2025-01-02 14:30:00', 9, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置9电池'), +(18, 2, 'BAT002-10', 'BOX002-电池10', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250018', '2024-12-05', '2025-01-02 14:30:00', 10, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置10电池'), +(19, 2, 'BAT002-11', 'BOX002-电池11', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250019', '2024-12-05', '2025-01-02 14:30:00', 11, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置11电池'), +(20, 2, 'BAT002-12', 'BOX002-电池12', 'LiFePO4', 'LiFePO4', 'BYD', 'LFP-100Ah', 'BAT20250020', '2024-12-05', '2025-01-02 14:30:00', 12, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-02', '2027-01-02', 'admin', '2025-01-02 14:30:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX002位置12电池'); + +-- 插入BOX003的6个电池基础信息 +INSERT INTO `bms_battery` VALUES +(21, 3, 'BAT003-01', 'BOX003-电池01', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250021', '2024-11-20', '2025-01-03 09:45:00', 1, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 2, '2025-01-03', '2027-01-03', 'admin', '2025-01-03 09:45:00', 'admin', '2025-01-22 09:45:00', '0', 0, 'BOX003位置1电池-维护中'), +(22, 3, 'BAT003-02', 'BOX003-电池02', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250022', '2024-11-20', '2025-01-03 09:45:00', 2, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-03', '2027-01-03', 'admin', '2025-01-03 09:45:00', 'admin', '2025-01-22 09:45:00', '0', 0, 'BOX003位置2电池'), +(23, 3, 'BAT003-03', 'BOX003-电池03', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250023', '2024-11-20', '2025-01-03 09:45:00', 3, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 2, '2025-01-03', '2027-01-03', 'admin', '2025-01-03 09:45:00', 'admin', '2025-01-22 09:45:00', '0', 0, 'BOX003位置3电池-维护中'), +(24, 3, 'BAT003-04', 'BOX003-电池04', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250024', '2024-11-20', '2025-01-03 09:45:00', 4, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-03', '2027-01-03', 'admin', '2025-01-03 09:45:00', 'admin', '2025-01-22 09:45:00', '0', 0, 'BOX003位置4电池'), +(25, 3, 'BAT003-05', 'BOX003-电池05', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250025', '2024-11-20', '2025-01-03 09:45:00', 5, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-03', '2027-01-03', 'admin', '2025-01-03 09:45:00', 'admin', '2025-01-22 09:45:00', '0', 0, 'BOX003位置5电池'), +(26, 3, 'BAT003-06', 'BOX003-电池06', 'LiFePO4', 'LiFePO4', 'CATL', 'LFP-100Ah', 'BAT20250026', '2024-11-20', '2025-01-03 09:45:00', 6, 100.00, 6.4, 7.2, 5.0, 50.0, 100.0, 1, '2025-01-03', '2027-01-03', 'admin', '2025-01-03 09:45:00', 'admin', '2025-01-22 09:45:00', '0', 0, 'BOX003位置6电池'); \ No newline at end of file diff --git a/sql/bms_battery_data.sql b/sql/bms_battery_data.sql new file mode 100644 index 0000000..e8b3a29 --- /dev/null +++ b/sql/bms_battery_data.sql @@ -0,0 +1,83 @@ +-- 电池实时数据表(用于存储大量实时监测数据) +DROP TABLE IF EXISTS `bms_battery_data`; +CREATE TABLE `bms_battery_data` ( + `data_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '数据ID', + `battery_id` bigint(20) NOT NULL COMMENT '电池ID', + `box_id` bigint(20) NOT NULL COMMENT 'BOX设备ID(冗余字段,便于查询)', + `battery_code` varchar(50) NOT NULL COMMENT '电池编号(冗余字段,便于查询)', + `collect_time` datetime NOT NULL COMMENT '采集时间', + `current_voltage` decimal(6,2) DEFAULT '0.00' COMMENT '当前电压(V)', + `current_current` decimal(8,2) DEFAULT '0.00' COMMENT '当前电流(A)', + `current_power` decimal(10,2) DEFAULT '0.00' COMMENT '当前功率(W)', + `soc` decimal(5,2) DEFAULT '0.00' COMMENT '电量百分比(%)', + `soh` decimal(5,2) DEFAULT '100.00' COMMENT '健康状态(%)', + `remaining_capacity` decimal(8,2) DEFAULT '0.00' COMMENT '剩余容量(Ah)', + `temperature` decimal(5,2) DEFAULT '0.00' COMMENT '温度(°C)', + `internal_resistance` decimal(8,4) DEFAULT '0.0000' COMMENT '内阻(Ω)', + `charge_cycles` int(11) DEFAULT '0' COMMENT '充电循环次数', + `deep_discharge_count` int(11) DEFAULT '0' COMMENT '深度放电次数', + `overcharge_count` int(11) DEFAULT '0' COMMENT '过充次数', + `over_temperature_count` int(11) DEFAULT '0' COMMENT '过温次数', + `runtime_status` tinyint(1) DEFAULT '1' COMMENT '运行状态(0离线 1正常 2充电中 3放电中 4故障 5维护)', + `charge_status` tinyint(1) DEFAULT '0' COMMENT '充电状态(0未充电 1充电中 2充满 3充电故障)', + `balance_status` tinyint(1) DEFAULT '0' COMMENT '均衡状态(0未均衡 1均衡中 2均衡完成)', + `alarm_status` tinyint(1) DEFAULT '0' COMMENT '告警状态(0正常 1告警)', + `alarm_info` text COMMENT '告警信息', + `last_charge_time` datetime DEFAULT NULL COMMENT '最后充电时间', + `last_discharge_time` datetime DEFAULT NULL COMMENT '最后放电时间', + `last_balance_time` datetime DEFAULT NULL COMMENT '最后均衡时间', + `data_source` varchar(50) DEFAULT 'MQTT' COMMENT '数据来源(MQTT、Modbus、CAN等)', + `raw_data` text COMMENT '原始数据(JSON格式)', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`data_id`), + KEY `idx_battery_id` (`battery_id`), + KEY `idx_box_id` (`box_id`), + KEY `idx_battery_code` (`battery_code`), + KEY `idx_collect_time` (`collect_time`), + KEY `idx_runtime_status` (`runtime_status`), + KEY `idx_alarm_status` (`alarm_status`), + KEY `idx_soc` (`soc`), + KEY `idx_temperature` (`temperature`), + KEY `idx_battery_collect_time` (`battery_id`, `collect_time`), + CONSTRAINT `fk_battery_data_battery` FOREIGN KEY (`battery_id`) REFERENCES `bms_battery` (`battery_id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='电池实时数据表'; + +-- 创建分区表(按月分区,提高查询性能) +-- ALTER TABLE `bms_battery_data` PARTITION BY RANGE (YEAR(collect_time)*100 + MONTH(collect_time)) ( +-- PARTITION p202501 VALUES LESS THAN (202502), +-- PARTITION p202502 VALUES LESS THAN (202503), +-- PARTITION p202503 VALUES LESS THAN (202504), +-- PARTITION p202504 VALUES LESS THAN (202505), +-- PARTITION p202505 VALUES LESS THAN (202506), +-- PARTITION p202506 VALUES LESS THAN (202507), +-- PARTITION p202507 VALUES LESS THAN (202508), +-- PARTITION p202508 VALUES LESS THAN (202509), +-- PARTITION p202509 VALUES LESS THAN (202510), +-- PARTITION p202510 VALUES LESS THAN (202511), +-- PARTITION p202511 VALUES LESS THAN (202512), +-- PARTITION p202512 VALUES LESS THAN (202601), +-- PARTITION p_future VALUES LESS THAN MAXVALUE +-- ); + +-- 插入电池实时数据示例(最近24小时的数据) +INSERT INTO `bms_battery_data` VALUES +-- BOX001-电池01的实时数据 +(1, 1, 1, 'BAT001-01', '2025-01-22 10:30:00', 6.38, 1.2, 7.66, 85.2, 98.5, 85.2, 24.1, 0.0025, 156, 2, 0, 0, 2, 1, 0, 0, NULL, '2025-01-22 08:30:00', '2025-01-21 18:45:00', '2025-01-22 02:15:00', 'MQTT', '{"voltage":6.38,"current":1.2,"temperature":24.1,"soc":85.2}', '2025-01-22 10:30:00'), +(2, 1, 1, 'BAT001-01', '2025-01-22 10:25:00', 6.37, 1.1, 7.01, 85.0, 98.5, 85.0, 24.0, 0.0025, 156, 2, 0, 0, 2, 1, 0, 0, NULL, '2025-01-22 08:30:00', '2025-01-21 18:45:00', '2025-01-22 02:15:00', 'MQTT', '{"voltage":6.37,"current":1.1,"temperature":24.0,"soc":85.0}', '2025-01-22 10:25:00'), +(3, 1, 1, 'BAT001-01', '2025-01-22 10:20:00', 6.39, 1.3, 8.31, 85.4, 98.5, 85.4, 24.2, 0.0025, 156, 2, 0, 0, 2, 1, 0, 0, NULL, '2025-01-22 08:30:00', '2025-01-21 18:45:00', '2025-01-22 02:15:00', 'MQTT', '{"voltage":6.39,"current":1.3,"temperature":24.2,"soc":85.4}', '2025-01-22 10:20:00'), + +-- BOX001-电池02的实时数据 +(4, 2, 1, 'BAT001-02', '2025-01-22 10:30:00', 6.41, 1.3, 8.33, 86.1, 98.2, 86.1, 24.3, 0.0024, 156, 1, 0, 0, 2, 1, 0, 0, NULL, '2025-01-22 08:30:00', '2025-01-21 18:45:00', '2025-01-22 02:15:00', 'MQTT', '{"voltage":6.41,"current":1.3,"temperature":24.3,"soc":86.1}', '2025-01-22 10:30:00'), +(5, 2, 1, 'BAT001-02', '2025-01-22 10:25:00', 6.40, 1.2, 7.68, 85.9, 98.2, 85.9, 24.2, 0.0024, 156, 1, 0, 0, 2, 1, 0, 0, NULL, '2025-01-22 08:30:00', '2025-01-21 18:45:00', '2025-01-22 02:15:00', 'MQTT', '{"voltage":6.40,"current":1.2,"temperature":24.2,"soc":85.9}', '2025-01-22 10:25:00'), + +-- BOX002-电池01的实时数据 +(6, 9, 2, 'BAT002-01', '2025-01-22 10:25:00', 6.45, 1.5, 9.68, 92.1, 96.8, 92.1, 25.2, 0.0022, 89, 1, 0, 0, 2, 1, 0, 0, NULL, '2025-01-22 09:15:00', '2025-01-21 20:30:00', '2025-01-22 03:20:00', 'MQTT', '{"voltage":6.45,"current":1.5,"temperature":25.2,"soc":92.1}', '2025-01-22 10:25:00'), +(7, 9, 2, 'BAT002-01', '2025-01-22 10:20:00', 6.44, 1.4, 9.02, 91.9, 96.8, 91.9, 25.1, 0.0022, 89, 1, 0, 0, 2, 1, 0, 0, NULL, '2025-01-22 09:15:00', '2025-01-21 20:30:00', '2025-01-22 03:20:00', 'MQTT', '{"voltage":6.44,"current":1.4,"temperature":25.1,"soc":91.9}', '2025-01-22 10:20:00'), + +-- BOX003-电池01的实时数据(故障状态) +(8, 21, 3, 'BAT003-01', '2025-01-22 09:45:00', 6.20, 0.0, 0.0, 78.5, 95.2, 78.5, 27.8, 0.0035, 234, 5, 1, 2, 4, 0, 0, 1, '电压过低告警', '2025-01-21 16:20:00', '2025-01-21 22:10:00', '2025-01-21 23:45:00', 'MQTT', '{"voltage":6.20,"current":0.0,"temperature":27.8,"soc":78.5,"alarm":"电压过低"}', '2025-01-22 09:45:00'), +(9, 21, 3, 'BAT003-01', '2025-01-22 09:40:00', 6.18, 0.0, 0.0, 78.3, 95.2, 78.3, 27.9, 0.0035, 234, 5, 1, 2, 4, 0, 0, 1, '电压过低告警', '2025-01-21 16:20:00', '2025-01-21 22:10:00', '2025-01-21 23:45:00', 'MQTT', '{"voltage":6.18,"current":0.0,"temperature":27.9,"soc":78.3,"alarm":"电压过低"}', '2025-01-22 09:40:00'), + +-- BOX003-电池03的实时数据(高温故障) +(10, 23, 3, 'BAT003-03', '2025-01-22 09:45:00', 6.18, 0.0, 0.0, 77.8, 94.9, 77.8, 29.5, 0.0038, 234, 6, 2, 3, 4, 0, 0, 1, '温度过高告警,电压异常', '2025-01-21 16:20:00', '2025-01-21 22:10:00', '2025-01-21 23:45:00', 'MQTT', '{"voltage":6.18,"current":0.0,"temperature":29.5,"soc":77.8,"alarm":"温度过高,电压异常"}', '2025-01-22 09:45:00'), +(11, 23, 3, 'BAT003-03', '2025-01-22 09:40:00', 6.16, 0.0, 0.0, 77.6, 94.9, 77.6, 29.8, 0.0038, 234, 6, 2, 3, 4, 0, 0, 1, '温度过高告警,电压异常', '2025-01-21 16:20:00', '2025-01-21 22:10:00', '2025-01-21 23:45:00', 'MQTT', '{"voltage":6.16,"current":0.0,"temperature":29.8,"soc":77.6,"alarm":"温度过高,电压异常"}', '2025-01-22 09:40:00'); \ No newline at end of file diff --git a/sql/bms_box_device.sql b/sql/bms_box_device.sql new file mode 100644 index 0000000..a17bcdd --- /dev/null +++ b/sql/bms_box_device.sql @@ -0,0 +1,54 @@ +-- BOX设备表 +DROP TABLE IF EXISTS `bms_box_device`; +CREATE TABLE `bms_box_device` ( + `box_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'BOX设备ID', + `box_code` varchar(50) NOT NULL COMMENT 'BOX设备编号', + `box_name` varchar(100) NOT NULL COMMENT 'BOX设备名称', + `box_type` varchar(50) DEFAULT NULL COMMENT 'BOX设备类型', + `manufacturer` varchar(100) DEFAULT NULL COMMENT '制造商', + `model` varchar(100) DEFAULT NULL COMMENT '型号', + `serial_number` varchar(100) DEFAULT NULL COMMENT '序列号', + `firmware_version` varchar(50) DEFAULT NULL COMMENT '固件版本', + `hardware_version` varchar(50) DEFAULT NULL COMMENT '硬件版本', + `install_location` varchar(200) DEFAULT NULL COMMENT '安装位置', + `install_date` datetime DEFAULT NULL COMMENT '安装日期', + `status` tinyint(1) DEFAULT '1' COMMENT '设备状态(0离线 1在线 2故障 3维护)', + `communication_protocol` varchar(50) DEFAULT 'MQTT' COMMENT '通信协议', + `ip_address` varchar(50) DEFAULT NULL COMMENT 'IP地址', + `port` int(11) DEFAULT NULL COMMENT '端口号', + `battery_count` int(11) DEFAULT '0' COMMENT '电池数量', + `total_capacity` decimal(10,2) DEFAULT '0.00' COMMENT '总容量(Ah)', + `total_voltage` decimal(8,2) DEFAULT '0.00' COMMENT '总电压(V)', + `total_current` decimal(8,2) DEFAULT '0.00' COMMENT '总电流(A)', + `total_power` decimal(10,2) DEFAULT '0.00' COMMENT '总功率(W)', + `soc` decimal(5,2) DEFAULT '0.00' COMMENT '电量百分比(%)', + `soh` decimal(5,2) DEFAULT '100.00' COMMENT '健康状态(%)', + `max_temperature` decimal(5,2) DEFAULT '0.00' COMMENT '最高温度(°C)', + `min_temperature` decimal(5,2) DEFAULT '0.00' COMMENT '最低温度(°C)', + `avg_temperature` decimal(5,2) DEFAULT '0.00' COMMENT '平均温度(°C)', + `charge_cycles` int(11) DEFAULT '0' COMMENT '充电循环次数', + `last_charge_time` datetime DEFAULT NULL COMMENT '最后充电时间', + `last_discharge_time` datetime DEFAULT NULL COMMENT '最后放电时间', + `last_comm_time` datetime DEFAULT NULL COMMENT '最后通信时间', + `alarm_status` tinyint(1) DEFAULT '0' COMMENT '告警状态(0正常 1告警)', + `alarm_info` text COMMENT '告警信息', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `version` int(11) DEFAULT '0' COMMENT '乐观锁版本号', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`box_id`), + UNIQUE KEY `uk_box_code` (`box_code`), + KEY `idx_box_type` (`box_type`), + KEY `idx_status` (`status`), + KEY `idx_last_comm_time` (`last_comm_time`), + KEY `idx_install_location` (`install_location`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='BOX设备表'; + +-- 插入示例数据 +INSERT INTO `bms_box_device` VALUES +(1, 'BOX001', 'BOX设备001', 'Industrial', 'EvoBMS', 'EVO-BOX-100', 'SN20250001', 'V1.2.0', 'V1.0', '车间A-01', '2025-01-01 10:00:00', 1, 'MQTT', '192.168.1.100', 1883, 8, 800.00, 51.2, 10.5, 537.6, 85.5, 98.2, 25.6, 23.1, 24.2, 156, '2025-01-22 08:30:00', '2025-01-21 18:45:00', '2025-01-22 10:30:00', 0, NULL, 'admin', '2025-01-01 10:00:00', 'admin', '2025-01-22 10:30:00', '0', 0, 'BOX设备001'), +(2, 'BOX002', 'BOX设备002', 'Commercial', 'EvoBMS', 'EVO-BOX-200', 'SN20250002', 'V1.2.0', 'V1.0', '车间B-02', '2025-01-02 14:00:00', 1, 'MQTT', '192.168.1.101', 1883, 12, 1200.00, 76.8, 15.2, 1167.36, 92.3, 96.8, 26.8, 24.5, 25.4, 89, '2025-01-22 09:15:00', '2025-01-21 20:30:00', '2025-01-22 10:25:00', 0, NULL, 'admin', '2025-01-02 14:00:00', 'admin', '2025-01-22 10:25:00', '0', 0, 'BOX设备002'), +(3, 'BOX003', 'BOX设备003', 'Industrial', 'EvoBMS', 'EVO-BOX-100', 'SN20250003', 'V1.1.5', 'V1.0', '车间C-03', '2025-01-03 09:30:00', 2, 'MQTT', '192.168.1.102', 1883, 6, 600.00, 38.4, 0.0, 0.0, 0.0, 95.5, 28.9, 27.2, 28.1, 234, '2025-01-21 16:20:00', '2025-01-21 22:10:00', '2025-01-22 09:45:00', 1, '电池模块3温度过高', 'admin', '2025-01-03 09:30:00', 'admin', '2025-01-22 09:45:00', '0', 0, 'BOX设备003-故障中'); \ No newline at end of file diff --git a/sql/bms_device.sql b/sql/bms_device.sql new file mode 100644 index 0000000..0976cf7 --- /dev/null +++ b/sql/bms_device.sql @@ -0,0 +1,38 @@ +-- ---------------------------- +-- BMS设备表 +-- ---------------------------- +DROP TABLE IF EXISTS `bms_device`; +CREATE TABLE `bms_device` ( + `device_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '设备ID', + `device_code` varchar(64) NOT NULL COMMENT '设备编号', + `device_name` varchar(100) NOT NULL COMMENT '设备名称', + `device_type` varchar(50) DEFAULT NULL COMMENT '设备类型', + `status` char(1) DEFAULT '0' COMMENT '设备状态(0正常 1停用)', + `battery_capacity` decimal(10,2) DEFAULT NULL COMMENT '电池容量(Ah)', + `rated_voltage` decimal(10,2) DEFAULT NULL COMMENT '额定电压(V)', + `current_voltage` decimal(10,2) DEFAULT NULL COMMENT '当前电压(V)', + `current_current` decimal(10,2) DEFAULT NULL COMMENT '当前电流(A)', + `remaining_capacity` decimal(5,2) DEFAULT NULL COMMENT '剩余电量(%)', + `temperature` decimal(5,2) DEFAULT NULL COMMENT '温度(℃)', + `last_comm_time` datetime DEFAULT NULL COMMENT '最后通信时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `version` int(11) DEFAULT '0' COMMENT '版本号(乐观锁)', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`device_id`), + UNIQUE KEY `uk_device_code` (`device_code`), + KEY `idx_device_type` (`device_type`), + KEY `idx_status` (`status`), + KEY `idx_last_comm_time` (`last_comm_time`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='BMS设备表'; + +-- ---------------------------- +-- 初始化BMS设备数据 +-- ---------------------------- +INSERT INTO `bms_device` VALUES +(1, 'BMS001', '1号电池管理系统', 'LiFePO4', '0', 100.00, 48.00, 48.50, 10.20, 85.50, 25.30, '2025-01-22 10:30:00', '0', 0, 'admin', '2025-01-22 10:00:00', '', NULL, '测试设备1'), +(2, 'BMS002', '2号电池管理系统', 'LiFePO4', '0', 200.00, 48.00, 47.80, -5.60, 72.30, 26.10, '2025-01-22 10:25:00', '0', 0, 'admin', '2025-01-22 10:00:00', '', NULL, '测试设备2'), +(3, 'BMS003', '3号电池管理系统', 'NCM', '1', 150.00, 52.00, 0.00, 0.00, 0.00, 0.00, NULL, '0', 0, 'admin', '2025-01-22 10:00:00', '', NULL, '停用设备'); \ No newline at end of file diff --git a/sql/quartz.sql b/sql/quartz.sql new file mode 100644 index 0000000..cee613b --- /dev/null +++ b/sql/quartz.sql @@ -0,0 +1,174 @@ +DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; +DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; +DROP TABLE IF EXISTS QRTZ_LOCKS; +DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; +DROP TABLE IF EXISTS QRTZ_CALENDARS; + +-- ---------------------------- +-- 1、存储每一个已配置的 jobDetail 的详细信息 +-- ---------------------------- +create table QRTZ_JOB_DETAILS ( + sched_name varchar(120) not null comment '调度名称', + job_name varchar(200) not null comment '任务名称', + job_group varchar(200) not null comment '任务组名', + description varchar(250) null comment '相关介绍', + job_class_name varchar(250) not null comment '执行任务类名称', + is_durable varchar(1) not null comment '是否持久化', + is_nonconcurrent varchar(1) not null comment '是否并发', + is_update_data varchar(1) not null comment '是否更新数据', + requests_recovery varchar(1) not null comment '是否接受恢复执行', + job_data blob null comment '存放持久化job对象', + primary key (sched_name, job_name, job_group) +) engine=innodb comment = '任务详细信息表'; + +-- ---------------------------- +-- 2、 存储已配置的 Trigger 的信息 +-- ---------------------------- +create table QRTZ_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment '触发器的名字', + trigger_group varchar(200) not null comment '触发器所属组的名字', + job_name varchar(200) not null comment 'qrtz_job_details表job_name的外键', + job_group varchar(200) not null comment 'qrtz_job_details表job_group的外键', + description varchar(250) null comment '相关介绍', + next_fire_time bigint(13) null comment '上一次触发时间(毫秒)', + prev_fire_time bigint(13) null comment '下一次触发时间(默认为-1表示不触发)', + priority integer null comment '优先级', + trigger_state varchar(16) not null comment '触发器状态', + trigger_type varchar(8) not null comment '触发器的类型', + start_time bigint(13) not null comment '开始时间', + end_time bigint(13) null comment '结束时间', + calendar_name varchar(200) null comment '日程表名称', + misfire_instr smallint(2) null comment '补偿执行的策略', + job_data blob null comment '存放持久化job对象', + 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 comment = '触发器详细信息表'; + +-- ---------------------------- +-- 3、 存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数 +-- ---------------------------- +create table QRTZ_SIMPLE_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + repeat_count bigint(7) not null comment '重复的次数统计', + repeat_interval bigint(12) not null comment '重复的间隔时间', + times_triggered bigint(10) not null comment '已经触发的次数', + 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 comment = '简单触发器的信息表'; + +-- ---------------------------- +-- 4、 存储 Cron Trigger,包括 Cron 表达式和时区信息 +-- ---------------------------- +create table QRTZ_CRON_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + cron_expression varchar(200) not null comment 'cron表达式', + time_zone_id varchar(80) comment '时区', + 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 comment = 'Cron类型的触发器表'; + +-- ---------------------------- +-- 5、 Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候) +-- ---------------------------- +create table QRTZ_BLOB_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + blob_data blob null comment '存放持久化Trigger对象', + 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 comment = 'Blob类型的触发器表'; + +-- ---------------------------- +-- 6、 以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围 +-- ---------------------------- +create table QRTZ_CALENDARS ( + sched_name varchar(120) not null comment '调度名称', + calendar_name varchar(200) not null comment '日历名称', + calendar blob not null comment '存放持久化calendar对象', + primary key (sched_name, calendar_name) +) engine=innodb comment = '日历信息表'; + +-- ---------------------------- +-- 7、 存储已暂停的 Trigger 组的信息 +-- ---------------------------- +create table QRTZ_PAUSED_TRIGGER_GRPS ( + sched_name varchar(120) not null comment '调度名称', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + primary key (sched_name, trigger_group) +) engine=innodb comment = '暂停的触发器表'; + +-- ---------------------------- +-- 8、 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息 +-- ---------------------------- +create table QRTZ_FIRED_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + entry_id varchar(95) not null comment '调度器实例id', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + instance_name varchar(200) not null comment '调度器实例名', + fired_time bigint(13) not null comment '触发的时间', + sched_time bigint(13) not null comment '定时器制定的时间', + priority integer not null comment '优先级', + state varchar(16) not null comment '状态', + job_name varchar(200) null comment '任务名称', + job_group varchar(200) null comment '任务组名', + is_nonconcurrent varchar(1) null comment '是否并发', + requests_recovery varchar(1) null comment '是否接受恢复执行', + primary key (sched_name, entry_id) +) engine=innodb comment = '已触发的触发器表'; + +-- ---------------------------- +-- 9、 存储少量的有关 Scheduler 的状态信息,假如是用于集群中,可以看到其他的 Scheduler 实例 +-- ---------------------------- +create table QRTZ_SCHEDULER_STATE ( + sched_name varchar(120) not null comment '调度名称', + instance_name varchar(200) not null comment '实例名称', + last_checkin_time bigint(13) not null comment '上次检查时间', + checkin_interval bigint(13) not null comment '检查间隔时间', + primary key (sched_name, instance_name) +) engine=innodb comment = '调度器状态表'; + +-- ---------------------------- +-- 10、 存储程序的悲观锁的信息(假如使用了悲观锁) +-- ---------------------------- +create table QRTZ_LOCKS ( + sched_name varchar(120) not null comment '调度名称', + lock_name varchar(40) not null comment '悲观锁名称', + primary key (sched_name, lock_name) +) engine=innodb comment = '存储的悲观锁信息表'; + +-- ---------------------------- +-- 11、 Quartz集群实现同步机制的行锁表 +-- ---------------------------- +create table QRTZ_SIMPROP_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + str_prop_1 varchar(512) null comment 'String类型的trigger的第一个参数', + str_prop_2 varchar(512) null comment 'String类型的trigger的第二个参数', + str_prop_3 varchar(512) null comment 'String类型的trigger的第三个参数', + int_prop_1 int null comment 'int类型的trigger的第一个参数', + int_prop_2 int null comment 'int类型的trigger的第二个参数', + long_prop_1 bigint null comment 'long类型的trigger的第一个参数', + long_prop_2 bigint null comment 'long类型的trigger的第二个参数', + dec_prop_1 numeric(13,4) null comment 'decimal类型的trigger的第一个参数', + dec_prop_2 numeric(13,4) null comment 'decimal类型的trigger的第二个参数', + bool_prop_1 varchar(1) null comment 'Boolean类型的trigger的第一个参数', + bool_prop_2 varchar(1) null comment 'Boolean类型的trigger的第二个参数', + 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 comment = '同步机制的行锁表'; + +commit; \ No newline at end of file diff --git a/sql/ry_20250522.sql b/sql/ry_20250522.sql new file mode 100644 index 0000000..20e3827 --- /dev/null +++ b/sql/ry_20250522.sql @@ -0,0 +1,704 @@ +-- ---------------------------- +-- 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 '父部门id', + 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正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + 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', sysdate(), '', null); +insert into sys_dept values(101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(102, 100, '0,100', '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(103, 101, '0,100,101', '研发部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(104, 101, '0,100,101', '市场部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(105, 101, '0,100,101', '测试部门', 3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(106, 101, '0,100,101', '财务部门', 4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(107, 101, '0,100,101', '运维部门', 5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); + + +-- ---------------------------- +-- 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正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + login_ip varchar(128) default '' comment '最后登录IP', + login_date datetime comment '最后登录时间', + pwd_update_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', sysdate(), sysdate(), 'admin', sysdate(), '', null, '管理员'); +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', sysdate(), sysdate(), 'admin', sysdate(), '', null, '测试员'); + + +-- ---------------------------- +-- 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正常 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', '董事长', 1, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(2, 'se', '项目经理', 2, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(3, 'hr', '人力资源', 3, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(4, 'user', '普通员工', 4, '0', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 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正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + 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', sysdate(), '', null, '超级管理员'); +insert into sys_role values('2', '普通角色', 'common', 2, 2, 1, 1, '0', '0', 'admin', sysdate(), '', null, '普通角色'); + + +-- ---------------------------- +-- 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 '父菜单ID', + order_num int(4) default 0 comment '显示顺序', + path varchar(200) default '' comment '路由地址', + component varchar(255) default null comment '组件路径', + query varchar(255) default null comment '路由参数', + route_name varchar(50) default '' 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 '菜单类型(M目录 C菜单 F按钮)', + visible char(1) default 0 comment '菜单状态(0显示 1隐藏)', + status char(1) default 0 comment '菜单状态(0正常 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', sysdate(), '', null, '系统管理目录'); +insert into sys_menu values('2', '系统监控', '0', '2', 'monitor', null, '', '', 1, 0, 'M', '0', '0', '', 'monitor', 'admin', sysdate(), '', null, '系统监控目录'); +insert into sys_menu values('3', '系统工具', '0', '3', 'tool', null, '', '', 1, 0, 'M', '0', '0', '', 'tool', 'admin', sysdate(), '', null, '系统工具目录'); +insert into sys_menu values('4', '若依官网', '0', '4', 'http://ruoyi.vip', null, '', '', 0, 0, 'M', '0', '0', '', 'guide', 'admin', sysdate(), '', null, '若依官网地址'); +-- 二级菜单 +insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system/user/index', '', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', sysdate(), '', null, '用户管理菜单'); +insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system/role/index', '', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', sysdate(), '', null, '角色管理菜单'); +insert into sys_menu values('102', '菜单管理', '1', '3', 'menu', 'system/menu/index', '', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', sysdate(), '', null, '菜单管理菜单'); +insert into sys_menu values('103', '部门管理', '1', '4', 'dept', 'system/dept/index', '', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', sysdate(), '', null, '部门管理菜单'); +insert into sys_menu values('104', '岗位管理', '1', '5', 'post', 'system/post/index', '', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', sysdate(), '', null, '岗位管理菜单'); +insert into sys_menu values('105', '字典管理', '1', '6', 'dict', 'system/dict/index', '', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', sysdate(), '', null, '字典管理菜单'); +insert into sys_menu values('106', '参数设置', '1', '7', 'config', 'system/config/index', '', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', sysdate(), '', null, '参数设置菜单'); +insert into sys_menu values('107', '通知公告', '1', '8', 'notice', 'system/notice/index', '', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 'admin', sysdate(), '', null, '通知公告菜单'); +insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', '', 1, 0, 'M', '0', '0', '', 'log', 'admin', sysdate(), '', null, '日志管理菜单'); +insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 'admin', sysdate(), '', null, '在线用户菜单'); +insert into sys_menu values('110', '定时任务', '2', '2', 'job', 'monitor/job/index', '', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', sysdate(), '', null, '定时任务菜单'); +insert into sys_menu values('111', '数据监控', '2', '3', 'druid', 'monitor/druid/index', '', '', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'druid', 'admin', sysdate(), '', null, '数据监控菜单'); +insert into sys_menu values('112', '服务监控', '2', '4', 'server', 'monitor/server/index', '', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', sysdate(), '', null, '服务监控菜单'); +insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 'admin', sysdate(), '', null, '缓存监控菜单'); +insert into sys_menu values('114', '缓存列表', '2', '6', 'cacheList', 'monitor/cache/list', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis-list', 'admin', sysdate(), '', null, '缓存列表菜单'); +insert into sys_menu values('115', '表单构建', '3', '1', 'build', 'tool/build/index', '', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', sysdate(), '', null, '表单构建菜单'); +insert into sys_menu values('116', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', sysdate(), '', null, '代码生成菜单'); +insert into sys_menu values('117', '系统接口', '3', '3', 'swagger', 'tool/swagger/index', '', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', sysdate(), '', null, '系统接口菜单'); +-- 三级菜单 +insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 'admin', sysdate(), '', null, '操作日志菜单'); +insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 'admin', sysdate(), '', null, '登录日志菜单'); +-- 用户管理按钮 +insert into sys_menu values('1000', '用户查询', '100', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1001', '用户新增', '100', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1002', '用户修改', '100', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1003', '用户删除', '100', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1004', '用户导出', '100', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1005', '用户导入', '100', '6', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1006', '重置密码', '100', '7', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', sysdate(), '', null, ''); +-- 角色管理按钮 +insert into sys_menu values('1007', '角色查询', '101', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1008', '角色新增', '101', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1009', '角色修改', '101', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1010', '角色删除', '101', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1011', '角色导出', '101', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', sysdate(), '', null, ''); +-- 菜单管理按钮 +insert into sys_menu values('1012', '菜单查询', '102', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1013', '菜单新增', '102', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1014', '菜单修改', '102', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1015', '菜单删除', '102', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', sysdate(), '', null, ''); +-- 部门管理按钮 +insert into sys_menu values('1016', '部门查询', '103', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1017', '部门新增', '103', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1018', '部门修改', '103', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1019', '部门删除', '103', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', sysdate(), '', null, ''); +-- 岗位管理按钮 +insert into sys_menu values('1020', '岗位查询', '104', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1021', '岗位新增', '104', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1022', '岗位修改', '104', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1023', '岗位删除', '104', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1024', '岗位导出', '104', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', sysdate(), '', null, ''); +-- 字典管理按钮 +insert into sys_menu values('1025', '字典查询', '105', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1026', '字典新增', '105', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1027', '字典修改', '105', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1028', '字典删除', '105', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1029', '字典导出', '105', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', sysdate(), '', null, ''); +-- 参数设置按钮 +insert into sys_menu values('1030', '参数查询', '106', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1031', '参数新增', '106', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1032', '参数修改', '106', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1033', '参数删除', '106', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1034', '参数导出', '106', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', sysdate(), '', null, ''); +-- 通知公告按钮 +insert into sys_menu values('1035', '公告查询', '107', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1036', '公告新增', '107', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1037', '公告修改', '107', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1038', '公告删除', '107', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', sysdate(), '', null, ''); +-- 操作日志按钮 +insert into sys_menu values('1039', '操作查询', '500', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1040', '操作删除', '500', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1041', '日志导出', '500', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', sysdate(), '', null, ''); +-- 登录日志按钮 +insert into sys_menu values('1042', '登录查询', '501', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1043', '登录删除', '501', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1044', '日志导出', '501', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1045', '账户解锁', '501', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 'admin', sysdate(), '', null, ''); +-- 在线用户按钮 +insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', sysdate(), '', null, ''); +-- 定时任务按钮 +insert into sys_menu values('1049', '任务查询', '110', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1050', '任务新增', '110', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1051', '任务修改', '110', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1052', '任务删除', '110', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1053', '状态修改', '110', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1054', '任务导出', '110', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', sysdate(), '', null, ''); +-- 代码生成按钮 +insert into sys_menu values('1055', '生成查询', '116', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1056', '生成修改', '116', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1057', '生成删除', '116', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1058', '导入代码', '116', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1059', '预览代码', '116', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1060', '生成代码', '116', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 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', '117'); +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'); + +-- ---------------------------- +-- 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(200) 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(128) 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正常 1异常)', + error_msg varchar(2000) default '' comment '错误消息', + oper_time datetime comment '操作时间', + cost_time bigint(20) default 0 comment '消耗时间', + primary key (oper_id), + key idx_sys_oper_log_bt (business_type), + key idx_sys_oper_log_s (status), + key idx_sys_oper_log_ot (oper_time) +) 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正常 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', sysdate(), '', null, '用户性别列表'); +insert into sys_dict_type values(2, '菜单状态', 'sys_show_hide', '0', 'admin', sysdate(), '', null, '菜单状态列表'); +insert into sys_dict_type values(3, '系统开关', 'sys_normal_disable', '0', 'admin', sysdate(), '', null, '系统开关列表'); +insert into sys_dict_type values(4, '任务状态', 'sys_job_status', '0', 'admin', sysdate(), '', null, '任务状态列表'); +insert into sys_dict_type values(5, '任务分组', 'sys_job_group', '0', 'admin', sysdate(), '', null, '任务分组列表'); +insert into sys_dict_type values(6, '系统是否', 'sys_yes_no', '0', 'admin', sysdate(), '', null, '系统是否列表'); +insert into sys_dict_type values(7, '通知类型', 'sys_notice_type', '0', 'admin', sysdate(), '', null, '通知类型列表'); +insert into sys_dict_type values(8, '通知状态', 'sys_notice_status', '0', 'admin', sysdate(), '', null, '通知状态列表'); +insert into sys_dict_type values(9, '操作类型', 'sys_oper_type', '0', 'admin', sysdate(), '', null, '操作类型列表'); +insert into sys_dict_type values(10, '系统状态', 'sys_common_status', '0', 'admin', sysdate(), '', null, '登录状态列表'); + + +-- ---------------------------- +-- 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 '是否默认(Y是 N否)', + status char(1) default '0' comment '状态(0正常 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', sysdate(), '', null, '性别男'); +insert into sys_dict_data values(2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别女'); +insert into sys_dict_data values(3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别未知'); +insert into sys_dict_data values(4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '显示菜单'); +insert into sys_dict_data values(5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '隐藏菜单'); +insert into sys_dict_data values(6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); +insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); +insert into sys_dict_data values(10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', sysdate(), '', null, '默认分组'); +insert into sys_dict_data values(11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', sysdate(), '', null, '系统分组'); +insert into sys_dict_data values(12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '系统默认是'); +insert into sys_dict_data values(13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '系统默认否'); +insert into sys_dict_data values(14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', sysdate(), '', null, '通知'); +insert into sys_dict_data values(15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', sysdate(), '', null, '公告'); +insert into sys_dict_data values(16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '关闭状态'); +insert into sys_dict_data values(18, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '其他操作'); +insert into sys_dict_data values(19, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '新增操作'); +insert into sys_dict_data values(20, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '修改操作'); +insert into sys_dict_data values(21, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '删除操作'); +insert into sys_dict_data values(22, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '授权操作'); +insert into sys_dict_data values(23, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导出操作'); +insert into sys_dict_data values(24, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导入操作'); +insert into sys_dict_data values(25, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '强退操作'); +insert into sys_dict_data values(26, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '生成操作'); +insert into sys_dict_data values(27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '清空操作'); +insert into sys_dict_data values(28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); + + +-- ---------------------------- +-- 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 '系统内置(Y是 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', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' ); +insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', sysdate(), '', null, '初始化密码 123456' ); +insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' ); +insert into sys_config values(4, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启验证码功能(true开启,false关闭)'); +insert into sys_config values(5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', sysdate(), '', null, '是否开启注册用户功能(true开启,false关闭)'); +insert into sys_config values(6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', sysdate(), '', null, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)'); +insert into sys_config values(7, '用户管理-初始密码修改策略', 'sys.account.initPasswordModify', '1', 'Y', 'admin', sysdate(), '', null, '0:初始密码修改策略关闭,没有任何提示,1:提醒用户,如果未修改初始密码,则在登录时就会提醒修改密码对话框'); +insert into sys_config values(8, '用户管理-账号密码更新周期', 'sys.account.passwordValidateDays', '0', 'Y', 'admin', sysdate(), '', null, '密码更新周期(填写数字,数据初始化值为0不限制,若修改必须为大于0小于365的正整数),如果超过这个周期登录系统时,则在登录时就会提醒修改密码对话框'); + + +-- ---------------------------- +-- 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(128) default '' comment '登录IP地址', + login_location varchar(255) default '' comment '登录地点', + browser varchar(50) default '' comment '浏览器类型', + os varchar(50) default '' comment '操作系统', + status char(1) default '0' comment '登录状态(0成功 1失败)', + msg varchar(255) default '' comment '提示消息', + login_time datetime comment '访问时间', + primary key (info_id), + key idx_sys_logininfor_s (status), + key idx_sys_logininfor_lt (login_time) +) 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正常 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', sysdate(), '', null, ''); +insert into sys_job values(2, '系统默认(有参)', 'DEFAULT', 'ryTask.ryParams(\'ry\')', '0/15 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, ''); +insert into sys_job values(3, '系统默认(多参)', 'DEFAULT', 'ryTask.ryMultipleParams(\'ry\', true, 2000L, 316.50D, 100)', '0/20 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 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正常 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正常 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', sysdate(), '', null, '管理员'); +insert into sys_notice values('2', '维护通知:2018-07-01 若依系统凌晨维护', '1', '维护内容', '0', 'admin', sysdate(), '', null, '管理员'); + + +-- ---------------------------- +-- 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树表操作)', + tpl_web_type varchar(30) default '' comment '前端模板类型(element-ui模版 element-plus模版)', + 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 '生成代码方式(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 = '代码生成业务表'; + + +-- ---------------------------- +-- 19、代码生成业务表字段 +-- ---------------------------- +drop table if exists gen_table_column; +create table gen_table_column ( + column_id bigint(20) not null auto_increment comment '编号', + table_id bigint(20) 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 = '代码生成业务表字段'; \ No newline at end of file diff --git a/src/main/java/com/evobms/EVOBMSApplication.java b/src/main/java/com/evobms/EVOBMSApplication.java new file mode 100644 index 0000000..e11b9a6 --- /dev/null +++ b/src/main/java/com/evobms/EVOBMSApplication.java @@ -0,0 +1,30 @@ +package com.evobms; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +/** + * 启动程序 + * + * @author ruoyi + */ +@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +public class EVOBMSApplication +{ + public static void main(String[] args) + { + // System.setProperty("spring.devtools.restart.enabled", "false"); + SpringApplication.run(EVOBMSApplication.class, args); + System.out.println("(♥◠‿◠)ノ゙ BMS启动成功 ლ(´ڡ`ლ)゙ \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} diff --git a/src/main/java/com/evobms/RuoYiServletInitializer.java b/src/main/java/com/evobms/RuoYiServletInitializer.java new file mode 100644 index 0000000..f323394 --- /dev/null +++ b/src/main/java/com/evobms/RuoYiServletInitializer.java @@ -0,0 +1,18 @@ +package com.evobms; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web容器中进行部署 + * + * @author ruoyi + */ +public class RuoYiServletInitializer extends SpringBootServletInitializer +{ + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) + { + return application.sources(EVOBMSApplication.class); + } +} diff --git a/src/main/java/com/evobms/common/constant/BboxApiConstants.java b/src/main/java/com/evobms/common/constant/BboxApiConstants.java new file mode 100644 index 0000000..1509fee --- /dev/null +++ b/src/main/java/com/evobms/common/constant/BboxApiConstants.java @@ -0,0 +1,26 @@ +package com.evobms.common.constant; + +/** + * BBOX 接口业务状态码常量 + * 对应《羿动新能源-BBOX接口规范 v1.1》中的返回码。 + */ +public final class BboxApiConstants { + + private BboxApiConstants() {} + + // 标准HTTP与业务扩展状态码 + public static final int CODE_SUCCESS = 200; // 成功 + public static final int CODE_NOT_FOUND = 404; // 接口不存在 + public static final int CODE_UNAUTHORIZED = 401; // 未授权 + public static final int CODE_DEVICE_NOT_REGISTERED = 901; // 设备未在平台注册,如平台未录入 + public static final int CODE_DEVICE_DISABLED = 902; // 设备已被禁用 + public static final int CODE_FILE_NOT_FOUND = 903; // 文件不存在 + + // 对应消息文本(可用于统一提示) + public static final String MSG_SUCCESS = "成功"; + public static final String MSG_NOT_FOUND = "接口不存在"; + public static final String MSG_UNAUTHORIZED = "未授权"; + public static final String MSG_DEVICE_NOT_REGISTERED = "设备未在平台注册,如平台未录入"; + public static final String MSG_DEVICE_DISABLED = "设备已被禁用"; + public static final String MSG_FILE_NOT_FOUND = "文件不存在"; +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/constant/CacheConstants.java b/src/main/java/com/evobms/common/constant/CacheConstants.java new file mode 100644 index 0000000..efb8705 --- /dev/null +++ b/src/main/java/com/evobms/common/constant/CacheConstants.java @@ -0,0 +1,44 @@ +package com.evobms.common.constant; + +/** + * 缓存的key 常量 + * + * @author ruoyi + */ +public class CacheConstants +{ + /** + * 登录用户 redis key + */ + public static final String LOGIN_TOKEN_KEY = "login_tokens:"; + + /** + * 验证码 redis key + */ + public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; + + /** + * 参数管理 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 防重提交 redis key + */ + public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; + + /** + * 限流 redis key + */ + public static final String RATE_LIMIT_KEY = "rate_limit:"; + + /** + * 登录账户密码错误次数 redis key + */ + public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; +} diff --git a/src/main/java/com/evobms/common/constant/Constants.java b/src/main/java/com/evobms/common/constant/Constants.java new file mode 100644 index 0000000..7408365 --- /dev/null +++ b/src/main/java/com/evobms/common/constant/Constants.java @@ -0,0 +1,173 @@ +package com.evobms.common.constant; + +import java.util.Locale; +import io.jsonwebtoken.Claims; + +/** + * 通用常量信息 + * + * @author ruoyi + */ +public class Constants +{ + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * 系统语言 + */ + public static final Locale DEFAULT_LOCALE = Locale.SIMPLIFIED_CHINESE; + + /** + * www主域 + */ + public static final String WWW = "www."; + + /** + * http请求 + */ + public static final String HTTP = "http://"; + + /** + * https请求 + */ + public static final String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + public static final String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + public static final String FAIL = "1"; + + /** + * 登录成功 + */ + 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 ALL_PERMISSION = "*:*:*"; + + /** + * 管理员角色权限标识 + */ + public static final String SUPER_ADMIN = "admin"; + + /** + * 角色权限分隔符 + */ + public static final String ROLE_DELIMETER = ","; + + /** + * 权限标识分隔符 + */ + public static final String PERMISSION_DELIMETER = ","; + + /** + * 验证码有效期(分钟) + */ + public static final Integer CAPTCHA_EXPIRATION = 2; + + /** + * 令牌 + */ + public static final String TOKEN = "token"; + + /** + * 令牌前缀 + */ + public static final String TOKEN_PREFIX = "Bearer "; + + /** + * 令牌前缀 + */ + public static final String LOGIN_USER_KEY = "login_user_key"; + + /** + * 用户ID + */ + public static final String JWT_USERID = "userid"; + + /** + * 用户名称 + */ + public static final String JWT_USERNAME = Claims.SUBJECT; + + /** + * 用户头像 + */ + public static final String JWT_AVATAR = "avatar"; + + /** + * 创建时间 + */ + public static final String JWT_CREATED = "created"; + + /** + * 用户权限 + */ + public static final String JWT_AUTHORITIES = "authorities"; + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile"; + + /** + * RMI 远程方法调用 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 远程方法调用 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 远程方法调用 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + + /** + * 自动识别json对象白名单配置(仅允许解析的包名,范围越小越安全) + */ + public static final String[] JSON_WHITELIST_STR = { "com.evobms" }; + + /** + * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) + */ + public static final String[] JOB_WHITELIST_STR = { "com.evobms.framework.task" }; + + /** + * 定时任务违规的字符 + */ + public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.evobms.common.utils.file", "com.evobms.framework.config", "com.evobms.project.tool" }; +} diff --git a/src/main/java/com/evobms/common/constant/GenConstants.java b/src/main/java/com/evobms/common/constant/GenConstants.java new file mode 100644 index 0000000..c776db3 --- /dev/null +++ b/src/main/java/com/evobms/common/constant/GenConstants.java @@ -0,0 +1,117 @@ +package com.evobms.common.constant; + +/** + * 代码生成通用常量 + * + * @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", + "bit", "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", "children" }; + + /** 文本框 */ + 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 QUERY_EQ = "EQ"; + + /** 需要 */ + public static final String REQUIRE = "1"; +} diff --git a/src/main/java/com/evobms/common/constant/HttpStatus.java b/src/main/java/com/evobms/common/constant/HttpStatus.java new file mode 100644 index 0000000..13785b3 --- /dev/null +++ b/src/main/java/com/evobms/common/constant/HttpStatus.java @@ -0,0 +1,94 @@ +package com.evobms.common.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; + + /** + * 系统警告消息 + */ + public static final int WARN = 601; +} diff --git a/src/main/java/com/evobms/common/constant/ScheduleConstants.java b/src/main/java/com/evobms/common/constant/ScheduleConstants.java new file mode 100644 index 0000000..4e50e60 --- /dev/null +++ b/src/main/java/com/evobms/common/constant/ScheduleConstants.java @@ -0,0 +1,50 @@ +package com.evobms.common.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 + { + /** + * 正常 + */ + NORMAL("0"), + /** + * 暂停 + */ + PAUSE("1"); + + private String value; + + private Status(String value) + { + this.value = value; + } + + public String getValue() + { + return value; + } + } +} diff --git a/src/main/java/com/evobms/common/constant/UserConstants.java b/src/main/java/com/evobms/common/constant/UserConstants.java new file mode 100644 index 0000000..c43c4bc --- /dev/null +++ b/src/main/java/com/evobms/common/constant/UserConstants.java @@ -0,0 +1,81 @@ +package com.evobms.common.constant; + +/** + * 用户常量信息 + * + * @author ruoyi + */ +public class UserConstants +{ + /** + * 平台内系统用户的唯一标志 + */ + public static final String SYS_USER = "SYS_USER"; + + /** 正常状态 */ + public static final String NORMAL = "0"; + + /** 异常状态 */ + public static final String EXCEPTION = "1"; + + /** 用户封禁状态 */ + public static final String USER_DISABLE = "1"; + + /** 角色正常状态 */ + public static final String ROLE_NORMAL = "0"; + + /** 角色封禁状态 */ + public static final String ROLE_DISABLE = "1"; + + /** 部门正常状态 */ + public static final String DEPT_NORMAL = "0"; + + /** 部门停用状态 */ + public static final String DEPT_DISABLE = "1"; + + /** 字典正常状态 */ + 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"; + + /** InnerLink组件标识 */ + public final static String INNER_LINK = "InnerLink"; + + /** 校验是否唯一的返回标识 */ + public final static boolean UNIQUE = true; + public final static boolean NOT_UNIQUE = false; + + /** + * 用户名长度限制 + */ + 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/src/main/java/com/evobms/common/core/text/CharsetKit.java b/src/main/java/com/evobms/common/core/text/CharsetKit.java new file mode 100644 index 0000000..30ca463 --- /dev/null +++ b/src/main/java/com/evobms/common/core/text/CharsetKit.java @@ -0,0 +1,86 @@ +package com.evobms.common.core.text; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import com.evobms.common.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); + + /** + * 转换为Charset对象 + * + * @param charset 字符集,为空则返回默认字符集 + * @return Charset + */ + public static Charset charset(String charset) + { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-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 源字符集,默认ISO-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/src/main/java/com/evobms/common/core/text/Convert.java b/src/main/java/com/evobms/common/core/text/Convert.java new file mode 100644 index 0000000..8960692 --- /dev/null +++ b/src/main/java/com/evobms/common/core/text/Convert.java @@ -0,0 +1,1012 @@ +package com.evobms.common.core.text; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; +import com.evobms.common.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; + +/** + * 类型转换器 + * + * @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); + } + + /** + * 转换为byte
+ * 如果给定的值为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; + } + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) + { + return toByte(value, null); + } + + /** + * 转换为Short
+ * 如果给定的值为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; + } + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) + { + return toShort(value, null); + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @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; + } + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) + { + return toNumber(value, null); + } + + /** + * 转换为int
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @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; + } + } + + /** + * 转换为int
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) + { + return toInt(value, null); + } + + /** + * 转换为Integer数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) + { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) + { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
+ * + * @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; + } + + /** + * 转换为Long数组
+ * + * @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; + } + + /** + * 转换为String数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) + { + if (StringUtils.isEmpty(str)) + { + return new String[] {}; + } + return toStrArray(",", str); + } + + /** + * 转换为String数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) + { + return str.split(split); + } + + /** + * 转换为long
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @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; + } + } + + /** + * 转换为long
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) + { + return toLong(value, null); + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @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; + } + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) + { + return toDouble(value, null); + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @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; + } + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) + { + return toFloat(value, null); + } + + /** + * 转换为boolean
+ * String支持的值为:true、false、yes、ok、no、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": + case "yes": + case "ok": + case "1": + case "是": + return true; + case "false": + case "no": + case "0": + case "否": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) + { + return toBool(value, null); + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * + * @param clazz Enum的Class + * @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; + } + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) + { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @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; + } + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) + { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @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 BigDecimal.valueOf((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; + } + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) + { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) + { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) + { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 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[]) + { + return str((byte[]) obj, charset); + } + else if (obj instanceof Byte[]) + { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); + } + else if (obj instanceof ByteBuffer) + { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @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)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + 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++) + { + // 优化double计算精度丢失问题 + BigDecimal nNum = new BigDecimal(n); + BigDecimal decimal = new BigDecimal(10); + BigDecimal scale = nNum.multiply(decimal).setScale(2, RoundingMode.HALF_EVEN); + double d = scale.doubleValue(); + s += (digit[(int) (Math.floor(d * 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/src/main/java/com/evobms/common/core/text/StrFormatter.java b/src/main/java/com/evobms/common/core/text/StrFormatter.java new file mode 100644 index 0000000..f031ebb --- /dev/null +++ b/src/main/java/com/evobms/common/core/text/StrFormatter.java @@ -0,0 +1,92 @@ +package com.evobms.common.core.text; + +import com.evobms.common.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 = '}'; + + /** + * 格式化字符串
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param 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 + { + // 正常占位符 + 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/src/main/java/com/evobms/common/enums/HttpMethod.java b/src/main/java/com/evobms/common/enums/HttpMethod.java new file mode 100644 index 0000000..25fdc78 --- /dev/null +++ b/src/main/java/com/evobms/common/enums/HttpMethod.java @@ -0,0 +1,36 @@ +package com.evobms.common.enums; + +import java.util.HashMap; +import java.util.Map; +import org.springframework.lang.Nullable; + +/** + * 请求方式 + * + * @author ruoyi + */ +public enum HttpMethod +{ + GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; + + private static final Map mappings = new HashMap<>(16); + + static + { + for (HttpMethod httpMethod : values()) + { + mappings.put(httpMethod.name(), httpMethod); + } + } + + @Nullable + public static HttpMethod resolve(@Nullable String method) + { + return (method != null ? mappings.get(method) : null); + } + + public boolean matches(String method) + { + return (this == resolve(method)); + } +} diff --git a/src/main/java/com/evobms/common/enums/UserStatus.java b/src/main/java/com/evobms/common/enums/UserStatus.java new file mode 100644 index 0000000..7c90a50 --- /dev/null +++ b/src/main/java/com/evobms/common/enums/UserStatus.java @@ -0,0 +1,30 @@ +package com.evobms.common.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum UserStatus +{ + OK("0", "正常"), 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/src/main/java/com/evobms/common/exception/DemoModeException.java b/src/main/java/com/evobms/common/exception/DemoModeException.java new file mode 100644 index 0000000..ce2bf62 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/DemoModeException.java @@ -0,0 +1,15 @@ +package com.evobms.common.exception; + +/** + * 演示模式异常 + * + * @author ruoyi + */ +public class DemoModeException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public DemoModeException() + { + } +} diff --git a/src/main/java/com/evobms/common/exception/GlobalException.java b/src/main/java/com/evobms/common/exception/GlobalException.java new file mode 100644 index 0000000..d7d7370 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/GlobalException.java @@ -0,0 +1,58 @@ +package com.evobms.common.exception; + +/** + * 全局异常 + * + * @author ruoyi + */ +public class GlobalException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public GlobalException() + { + } + + public GlobalException(String message) + { + this.message = message; + } + + public String getDetailMessage() + { + return detailMessage; + } + + public GlobalException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } + + @Override + public String getMessage() + { + return message; + } + + public GlobalException setMessage(String message) + { + this.message = message; + return this; + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/exception/ServiceException.java b/src/main/java/com/evobms/common/exception/ServiceException.java new file mode 100644 index 0000000..e01af45 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/ServiceException.java @@ -0,0 +1,74 @@ +package com.evobms.common.exception; + +/** + * 业务异常 + * + * @author ruoyi + */ +public final class ServiceException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + private Integer code; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() + { + } + + public ServiceException(String message) + { + this.message = message; + } + + public ServiceException(String message, Integer code) + { + this.message = message; + this.code = code; + } + + public String getDetailMessage() + { + return detailMessage; + } + + @Override + public String getMessage() + { + return message; + } + + public Integer getCode() + { + return code; + } + + public ServiceException setMessage(String message) + { + this.message = message; + return this; + } + + public ServiceException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/exception/UtilException.java b/src/main/java/com/evobms/common/exception/UtilException.java new file mode 100644 index 0000000..9aae9c0 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/UtilException.java @@ -0,0 +1,26 @@ +package com.evobms.common.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/src/main/java/com/evobms/common/exception/base/BaseException.java b/src/main/java/com/evobms/common/exception/base/BaseException.java new file mode 100644 index 0000000..88bb357 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/base/BaseException.java @@ -0,0 +1,97 @@ +package com.evobms.common.exception.base; + +import com.evobms.common.utils.MessageUtils; +import com.evobms.common.utils.StringUtils; + +/** + * 基础异常 + * + * @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); + } + + @Override + public String getMessage() + { + String message = null; + if (!StringUtils.isEmpty(code)) + { + message = MessageUtils.message(code, args); + } + if (message == null) + { + message = defaultMessage; + } + return message; + } + + public String getModule() + { + return module; + } + + public String getCode() + { + return code; + } + + public Object[] getArgs() + { + return args; + } + + public String getDefaultMessage() + { + return defaultMessage; + } +} diff --git a/src/main/java/com/evobms/common/exception/file/FileException.java b/src/main/java/com/evobms/common/exception/file/FileException.java new file mode 100644 index 0000000..1a99232 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/file/FileException.java @@ -0,0 +1,19 @@ +package com.evobms.common.exception.file; + +import com.evobms.common.exception.base.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/src/main/java/com/evobms/common/exception/file/FileNameLengthLimitExceededException.java b/src/main/java/com/evobms/common/exception/file/FileNameLengthLimitExceededException.java new file mode 100644 index 0000000..9d26f39 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/file/FileNameLengthLimitExceededException.java @@ -0,0 +1,16 @@ +package com.evobms.common.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/src/main/java/com/evobms/common/exception/file/FileSizeLimitExceededException.java b/src/main/java/com/evobms/common/exception/file/FileSizeLimitExceededException.java new file mode 100644 index 0000000..811f401 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/file/FileSizeLimitExceededException.java @@ -0,0 +1,16 @@ +package com.evobms.common.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/src/main/java/com/evobms/common/exception/file/FileUploadException.java b/src/main/java/com/evobms/common/exception/file/FileUploadException.java new file mode 100644 index 0000000..eb45274 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/file/FileUploadException.java @@ -0,0 +1,61 @@ +package com.evobms.common.exception.file; + +import java.io.PrintStream; +import java.io.PrintWriter; + +/** + * 文件上传异常类 + * + * @author ruoyi + */ +public class FileUploadException extends Exception +{ + + private static final long serialVersionUID = 1L; + + private final Throwable cause; + + public FileUploadException() + { + this(null, null); + } + + public FileUploadException(final String msg) + { + this(msg, null); + } + + public FileUploadException(String msg, Throwable cause) + { + super(msg); + this.cause = cause; + } + + @Override + public void printStackTrace(PrintStream stream) + { + super.printStackTrace(stream); + if (cause != null) + { + stream.println("Caused by:"); + cause.printStackTrace(stream); + } + } + + @Override + public void printStackTrace(PrintWriter writer) + { + super.printStackTrace(writer); + if (cause != null) + { + writer.println("Caused by:"); + cause.printStackTrace(writer); + } + } + + @Override + public Throwable getCause() + { + return cause; + } +} diff --git a/src/main/java/com/evobms/common/exception/file/InvalidExtensionException.java b/src/main/java/com/evobms/common/exception/file/InvalidExtensionException.java new file mode 100644 index 0000000..fbe0d65 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/file/InvalidExtensionException.java @@ -0,0 +1,80 @@ +package com.evobms.common.exception.file; + +import java.util.Arrays; + +/** + * 文件上传 误异常类 + * + * @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 + "]后缀[" + 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/src/main/java/com/evobms/common/exception/job/TaskException.java b/src/main/java/com/evobms/common/exception/job/TaskException.java new file mode 100644 index 0000000..f05eb76 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/job/TaskException.java @@ -0,0 +1,34 @@ +package com.evobms.common.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 + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/exception/user/BlackListException.java b/src/main/java/com/evobms/common/exception/user/BlackListException.java new file mode 100644 index 0000000..590abe3 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/user/BlackListException.java @@ -0,0 +1,16 @@ +package com.evobms.common.exception.user; + +/** + * 黑名单IP异常类 + * + * @author ruoyi + */ +public class BlackListException extends UserException +{ + private static final long serialVersionUID = 1L; + + public BlackListException() + { + super("login.blocked", null); + } +} diff --git a/src/main/java/com/evobms/common/exception/user/CaptchaException.java b/src/main/java/com/evobms/common/exception/user/CaptchaException.java new file mode 100644 index 0000000..1addf66 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/user/CaptchaException.java @@ -0,0 +1,16 @@ +package com.evobms.common.exception.user; + +/** + * 验证码错误异常类 + * + * @author ruoyi + */ +public class CaptchaException extends UserException +{ + private static final long serialVersionUID = 1L; + + public CaptchaException() + { + super("user.jcaptcha.error", null); + } +} diff --git a/src/main/java/com/evobms/common/exception/user/CaptchaExpireException.java b/src/main/java/com/evobms/common/exception/user/CaptchaExpireException.java new file mode 100644 index 0000000..21be46f --- /dev/null +++ b/src/main/java/com/evobms/common/exception/user/CaptchaExpireException.java @@ -0,0 +1,16 @@ +package com.evobms.common.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/src/main/java/com/evobms/common/exception/user/UserException.java b/src/main/java/com/evobms/common/exception/user/UserException.java new file mode 100644 index 0000000..1e5980f --- /dev/null +++ b/src/main/java/com/evobms/common/exception/user/UserException.java @@ -0,0 +1,18 @@ +package com.evobms.common.exception.user; + +import com.evobms.common.exception.base.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/src/main/java/com/evobms/common/exception/user/UserNotExistsException.java b/src/main/java/com/evobms/common/exception/user/UserNotExistsException.java new file mode 100644 index 0000000..8c1c71c --- /dev/null +++ b/src/main/java/com/evobms/common/exception/user/UserNotExistsException.java @@ -0,0 +1,16 @@ +package com.evobms.common.exception.user; + +/** + * 用户不存在异常类 + * + * @author ruoyi + */ +public class UserNotExistsException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserNotExistsException() + { + super("user.not.exists", null); + } +} diff --git a/src/main/java/com/evobms/common/exception/user/UserPasswordNotMatchException.java b/src/main/java/com/evobms/common/exception/user/UserPasswordNotMatchException.java new file mode 100644 index 0000000..cc7c6d7 --- /dev/null +++ b/src/main/java/com/evobms/common/exception/user/UserPasswordNotMatchException.java @@ -0,0 +1,16 @@ +package com.evobms.common.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/src/main/java/com/evobms/common/exception/user/UserPasswordRetryLimitExceedException.java b/src/main/java/com/evobms/common/exception/user/UserPasswordRetryLimitExceedException.java new file mode 100644 index 0000000..7ca897a --- /dev/null +++ b/src/main/java/com/evobms/common/exception/user/UserPasswordRetryLimitExceedException.java @@ -0,0 +1,16 @@ +package com.evobms.common.exception.user; + +/** + * 用户错误最大次数异常类 + * + * @author ruoyi + */ +public class UserPasswordRetryLimitExceedException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordRetryLimitExceedException(int retryLimitCount, int lockTime) + { + super("user.password.retry.limit.exceed", new Object[] { retryLimitCount, lockTime }); + } +} diff --git a/src/main/java/com/evobms/common/filter/HttpDumpFilter.java b/src/main/java/com/evobms/common/filter/HttpDumpFilter.java new file mode 100644 index 0000000..02e0e88 --- /dev/null +++ b/src/main/java/com/evobms/common/filter/HttpDumpFilter.java @@ -0,0 +1,98 @@ +package com.evobms.common.filter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingRequestWrapper; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Enumeration; + +/** + * HTTP请求打印过滤器(调试用途) + * - 打印请求方法、URL、查询参数、所有请求头以及前1KB的请求体 + * - 默认关闭,通过配置开启:debug.httpdump.enabled=true + * - 注意:可能打印敏感信息(Authorization),已做部分掩码处理 + */ +@Component +@ConditionalOnProperty(value = "debug.httpdump.enabled", havingValue = "true") +public class HttpDumpFilter extends OncePerRequestFilter { + private static final Logger log = LoggerFactory.getLogger(HttpDumpFilter.class); + + @Value("${token.header:Authorization}") + private String tokenHeader; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + // 包装请求以便在下游读取后能够回读缓存内容 + ContentCachingRequestWrapper wrapper = new ContentCachingRequestWrapper(request); + try { + filterChain.doFilter(wrapper, response); + } finally { + try { + StringBuilder sb = new StringBuilder(2048); + String method = request.getMethod(); + String uri = request.getRequestURI(); + String query = request.getQueryString(); + sb.append("HTTP Dump >>> ").append(method).append(' ').append(uri); + if (query != null) sb.append('?').append(query); + sb.append('\n'); + + // 打印头部 + Enumeration names = request.getHeaderNames(); + while (names != null && names.hasMoreElements()) { + String name = names.nextElement(); + String value = request.getHeader(name); + if (value == null) value = ""; + if ("Authorization".equalsIgnoreCase(name) || name.equalsIgnoreCase(tokenHeader)) { + value = maskToken(value); + } + sb.append(name).append(": ").append(value).append('\n'); + } + + // 打印体(最多1KB),同时输出HEX预览以确认原始字节 + byte[] body = wrapper.getContentAsByteArray(); + if (body != null && body.length > 0) { + int len = Math.min(body.length, 1024); + String raw = new String(body, 0, len, StandardCharsets.UTF_8); + sb.append("\nBody[" + body.length + " bytes, show " + len + "]: ").append(raw); + sb.append("\nHex [show " + len + "]: ").append(toHex(body, len)); + } + log.info(sb.toString()); + } catch (Exception e) { + log.debug("HTTP Dump失败: {}", e.getMessage()); + } + } + } + + private String maskToken(String v) { + if (v == null) return null; + String s = v.trim(); + // 去掉 Bearer 前缀 + if (s.toLowerCase().startsWith("bearer ")) { + s = s.substring(7); + } + if (s.length() <= 8) return "***"; + return "Bearer " + s.substring(0, 4) + "***" + s.substring(s.length() - 4); + } + + private String toHex(byte[] bytes, int len) { + StringBuilder hex = new StringBuilder(len * 2); + for (int i = 0; i < len; i++) { + int b = bytes[i] & 0xFF; + String h = Integer.toHexString(b); + if (h.length() == 1) hex.append('0'); + hex.append(h); + } + return hex.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/filter/PropertyPreExcludeFilter.java b/src/main/java/com/evobms/common/filter/PropertyPreExcludeFilter.java new file mode 100644 index 0000000..f24f150 --- /dev/null +++ b/src/main/java/com/evobms/common/filter/PropertyPreExcludeFilter.java @@ -0,0 +1,24 @@ +package com.evobms.common.filter; + +import com.alibaba.fastjson2.filter.SimplePropertyPreFilter; + +/** + * 排除JSON敏感属性 + * + * @author ruoyi + */ +public class PropertyPreExcludeFilter extends SimplePropertyPreFilter +{ + public PropertyPreExcludeFilter() + { + } + + public PropertyPreExcludeFilter addExcludes(String... filters) + { + for (int i = 0; i < filters.length; i++) + { + this.getExcludes().add(filters[i]); + } + return this; + } +} diff --git a/src/main/java/com/evobms/common/filter/RefererFilter.java b/src/main/java/com/evobms/common/filter/RefererFilter.java new file mode 100644 index 0000000..0faf734 --- /dev/null +++ b/src/main/java/com/evobms/common/filter/RefererFilter.java @@ -0,0 +1,77 @@ +package com.evobms.common.filter; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 防盗链过滤器 + * + * @author ruoyi + */ +public class RefererFilter implements Filter +{ + /** + * 允许的域名列表 + */ + public List allowedDomains; + + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + String domains = filterConfig.getInitParameter("allowedDomains"); + this.allowedDomains = Arrays.asList(domains.split(",")); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + + String referer = req.getHeader("Referer"); + + // 如果Referer为空,拒绝访问 + if (referer == null || referer.isEmpty()) + { + resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Access denied: Referer header is required"); + return; + } + + // 检查Referer是否在允许的域名列表中 + boolean allowed = false; + for (String domain : allowedDomains) + { + if (referer.contains(domain)) + { + allowed = true; + break; + } + } + + // 根据检查结果决定是否放行 + if (allowed) + { + chain.doFilter(request, response); + } + else + { + resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Access denied: Referer '" + referer + "' is not allowed"); + } + } + + @Override + public void destroy() + { + + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/filter/RepeatableFilter.java b/src/main/java/com/evobms/common/filter/RepeatableFilter.java new file mode 100644 index 0000000..cbb9de2 --- /dev/null +++ b/src/main/java/com/evobms/common/filter/RepeatableFilter.java @@ -0,0 +1,52 @@ +package com.evobms.common.filter; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import org.springframework.http.MediaType; +import com.evobms.common.utils.StringUtils; + +/** + * Repeatable 过滤器 + * + * @author ruoyi + */ +public class RepeatableFilter implements Filter +{ + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + ServletRequest requestWrapper = null; + if (request instanceof HttpServletRequest + && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) + { + requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); + } + if (null == requestWrapper) + { + chain.doFilter(request, response); + } + else + { + chain.doFilter(requestWrapper, response); + } + } + + @Override + public void destroy() + { + + } +} diff --git a/src/main/java/com/evobms/common/filter/RepeatedlyRequestWrapper.java b/src/main/java/com/evobms/common/filter/RepeatedlyRequestWrapper.java new file mode 100644 index 0000000..3424597 --- /dev/null +++ b/src/main/java/com/evobms/common/filter/RepeatedlyRequestWrapper.java @@ -0,0 +1,76 @@ +package com.evobms.common.filter; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import com.evobms.common.utils.http.HttpHelper; +import com.evobms.common.constant.Constants; + +/** + * 构建可重复读取inputStream的request + * + * @author ruoyi + */ +public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper +{ + private final byte[] body; + + public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException + { + super(request); + request.setCharacterEncoding(Constants.UTF8); + response.setCharacterEncoding(Constants.UTF8); + + body = HttpHelper.getBodyString(request).getBytes(Constants.UTF8); + } + + @Override + public BufferedReader getReader() throws IOException + { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException + { + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + return new ServletInputStream() + { + @Override + public int read() throws IOException + { + return bais.read(); + } + + @Override + public int available() throws IOException + { + return body.length; + } + + @Override + public boolean isFinished() + { + return false; + } + + @Override + public boolean isReady() + { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) + { + + } + }; + } +} diff --git a/src/main/java/com/evobms/common/filter/XssFilter.java b/src/main/java/com/evobms/common/filter/XssFilter.java new file mode 100644 index 0000000..f30012a --- /dev/null +++ b/src/main/java/com/evobms/common/filter/XssFilter.java @@ -0,0 +1,75 @@ +package com.evobms.common.filter; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.enums.HttpMethod; + +/** + * 防止XSS攻击的过滤器 + * + * @author ruoyi + */ +public class XssFilter implements Filter +{ + /** + * 排除链接 + */ + public List excludes = new ArrayList<>(); + + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + String tempExcludes = filterConfig.getInitParameter("excludes"); + if (StringUtils.isNotEmpty(tempExcludes)) + { + String[] urls = tempExcludes.split(","); + for (String url : urls) + { + excludes.add(url); + } + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + if (handleExcludeURL(req, resp)) + { + chain.doFilter(request, response); + return; + } + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request); + chain.doFilter(xssRequest, response); + } + + private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) + { + String url = request.getServletPath(); + String method = request.getMethod(); + // GET DELETE 不过滤 + if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) + { + return true; + } + return StringUtils.matches(url, excludes); + } + + @Override + public void destroy() + { + + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/filter/XssHttpServletRequestWrapper.java b/src/main/java/com/evobms/common/filter/XssHttpServletRequestWrapper.java new file mode 100644 index 0000000..477a1d3 --- /dev/null +++ b/src/main/java/com/evobms/common/filter/XssHttpServletRequestWrapper.java @@ -0,0 +1,111 @@ +package com.evobms.common.filter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import org.apache.commons.io.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.html.EscapeUtil; + +/** + * XSS过滤处理 + * + * @author ruoyi + */ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper +{ + /** + * @param request + */ + public XssHttpServletRequestWrapper(HttpServletRequest request) + { + super(request); + } + + @Override + public String[] getParameterValues(String name) + { + String[] values = super.getParameterValues(name); + if (values != null) + { + int length = values.length; + String[] escapesValues = new String[length]; + for (int i = 0; i < length; i++) + { + // 防xss攻击和过滤前后空格 + escapesValues[i] = EscapeUtil.clean(values[i]).trim(); + } + return escapesValues; + } + return super.getParameterValues(name); + } + + @Override + public ServletInputStream getInputStream() throws IOException + { + // 非json类型,直接返回 + if (!isJsonRequest()) + { + return super.getInputStream(); + } + + // 为空,直接返回 + String json = IOUtils.toString(super.getInputStream(), "utf-8"); + if (StringUtils.isEmpty(json)) + { + return super.getInputStream(); + } + + // xss过滤 + json = EscapeUtil.clean(json).trim(); + byte[] jsonBytes = json.getBytes("utf-8"); + final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes); + return new ServletInputStream() + { + @Override + public boolean isFinished() + { + return true; + } + + @Override + public boolean isReady() + { + return true; + } + + @Override + public int available() throws IOException + { + return jsonBytes.length; + } + + @Override + public void setReadListener(ReadListener readListener) + { + } + + @Override + public int read() throws IOException + { + return bis.read(); + } + }; + } + + /** + * 是否是Json请求 + * + * @param request + */ + public boolean isJsonRequest() + { + String header = super.getHeader(HttpHeaders.CONTENT_TYPE); + return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/utils/AesEcbPkcs5Utils.java b/src/main/java/com/evobms/common/utils/AesEcbPkcs5Utils.java new file mode 100644 index 0000000..1ec7a1e --- /dev/null +++ b/src/main/java/com/evobms/common/utils/AesEcbPkcs5Utils.java @@ -0,0 +1,44 @@ +package com.evobms.common.utils; + +import org.apache.tomcat.util.buf.Ascii; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +/** + * AES/ECB/PKCS5Padding 加密工具(输出Base64字符串) + */ +public final class AesEcbPkcs5Utils { + + private AesEcbPkcs5Utils() {} + + /** + * 使用 AES/ECB/PKCS5Padding 进行加密,返回16进制ASCII字符串 + * @param plaintext 明文 + * @param key16 长度16的密钥(UTF-8) + */ + public static String encryptToAscII16(String plaintext, String key16) throws Exception { + if (key16 == null) { + throw new IllegalArgumentException("AES key must not be null"); + } + byte[] keyBytes = key16.getBytes(StandardCharsets.UTF_8); + SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec); + byte[] encrypted = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + return bytesToHex(encrypted); + } + + /** + * 将字节数组转换为大写16进制字符串 + */ + private static String bytesToHex(byte[] bytes) { + StringBuilder sb = new StringBuilder(bytes.length * 2); + for (byte b : bytes) { + sb.append(String.format("%02X", b)); + } + return sb.toString(); + } +} diff --git a/src/main/java/com/evobms/common/utils/Arith.java b/src/main/java/com/evobms/common/utils/Arith.java new file mode 100644 index 0000000..adb604e --- /dev/null +++ b/src/main/java/com/evobms/common/utils/Arith.java @@ -0,0 +1,113 @@ +package com.evobms.common.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 精确的浮点数运算 + * + * @author ruoyi + */ +public class Arith +{ + + /** 默认除法运算精度 */ + private static final int DEF_DIV_SCALE = 10; + + /** 这个类不能实例化 */ + private Arith() + { + } + + /** + * 提供精确的加法运算。 + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static double add(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).doubleValue(); + } + + /** + * 提供精确的减法运算。 + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static double sub(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.subtract(b2).doubleValue(); + } + + /** + * 提供精确的乘法运算。 + * @param v1 被乘数 + * @param v2 乘数 + * @return 两个参数的积 + */ + public static double mul(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).doubleValue(); + } + + /** + * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 + * 小数点以后10位,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @return 两个参数的商 + */ + public static double div(double v1, double v2) + { + return div(v1, v2, DEF_DIV_SCALE); + } + + /** + * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 + * 定精度,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的商 + */ + public static double div(double v1, double v2, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + if (b1.compareTo(BigDecimal.ZERO) == 0) + { + return BigDecimal.ZERO.doubleValue(); + } + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 提供精确的小数位四舍五入处理。 + * @param v 需要四舍五入的数字 + * @param scale 小数点后保留几位 + * @return 四舍五入后的结果 + */ + public static double round(double v, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b = new BigDecimal(Double.toString(v)); + return b.divide(BigDecimal.ONE, scale, RoundingMode.HALF_UP).doubleValue(); + } +} diff --git a/src/main/java/com/evobms/common/utils/DateUtils.java b/src/main/java/com/evobms/common/utils/DateUtils.java new file mode 100644 index 0000000..ca21d89 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/DateUtils.java @@ -0,0 +1,191 @@ +package com.evobms.common.utils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +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(); + } + + /** + * 获取当前日期, 默认格式为yyyy-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 int differentDaysByMillisecond(Date date1, Date date2) + { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + + /** + * 计算时间差 + * + * @param endDate 最后时间 + * @param startTime 开始时间 + * @return 时间差(天/小时/分钟) + */ + public static String timeDistance(Date endDate, Date startTime) + { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - startTime.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 + "分钟"; + } + + /** + * 增加 LocalDateTime ==> Date + */ + public static Date toDate(LocalDateTime temporalAccessor) + { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 增加 LocalDate ==> Date + */ + public static Date toDate(LocalDate temporalAccessor) + { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } +} diff --git a/src/main/java/com/evobms/common/utils/DesensitizedUtil.java b/src/main/java/com/evobms/common/utils/DesensitizedUtil.java new file mode 100644 index 0000000..601a697 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/DesensitizedUtil.java @@ -0,0 +1,49 @@ +package com.evobms.common.utils; + +/** + * 脱敏工具类 + * + * @author ruoyi + */ +public class DesensitizedUtil +{ + /** + * 密码的全部字符都用*代替,比如:****** + * + * @param password 密码 + * @return 脱敏后的密码 + */ + public static String password(String password) + { + if (StringUtils.isBlank(password)) + { + return StringUtils.EMPTY; + } + return StringUtils.repeat('*', password.length()); + } + + /** + * 车牌中间用*代替,如果是错误的车牌,不处理 + * + * @param carLicense 完整的车牌号 + * @return 脱敏后的车牌 + */ + public static String carLicense(String carLicense) + { + if (StringUtils.isBlank(carLicense)) + { + return StringUtils.EMPTY; + } + // 普通车牌 + if (carLicense.length() == 7) + { + carLicense = StringUtils.hide(carLicense, 3, 6); + } + else if (carLicense.length() == 8) + { + // 新能源车牌 + carLicense = StringUtils.hide(carLicense, 3, 7); + } + return carLicense; + } +} diff --git a/src/main/java/com/evobms/common/utils/DictUtils.java b/src/main/java/com/evobms/common/utils/DictUtils.java new file mode 100644 index 0000000..642c6f2 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/DictUtils.java @@ -0,0 +1,239 @@ +package com.evobms.common.utils; + +import java.util.Collection; +import java.util.List; +import com.alibaba.fastjson2.JSONArray; +import com.evobms.common.constant.CacheConstants; +import com.evobms.common.utils.spring.SpringUtils; +import com.evobms.framework.redis.RedisCache; +import com.evobms.project.system.domain.SysDictData; + +/** + * 字典工具类 + * + * @author ruoyi + */ +public class DictUtils +{ + /** + * 分隔符 + */ + public static final String SEPARATOR = ","; + + /** + * 设置字典缓存 + * + * @param key 参数键 + * @param dictDatas 字典数据列表 + */ + public static void setDictCache(String key, List dictDatas) + { + SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas); + } + + /** + * 获取字典缓存 + * + * @param key 参数键 + * @return dictDatas 字典数据列表 + */ + public static List getDictCache(String key) + { + JSONArray arrayCache = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); + if (StringUtils.isNotNull(arrayCache)) + { + return arrayCache.toList(SysDictData.class); + } + return null; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue) + { + if (StringUtils.isEmpty(dictValue)) + { + return StringUtils.EMPTY; + } + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel) + { + if (StringUtils.isEmpty(dictLabel)) + { + return StringUtils.EMPTY; + } + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + if (StringUtils.containsAny(separator, dictValue)) + { + for (SysDictData dict : datas) + { + for (String value : dictValue.split(separator)) + { + if (value.equals(dict.getDictValue())) + { + propertyString.append(dict.getDictLabel()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictValue.equals(dict.getDictValue())) + { + return dict.getDictLabel(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + if (StringUtils.containsAny(separator, dictLabel)) + { + for (SysDictData dict : datas) + { + for (String label : dictLabel.split(separator)) + { + if (label.equals(dict.getDictLabel())) + { + propertyString.append(dict.getDictValue()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictLabel.equals(dict.getDictLabel())) + { + return dict.getDictValue(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型获取字典所有值 + * + * @param dictType 字典类型 + * @return 字典值 + */ + public static String getDictValues(String dictType) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + for (SysDictData dict : datas) + { + propertyString.append(dict.getDictValue()).append(SEPARATOR); + } + return StringUtils.stripEnd(propertyString.toString(), SEPARATOR); + } + + /** + * 根据字典类型获取字典所有标签 + * + * @param dictType 字典类型 + * @return 字典值 + */ + public static String getDictLabels(String dictType) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) + { + return StringUtils.EMPTY; + } + for (SysDictData dict : datas) + { + propertyString.append(dict.getDictLabel()).append(SEPARATOR); + } + return StringUtils.stripEnd(propertyString.toString(), SEPARATOR); + } + + /** + * 删除指定字典缓存 + * + * @param key 字典键 + */ + public static void removeDictCache(String key) + { + SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key)); + } + + /** + * 清空字典缓存 + */ + public static void clearDictCache() + { + Collection keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.SYS_DICT_KEY + "*"); + SpringUtils.getBean(RedisCache.class).deleteObject(keys); + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + public static String getCacheKey(String configKey) + { + return CacheConstants.SYS_DICT_KEY + configKey; + } +} diff --git a/src/main/java/com/evobms/common/utils/ExceptionUtil.java b/src/main/java/com/evobms/common/utils/ExceptionUtil.java new file mode 100644 index 0000000..da624b3 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/ExceptionUtil.java @@ -0,0 +1,39 @@ +package com.evobms.common.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)); + return sw.toString(); + } + + public static String getRootErrorMessage(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/src/main/java/com/evobms/common/utils/LogUtils.java b/src/main/java/com/evobms/common/utils/LogUtils.java new file mode 100644 index 0000000..46600d6 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/LogUtils.java @@ -0,0 +1,18 @@ +package com.evobms.common.utils; + +/** + * 处理并记录日志文件 + * + * @author ruoyi + */ +public class LogUtils +{ + public static String getBlock(Object msg) + { + if (msg == null) + { + msg = ""; + } + return "[" + msg.toString() + "]"; + } +} diff --git a/src/main/java/com/evobms/common/utils/MessageUtils.java b/src/main/java/com/evobms/common/utils/MessageUtils.java new file mode 100644 index 0000000..5e82b41 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/MessageUtils.java @@ -0,0 +1,26 @@ +package com.evobms.common.utils; + +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import com.evobms.common.utils.spring.SpringUtils; + +/** + * 获取i18n资源文件 + * + * @author ruoyi + */ +public class MessageUtils +{ + /** + * 根据消息键和参数 获取消息 委托给spring messageSource + * + * @param code 消息键 + * @param args 参数 + * @return 获取国际化翻译值 + */ + public static String message(String code, Object... args) + { + MessageSource messageSource = SpringUtils.getBean(MessageSource.class); + return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + } +} diff --git a/src/main/java/com/evobms/common/utils/PageUtils.java b/src/main/java/com/evobms/common/utils/PageUtils.java new file mode 100644 index 0000000..df45a6f --- /dev/null +++ b/src/main/java/com/evobms/common/utils/PageUtils.java @@ -0,0 +1,35 @@ +package com.evobms.common.utils; + +import com.github.pagehelper.PageHelper; +import com.evobms.common.utils.sql.SqlUtil; +import com.evobms.framework.web.page.PageDomain; +import com.evobms.framework.web.page.TableSupport; + +/** + * 分页工具类 + * + * @author ruoyi + */ +public class PageUtils extends PageHelper +{ + /** + * 设置请求分页数据 + */ + public static void startPage() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + Boolean reasonable = pageDomain.getReasonable(); + PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); + } + + /** + * 清理分页的线程变量 + */ + public static void clearPage() + { + PageHelper.clearPage(); + } +} diff --git a/src/main/java/com/evobms/common/utils/SecurityUtils.java b/src/main/java/com/evobms/common/utils/SecurityUtils.java new file mode 100644 index 0000000..6e6101b --- /dev/null +++ b/src/main/java/com/evobms/common/utils/SecurityUtils.java @@ -0,0 +1,176 @@ +package com.evobms.common.utils; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.util.PatternMatchUtils; +import com.evobms.common.constant.Constants; +import com.evobms.common.constant.HttpStatus; +import com.evobms.common.exception.ServiceException; +import com.evobms.framework.security.LoginUser; +import com.evobms.project.system.domain.SysRole; + +/** + * 安全服务工具类 + * + * @author ruoyi + */ +public class SecurityUtils +{ + /** + * 用户ID + **/ + public static Long getUserId() + { + try + { + return getLoginUser().getUserId(); + } + catch (Exception e) + { + throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取部门ID + **/ + public static Long getDeptId() + { + try + { + return getLoginUser().getDeptId(); + } + catch (Exception e) + { + throw new ServiceException("获取部门ID异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取用户账户 + **/ + public static String getUsername() + { + try + { + return getLoginUser().getUsername(); + } + catch (Exception e) + { + throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取用户 + **/ + public static LoginUser getLoginUser() + { + try + { + return (LoginUser) getAuthentication().getPrincipal(); + } + catch (Exception e) + { + throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取Authentication + */ + public static Authentication getAuthentication() + { + return SecurityContextHolder.getContext().getAuthentication(); + } + + /** + * 生成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); + } + + /** + * 是否为管理员 + * + * @param userId 用户ID + * @return 结果 + */ + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } + + /** + * 验证用户是否具备某权限 + * + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public static boolean hasPermi(String permission) + { + return hasPermi(getLoginUser().getPermissions(), permission); + } + + /** + * 判断是否包含权限 + * + * @param authorities 权限列表 + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public static boolean hasPermi(Collection authorities, String permission) + { + return authorities.stream().filter(StringUtils::hasText) + .anyMatch(x -> Constants.ALL_PERMISSION.equals(x) || PatternMatchUtils.simpleMatch(x, permission)); + } + + /** + * 验证用户是否拥有某个角色 + * + * @param role 角色标识 + * @return 用户是否具备某角色 + */ + public static boolean hasRole(String role) + { + List roleList = getLoginUser().getUser().getRoles(); + Collection roles = roleList.stream().map(SysRole::getRoleKey).collect(Collectors.toSet()); + return hasRole(roles, role); + } + + /** + * 判断是否包含角色 + * + * @param roles 角色列表 + * @param role 角色 + * @return 用户是否具备某角色权限 + */ + public static boolean hasRole(Collection roles, String role) + { + return roles.stream().filter(StringUtils::hasText) + .anyMatch(x -> Constants.SUPER_ADMIN.equals(x) || PatternMatchUtils.simpleMatch(x, role)); + } +} diff --git a/src/main/java/com/evobms/common/utils/ServletUtils.java b/src/main/java/com/evobms/common/utils/ServletUtils.java new file mode 100644 index 0000000..579f8ce --- /dev/null +++ b/src/main/java/com/evobms/common/utils/ServletUtils.java @@ -0,0 +1,218 @@ +package com.evobms.common.utils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import com.evobms.common.constant.Constants; +import com.evobms.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); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name) + { + return Convert.toBool(getRequest().getParameter(name)); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name, Boolean defaultValue) + { + return Convert.toBool(getRequest().getParameter(name), defaultValue); + } + + /** + * 获得所有请求参数 + * + * @param request 请求对象{@link ServletRequest} + * @return Map + */ + public static Map getParams(ServletRequest request) + { + final Map map = request.getParameterMap(); + return Collections.unmodifiableMap(map); + } + + /** + * 获得所有请求参数 + * + * @param request 请求对象{@link ServletRequest} + * @return Map + */ + public static Map getParamMap(ServletRequest request) + { + Map params = new HashMap<>(); + for (Map.Entry entry : getParams(request).entrySet()) + { + params.put(entry.getKey(), StringUtils.join(entry.getValue(), ",")); + } + return params; + } + + /** + * 获取request + */ + public static HttpServletRequest getRequest() + { + return getRequestAttributes().getRequest(); + } + + /** + * 获取response + */ + public static HttpServletResponse getResponse() + { + return getRequestAttributes().getResponse(); + } + + /** + * 获取session + */ + public static HttpSession getSession() + { + return getRequest().getSession(); + } + + public static ServletRequestAttributes getRequestAttributes() + { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + + /** + * 将字符串渲染到客户端 + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + */ + public static void 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(); + } + } + + /** + * 是否是Ajax异步请求 + * + * @param request + */ + public static boolean isAjaxRequest(HttpServletRequest request) + { + String accept = request.getHeader("accept"); + if (accept != null && accept.contains("application/json")) + { + return true; + } + + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) + { + return true; + } + + String uri = request.getRequestURI(); + if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) + { + return true; + } + + String ajax = request.getParameter("__ajax"); + return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); + } + + /** + * 内容编码 + * + * @param str 内容 + * @return 编码后的内容 + */ + public static String urlEncode(String str) + { + try + { + return URLEncoder.encode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } + + /** + * 内容解码 + * + * @param str 内容 + * @return 解码后的内容 + */ + public static String urlDecode(String str) + { + try + { + return URLDecoder.decode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } +} diff --git a/src/main/java/com/evobms/common/utils/StringUtils.java b/src/main/java/com/evobms/common/utils/StringUtils.java new file mode 100644 index 0000000..404821d --- /dev/null +++ b/src/main/java/com/evobms/common/utils/StringUtils.java @@ -0,0 +1,722 @@ +package com.evobms.common.utils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.springframework.util.AntPathMatcher; +import com.evobms.common.constant.Constants; +import com.evobms.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 char ASTERISK = '*'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) + { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) + { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) + { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + ** @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) + { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) + { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) + { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) + { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) + { + return 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); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @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 startInclude 开始位置(包含) + * @param endExclude 结束位置(不包含) + * @return 替换后的字符串 + */ + public static String hide(CharSequence str, int startInclude, int endExclude) + { + if (isEmpty(str)) + { + return NULLSTR; + } + final int strLength = str.length(); + if (startInclude > strLength) + { + return NULLSTR; + } + if (endExclude > strLength) + { + endExclude = strLength; + } + if (startInclude > endExclude) + { + // 如果起始位置大于结束位置,不替换 + return NULLSTR; + } + final char[] chars = new char[strLength]; + for (int i = 0; i < strLength; i++) + { + if (i >= startInclude && i < endExclude) + { + chars[i] = ASTERISK; + } + else + { + chars[i] = str.charAt(i); + } + } + return new String(chars); + } + + /** + * 截取字符串 + * + * @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); + } + + /** + * 在字符串中查找第一个出现的 `open` 和最后一个出现的 `close` 之间的子字符串 + * + * @param str 要截取的字符串 + * @param open 起始字符串 + * @param close 结束字符串 + * @return 截取结果 + */ + public static String substringBetweenLast(final String str, final String open, final String close) + { + if (isEmpty(str) || isEmpty(open) || isEmpty(close)) + { + return NULLSTR; + } + final int start = str.indexOf(open); + if (start != INDEX_NOT_FOUND) + { + final int end = str.lastIndexOf(close); + if (end != INDEX_NOT_FOUND) + { + return str.substring(start + open.length(), end); + } + } + return NULLSTR; + } + + /** + * 判断是否为空,并且不是空白字符 + * + * @param str 要判断的value + * @return 结果 + */ + public static boolean hasText(String str) + { + return (str != null && !str.isEmpty() && containsText(str)); + } + + private static boolean containsText(CharSequence str) + { + int strLen = str.length(); + for (int i = 0; i < strLen; i++) + { + if (!Character.isWhitespace(str.charAt(i))) + { + return true; + } + } + return false; + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) + { + if (isEmpty(params) || isEmpty(template)) + { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) + { + return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); + } + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static final Set str2Set(String str, String sep) + { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @return list集合 + */ + public static final List str2List(String str, String sep) + { + return str2List(str, sep, true, false); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) + { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) + { + return list; + } + + // 过滤空白字符串 + if (filterBlank && StringUtils.isBlank(str)) + { + return list; + } + String[] split = str.split(sep); + for (String string : split) + { + if (filterBlank && StringUtils.isBlank(string)) + { + continue; + } + if (trim) + { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value + * + * @param collection 给定的集合 + * @param array 给定的数组 + * @return boolean 结果 + */ + public static boolean containsAny(Collection collection, String... array) + { + if (isEmpty(collection) || isEmpty(array)) + { + return false; + } + else + { + for (String str : array) + { + if (collection.contains(str)) + { + return true; + } + } + return false; + } + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) + { + if (isEmpty(cs) || isEmpty(searchCharSequences)) + { + return false; + } + for (CharSequence testStr : searchCharSequences) + { + if (containsIgnoreCase(cs, testStr)) + { + return true; + } + } + return false; + } + + /** + * 驼峰转下划线命名 + */ + 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; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_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(); + } + + /** + * 驼峰式命名法 + * 例如:user_name->userName + */ + public static String toCamelCase(String s) + { + if (s == null) + { + return null; + } + if (s.indexOf(SEPARATOR) == -1) + { + return s; + } + 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 pattern : strs) + { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) + { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) + { + return (T) obj; + } + + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static final String padl(final Number num, final int size) + { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static final String padl(final String s, final int size, final char c) + { + final StringBuilder sb = new StringBuilder(size); + if (s != null) + { + final int len = s.length(); + if (s.length() <= size) + { + for (int i = size - len; i > 0; i--) + { + sb.append(c); + } + sb.append(s); + } + else + { + return s.substring(len - size, len); + } + } + else + { + for (int i = size; i > 0; i--) + { + sb.append(c); + } + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/utils/Threads.java b/src/main/java/com/evobms/common/utils/Threads.java new file mode 100644 index 0000000..f158737 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/Threads.java @@ -0,0 +1,99 @@ +package com.evobms.common.utils; + +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 线程相关工具类. + * + * @author ruoyi + */ +public class Threads +{ + private static final Logger logger = LoggerFactory.getLogger(Threads.class); + + /** + * sleep等待,单位为毫秒 + */ + public static void sleep(long milliseconds) + { + try + { + Thread.sleep(milliseconds); + } + catch (InterruptedException e) + { + return; + } + } + + /** + * 停止线程池 + * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. + * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. + * 如果仍然超時,則強制退出. + * 另对在shutdown时线程本身被调用中断做了处理. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) + { + if (pool != null && !pool.isShutdown()) + { + pool.shutdown(); + try + { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + logger.info("Pool did not terminate"); + } + } + } + catch (InterruptedException ie) + { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 打印线程异常信息 + */ + public static void printException(Runnable r, Throwable t) + { + if (t == null && r instanceof Future) + { + try + { + Future future = (Future) r; + if (future.isDone()) + { + future.get(); + } + } + catch (CancellationException ce) + { + t = ce; + } + catch (ExecutionException ee) + { + t = ee.getCause(); + } + catch (InterruptedException ie) + { + Thread.currentThread().interrupt(); + } + } + if (t != null) + { + logger.error(t.getMessage(), t); + } + } +} diff --git a/src/main/java/com/evobms/common/utils/bean/BeanUtils.java b/src/main/java/com/evobms/common/utils/bean/BeanUtils.java new file mode 100644 index 0000000..1c3299c --- /dev/null +++ b/src/main/java/com/evobms/common/utils/bean/BeanUtils.java @@ -0,0 +1,110 @@ +package com.evobms.common.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(); + } + } + + /** + * 获取对象的setter方法。 + * + * @param obj 对象 + * @return 对象的setter方法列表 + */ + 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; + } + + /** + * 获取对象的getter方法。 + * + * @param obj 对象 + * @return 对象的getter方法列表 + */ + + 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; + } + + /** + * 检查Bean方法名中的属性名是否相等。
+ * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 + * + * @param m1 方法名1 + * @param m2 方法名2 + * @return 属性名一样返回true,否则返回false + */ + + 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/src/main/java/com/evobms/common/utils/bean/BeanValidators.java b/src/main/java/com/evobms/common/utils/bean/BeanValidators.java new file mode 100644 index 0000000..10408f0 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/bean/BeanValidators.java @@ -0,0 +1,24 @@ +package com.evobms.common.utils.bean; + +import java.util.Set; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validator; + +/** + * bean对象属性验证 + * + * @author ruoyi + */ +public class BeanValidators +{ + public static void validateWithException(Validator validator, Object object, Class... groups) + throws ConstraintViolationException + { + Set> constraintViolations = validator.validate(object, groups); + if (!constraintViolations.isEmpty()) + { + throw new ConstraintViolationException(constraintViolations); + } + } +} diff --git a/src/main/java/com/evobms/common/utils/file/FileTypeUtils.java b/src/main/java/com/evobms/common/utils/file/FileTypeUtils.java new file mode 100644 index 0000000..01fdfc9 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/file/FileTypeUtils.java @@ -0,0 +1,76 @@ +package com.evobms.common.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; + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/utils/file/FileUploadUtils.java b/src/main/java/com/evobms/common/utils/file/FileUploadUtils.java new file mode 100644 index 0000000..fe7365d --- /dev/null +++ b/src/main/java/com/evobms/common/utils/file/FileUploadUtils.java @@ -0,0 +1,260 @@ +package com.evobms.common.utils.file; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Objects; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; +import com.evobms.common.constant.Constants; +import com.evobms.common.exception.file.FileNameLengthLimitExceededException; +import com.evobms.common.exception.file.FileSizeLimitExceededException; +import com.evobms.common.exception.file.InvalidExtensionException; +import com.evobms.common.utils.DateUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.uuid.IdUtils; +import com.evobms.common.utils.uuid.Seq; +import com.evobms.framework.config.RuoYiConfig; + +/** + * 文件上传工具类 + * + * @author ruoyi + */ +public class FileUploadUtils +{ + /** + * 默认大小 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024L; + + /** + * 默认的文件名最大长度 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 默认上传的地址 + */ + private static String defaultBaseDir = RuoYiConfig.getProfile(); + + public static void setDefaultBaseDir(String defaultBaseDir) + { + FileUploadUtils.defaultBaseDir = defaultBaseDir; + } + + public static String getDefaultBaseDir() + { + return defaultBaseDir; + } + + /** + * 以默认配置进行文件上传 + * + * @param file 上传的文件 + * @return 文件名称 + * @throws Exception + */ + public static final String upload(MultipartFile file) throws IOException + { + try + { + return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 根据文件路径上传 + * + * @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 allowedExtension 上传文件类型 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException + { + return upload(baseDir, file, allowedExtension, false); + } + + /** + * 文件上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @param useCustomNaming 系统自定义文件名 + * @param allowedExtension 上传文件类型 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension, boolean useCustomNaming) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException + { + int fileNameLength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNameLength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) + { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = useCustomNaming ? uuidFilename(file) : extractFilename(file); + + String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); + file.transferTo(Paths.get(absPath)); + return getPathFileName(baseDir, fileName); + } + + /** + * 编码文件名(日期格式目录 + 原文件名 + 序列值 + 后缀) + */ + public static final String extractFilename(MultipartFile file) + { + return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); + } + + /** + * 编编码文件名(日期格式目录 + UUID + 后缀) + */ + public static final String uuidFilename(MultipartFile file) + { + return StringUtils.format("{}/{}.{}", DateUtils.datePath(), IdUtils.fastSimpleUUID(), getExtension(file)); + } + + public 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; + } + + public static final String getPathFileName(String uploadDir, String fileName) throws IOException + { + int dirLastIndex = RuoYiConfig.getProfile().length() + 1; + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); + return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + } + + /** + * 文件大小校验 + * + * @param file 上传的文件 + * @return + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws InvalidExtensionException + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException + { + long size = file.getSize(); + if (size > DEFAULT_MAX_SIZE) + { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = 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(Objects.requireNonNull(file.getContentType())); + } + return extension; + } +} diff --git a/src/main/java/com/evobms/common/utils/file/FileUtils.java b/src/main/java/com/evobms/common/utils/file/FileUtils.java new file mode 100644 index 0000000..40d7932 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/file/FileUtils.java @@ -0,0 +1,303 @@ +package com.evobms.common.utils.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +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.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; +import com.evobms.common.constant.Constants; +import com.evobms.common.utils.DateUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.uuid.IdUtils; +import com.evobms.framework.config.RuoYiConfig; + +/** + * 文件处理工具类 + * + * @author ruoyi + */ +public class FileUtils +{ + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; + + /** + * 输出指定文件的byte数组 + * + * @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 + { + IOUtils.close(os); + IOUtils.close(fis); + } + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeImportBytes(byte[] data) throws IOException + { + return writeBytes(data, RuoYiConfig.getImportPath()); + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @param uploadDir 目标文件 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeBytes(byte[] data, String uploadDir) throws IOException + { + FileOutputStream fos = null; + String pathName = ""; + try + { + String extension = getFileExtendName(data); + pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); + fos = new FileOutputStream(file); + fos.write(data); + } + finally + { + IOUtils.close(fos); + } + return FileUploadUtils.getPathFileName(uploadDir, pathName); + } + + /** + * 移除路径中的请求前缀片段 + * + * @param filePath 文件路径 + * @return 移除后的文件路径 + */ + public static String stripPrefix(String filePath) + { + return StringUtils.substringAfter(filePath, Constants.RESOURCE_PREFIX); + } + + /** + * 删除文件 + * + * @param filePath 文件 + * @return + */ + public static boolean deleteFile(String filePath) + { + boolean flag = false; + File file = new File(filePath); + // 路径为文件且不为空则进行删除 + if (file.isFile() && file.exists()) + { + flag = file.delete(); + } + return flag; + } + + /** + * 文件名称验证 + * + * @param filename 文件名称 + * @return true 正常 false 非法 + */ + public static boolean isValidFilename(String filename) + { + return filename.matches(FILENAME_PATTERN); + } + + /** + * 检查文件是否可下载 + * + * @param resource 需要下载的文件 + * @return true 正常 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 response 响应对象 + * @param realFileName 真实文件名 + */ + 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.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); + response.setHeader("Content-disposition", contentDispositionValue.toString()); + response.setHeader("download-filename", percentEncodedFileName); + } + + /** + * 百分号编码工具方法 + * + * @param s 需要百分号编码的字符串 + * @return 百分号编码后的字符串 + */ + public static String percentEncode(String s) throws UnsupportedEncodingException + { + String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); + return encode.replaceAll("\\+", "%20"); + } + + /** + * 获取图像后缀 + * + * @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; + } + + /** + * 获取文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png + * + * @param fileName 路径名称 + * @return 没有文件路径的名称 + */ + public static String getName(String fileName) + { + if (fileName == null) + { + return null; + } + int lastUnixPos = fileName.lastIndexOf('/'); + int lastWindowsPos = fileName.lastIndexOf('\\'); + int index = Math.max(lastUnixPos, lastWindowsPos); + return fileName.substring(index + 1); + } + + /** + * 获取不带后缀文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi + * + * @param fileName 路径名称 + * @return 没有文件路径和后缀的名称 + */ + public static String getNameNotSuffix(String fileName) + { + if (fileName == null) + { + return null; + } + String baseName = FilenameUtils.getBaseName(fileName); + return baseName; + } +} diff --git a/src/main/java/com/evobms/common/utils/file/ImageUtils.java b/src/main/java/com/evobms/common/utils/file/ImageUtils.java new file mode 100644 index 0000000..5162b0c --- /dev/null +++ b/src/main/java/com/evobms/common/utils/file/ImageUtils.java @@ -0,0 +1,98 @@ +package com.evobms.common.utils.file; + +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +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; +import com.evobms.common.constant.Constants; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.config.RuoYiConfig; + +/** + * 图片处理工具类 + * + * @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 url 地址 + * @return 字节数据 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + try + { + if (url.startsWith("http")) + { + // 网络地址 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + } + else + { + // 本机地址 + String localPath = RuoYiConfig.getProfile(); + String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX); + in = new FileInputStream(downloadPath); + } + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("获取文件路径异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(in); + } + } +} diff --git a/src/main/java/com/evobms/common/utils/file/MimeTypeUtils.java b/src/main/java/com/evobms/common/utils/file/MimeTypeUtils.java new file mode 100644 index 0000000..eefc16a --- /dev/null +++ b/src/main/java/com/evobms/common/utils/file/MimeTypeUtils.java @@ -0,0 +1,59 @@ +package com.evobms.common.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/src/main/java/com/evobms/common/utils/html/EscapeUtil.java b/src/main/java/com/evobms/common/utils/html/EscapeUtil.java new file mode 100644 index 0000000..02f20c5 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/html/EscapeUtil.java @@ -0,0 +1,167 @@ +package com.evobms.common.utils.html; + +import com.evobms.common.utils.StringUtils; + +/** + * 转义和反转义工具类 + * + * @author ruoyi + */ +public class EscapeUtil +{ + public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; + + private static final char[][] TEXT = new char[64][]; + + static + { + for (int i = 0; i < 64; i++) + { + TEXT[i] = new char[] { (char) i }; + } + + // special HTML characters + TEXT['\''] = "'".toCharArray(); // 单引号 + TEXT['"'] = """.toCharArray(); // 双引号 + TEXT['&'] = "&".toCharArray(); // &符 + TEXT['<'] = "<".toCharArray(); // 小于号 + TEXT['>'] = ">".toCharArray(); // 大于号 + } + + /** + * 转义文本中的HTML字符为安全的字符 + * + * @param text 被转义的文本 + * @return 转义后的文本 + */ + public static String escape(String text) + { + return encode(text); + } + + /** + * 还原被转义的HTML特殊字符 + * + * @param content 包含转义符的HTML内容 + * @return 转换后的字符串 + */ + public static String unescape(String content) + { + return decode(content); + } + + /** + * 清除所有HTML标签,但是不删除标签内的内容 + * + * @param content 文本 + * @return 清除标签后的文本 + */ + public static String clean(String content) + { + return new HTMLFilter().filter(content); + } + + /** + * Escape编码 + * + * @param text 被编码的文本 + * @return 编码后的字符 + */ + private static String encode(String text) + { + if (StringUtils.isEmpty(text)) + { + return StringUtils.EMPTY; + } + + final StringBuilder tmp = new StringBuilder(text.length() * 6); + char c; + for (int i = 0; i < text.length(); i++) + { + c = text.charAt(i); + if (c < 256) + { + tmp.append("%"); + if (c < 16) + { + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + else + { + tmp.append("%u"); + if (c <= 0xfff) + { + // issue#I49JU8@Gitee + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + } + return tmp.toString(); + } + + /** + * Escape解码 + * + * @param content 被转义的内容 + * @return 解码后的字符串 + */ + public static String decode(String content) + { + if (StringUtils.isEmpty(content)) + { + return content; + } + + StringBuilder tmp = new StringBuilder(content.length()); + int lastPos = 0, pos = 0; + char ch; + while (lastPos < content.length()) + { + pos = content.indexOf("%", lastPos); + if (pos == lastPos) + { + if (content.charAt(pos + 1) == 'u') + { + ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); + tmp.append(ch); + lastPos = pos + 6; + } + else + { + ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); + tmp.append(ch); + lastPos = pos + 3; + } + } + else + { + if (pos == -1) + { + tmp.append(content.substring(lastPos)); + lastPos = content.length(); + } + else + { + tmp.append(content.substring(lastPos, pos)); + lastPos = pos; + } + } + } + return tmp.toString(); + } + + public static void main(String[] args) + { + String html = ""; + String escape = EscapeUtil.escape(html); + // String html = "ipt>alert(\"XSS\")ipt>"; + // String html = "<123"; + // String html = "123>"; + System.out.println("clean: " + EscapeUtil.clean(html)); + System.out.println("escape: " + escape); + System.out.println("unescape: " + EscapeUtil.unescape(escape)); + } +} diff --git a/src/main/java/com/evobms/common/utils/html/HTMLFilter.java b/src/main/java/com/evobms/common/utils/html/HTMLFilter.java new file mode 100644 index 0000000..2a14169 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/html/HTMLFilter.java @@ -0,0 +1,570 @@ +package com.evobms.common.utils.html; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * HTML过滤器,用于去除XSS漏洞隐患。 + * + * @author ruoyi + */ +public final class HTMLFilter +{ + /** + * regex flag union representing /si modifiers in php + **/ + private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL; + private static final Pattern P_COMMENTS = Pattern.compile("", Pattern.DOTALL); + private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI); + private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL); + private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI); + private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI); + private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI); + private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI); + private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI); + private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?"); + private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?"); + private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?"); + private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))"); + private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL); + private static final Pattern P_END_ARROW = Pattern.compile("^>"); + private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_AMP = Pattern.compile("&"); + private static final Pattern P_QUOTE = Pattern.compile("\""); + private static final Pattern P_LEFT_ARROW = Pattern.compile("<"); + private static final Pattern P_RIGHT_ARROW = Pattern.compile(">"); + private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>"); + + // @xxx could grow large... maybe use sesat's ReferenceMap + private static final ConcurrentMap P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>(); + private static final ConcurrentMap P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>(); + + /** + * set of allowed html elements, along with allowed attributes for each element + **/ + private final Map> vAllowed; + /** + * counts of open tags for each (allowable) html element + **/ + private final Map vTagCounts = new HashMap<>(); + + /** + * html elements which must always be self-closing (e.g. "") + **/ + private final String[] vSelfClosingTags; + /** + * html elements which must always have separate opening and closing tags (e.g. "") + **/ + private final String[] vNeedClosingTags; + /** + * set of disallowed html elements + **/ + private final String[] vDisallowed; + /** + * attributes which should be checked for valid protocols + **/ + private final String[] vProtocolAtts; + /** + * allowed protocols + **/ + private final String[] vAllowedProtocols; + /** + * tags which should be removed if they contain no content (e.g. "" or "") + **/ + private final String[] vRemoveBlanks; + /** + * entities allowed within html markup + **/ + private final String[] vAllowedEntities; + /** + * flag determining whether comments are allowed in input String. + */ + private final boolean stripComment; + private final boolean encodeQuotes; + /** + * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "" + * becomes " text "). If set to false, unbalanced angle brackets will be html escaped. + */ + private final boolean alwaysMakeTags; + + /** + * Default constructor. + */ + public HTMLFilter() + { + vAllowed = new HashMap<>(); + + final ArrayList a_atts = new ArrayList<>(); + a_atts.add("href"); + a_atts.add("target"); + vAllowed.put("a", a_atts); + + final ArrayList img_atts = new ArrayList<>(); + img_atts.add("src"); + img_atts.add("width"); + img_atts.add("height"); + img_atts.add("alt"); + vAllowed.put("img", img_atts); + + final ArrayList no_atts = new ArrayList<>(); + vAllowed.put("b", no_atts); + vAllowed.put("strong", no_atts); + vAllowed.put("i", no_atts); + vAllowed.put("em", no_atts); + + vSelfClosingTags = new String[] { "img" }; + vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" }; + vDisallowed = new String[] {}; + vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp. + vProtocolAtts = new String[] { "src", "href" }; + vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" }; + vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" }; + stripComment = true; + encodeQuotes = true; + alwaysMakeTags = false; + } + + /** + * Map-parameter configurable constructor. + * + * @param conf map containing configuration. keys match field names. + */ + @SuppressWarnings("unchecked") + public HTMLFilter(final Map conf) + { + + assert conf.containsKey("vAllowed") : "configuration requires vAllowed"; + assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags"; + assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags"; + assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed"; + assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols"; + assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts"; + assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks"; + assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities"; + + vAllowed = Collections.unmodifiableMap((HashMap>) conf.get("vAllowed")); + vSelfClosingTags = (String[]) conf.get("vSelfClosingTags"); + vNeedClosingTags = (String[]) conf.get("vNeedClosingTags"); + vDisallowed = (String[]) conf.get("vDisallowed"); + vAllowedProtocols = (String[]) conf.get("vAllowedProtocols"); + vProtocolAtts = (String[]) conf.get("vProtocolAtts"); + vRemoveBlanks = (String[]) conf.get("vRemoveBlanks"); + vAllowedEntities = (String[]) conf.get("vAllowedEntities"); + stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true; + encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true; + alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true; + } + + private void reset() + { + vTagCounts.clear(); + } + + // --------------------------------------------------------------- + // my versions of some PHP library functions + public static String chr(final int decimal) + { + return String.valueOf((char) decimal); + } + + public static String htmlSpecialChars(final String s) + { + String result = s; + result = regexReplace(P_AMP, "&", result); + result = regexReplace(P_QUOTE, """, result); + result = regexReplace(P_LEFT_ARROW, "<", result); + result = regexReplace(P_RIGHT_ARROW, ">", result); + return result; + } + + // --------------------------------------------------------------- + + /** + * given a user submitted input String, filter out any invalid or restricted html. + * + * @param input text (i.e. submitted by a user) than may contain html + * @return "clean" version of input, with only valid, whitelisted html elements allowed + */ + public String filter(final String input) + { + reset(); + String s = input; + + s = escapeComments(s); + + s = balanceHTML(s); + + s = checkTags(s); + + s = processRemoveBlanks(s); + + // s = validateEntities(s); + + return s; + } + + public boolean isAlwaysMakeTags() + { + return alwaysMakeTags; + } + + public boolean isStripComments() + { + return stripComment; + } + + private String escapeComments(final String s) + { + final Matcher m = P_COMMENTS.matcher(s); + final StringBuffer buf = new StringBuffer(); + if (m.find()) + { + final String match = m.group(1); // (.*?) + m.appendReplacement(buf, Matcher.quoteReplacement("")); + } + m.appendTail(buf); + + return buf.toString(); + } + + private String balanceHTML(String s) + { + if (alwaysMakeTags) + { + // + // try and form html + // + s = regexReplace(P_END_ARROW, "", s); + // 不追加结束标签 + s = regexReplace(P_BODY_TO_END, "<$1>", s); + s = regexReplace(P_XML_CONTENT, "$1<$2", s); + + } + else + { + // + // escape stray brackets + // + s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s); + s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s); + + // + // the last regexp causes '<>' entities to appear + // (we need to do a lookahead assertion so that the last bracket can + // be used in the next pass of the regexp) + // + s = regexReplace(P_BOTH_ARROWS, "", s); + } + + return s; + } + + private String checkTags(String s) + { + Matcher m = P_TAGS.matcher(s); + + final StringBuffer buf = new StringBuffer(); + while (m.find()) + { + String replaceStr = m.group(1); + replaceStr = processTag(replaceStr); + m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr)); + } + m.appendTail(buf); + + // these get tallied in processTag + // (remember to reset before subsequent calls to filter method) + final StringBuilder sBuilder = new StringBuilder(buf.toString()); + for (String key : vTagCounts.keySet()) + { + for (int ii = 0; ii < vTagCounts.get(key); ii++) + { + sBuilder.append(""); + } + } + s = sBuilder.toString(); + + return s; + } + + private String processRemoveBlanks(final String s) + { + String result = s; + for (String tag : vRemoveBlanks) + { + if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) + { + P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?>")); + } + result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result); + if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) + { + P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>")); + } + result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result); + } + + return result; + } + + private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) + { + Matcher m = regex_pattern.matcher(s); + return m.replaceAll(replacement); + } + + private String processTag(final String s) + { + // ending tags + Matcher m = P_END_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + if (allowed(name)) + { + if (false == inArray(name, vSelfClosingTags)) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) - 1); + return ""; + } + } + } + } + + // starting tags + m = P_START_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + final String body = m.group(2); + String ending = m.group(3); + + // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" ); + if (allowed(name)) + { + final StringBuilder params = new StringBuilder(); + + final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body); + final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body); + final List paramNames = new ArrayList<>(); + final List paramValues = new ArrayList<>(); + while (m2.find()) + { + paramNames.add(m2.group(1)); // ([a-z0-9]+) + paramValues.add(m2.group(3)); // (.*?) + } + while (m3.find()) + { + paramNames.add(m3.group(1)); // ([a-z0-9]+) + paramValues.add(m3.group(3)); // ([^\"\\s']+) + } + + String paramName, paramValue; + for (int ii = 0; ii < paramNames.size(); ii++) + { + paramName = paramNames.get(ii).toLowerCase(); + paramValue = paramValues.get(ii); + + // debug( "paramName='" + paramName + "'" ); + // debug( "paramValue='" + paramValue + "'" ); + // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) ); + + if (allowedAttribute(name, paramName)) + { + if (inArray(paramName, vProtocolAtts)) + { + paramValue = processParamProtocol(paramValue); + } + params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\""); + } + } + + if (inArray(name, vSelfClosingTags)) + { + ending = " /"; + } + + if (inArray(name, vNeedClosingTags)) + { + ending = ""; + } + + if (ending == null || ending.length() < 1) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) + 1); + } + else + { + vTagCounts.put(name, 1); + } + } + else + { + ending = " /"; + } + return "<" + name + params + ending + ">"; + } + else + { + return ""; + } + } + + // comments + m = P_COMMENT.matcher(s); + if (!stripComment && m.find()) + { + return "<" + m.group() + ">"; + } + + return ""; + } + + private String processParamProtocol(String s) + { + s = decodeEntities(s); + final Matcher m = P_PROTOCOL.matcher(s); + if (m.find()) + { + final String protocol = m.group(1); + if (!inArray(protocol, vAllowedProtocols)) + { + // bad protocol, turn into local anchor link instead + s = "#" + s.substring(protocol.length() + 1); + if (s.startsWith("#//")) + { + s = "#" + s.substring(3); + } + } + } + + return s; + } + + private String decodeEntities(String s) + { + StringBuffer buf = new StringBuffer(); + + Matcher m = P_ENTITY.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.decode(match).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENTITY_UNICODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENCODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + s = validateEntities(s); + return s; + } + + private String validateEntities(final String s) + { + StringBuffer buf = new StringBuffer(); + + // validate entities throughout the string + Matcher m = P_VALID_ENTITIES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // ([^&;]*) + final String two = m.group(2); // (?=(;|&|$)) + m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two))); + } + m.appendTail(buf); + + return encodeQuotes(buf.toString()); + } + + private String encodeQuotes(final String s) + { + if (encodeQuotes) + { + StringBuffer buf = new StringBuffer(); + Matcher m = P_VALID_QUOTES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // (>|^) + final String two = m.group(2); // ([^<]+?) + final String three = m.group(3); // (<|$) + // 不替换双引号为",防止json格式无效 regexReplace(P_QUOTE, """, two) + m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three)); + } + m.appendTail(buf); + return buf.toString(); + } + else + { + return s; + } + } + + private String checkEntity(final String preamble, final String term) + { + + return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble; + } + + private boolean isValidEntity(final String entity) + { + return inArray(entity, vAllowedEntities); + } + + private static boolean inArray(final String s, final String[] array) + { + for (String item : array) + { + if (item != null && item.equals(s)) + { + return true; + } + } + return false; + } + + private boolean allowed(final String name) + { + return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed); + } + + private boolean allowedAttribute(final String name, final String paramName) + { + return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName)); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/utils/http/HttpHelper.java b/src/main/java/com/evobms/common/utils/http/HttpHelper.java new file mode 100644 index 0000000..645b572 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/http/HttpHelper.java @@ -0,0 +1,55 @@ +package com.evobms.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import javax.servlet.ServletRequest; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 通用http工具封装 + * + * @author ruoyi + */ +public class HttpHelper +{ + private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class); + + public static String getBodyString(ServletRequest request) + { + StringBuilder sb = new StringBuilder(); + BufferedReader reader = null; + try (InputStream inputStream = request.getInputStream()) + { + reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + String line = ""; + while ((line = reader.readLine()) != null) + { + sb.append(line); + } + } + catch (IOException e) + { + LOGGER.warn("getBodyString出现问题!"); + } + finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException e) + { + LOGGER.error(ExceptionUtils.getMessage(e)); + } + } + } + return sb.toString(); + } +} diff --git a/src/main/java/com/evobms/common/utils/http/HttpUtils.java b/src/main/java/com/evobms/common/utils/http/HttpUtils.java new file mode 100644 index 0000000..e9ef948 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/http/HttpUtils.java @@ -0,0 +1,293 @@ +package com.evobms.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.cert.X509Certificate; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.evobms.common.constant.Constants; +import com.evobms.common.utils.StringUtils; +import org.springframework.http.MediaType; + +/** + * 通用http发送方法 + * + * @author ruoyi + */ +public class HttpUtils +{ + private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url) + { + return sendGet(url, StringUtils.EMPTY); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param) + { + return sendGet(url, param, Constants.UTF8); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @param contentType 编码类型 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param, String contentType) + { + StringBuilder result = new StringBuilder(); + BufferedReader in = null; + try + { + String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; + log.info("sendGet - {}", urlNameString); + URL realUrl = new URL(urlNameString); + URLConnection connection = realUrl.openConnection(); + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + connection.connect(); + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (in != null) + { + in.close(); + } + } + catch (Exception ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, String param) + { + return sendPost(url, param, MediaType.APPLICATION_FORM_URLENCODED_VALUE); + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数 + * @param contentType 内容类型 + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, String param, String contentType) + { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try + { + log.info("sendPost - {}", url); + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("Content-Type", contentType); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (out != null) + { + out.close(); + } + if (in != null) + { + in.close(); + } + } + catch (IOException ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + public static String sendSSLPost(String url, String param) + { + return sendSSLPost(url, param, MediaType.APPLICATION_FORM_URLENCODED_VALUE); + } + + public static String sendSSLPost(String url, String param, String contentType) + { + StringBuilder result = new StringBuilder(); + String urlNameString = url + "?" + param; + try + { + log.info("sendSSLPost - {}", urlNameString); + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); + URL console = new URL(urlNameString); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("Content-Type", contentType); + conn.setDoOutput(true); + conn.setDoInput(true); + + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.connect(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String ret = ""; + while ((ret = br.readLine()) != null) + { + if (ret != null && !"".equals(ret.trim())) + { + result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + } + } + log.info("recv - {}", result); + conn.disconnect(); + br.close(); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); + } + return result.toString(); + } + + private static class TrustAnyTrustManager implements X509TrustManager + { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public X509Certificate[] getAcceptedIssuers() + { + return new X509Certificate[] {}; + } + } + + private static class TrustAnyHostnameVerifier implements HostnameVerifier + { + @Override + public boolean verify(String hostname, SSLSession session) + { + return true; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/utils/ip/AddressUtils.java b/src/main/java/com/evobms/common/utils/ip/AddressUtils.java new file mode 100644 index 0000000..7447bb9 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/ip/AddressUtils.java @@ -0,0 +1,56 @@ +package com.evobms.common.utils.ip; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.evobms.common.constant.Constants; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.http.HttpUtils; +import com.evobms.framework.config.RuoYiConfig; + +/** + * 获取地址类 + * + * @author ruoyi + */ +public class AddressUtils +{ + private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); + + // IP地址查询 + public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; + + // 未知地址 + public static final String UNKNOWN = "XX XX"; + + public static String getRealAddressByIP(String ip) + { + // 内网不查询 + if (IpUtils.internalIp(ip)) + { + return "内网IP"; + } + if (RuoYiConfig.isAddressEnabled()) + { + try + { + String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); + if (StringUtils.isEmpty(rspStr)) + { + log.error("获取地理位置异常 {}", ip); + return UNKNOWN; + } + JSONObject obj = JSON.parseObject(rspStr); + String region = obj.getString("pro"); + String city = obj.getString("city"); + return String.format("%s %s", region, city); + } + catch (Exception e) + { + log.error("获取地理位置异常 {}", ip); + } + } + return UNKNOWN; + } +} diff --git a/src/main/java/com/evobms/common/utils/ip/IpUtils.java b/src/main/java/com/evobms/common/utils/ip/IpUtils.java new file mode 100644 index 0000000..8335809 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/ip/IpUtils.java @@ -0,0 +1,382 @@ +package com.evobms.common.utils.ip; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import javax.servlet.http.HttpServletRequest; +import com.evobms.common.utils.ServletUtils; +import com.evobms.common.utils.StringUtils; + +/** + * 获取IP方法 + * + * @author ruoyi + */ +public class IpUtils +{ + public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; + // 匹配 ip + public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")"; + public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))"; + // 匹配网段 + public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")"; + + /** + * 获取客户端IP + * + * @return IP地址 + */ + public static String getIpAddr() + { + return getIpAddr(ServletUtils.getRequest()); + } + + /** + * 获取客户端IP + * + * @param request 请求对象 + * @return IP地址 + */ + public static String getIpAddr(HttpServletRequest request) + { + if (request == null) + { + return "unknown"; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Real-IP"); + } + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getRemoteAddr(); + } + + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @param ip IP地址 + * @return 结果 + */ + public static boolean internalIp(String ip) + { + byte[] addr = textToNumericFormatV4(ip); + return internalIp(addr) || "127.0.0.1".equals(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @param addr byte地址 + * @return 结果 + */ + 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; + } + } + + /** + * 将IPv4地址转换成字节 + * + * @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; + } + + /** + * 获取IP地址 + * + * @return 本地IP地址 + */ + public static String getHostIp() + { + try + { + return InetAddress.getLocalHost().getHostAddress(); + } + catch (UnknownHostException e) + { + } + return "127.0.0.1"; + } + + /** + * 获取主机名 + * + * @return 本地主机名 + */ + public static String getHostName() + { + try + { + return InetAddress.getLocalHost().getHostName(); + } + catch (UnknownHostException e) + { + } + return "未知"; + } + + /** + * 从多级反向代理中获得第一个非unknown IP地址 + * + * @param ip 获得的IP地址 + * @return 第一个非unknown IP地址 + */ + public static String getMultistageReverseProxyIp(String ip) + { + // 多级反向代理检测 + if (ip != null && ip.indexOf(",") > 0) + { + final String[] ips = ip.trim().split(","); + for (String subIp : ips) + { + if (false == isUnknown(subIp)) + { + ip = subIp; + break; + } + } + } + return StringUtils.substring(ip, 0, 255); + } + + /** + * 检测给定字符串是否为未知,多用于检测HTTP请求相关 + * + * @param checkString 被检测的字符串 + * @return 是否未知 + */ + public static boolean isUnknown(String checkString) + { + return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); + } + + /** + * 是否为IP + */ + public static boolean isIP(String ip) + { + return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP); + } + + /** + * 是否为IP,或 *为间隔的通配符地址 + */ + public static boolean isIpWildCard(String ip) + { + return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD); + } + + /** + * 检测参数是否在ip通配符里 + */ + public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) + { + String[] s1 = ipWildCard.split("\\."); + String[] s2 = ip.split("\\."); + boolean isMatchedSeg = true; + for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) + { + if (!s1[i].equals(s2[i])) + { + isMatchedSeg = false; + break; + } + } + return isMatchedSeg; + } + + /** + * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串 + */ + public static boolean isIPSegment(String ipSeg) + { + return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG); + } + + /** + * 判断ip是否在指定网段中 + */ + public static boolean ipIsInNetNoCheck(String iparea, String ip) + { + int idx = iparea.indexOf('-'); + String[] sips = iparea.substring(0, idx).split("\\."); + String[] sipe = iparea.substring(idx + 1).split("\\."); + String[] sipt = ip.split("\\."); + long ips = 0L, ipe = 0L, ipt = 0L; + for (int i = 0; i < 4; ++i) + { + ips = ips << 8 | Integer.parseInt(sips[i]); + ipe = ipe << 8 | Integer.parseInt(sipe[i]); + ipt = ipt << 8 | Integer.parseInt(sipt[i]); + } + if (ips > ipe) + { + long t = ips; + ips = ipe; + ipe = t; + } + return ips <= ipt && ipt <= ipe; + } + + /** + * 校验ip是否符合过滤串规则 + * + * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99` + * @param ip 校验IP地址 + * @return boolean 结果 + */ + public static boolean isMatchedIp(String filter, String ip) + { + if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) + { + return false; + } + String[] ips = filter.split(";"); + for (String iStr : ips) + { + if (isIP(iStr) && iStr.equals(ip)) + { + return true; + } + else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) + { + return true; + } + else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) + { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/common/utils/job/AbstractQuartzJob.java b/src/main/java/com/evobms/common/utils/job/AbstractQuartzJob.java new file mode 100644 index 0000000..7b4d3ad --- /dev/null +++ b/src/main/java/com/evobms/common/utils/job/AbstractQuartzJob.java @@ -0,0 +1,106 @@ +package com.evobms.common.utils.job; + +import java.util.Date; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.evobms.common.constant.Constants; +import com.evobms.common.constant.ScheduleConstants; +import com.evobms.common.utils.ExceptionUtil; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.bean.BeanUtils; +import com.evobms.common.utils.spring.SpringUtils; +import com.evobms.project.monitor.domain.SysJob; +import com.evobms.project.monitor.domain.SysJobLog; +import com.evobms.project.monitor.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) + { + 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 sysScheduleJob 系统计划任务 + */ + 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(Constants.FAIL); + String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000); + sysJobLog.setExceptionInfo(errorMsg); + } + else + { + sysJobLog.setStatus(Constants.SUCCESS); + } + + // 写入数据库当中 + 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/src/main/java/com/evobms/common/utils/job/CronUtils.java b/src/main/java/com/evobms/common/utils/job/CronUtils.java new file mode 100644 index 0000000..4fdbf1d --- /dev/null +++ b/src/main/java/com/evobms/common/utils/job/CronUtils.java @@ -0,0 +1,63 @@ +package com.evobms.common.utils.job; + +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); + } + + /** + * 返回一个字符串值,表示该消息无效Cron表达式给出有效性 + * + * @param cronExpression Cron表达式 + * @return String 无效时返回表达式错误描述,如果有效返回null + */ + public static String getInvalidMessage(String cronExpression) + { + try + { + new CronExpression(cronExpression); + return null; + } + catch (ParseException pe) + { + return pe.getMessage(); + } + } + + /** + * 返回下一个执行时间根据给定的Cron表达式 + * + * @param cronExpression Cron表达式 + * @return Date 下次Cron表达式执行时间 + */ + public static Date getNextExecution(String cronExpression) + { + try + { + CronExpression cron = new CronExpression(cronExpression); + return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); + } + catch (ParseException e) + { + throw new IllegalArgumentException(e.getMessage()); + } + } +} diff --git a/src/main/java/com/evobms/common/utils/job/JobInvokeUtil.java b/src/main/java/com/evobms/common/utils/job/JobInvokeUtil.java new file mode 100644 index 0000000..06d65ac --- /dev/null +++ b/src/main/java/com/evobms/common/utils/job/JobInvokeUtil.java @@ -0,0 +1,182 @@ +package com.evobms.common.utils.job; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.spring.SpringUtils; +import com.evobms.project.monitor.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).getDeclaredConstructor().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().getMethod(methodName, getMethodParamsType(methodParams)); + method.invoke(bean, getMethodParamsValue(methodParams)); + } + else + { + Method method = bean.getClass().getMethod(methodName); + method.invoke(bean); + } + } + + /** + * 校验是否为为class包名 + * + * @param invokeTarget 名称 + * @return true是 false否 + */ + public static boolean isValidClassName(String invokeTarget) + { + return StringUtils.countMatches(invokeTarget, ".") > 1; + } + + /** + * 获取bean名称 + * + * @param invokeTarget 目标字符串 + * @return bean名称 + */ + public static String getBeanName(String invokeTarget) + { + String beanName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBeforeLast(beanName, "."); + } + + /** + * 获取bean方法 + * + * @param invokeTarget 目标字符串 + * @return method方法 + */ + public static String getMethodName(String invokeTarget) + { + String methodName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringAfterLast(methodName, "."); + } + + /** + * 获取method方法参数相关列表 + * + * @param invokeTarget 目标字符串 + * @return method方法相关参数列表 + */ + public static List getMethodParams(String invokeTarget) + { + String methodStr = StringUtils.substringBetweenLast(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.startsWithAny(str, "'", "\"")) + { + classs.add(new Object[] { StringUtils.substring(str, 1, str.length() - 1), String.class }); + } + // boolean布尔类型,等于true或者false + else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) + { + classs.add(new Object[] { Boolean.valueOf(str), Boolean.class }); + } + // long长整形,以L结尾 + else if (StringUtils.endsWith(str, "L")) + { + classs.add(new Object[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class }); + } + // double浮点类型,以D结尾 + else if (StringUtils.endsWith(str, "D")) + { + classs.add(new Object[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class }); + } + // 其他类型归类为整形 + else + { + classs.add(new Object[] { Integer.valueOf(str), Integer.class }); + } + } + return classs; + } + + /** + * 获取参数类型 + * + * @param methodParams 参数相关列表 + * @return 参数类型列表 + */ + public static Class[] getMethodParamsType(List 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/src/main/java/com/evobms/common/utils/job/QuartzDisallowConcurrentExecution.java b/src/main/java/com/evobms/common/utils/job/QuartzDisallowConcurrentExecution.java new file mode 100644 index 0000000..bc63536 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/job/QuartzDisallowConcurrentExecution.java @@ -0,0 +1,21 @@ +package com.evobms.common.utils.job; + +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import com.evobms.project.monitor.domain.SysJob; + +/** + * 定时任务处理(禁止并发执行) + * + * @author ruoyi + * + */ +@DisallowConcurrentExecution +public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/src/main/java/com/evobms/common/utils/job/QuartzJobExecution.java b/src/main/java/com/evobms/common/utils/job/QuartzJobExecution.java new file mode 100644 index 0000000..61709b5 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/job/QuartzJobExecution.java @@ -0,0 +1,19 @@ +package com.evobms.common.utils.job; + +import org.quartz.JobExecutionContext; +import com.evobms.project.monitor.domain.SysJob; + +/** + * 定时任务处理(允许并发执行) + * + * @author ruoyi + * + */ +public class QuartzJobExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/src/main/java/com/evobms/common/utils/job/ScheduleUtils.java b/src/main/java/com/evobms/common/utils/job/ScheduleUtils.java new file mode 100644 index 0000000..20d57fa --- /dev/null +++ b/src/main/java/com/evobms/common/utils/job/ScheduleUtils.java @@ -0,0 +1,141 @@ +package com.evobms.common.utils.job; + +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.evobms.common.constant.Constants; +import com.evobms.common.constant.ScheduleConstants; +import com.evobms.common.exception.job.TaskException; +import com.evobms.common.exception.job.TaskException.Code; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.spring.SpringUtils; +import com.evobms.project.monitor.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); + + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)) + .withSchedule(cronScheduleBuilder).build(); + + // 放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); + + // 判断是否存在 + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(getJobKey(jobId, jobGroup)); + } + + // 判断任务是否过期 + if (StringUtils.isNotNull(CronUtils.getNextExecution(job.getCronExpression()))) + { + // 执行调度任务 + scheduler.scheduleJob(jobDetail, trigger); + } + + // 暂停任务 + if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + } + + /** + * 设置定时任务策略 + */ + public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb) + throws TaskException + { + switch (job.getMisfirePolicy()) + { + case ScheduleConstants.MISFIRE_DEFAULT: + return cb; + case ScheduleConstants.MISFIRE_IGNORE_MISFIRES: + return cb.withMisfireHandlingInstructionIgnoreMisfires(); + case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED: + return cb.withMisfireHandlingInstructionFireAndProceed(); + case ScheduleConstants.MISFIRE_DO_NOTHING: + return cb.withMisfireHandlingInstructionDoNothing(); + default: + throw new TaskException("The task misfire policy '" + job.getMisfirePolicy() + + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR); + } + } + + /** + * 检查包名是否为白名单配置 + * + * @param invokeTarget 目标字符串 + * @return 结果 + */ + public static boolean whiteList(String invokeTarget) + { + String packageName = StringUtils.substringBefore(invokeTarget, "("); + int count = StringUtils.countMatches(packageName, "."); + if (count > 1) + { + return StringUtils.startsWithAny(invokeTarget, Constants.JOB_WHITELIST_STR); + } + Object obj = SpringUtils.getBean(StringUtils.split(invokeTarget, ".")[0]); + String beanPackageName = obj.getClass().getPackage().getName(); + return StringUtils.startsWithAny(beanPackageName, Constants.JOB_WHITELIST_STR) + && !StringUtils.startsWithAny(beanPackageName, Constants.JOB_ERROR_STR); + } +} diff --git a/src/main/java/com/evobms/common/utils/poi/ExcelHandlerAdapter.java b/src/main/java/com/evobms/common/utils/poi/ExcelHandlerAdapter.java new file mode 100644 index 0000000..e35f32f --- /dev/null +++ b/src/main/java/com/evobms/common/utils/poi/ExcelHandlerAdapter.java @@ -0,0 +1,24 @@ +package com.evobms.common.utils.poi; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Workbook; + +/** + * Excel数据格式处理适配器 + * + * @author ruoyi + */ +public interface ExcelHandlerAdapter +{ + /** + * 格式化 + * + * @param value 单元格数据值 + * @param args excel注解args参数组 + * @param cell 单元格对象 + * @param wb 工作簿对象 + * + * @return 处理后的值 + */ + Object format(Object value, String[] args, Cell cell, Workbook wb); +} diff --git a/src/main/java/com/evobms/common/utils/poi/ExcelUtil.java b/src/main/java/com/evobms/common/utils/poi/ExcelUtil.java new file mode 100644 index 0000000..e89ed54 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/poi/ExcelUtil.java @@ -0,0 +1,1893 @@ +package com.evobms.common.utils.poi; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +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.UUID; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.RegExUtils; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.poi.hssf.usermodel.HSSFClientAnchor; +import org.apache.poi.hssf.usermodel.HSSFPicture; +import org.apache.poi.hssf.usermodel.HSSFPictureData; +import org.apache.poi.hssf.usermodel.HSSFShape; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ooxml.POIXMLDocumentPart; +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.DataFormat; +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.Name; +import org.apache.poi.ss.usermodel.PictureData; +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.CellRangeAddress; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.apache.poi.xssf.usermodel.XSSFDrawing; +import org.apache.poi.xssf.usermodel.XSSFPicture; +import org.apache.poi.xssf.usermodel.XSSFShape; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.evobms.common.core.text.Convert; +import com.evobms.common.exception.UtilException; +import com.evobms.common.utils.DateUtils; +import com.evobms.common.utils.DictUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.file.FileTypeUtils; +import com.evobms.common.utils.file.FileUtils; +import com.evobms.common.utils.file.ImageUtils; +import com.evobms.common.utils.reflect.ReflectUtils; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.evobms.framework.aspectj.lang.annotation.Excel.Type; +import com.evobms.framework.aspectj.lang.annotation.Excels; +import com.evobms.framework.config.RuoYiConfig; +import com.evobms.framework.web.domain.AjaxResult; + +/** + * Excel相关处理 + * + * @author ruoyi + */ +public class ExcelUtil +{ + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + public static final String SEPARATOR = ","; + + public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; + + public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; + + /** + * 用于dictType属性数据存储,避免重复查缓存 + */ + public Map sysDictMap = new HashMap(); + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表名称 + */ + private String sheetName; + + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + private Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 导入导出数据列表 + */ + private List list; + + /** + * 注解列表 + */ + private List fields; + + /** + * 当前行号 + */ + private int rownum; + + /** + * 标题 + */ + private String title; + + /** + * 最大高度 + */ + private short maxHeight; + + /** + * 合并后最后行数 + */ + private int subMergedLastRowNum = 0; + + /** + * 合并后开始行数 + */ + private int subMergedFirstRowNum = 1; + + /** + * 对象的子列表方法 + */ + private Method subMethod; + + /** + * 对象的子列表属性 + */ + private List subFields; + + /** + * 统计列表 + */ + private Map statistics = new HashMap(); + + /** + * 实体对象 + */ + public Class clazz; + + /** + * 需要显示列属性 + */ + public String[] includeFields; + + /** + * 需要排除列属性 + */ + public String[] excludeFields; + + public ExcelUtil(Class clazz) + { + this.clazz = clazz; + } + + /** + * 仅在Excel中显示列属性 + * + * @param fields 列属性名 示例[单个"name"/多个"id","name"] + */ + public void showColumn(String... fields) + { + this.includeFields = fields; + } + + /** + * 隐藏Excel中列属性 + * + * @param fields 列属性名 示例[单个"name"/多个"id","name"] + */ + public void hideColumn(String... fields) + { + this.excludeFields = fields; + } + + public void init(List list, String sheetName, String title, Type type) + { + if (list == null) + { + list = new ArrayList(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + this.title = title; + createExcelField(); + createWorkbook(); + createTitle(); + createSubHead(); + } + + /** + * 创建excel第一行标题 + */ + public void createTitle() + { + if (StringUtils.isNotEmpty(title)) + { + int titleLastCol = this.fields.size() - 1; + if (isSubList()) + { + titleLastCol = titleLastCol + subFields.size() - 1; + } + Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); + titleRow.setHeightInPoints(30); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellStyle(styles.get("title")); + titleCell.setCellValue(title); + sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), 0, titleLastCol)); + } + } + + /** + * 创建对象的子列表名称 + */ + public void createSubHead() + { + if (isSubList()) + { + Row subRow = sheet.createRow(rownum); + int column = 0; + int subFieldSize = subFields != null ? subFields.size() : 0; + for (Object[] objects : fields) + { + Field field = (Field) objects[0]; + Excel attr = (Excel) objects[1]; + if (Collection.class.isAssignableFrom(field.getType())) + { + Cell cell = subRow.createCell(column); + cell.setCellValue(attr.name()); + cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + if (subFieldSize > 1) + { + CellRangeAddress cellAddress = new CellRangeAddress(rownum, rownum, column, column + subFieldSize - 1); + sheet.addMergedRegion(cellAddress); + } + column += subFieldSize; + } + else + { + Cell cell = subRow.createCell(column++); + cell.setCellValue(attr.name()); + cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + } + } + rownum++; + } + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(InputStream is) + { + return importExcel(is, 0); + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @param titleNum 标题占用行数 + * @return 转换后集合 + */ + public List importExcel(InputStream is, int titleNum) + { + List list = null; + try + { + list = importExcel(StringUtils.EMPTY, is, titleNum); + } + catch (Exception e) + { + log.error("导入Excel异常{}", e.getMessage()); + throw new UtilException(e.getMessage()); + } + finally + { + IOUtils.closeQuietly(is); + } + return list; + } + + /** + * 对excel表单指定表格索引名转换成list + * + * @param sheetName 表格索引名 + * @param titleNum 标题占用行数 + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception + { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); + if (sheet == null) + { + throw new IOException("文件sheet不存在"); + } + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map> pictures = null; + if (isXSSFWorkbook) + { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } + else + { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + } + // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 + int rows = sheet.getLastRowNum(); + if (rows > 0) + { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + Row heard = sheet.getRow(titleNum); + 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); + } + } + // 有数据时才处理 得到类的所有field. + List fields = this.getFields(); + Map fieldsMap = new HashMap(); + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Integer column = cellMap.get(attr.name()); + if (column != null) + { + fieldsMap.put(column, objects); + } + } + for (int i = titleNum + 1; i <= rows; i++) + { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + // 判断当前行是否是空行 + if (isRowEmpty(row)) + { + continue; + } + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) + { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = (Field) entry.getValue()[0]; + Excel attr = (Excel) entry.getValue()[1]; + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) + { + String s = Convert.toStr(val); + if (s.matches("^\\d+\\.0$")) + { + val = StringUtils.substringBefore(s, ".0"); + } + else + { + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) + { + val = parseDateToStr(dateFormat, 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) && StringUtils.isNumeric(Convert.toStr(val))) + { + 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)) + { + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) + { + propertyName = field.getName() + "." + attr.targetAttr(); + } + if (StringUtils.isNotEmpty(attr.readConverterExp())) + { + val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); + } + else if (StringUtils.isNotEmpty(attr.dictType())) + { + if (!sysDictMap.containsKey(attr.dictType() + val)) + { + String dictValue = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); + sysDictMap.put(attr.dictType() + val, dictValue); + } + val = sysDictMap.get(attr.dictType() + val); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + val = dataFormatHandlerAdapter(val, attr, null); + } + else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) + { + StringBuilder propertyString = new StringBuilder(); + List images = pictures.get(row.getRowNum() + "_" + entry.getKey()); + for (PictureData picture : images) + { + byte[] data = picture.getData(); + String fileName = FileUtils.writeImportBytes(data); + propertyString.append(fileName).append(SEPARATOR); + } + val = StringUtils.stripEnd(propertyString.toString(), SEPARATOR); + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName) + { + return exportExcel(list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName, String title) + { + this.init(list, sheetName, title, Type.EXPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName) + { + exportExcel(response, list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(list, sheetName, title, Type.EXPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName) + { + return importTemplateExcel(sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName, String title) + { + this.init(null, sheetName, title, Type.IMPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName) + { + importTemplateExcel(response, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(null, sheetName, title, Type.IMPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public void exportExcel(HttpServletResponse response) + { + try + { + writeSheet(); + wb.write(response.getOutputStream()); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + } + finally + { + IOUtils.closeQuietly(wb); + } + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public AjaxResult exportExcel() + { + OutputStream out = null; + try + { + writeSheet(); + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + throw new UtilException("导出Excel失败,请联系网站管理员!"); + } + finally + { + IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); + } + } + + /** + * 创建写入数据到Sheet + */ + public void writeSheet() + { + // 取出一共有多少个sheet. + int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); + for (int index = 0; index < sheetNo; index++) + { + createSheet(sheetNo, index); + + // 产生一行 + Row row = sheet.createRow(rownum); + int column = 0; + // 写入各个字段的列头名称 + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType())) + { + for (Field subField : subFields) + { + Excel subExcel = subField.getAnnotation(Excel.class); + this.createHeadCell(subExcel, row, column++); + } + } + else + { + this.createHeadCell(excel, row, column++); + } + } + if (Type.EXPORT.equals(type)) + { + fillExcelData(index, row); + addStatisticsRow(); + } + } + } + + /** + * 填充excel数据 + * + * @param index 序号 + * @param row 单元格行 + */ + @SuppressWarnings("unchecked") + public void fillExcelData(int index, Row row) + { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + int currentRowNum = rownum + 1; // 从标题行后开始 + + for (int i = startNo; i < endNo; i++) + { + row = sheet.createRow(currentRowNum); + T vo = (T) list.get(i); + int column = 0; + int maxSubListSize = getCurrentMaxSubListSize(vo); + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType())) + { + try + { + Collection subList = (Collection) getTargetValue(vo, field, excel); + if (subList != null && !subList.isEmpty()) + { + int subIndex = 0; + for (Object subVo : subList) + { + Row subRow = sheet.getRow(currentRowNum + subIndex); + if (subRow == null) + { + subRow = sheet.createRow(currentRowNum + subIndex); + } + + int subColumn = column; + for (Field subField : subFields) + { + Excel subExcel = subField.getAnnotation(Excel.class); + addCell(subExcel, subRow, (T) subVo, subField, subColumn++); + } + subIndex++; + } + column += subFields.size(); + } + } + catch (Exception e) + { + log.error("填充集合数据失败", e); + } + } + else + { + // 创建单元格并设置值 + addCell(excel, row, vo, field, column); + if (maxSubListSize > 1 && excel.needMerge()) + { + sheet.addMergedRegion(new CellRangeAddress(currentRowNum, currentRowNum + maxSubListSize - 1, column, column)); + } + column++; + } + } + currentRowNum += maxSubListSize; + } + } + + /** + * 获取子列表最大数 + */ + private int getCurrentMaxSubListSize(T vo) + { + int maxSubListSize = 1; + for (Object[] os : fields) + { + Field field = (Field) os[0]; + if (Collection.class.isAssignableFrom(field.getType())) + { + try + { + Collection subList = (Collection) getTargetValue(vo, field, (Excel) os[1]); + if (subList != null && !subList.isEmpty()) + { + maxSubListSize = Math.max(maxSubListSize, subList.size()); + } + } + catch (Exception e) + { + log.error("获取集合大小失败", e); + } + } + } + return maxSubListSize; + } + + /** + * 创建表格样式 + * + * @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); + Font titleFont = wb.createFont(); + titleFont.setFontName("Arial"); + titleFont.setFontHeightInPoints((short) 16); + titleFont.setBold(true); + style.setFont(titleFont); + DataFormat dataFormat = wb.createDataFormat(); + style.setDataFormat(dataFormat.getFormat("@")); + styles.put("title", style); + + 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.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setDataFormat(dataFormat.getFormat("######0.00")); + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short) 10); + style.setFont(totalFont); + styles.put("total", style); + + styles.putAll(annotationHeaderStyles(wb, styles)); + + styles.putAll(annotationDataStyles(wb)); + + return styles; + } + + /** + * 根据Excel注解创建表格头样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationHeaderStyles(Workbook wb, Map styles) + { + Map headerStyles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); + if (!headerStyles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(excel.headerBackgroundColor().index); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(excel.headerColor().index); + style.setFont(headerFont); + // 设置表格头单元格文本形式 + DataFormat dataFormat = wb.createDataFormat(); + style.setDataFormat(dataFormat.getFormat("@")); + headerStyles.put(key, style); + } + } + return headerStyles; + } + + /** + * 根据Excel注解创建表格列样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationDataStyles(Workbook wb) + { + Map styles = new HashMap(); + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType())) + { + ParameterizedType pt = (ParameterizedType) field.getGenericType(); + Class subClass = (Class) pt.getActualTypeArguments()[0]; + List subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + for (Field subField : subFields) + { + Excel subExcel = subField.getAnnotation(Excel.class); + annotationDataStyles(styles, subField, subExcel); + } + } + else + { + annotationDataStyles(styles, field, excel); + } + } + return styles; + } + + /** + * 根据Excel注解创建表格列样式 + * + * @param styles 自定义样式列表 + * @param field 属性列信息 + * @param excel 注解信息 + */ + public void annotationDataStyles(Map styles, Field field, Excel excel) + { + String key = StringUtils.format("data_{}_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), excel.cellType(), excel.wrapText()); + if (!styles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.setAlignment(excel.align()); + 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()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + style.setFillForegroundColor(excel.backgroundColor().getIndex()); + style.setWrapText(excel.wrapText()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + dataFont.setColor(excel.color().index); + style.setFont(dataFont); + if (ColumnType.TEXT == excel.cellType()) + { + DataFormat dataFormat = wb.createDataFormat(); + style.setDataFormat(dataFormat.getFormat("@")); + } + styles.put(key, style); + } + } + + /** + * 创建单元格 + */ + public Cell createHeadCell(Excel attr, Row row, int column) + { + // 创建列 + Cell cell = row.createCell(column); + // 写入列信息 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + if (isSubList()) + { + // 填充默认样式,防止合并单元格样式失效 + sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType(), attr.wrapText()))); + if (attr.needMerge()) + { + sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); + } + } + return cell; + } + + /** + * 设置单元格信息 + * + * @param value 单元格值 + * @param attr 注解相关 + * @param cell 单元格信息 + */ + public void setCellVo(Object value, Excel attr, Cell cell) + { + if (ColumnType.STRING == attr.cellType() || ColumnType.TEXT == attr.cellType()) + { + String cellValue = Convert.toStr(value); + // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 + if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) + { + cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); + } + if (value instanceof Collection && StringUtils.equals("[]", cellValue)) + { + cellValue = StringUtils.EMPTY; + } + cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); + } + else if (ColumnType.NUMERIC == attr.cellType()) + { + if (StringUtils.isNotNull(value)) + { + cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + } + } + else if (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 propertyValue = Convert.toStr(value); + if (StringUtils.isNotEmpty(propertyValue)) + { + List imagePaths = StringUtils.str2List(propertyValue, SEPARATOR); + for (String imagePath : imagePaths) + { + 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()) || attr.combo().length > 0 || attr.comboReadDict()) + { + String[] comboArray = attr.combo(); + if (attr.comboReadDict()) + { + if (!sysDictMap.containsKey("combo_" + attr.dictType())) + { + String labels = DictUtils.getDictLabels(attr.dictType()); + sysDictMap.put("combo_" + attr.dictType(), labels); + } + String val = sysDictMap.get("combo_" + attr.dictType()); + comboArray = StringUtils.split(val, DictUtils.SEPARATOR); + } + if (comboArray.length > 15 || StringUtils.join(comboArray).length() > 255) + { + // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 + setXSSFValidationWithHidden(sheet, comboArray, attr.prompt(), 1, 100, column, column); + } + else + { + // 提示信息或只能选择不能输入的列内容. + setPromptOrValidation(sheet, comboArray, attr.prompt(), 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); + if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) + { + if (subMergedLastRowNum >= subMergedFirstRowNum) + { + sheet.addMergedRegion(new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column)); + } + } + cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType(), attr.wrapText()))); + + // 用于读取对象中的属性 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + String separator = attr.separator(); + String dictType = attr.dictType(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) + { + cell.getCellStyle().setDataFormat(this.wb.getCreationHelper().createDataFormat().getFormat(dateFormat)); + cell.setCellValue(parseDateToStr(dateFormat, value)); + } + else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) + { + cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); + } + else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) + { + if (!sysDictMap.containsKey(dictType + value)) + { + String lable = convertDictByExp(Convert.toStr(value), dictType, separator); + sysDictMap.put(dictType + value, lable); + } + cell.setCellValue(sysDictMap.get(dictType + value)); + } + else if (value instanceof BigDecimal && -1 != attr.scale()) + { + cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + cell.setCellValue(dataFormatHandlerAdapter(value, attr, cell)); + } + 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 textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + + /** + * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). + * + * @param sheet 要设置的sheet. + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) + { + String hideSheetName = "combo_" + firstCol + "_" + endCol; + Sheet hideSheet = wb.createSheet(hideSheetName); // 用于存储 下拉菜单数据 + for (int i = 0; i < textlist.length; i++) + { + hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]); + } + // 创建名称,可被其他单元格引用 + Name name = wb.createName(); + name.setNameName(hideSheetName + "_data"); + name.setRefersToFormula(hideSheetName + "!$A$1:$A$" + textlist.length); + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 加载下拉列表内容 + DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + // 设置hiddenSheet隐藏 + wb.setSheetHidden(wb.getSheetIndex(hideSheet), true); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(SEPARATOR); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + 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); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(SEPARATOR); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + 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); + } + + /** + * 解析字典值 + * + * @param dictValue 字典值 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) + { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } + + /** + * 反向解析值字典值 + * + * @param dictLabel 字典标签 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典值 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) + { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + /** + * 数据处理器 + * + * @param value 数据值 + * @param excel 数据注解 + * @return + */ + public String dataFormatHandlerAdapter(Object value, Excel excel, Cell cell) + { + try + { + Object instance = excel.handler().newInstance(); + Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class, Cell.class, Workbook.class }); + value = formatMethod.invoke(instance, value, excel.args(), cell, this.wb); + } + catch (Exception e) + { + log.error("不能格式化数据 " + excel.handler(), e.getMessage()); + } + return Convert.toStr(value); + } + + /** + * 合计统计信息 + */ + 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) + { + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + Cell 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(statistics.get(key)); + } + statistics.clear(); + } + } + + /** + * 编码文件名 + */ + public String encodingFilename(String filename) + { + return UUID.randomUUID() + "_" + filename + ".xlsx"; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + */ + public String getAbsoluteFile(String filename) + { + String downloadPath = RuoYiConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 获取bean中的属性值 + * + * @param vo 实体对象 + * @param field 字段 + * @param excel 注解 + * @return 最终的属性值 + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception + { + field.setAccessible(true); + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) + { + String target = excel.targetAttr(); + if (target.contains(".")) + { + 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 = getFields(); + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + this.maxHeight = getRowHeight(); + } + + /** + * 获取字段注解信息 + */ + public List getFields() + { + List fields = new ArrayList(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + if (StringUtils.isNotEmpty(includeFields)) + { + for (Field field : tempFields) + { + if (ArrayUtils.contains(this.includeFields, field.getName()) || field.isAnnotationPresent(Excels.class)) + { + addField(fields, field); + } + } + } + else if (StringUtils.isNotEmpty(excludeFields)) + { + for (Field field : tempFields) + { + if (!ArrayUtils.contains(this.excludeFields, field.getName())) + { + addField(fields, field); + } + } + } + else + { + for (Field field : tempFields) + { + addField(fields, field); + } + } + return fields; + } + + /** + * 添加字段信息 + */ + public void addField(List fields, Field field) + { + // 单注解 + if (field.isAnnotationPresent(Excel.class)) + { + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + fields.add(new Object[] { field, attr }); + } + if (Collection.class.isAssignableFrom(field.getType())) + { + subMethod = getSubMethod(field.getName(), clazz); + ParameterizedType pt = (ParameterizedType) field.getGenericType(); + Class subClass = (Class) pt.getActualTypeArguments()[0]; + this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + } + } + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) + { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel attr : excels) + { + if (StringUtils.isNotEmpty(includeFields)) + { + if (ArrayUtils.contains(this.includeFields, field.getName() + "." + attr.targetAttr()) + && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) + { + fields.add(new Object[] { field, attr }); + } + } + else + { + if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) + && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) + { + fields.add(new Object[] { field, attr }); + } + } + } + } + } + + /** + * 根据注解获取最大行高 + */ + public short getRowHeight() + { + double maxHeight = 0; + for (Object[] os : this.fields) + { + Excel excel = (Excel) os[1]; + maxHeight = Math.max(maxHeight, excel.height()); + } + return (short) (maxHeight * 20); + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() + { + this.wb = new SXSSFWorkbook(500); + this.sheet = wb.createSheet(); + wb.setSheetName(0, sheetName); + this.styles = createStyles(wb); + } + + /** + * 创建工作表 + * + * @param sheetNo sheet数量 + * @param index 序号 + */ + public void createSheet(int sheetNo, int index) + { + // 设置工作表的名称. + if (sheetNo > 1 && index > 0) + { + this.sheet = wb.createSheet(); + this.createTitle(); + 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; + } + + /** + * 判断是否是空行 + * + * @param row 判断的行 + * @return + */ + private boolean isRowEmpty(Row row) + { + if (row == null) + { + return true; + } + for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) + { + Cell cell = row.getCell(i); + if (cell != null && cell.getCellType() != CellType.BLANK) + { + return false; + } + } + return true; + } + + /** + * 获取Excel2003图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map> getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + { + Map> sheetIndexPicMap = new HashMap<>(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty() && sheet.getDrawingPatriarch() != null) + { + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) + { + if (shape instanceof HSSFPicture) + { + HSSFPicture pic = (HSSFPicture) shape; + HSSFClientAnchor anchor = (HSSFClientAnchor) pic.getAnchor(); + String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); + sheetIndexPicMap.computeIfAbsent(picIndex, k -> new ArrayList<>()).add(pic.getPictureData()); + } + } + } + return sheetIndexPicMap; + } + + /** + * 获取Excel2007图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map> getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) + { + Map> sheetIndexPicMap = new HashMap<>(); + for (POIXMLDocumentPart dr : sheet.getRelations()) + { + if (dr instanceof XSSFDrawing) + { + XSSFDrawing drawing = (XSSFDrawing) dr; + for (XSSFShape shape : drawing.getShapes()) + { + if (shape instanceof XSSFPicture) + { + XSSFPicture pic = (XSSFPicture) shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.computeIfAbsent(picIndex, k -> new ArrayList<>()).add(pic.getPictureData()); + } + } + } + } + return sheetIndexPicMap; + } + + /** + * 格式化不同类型的日期对象 + * + * @param dateFormat 日期格式 + * @param val 被格式化的日期对象 + * @return 格式化后的日期字符 + */ + public String parseDateToStr(String dateFormat, Object val) + { + if (val == null) + { + return ""; + } + String str; + if (val instanceof Date) + { + str = DateUtils.parseDateToStr(dateFormat, (Date) val); + } + else if (val instanceof LocalDateTime) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); + } + else if (val instanceof LocalDate) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); + } + else + { + str = val.toString(); + } + return str; + } + + /** + * 是否有对象的子列表 + */ + public boolean isSubList() + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0; + } + + /** + * 是否有对象的子列表,集合不为空 + */ + public boolean isSubListValue(T vo) + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; + } + + /** + * 获取集合的值 + */ + public Collection getListCellValue(Object obj) + { + Object value; + try + { + value = subMethod.invoke(obj, new Object[] {}); + } + catch (Exception e) + { + return new ArrayList(); + } + return (Collection) value; + } + + /** + * 获取对象的子列表方法 + * + * @param name 名称 + * @param pojoClass 类对象 + * @return 子列表方法 + */ + public Method getSubMethod(String name, Class pojoClass) + { + StringBuffer getMethodName = new StringBuffer("get"); + getMethodName.append(name.substring(0, 1).toUpperCase()); + getMethodName.append(name.substring(1)); + Method method = null; + try + { + method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); + } + catch (Exception e) + { + log.error("获取对象异常{}", e.getMessage()); + } + return method; + } +} diff --git a/src/main/java/com/evobms/common/utils/reflect/ReflectUtils.java b/src/main/java/com/evobms/common/utils/reflect/ReflectUtils.java new file mode 100644 index 0000000..6f15fa5 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/reflect/ReflectUtils.java @@ -0,0 +1,410 @@ +package com.evobms.common.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.evobms.common.core.text.Convert; +import com.evobms.common.utils.DateUtils; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + * + * @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修饰符, 不经过getter函数. + */ + @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修饰符, 不经过setter函数. + */ + 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); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. + * 如向上转型到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; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 匹配函数名+参数类型。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用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; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 只匹配函数名。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用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的SecurityManager抱怨。 + */ + 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的SecurityManager抱怨。 + */ + 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定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 + * 如无法找到, 返回Object.class. + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) + { + return getClassGenricType(clazz, 0); + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. + * 如无法找到, 返回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; + + } + + /** + * 将反射时的checked exception转换为unchecked 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/src/main/java/com/evobms/common/utils/sign/Base64.java b/src/main/java/com/evobms/common/utils/sign/Base64.java new file mode 100644 index 0000000..6558337 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/sign/Base64.java @@ -0,0 +1,291 @@ +package com.evobms.common.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/src/main/java/com/evobms/common/utils/sign/Md5Utils.java b/src/main/java/com/evobms/common/utils/sign/Md5Utils.java new file mode 100644 index 0000000..11420ea --- /dev/null +++ b/src/main/java/com/evobms/common/utils/sign/Md5Utils.java @@ -0,0 +1,67 @@ +package com.evobms.common.utils.sign; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Md5加密方法 + * + * @author ruoyi + */ +public class Md5Utils +{ + private static final Logger log = LoggerFactory.getLogger(Md5Utils.class); + + private static byte[] md5(String s) + { + MessageDigest algorithm; + try + { + algorithm = MessageDigest.getInstance("MD5"); + algorithm.reset(); + algorithm.update(s.getBytes("UTF-8")); + byte[] messageDigest = algorithm.digest(); + return messageDigest; + } + catch (Exception e) + { + log.error("MD5 Error...", e); + } + return null; + } + + private static final String toHex(byte hash[]) + { + if (hash == null) + { + return null; + } + StringBuffer buf = new StringBuffer(hash.length * 2); + int i; + + for (i = 0; i < hash.length; i++) + { + if ((hash[i] & 0xff) < 0x10) + { + buf.append("0"); + } + buf.append(Long.toString(hash[i] & 0xff, 16)); + } + return buf.toString(); + } + + public static String hash(String s) + { + try + { + return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); + } + catch (Exception e) + { + log.error("not supported charset...{}", e); + return s; + } + } +} diff --git a/src/main/java/com/evobms/common/utils/spring/SpringUtils.java b/src/main/java/com/evobms/common/utils/spring/SpringUtils.java new file mode 100644 index 0000000..698f415 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/spring/SpringUtils.java @@ -0,0 +1,164 @@ +package com.evobms.common.utils.spring; + +import org.springframework.aop.framework.Advised; +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.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import com.evobms.common.utils.StringUtils; + +/** + * spring工具类 方便在非spring管理环境中获取bean + * + * @author ruoyi + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 获取对象 + * + * @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); + } + + /** + * 获取类型为requiredType的对象 + * + * @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定义是一个singleton还是一个prototype。 如果与给定名字相应的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); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + Object proxy = AopContext.currentProxy(); + if (((Advised) proxy).getTargetSource().getTargetClass() == invoker.getClass()) + { + return (T) proxy; + } + return invoker; + } + + /** + * 获取当前的环境配置,无配置返回null + * + * @return 当前的环境配置 + */ + public static String[] getActiveProfiles() + { + return applicationContext.getEnvironment().getActiveProfiles(); + } + + /** + * 获取当前的环境配置,当有多个环境配置时,只获取第一个 + * + * @return 当前的环境配置 + */ + public static String getActiveProfile() + { + final String[] activeProfiles = getActiveProfiles(); + return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; + } + + /** + * 获取配置文件中的值 + * + * @param key 配置文件的key + * @return 当前的配置文件的值 + * + */ + public static String getRequiredProperty(String key) + { + return applicationContext.getEnvironment().getRequiredProperty(key); + } +} diff --git a/src/main/java/com/evobms/common/utils/sql/SqlUtil.java b/src/main/java/com/evobms/common/utils/sql/SqlUtil.java new file mode 100644 index 0000000..8f7faf3 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/sql/SqlUtil.java @@ -0,0 +1,70 @@ +package com.evobms.common.utils.sql; + +import com.evobms.common.exception.UtilException; +import com.evobms.common.utils.StringUtils; + +/** + * sql操作工具类 + * + * @author ruoyi + */ +public class SqlUtil +{ + /** + * 定义常用的 sql关键字 + */ + public static String SQL_REGEX = "\u000B|and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()"; + + /** + * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) + */ + public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 限制orderBy最大长度 + */ + private static final int ORDER_BY_MAX_LENGTH = 500; + + /** + * 检查字符,防止注入绕过 + */ + public static String escapeOrderBySql(String value) + { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) + { + throw new UtilException("参数不符合规范,不能进行查询"); + } + if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) + { + throw new UtilException("参数已超过最大限制,不能进行查询"); + } + return value; + } + + /** + * 验证 order by 语法是否符合规范 + */ + public static boolean isValidOrderBySql(String value) + { + return value.matches(SQL_PATTERN); + } + + /** + * SQL关键字检查 + */ + public static void filterKeyword(String value) + { + if (StringUtils.isEmpty(value)) + { + return; + } + String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); + for (String sqlKeyword : sqlKeywords) + { + if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) + { + throw new UtilException("参数存在SQL注入风险"); + } + } + } +} diff --git a/src/main/java/com/evobms/common/utils/uuid/IdUtils.java b/src/main/java/com/evobms/common/utils/uuid/IdUtils.java new file mode 100644 index 0000000..ef3e839 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/uuid/IdUtils.java @@ -0,0 +1,49 @@ +package com.evobms.common.utils.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,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 随机UUID + */ + public static String fastUUID() + { + return UUID.fastUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 简化的UUID,去掉了横线 + */ + public static String fastSimpleUUID() + { + return UUID.fastUUID().toString(true); + } +} diff --git a/src/main/java/com/evobms/common/utils/uuid/Seq.java b/src/main/java/com/evobms/common/utils/uuid/Seq.java new file mode 100644 index 0000000..a1f546e --- /dev/null +++ b/src/main/java/com/evobms/common/utils/uuid/Seq.java @@ -0,0 +1,86 @@ +package com.evobms.common.utils.uuid; + +import java.util.concurrent.atomic.AtomicInteger; +import com.evobms.common.utils.DateUtils; +import com.evobms.common.utils.StringUtils; + +/** + * @author ruoyi 序列生成类 + */ +public class Seq +{ + // 通用序列类型 + public static final String commSeqType = "COMMON"; + + // 上传序列类型 + public static final String uploadSeqType = "UPLOAD"; + + // 通用接口序列数 + private static AtomicInteger commSeq = new AtomicInteger(1); + + // 上传接口序列数 + private static AtomicInteger uploadSeq = new AtomicInteger(1); + + // 机器标识 + private static final String machineCode = "A"; + + /** + * 获取通用序列号 + * + * @return 序列值 + */ + public static String getId() + { + return getId(commSeqType); + } + + /** + * 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串 + * + * @return 序列值 + */ + public static String getId(String type) + { + AtomicInteger atomicInt = commSeq; + if (uploadSeqType.equals(type)) + { + atomicInt = uploadSeq; + } + return getId(atomicInt, 3); + } + + /** + * 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串 + * + * @param atomicInt 序列数 + * @param length 数值长度 + * @return 序列值 + */ + public static String getId(AtomicInteger atomicInt, int length) + { + String result = DateUtils.dateTimeNow(); + result += machineCode; + result += getSeq(atomicInt, length); + return result; + } + + /** + * 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数 + * + * @return 序列值 + */ + private synchronized static String getSeq(AtomicInteger atomicInt, int length) + { + // 先取值再+1 + int value = atomicInt.getAndIncrement(); + + // 如果更新后值>=10 的 (length)幂次方则重置为1 + int maxSeq = (int) Math.pow(10, length); + if (atomicInt.get() >= maxSeq) + { + atomicInt.set(1); + } + // 转字符串,用0左补齐 + return StringUtils.padl(value, length); + } +} diff --git a/src/main/java/com/evobms/common/utils/uuid/UUID.java b/src/main/java/com/evobms/common/utils/uuid/UUID.java new file mode 100644 index 0000000..214c299 --- /dev/null +++ b/src/main/java/com/evobms/common/utils/uuid/UUID.java @@ -0,0 +1,484 @@ +package com.evobms.common.utils.uuid; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import com.evobms.common.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(); + } + + /** 此UUID的最高64有效位 */ + private final long mostSigBits; + + /** 此UUID的最低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 的静态工厂。 + * + * @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(基于名称的)UUID 的静态工厂。 + * + * @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、time_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 字段构造。clock_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 是否简单模式,简单模式为不带'-'的UUID字符串 + * @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 (!isSimple) + { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (!isSimple) + { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (!isSimple) + { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (!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 + /** + * 返回指定数字对应的hex值 + * + * @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是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); + } +} diff --git a/src/main/java/com/evobms/common/xss/Xss.java b/src/main/java/com/evobms/common/xss/Xss.java new file mode 100644 index 0000000..42267a5 --- /dev/null +++ b/src/main/java/com/evobms/common/xss/Xss.java @@ -0,0 +1,27 @@ +package com.evobms.common.xss; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义xss校验注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER }) +@Constraint(validatedBy = { XssValidator.class }) +public @interface Xss +{ + String message() + + default "不允许任何脚本运行"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/src/main/java/com/evobms/common/xss/XssValidator.java b/src/main/java/com/evobms/common/xss/XssValidator.java new file mode 100644 index 0000000..25146dd --- /dev/null +++ b/src/main/java/com/evobms/common/xss/XssValidator.java @@ -0,0 +1,39 @@ +package com.evobms.common.xss; + +import com.evobms.common.utils.StringUtils; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 自定义xss校验注解实现 + * + * @author ruoyi + */ +public class XssValidator implements ConstraintValidator +{ + private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />"; + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) + { + if (StringUtils.isBlank(value)) + { + return true; + } + return !containsHtml(value); + } + + public static boolean containsHtml(String value) + { + StringBuilder sHtml = new StringBuilder(); + Pattern pattern = Pattern.compile(HTML_PATTERN); + Matcher matcher = pattern.matcher(value); + while (matcher.find()) + { + sHtml.append(matcher.group()); + } + return pattern.matcher(sHtml).matches(); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/framework/aspectj/DataScopeAspect.java b/src/main/java/com/evobms/framework/aspectj/DataScopeAspect.java new file mode 100644 index 0000000..cc2ea94 --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/DataScopeAspect.java @@ -0,0 +1,184 @@ +package com.evobms.framework.aspectj; + +import java.util.ArrayList; +import java.util.List; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; +import com.evobms.common.constant.UserConstants; +import com.evobms.common.core.text.Convert; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.aspectj.lang.annotation.DataScope; +import com.evobms.framework.security.LoginUser; +import com.evobms.framework.security.context.PermissionContextHolder; +import com.evobms.framework.web.domain.BaseEntity; +import com.evobms.project.system.domain.SysRole; +import com.evobms.project.system.domain.SysUser; + +/** + * 数据过滤处理 + * + * @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"; + + @Before("@annotation(controllerDataScope)") + public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable + { + clearDataScope(point); + handleDataScope(point, controllerDataScope); + } + + protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) + { + // 获取当前的用户 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNotNull(loginUser)) + { + SysUser currentUser = loginUser.getUser(); + // 如果是超级管理员,则不过滤数据 + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) + { + String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext()); + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), controllerDataScope.userAlias(), permission); + } + } + } + + /** + * 数据范围过滤 + * + * @param joinPoint 切点 + * @param user 用户 + * @param deptAlias 部门别名 + * @param userAlias 用户别名 + * @param permission 权限字符 + */ + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission) + { + StringBuilder sqlString = new StringBuilder(); + List conditions = new ArrayList(); + List scopeCustomIds = new ArrayList(); + user.getRoles().forEach(role -> { + if (DATA_SCOPE_CUSTOM.equals(role.getDataScope()) && StringUtils.equals(role.getStatus(), UserConstants.ROLE_NORMAL) && StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) + { + scopeCustomIds.add(Convert.toStr(role.getRoleId())); + } + }); + + for (SysRole role : user.getRoles()) + { + String dataScope = role.getDataScope(); + if (conditions.contains(dataScope) || StringUtils.equals(role.getStatus(), UserConstants.ROLE_DISABLE)) + { + continue; + } + if (!StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) + { + continue; + } + if (DATA_SCOPE_ALL.equals(dataScope)) + { + sqlString = new StringBuilder(); + conditions.add(dataScope); + break; + } + else if (DATA_SCOPE_CUSTOM.equals(dataScope)) + { + if (scopeCustomIds.size() > 1) + { + // 多个自定数据权限使用in查询,避免多次拼接。 + sqlString.append(StringUtils.format(" OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id in ({}) ) ", deptAlias, String.join(",", scopeCustomIds))); + } + else + { + 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 + { + // 数据权限为仅本人且没有userAlias别名不查询任何数据 + sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); + } + } + conditions.add(dataScope); + } + + // 角色都不包含传递过来的权限字符,这个时候sqlString也会为空,所以要限制一下,不查询任何数据 + if (StringUtils.isEmpty(conditions)) + { + sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); + } + + 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) + ")"); + } + } + } + + /** + * 拼接权限sql前先清空params.dataScope参数防止注入 + */ + private void clearDataScope(final JoinPoint joinPoint) + { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) + { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, ""); + } + } +} diff --git a/src/main/java/com/evobms/framework/aspectj/DataSourceAspect.java b/src/main/java/com/evobms/framework/aspectj/DataSourceAspect.java new file mode 100644 index 0000000..bbefcca --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/DataSourceAspect.java @@ -0,0 +1,72 @@ +package com.evobms.framework.aspectj; + +import java.util.Objects; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.aspectj.lang.annotation.DataSource; +import com.evobms.framework.datasource.DynamicDataSourceContextHolder; + +/** + * 多数据源处理 + * + * @author ruoyi + */ +@Aspect +@Order(1) +@Component +public class DataSourceAspect +{ + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Pointcut("@annotation(com.evobms.framework.aspectj.lang.annotation.DataSource)" + + "|| @within(com.evobms.framework.aspectj.lang.annotation.DataSource)") + public void dsPointCut() + { + + } + + @Around("dsPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable + { + DataSource dataSource = getDataSource(point); + + if (StringUtils.isNotNull(dataSource)) + { + DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); + } + + try + { + return point.proceed(); + } + finally + { + // 销毁数据源 在执行方法之后 + DynamicDataSourceContextHolder.clearDataSourceType(); + } + } + + /** + * 获取需要切换的数据源 + */ + public DataSource getDataSource(ProceedingJoinPoint point) + { + MethodSignature signature = (MethodSignature) point.getSignature(); + DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); + if (Objects.nonNull(dataSource)) + { + return dataSource; + } + + return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); + } +} diff --git a/src/main/java/com/evobms/framework/aspectj/LogAspect.java b/src/main/java/com/evobms/framework/aspectj/LogAspect.java new file mode 100644 index 0000000..9f64db6 --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/LogAspect.java @@ -0,0 +1,256 @@ +package com.evobms.framework.aspectj; + +import java.util.Collection; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.ArrayUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.NamedThreadLocal; +import org.springframework.stereotype.Component; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; +import com.alibaba.fastjson2.JSON; +import com.evobms.common.core.text.Convert; +import com.evobms.common.enums.HttpMethod; +import com.evobms.common.filter.PropertyPreExcludeFilter; +import com.evobms.common.utils.ExceptionUtil; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.ServletUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.ip.IpUtils; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessStatus; +import com.evobms.framework.manager.AsyncManager; +import com.evobms.framework.manager.factory.AsyncFactory; +import com.evobms.framework.security.LoginUser; +import com.evobms.project.monitor.domain.SysOperLog; +import com.evobms.project.system.domain.SysUser; + +/** + * 操作日志记录处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class LogAspect +{ + private static final Logger log = LoggerFactory.getLogger(LogAspect.class); + + /** 排除敏感属性字段 */ + public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; + + /** 计算操作消耗时间 */ + private static final ThreadLocal TIME_THREADLOCAL = new NamedThreadLocal("Cost Time"); + + /** + * 处理请求前执行 + */ + @Before(value = "@annotation(controllerLog)") + public void doBefore(JoinPoint joinPoint, Log controllerLog) + { + TIME_THREADLOCAL.set(System.currentTimeMillis()); + } + + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) + { + handleLog(joinPoint, controllerLog, null, jsonResult); + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) + { + handleLog(joinPoint, controllerLog, e, null); + } + + protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) + { + try + { + // 获取当前的用户 + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // *========数据库日志=========*// + SysOperLog operLog = new SysOperLog(); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 请求的地址 + String ip = IpUtils.getIpAddr(); + operLog.setOperIp(ip); + operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); + if (loginUser != null) + { + operLog.setOperName(loginUser.getUsername()); + SysUser currentUser = loginUser.getUser(); + if (StringUtils.isNotNull(currentUser) && StringUtils.isNotNull(currentUser.getDept())) + { + operLog.setDeptName(currentUser.getDept().getDeptName()); + } + } + + if (e != null) + { + operLog.setStatus(BusinessStatus.FAIL.ordinal()); + operLog.setErrorMsg(StringUtils.substring(Convert.toStr(e.getMessage(), ExceptionUtil.getExceptionMessage(e)), 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, jsonResult); + // 设置消耗时间 + operLog.setCostTime(System.currentTimeMillis() - TIME_THREADLOCAL.get()); + // 保存数据库 + AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); + } + catch (Exception exp) + { + // 记录本地异常日志 + log.error("异常信息:{}", exp.getMessage()); + exp.printStackTrace(); + } + finally + { + TIME_THREADLOCAL.remove(); + } + } + + /** + * 获取注解中对方法的描述信息 用于Controller层注解 + * + * @param log 日志 + * @param operLog 操作日志 + * @throws Exception + */ + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception + { + // 设置action动作 + operLog.setBusinessType(log.businessType().ordinal()); + // 设置标题 + operLog.setTitle(log.title()); + // 设置操作人类别 + operLog.setOperatorType(log.operatorType().ordinal()); + // 是否需要保存request,参数和值 + if (log.isSaveRequestData()) + { + // 获取参数的信息,传入到数据库中。 + setRequestValue(joinPoint, operLog, log.excludeParamNames()); + } + // 是否需要保存response,参数和值 + if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) + { + operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000)); + } + } + + /** + * 获取请求的参数,放到log中 + * + * @param operLog 操作日志 + * @throws Exception 异常 + */ + private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog, String[] excludeParamNames) throws Exception + { + String requestMethod = operLog.getRequestMethod(); + Map paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest()); + if (StringUtils.isEmpty(paramsMap) && StringUtils.equalsAny(requestMethod, HttpMethod.PUT.name(), HttpMethod.POST.name(), HttpMethod.DELETE.name())) + { + String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); + } + else + { + operLog.setOperParam(StringUtils.substring(JSON.toJSONString(paramsMap, excludePropertyPreFilter(excludeParamNames)), 0, 2000)); + } + } + + /** + * 参数拼装 + */ + private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) + { + String params = ""; + if (paramsArray != null && paramsArray.length > 0) + { + for (Object o : paramsArray) + { + if (StringUtils.isNotNull(o) && !isFilterObject(o)) + { + try + { + String jsonObj = JSON.toJSONString(o, excludePropertyPreFilter(excludeParamNames)); + params += jsonObj.toString() + " "; + } + catch (Exception e) + { + } + } + } + } + return params.trim(); + } + + /** + * 忽略敏感属性 + */ + public PropertyPreExcludeFilter excludePropertyPreFilter(String[] excludeParamNames) + { + return new PropertyPreExcludeFilter().addExcludes(ArrayUtils.addAll(EXCLUDE_PROPERTIES, excludeParamNames)); + } + + /** + * 判断是否需要过滤的对象。 + * + * @param o 对象信息。 + * @return 如果是需要过滤的对象,则返回true;否则返回false。 + */ + @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 (Object value : collection) + { + return value instanceof MultipartFile; + } + } + else if (Map.class.isAssignableFrom(clazz)) + { + Map map = (Map) o; + for (Object value : map.entrySet()) + { + Map.Entry entry = (Map.Entry) value; + return entry.getValue() instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse + || o instanceof BindingResult; + } +} diff --git a/src/main/java/com/evobms/framework/aspectj/RateLimiterAspect.java b/src/main/java/com/evobms/framework/aspectj/RateLimiterAspect.java new file mode 100644 index 0000000..8d9dd9d --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/RateLimiterAspect.java @@ -0,0 +1,89 @@ +package com.evobms.framework.aspectj; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.RedisScript; +import org.springframework.stereotype.Component; +import com.evobms.common.exception.ServiceException; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.ip.IpUtils; +import com.evobms.framework.aspectj.lang.annotation.RateLimiter; +import com.evobms.framework.aspectj.lang.enums.LimitType; + +/** + * 限流处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class RateLimiterAspect +{ + private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class); + + private RedisTemplate redisTemplate; + + private RedisScript limitScript; + + @Autowired + public void setRedisTemplate1(RedisTemplate redisTemplate) + { + this.redisTemplate = redisTemplate; + } + + @Autowired + public void setLimitScript(RedisScript limitScript) + { + this.limitScript = limitScript; + } + + @Before("@annotation(rateLimiter)") + public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable + { + int time = rateLimiter.time(); + int count = rateLimiter.count(); + + String combineKey = getCombineKey(rateLimiter, point); + List keys = Collections.singletonList(combineKey); + try + { + Long number = redisTemplate.execute(limitScript, keys, count, time); + if (StringUtils.isNull(number) || number.intValue() > count) + { + throw new ServiceException("访问过于频繁,请稍候再试"); + } + log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), combineKey); + } + catch (ServiceException e) + { + throw e; + } + catch (Exception e) + { + throw new RuntimeException("服务器限流异常,请稍候再试"); + } + } + + public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) + { + StringBuffer stringBuffer = new StringBuffer(rateLimiter.key()); + if (rateLimiter.limitType() == LimitType.IP) + { + stringBuffer.append(IpUtils.getIpAddr()).append("-"); + } + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + Class targetClass = method.getDeclaringClass(); + stringBuffer.append(targetClass.getName()).append("-").append(method.getName()); + return stringBuffer.toString(); + } +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/annotation/Anonymous.java b/src/main/java/com/evobms/framework/aspectj/lang/annotation/Anonymous.java new file mode 100644 index 0000000..750ff86 --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/annotation/Anonymous.java @@ -0,0 +1,19 @@ +package com.evobms.framework.aspectj.lang.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, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Anonymous +{ +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/annotation/DataScope.java b/src/main/java/com/evobms/framework/aspectj/lang/annotation/DataScope.java new file mode 100644 index 0000000..56f6f09 --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/annotation/DataScope.java @@ -0,0 +1,33 @@ +package com.evobms.framework.aspectj.lang.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 ""; + + /** + * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来 + */ + public String permission() default ""; +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/annotation/DataSource.java b/src/main/java/com/evobms/framework/aspectj/lang/annotation/DataSource.java new file mode 100644 index 0000000..a2c4a5e --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/annotation/DataSource.java @@ -0,0 +1,28 @@ +package com.evobms.framework.aspectj.lang.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.evobms.framework.aspectj.lang.enums.DataSourceType; + +/** + * 自定义多数据源切换注解 + * + * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 + * + * @author ruoyi + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface DataSource +{ + /** + * 切换数据源名称 + */ + public DataSourceType value() default DataSourceType.MASTER; +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/annotation/Excel.java b/src/main/java/com/evobms/framework/aspectj/lang/annotation/Excel.java new file mode 100644 index 0000000..215dc3f --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/annotation/Excel.java @@ -0,0 +1,197 @@ +package com.evobms.framework.aspectj.lang.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; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import com.evobms.common.utils.poi.ExcelHandlerAdapter; + +/** + * 自定义导出Excel数据注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 导出时在excel中排序 + */ + public int sort() default Integer.MAX_VALUE; + + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + public String dictType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + public String separator() default ","; + + /** + * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) + */ + public int scale() default -1; + + /** + * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; + + /** + * 导出时在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 boolean wrapText() default false; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否从字典读数据到combo,默认不读取,如读取需要设置dictType注解. + */ + public boolean comboReadDict() default false; + + /** + * 是否需要纵向合并单元格,应对需求:含有list集合单元格) + */ + public boolean needMerge() default false; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 是否自动统计数据,在最后追加一行统计数据总和 + */ + public boolean isStatistics() default false; + + /** + * 导出类型(0数字 1字符串 2图片) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出列头背景颜色 + */ + public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT; + + /** + * 导出列头字体颜色 + */ + public IndexedColors headerColor() default IndexedColors.WHITE; + + /** + * 导出单元格背景颜色 + */ + public IndexedColors backgroundColor() default IndexedColors.WHITE; + + /** + * 导出单元格字体颜色 + */ + public IndexedColors color() default IndexedColors.BLACK; + + /** + * 导出字段对齐方式 + */ + public HorizontalAlignment align() default HorizontalAlignment.CENTER; + + /** + * 自定义数据处理器 + */ + public Class handler() default ExcelHandlerAdapter.class; + + /** + * 自定义数据处理器参数 + */ + public String[] args() default {}; + + /** + * 字段类型(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), TEXT(3); + private final int value; + + ColumnType(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/framework/aspectj/lang/annotation/Excels.java b/src/main/java/com/evobms/framework/aspectj/lang/annotation/Excels.java new file mode 100644 index 0000000..504403f --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/annotation/Excels.java @@ -0,0 +1,18 @@ +package com.evobms.framework.aspectj.lang.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 +{ + public Excel[] value(); +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/annotation/Log.java b/src/main/java/com/evobms/framework/aspectj/lang/annotation/Log.java new file mode 100644 index 0000000..3931a2e --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/annotation/Log.java @@ -0,0 +1,51 @@ +package com.evobms.framework.aspectj.lang.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.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.aspectj.lang.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; + + /** + * 是否保存响应的参数 + */ + public boolean isSaveResponseData() default true; + + /** + * 排除指定的请求参数 + */ + public String[] excludeParamNames() default {}; +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/annotation/RateLimiter.java b/src/main/java/com/evobms/framework/aspectj/lang/annotation/RateLimiter.java new file mode 100644 index 0000000..0c1342e --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/annotation/RateLimiter.java @@ -0,0 +1,40 @@ +package com.evobms.framework.aspectj.lang.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.evobms.common.constant.CacheConstants; +import com.evobms.framework.aspectj.lang.enums.LimitType; + +/** + * 限流注解 + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RateLimiter +{ + /** + * 限流key + */ + public String key() default CacheConstants.RATE_LIMIT_KEY; + + /** + * 限流时间,单位秒 + */ + public int time() default 60; + + /** + * 限流次数 + */ + public int count() default 100; + + /** + * 限流类型 + */ + public LimitType limitType() default LimitType.DEFAULT; +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/annotation/Sensitive.java b/src/main/java/com/evobms/framework/aspectj/lang/annotation/Sensitive.java new file mode 100644 index 0000000..633e7f7 --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/annotation/Sensitive.java @@ -0,0 +1,24 @@ +package com.evobms.framework.aspectj.lang.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.evobms.framework.aspectj.lang.enums.DesensitizedType; +import com.evobms.framework.config.SensitiveJsonSerializer; + +/** + * 数据脱敏注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@JacksonAnnotationsInside +@JsonSerialize(using = SensitiveJsonSerializer.class) +public @interface Sensitive +{ + DesensitizedType desensitizedType(); +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/enums/BusinessStatus.java b/src/main/java/com/evobms/framework/aspectj/lang/enums/BusinessStatus.java new file mode 100644 index 0000000..b86a5f6 --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/enums/BusinessStatus.java @@ -0,0 +1,20 @@ +package com.evobms.framework.aspectj.lang.enums; + +/** + * 操作状态 + * + * @author ruoyi + * + */ +public enum BusinessStatus +{ + /** + * 成功 + */ + SUCCESS, + + /** + * 失败 + */ + FAIL, +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/enums/BusinessType.java b/src/main/java/com/evobms/framework/aspectj/lang/enums/BusinessType.java new file mode 100644 index 0000000..fcb5178 --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/enums/BusinessType.java @@ -0,0 +1,59 @@ +package com.evobms.framework.aspectj.lang.enums; + +/** + * 业务操作类型 + * + * @author ruoyi + */ +public enum BusinessType +{ + /** + * 其它 + */ + OTHER, + + /** + * 新增 + */ + INSERT, + + /** + * 修改 + */ + UPDATE, + + /** + * 删除 + */ + DELETE, + + /** + * 授权 + */ + GRANT, + + /** + * 导出 + */ + EXPORT, + + /** + * 导入 + */ + IMPORT, + + /** + * 强退 + */ + FORCE, + + /** + * 生成代码 + */ + GENCODE, + + /** + * 清空数据 + */ + CLEAN, +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/enums/DataSourceType.java b/src/main/java/com/evobms/framework/aspectj/lang/enums/DataSourceType.java new file mode 100644 index 0000000..ead40b5 --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/enums/DataSourceType.java @@ -0,0 +1,19 @@ +package com.evobms.framework.aspectj.lang.enums; + +/** + * 数据源 + * + * @author ruoyi + */ +public enum DataSourceType +{ + /** + * 主库 + */ + MASTER, + + /** + * 从库 + */ + SLAVE +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/enums/DesensitizedType.java b/src/main/java/com/evobms/framework/aspectj/lang/enums/DesensitizedType.java new file mode 100644 index 0000000..a6d5350 --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/enums/DesensitizedType.java @@ -0,0 +1,59 @@ +package com.evobms.framework.aspectj.lang.enums; + +import java.util.function.Function; +import com.evobms.common.utils.DesensitizedUtil; + +/** + * 脱敏类型 + * + * @author ruoyi + */ +public enum DesensitizedType +{ + /** + * 姓名,第2位星号替换 + */ + USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")), + + /** + * 密码,全部字符都用*代替 + */ + PASSWORD(DesensitizedUtil::password), + + /** + * 身份证,中间10位星号替换 + */ + ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{3}[Xx]|\\d{4})", "$1** **** ****$2")), + + /** + * 手机号,中间4位星号替换 + */ + PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")), + + /** + * 电子邮箱,仅显示第一个字母和@后面的地址显示,其他星号替换 + */ + EMAIL(s -> s.replaceAll("(^.)[^@]*(@.*$)", "$1****$2")), + + /** + * 银行卡号,保留最后4位,其他星号替换 + */ + BANK_CARD(s -> s.replaceAll("\\d{15}(\\d{3})", "**** **** **** **** $1")), + + /** + * 车牌号码,包含普通车辆、新能源车辆 + */ + CAR_LICENSE(DesensitizedUtil::carLicense); + + private final Function desensitizer; + + DesensitizedType(Function desensitizer) + { + this.desensitizer = desensitizer; + } + + public Function desensitizer() + { + return desensitizer; + } +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/enums/LimitType.java b/src/main/java/com/evobms/framework/aspectj/lang/enums/LimitType.java new file mode 100644 index 0000000..938b899 --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/enums/LimitType.java @@ -0,0 +1,20 @@ +package com.evobms.framework.aspectj.lang.enums; + +/** + * 限流类型 + * + * @author ruoyi + */ + +public enum LimitType +{ + /** + * 默认策略全局限流 + */ + DEFAULT, + + /** + * 根据请求者IP进行限流 + */ + IP +} diff --git a/src/main/java/com/evobms/framework/aspectj/lang/enums/OperatorType.java b/src/main/java/com/evobms/framework/aspectj/lang/enums/OperatorType.java new file mode 100644 index 0000000..fb5659b --- /dev/null +++ b/src/main/java/com/evobms/framework/aspectj/lang/enums/OperatorType.java @@ -0,0 +1,24 @@ +package com.evobms.framework.aspectj.lang.enums; + +/** + * 操作人类别 + * + * @author ruoyi + */ +public enum OperatorType +{ + /** + * 其它 + */ + OTHER, + + /** + * 后台用户 + */ + MANAGE, + + /** + * 手机端用户 + */ + MOBILE +} diff --git a/src/main/java/com/evobms/framework/config/ApplicationConfig.java b/src/main/java/com/evobms/framework/config/ApplicationConfig.java new file mode 100644 index 0000000..1910df6 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/ApplicationConfig.java @@ -0,0 +1,30 @@ +package com.evobms.framework.config; + +import java.util.TimeZone; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +/** + * 程序注解配置 + * + * @author ruoyi + */ +@Configuration +// 表示通过aop框架暴露该代理对象,AopContext能够访问 +@EnableAspectJAutoProxy(exposeProxy = true) +// 指定要扫描的Mapper类的包的路径 +@MapperScan("com.evobms.project.**.mapper") +public class ApplicationConfig +{ + /** + * 时区配置 + */ + @Bean + public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() + { + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); + } +} diff --git a/src/main/java/com/evobms/framework/config/CaptchaConfig.java b/src/main/java/com/evobms/framework/config/CaptchaConfig.java new file mode 100644 index 0000000..7f700c6 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/CaptchaConfig.java @@ -0,0 +1,83 @@ +package com.evobms.framework.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(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } + + @Bean(name = "captchaProducerMath") + public DefaultKaptcha getKaptchaBeanMath() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 边框颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); + // 验证码文本生成器 + properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.evobms.framework.config.KaptchaTextCreator"); + // 验证码文本字符间距 默认为2 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 验证码噪点颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); + // 干扰实现类 + properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/src/main/java/com/evobms/framework/config/DruidConfig.java b/src/main/java/com/evobms/framework/config/DruidConfig.java new file mode 100644 index 0000000..9385ce5 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/DruidConfig.java @@ -0,0 +1,126 @@ +package com.evobms.framework.config; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.sql.DataSource; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; +import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; +import com.alibaba.druid.util.Utils; +import com.evobms.common.utils.spring.SpringUtils; +import com.evobms.framework.aspectj.lang.enums.DataSourceType; +import com.evobms.framework.config.properties.DruidProperties; +import com.evobms.framework.datasource.DynamicDataSource; + +/** + * druid 配置多数据源 + * + * @author ruoyi + */ +@Configuration +public class DruidConfig +{ + @Bean + @ConfigurationProperties("spring.datasource.druid.master") + public DataSource masterDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean + @ConfigurationProperties("spring.datasource.druid.slave") + @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") + public DataSource slaveDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean(name = "dynamicDataSource") + @Primary + public DynamicDataSource dataSource(DataSource masterDataSource) + { + Map targetDataSources = new HashMap<>(); + targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); + setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); + return new DynamicDataSource(masterDataSource, targetDataSources); + } + + /** + * 设置数据源 + * + * @param targetDataSources 备选数据源集合 + * @param sourceName 数据源名称 + * @param beanName bean名称 + */ + public void setDataSource(Map targetDataSources, String sourceName, String beanName) + { + try + { + DataSource dataSource = SpringUtils.getBean(beanName); + targetDataSources.put(sourceName, dataSource); + } + catch (Exception e) + { + } + } + + /** + * 去除监控页面底部的广告 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") + public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) + { + // 获取web监控页面的参数 + DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); + // 提取common.js的配置路径 + String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; + String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); + final String filePath = "support/http/resources/js/common.js"; + // 创建filter进行过滤 + Filter filter = new Filter() + { + @Override + public void init(javax.servlet.FilterConfig filterConfig) throws ServletException + { + } + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + chain.doFilter(request, response); + // 重置缓冲区,响应头不会被重置 + response.resetBuffer(); + // 获取common.js + String text = Utils.readFromResource(filePath); + // 正则替换banner, 除去底部的广告信息 + text = text.replaceAll("
", ""); + text = text.replaceAll("powered.*?shrek.wang", ""); + response.getWriter().write(text); + } + @Override + public void destroy() + { + } + }; + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(filter); + registrationBean.addUrlPatterns(commonJsPattern); + return registrationBean; + } +} diff --git a/src/main/java/com/evobms/framework/config/FastJson2JsonRedisSerializer.java b/src/main/java/com/evobms/framework/config/FastJson2JsonRedisSerializer.java new file mode 100644 index 0000000..a9da06b --- /dev/null +++ b/src/main/java/com/evobms/framework/config/FastJson2JsonRedisSerializer.java @@ -0,0 +1,52 @@ +package com.evobms.framework.config; + +import java.nio.charset.Charset; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.filter.Filter; +import com.evobms.common.constant.Constants; + +/** + * Redis使用FastJson序列化 + * + * @author ruoyi + */ +public class FastJson2JsonRedisSerializer implements RedisSerializer +{ + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + + static final Filter AUTO_TYPE_FILTER = JSONReader.autoTypeFilter(Constants.JSON_WHITELIST_STR); + + private Class clazz; + + 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, JSONWriter.Feature.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, AUTO_TYPE_FILTER); + } +} diff --git a/src/main/java/com/evobms/framework/config/FilterConfig.java b/src/main/java/com/evobms/framework/config/FilterConfig.java new file mode 100644 index 0000000..ccfaa84 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/FilterConfig.java @@ -0,0 +1,80 @@ +package com.evobms.framework.config; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.DispatcherType; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.evobms.common.constant.Constants; +import com.evobms.common.filter.RefererFilter; +import com.evobms.common.filter.RepeatableFilter; +import com.evobms.common.filter.XssFilter; +import com.evobms.common.utils.StringUtils; + +/** + * Filter配置 + * + * @author ruoyi + */ +@Configuration +public class FilterConfig +{ + @Value("${xss.excludes}") + private String excludes; + + @Value("${xss.urlPatterns}") + private String urlPatterns; + + @Value("${referer.allowed-domains}") + private String allowedDomains; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + @ConditionalOnProperty(value = "xss.enabled", havingValue = "true") + public FilterRegistrationBean xssFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new XssFilter()); + registration.addUrlPatterns(StringUtils.split(urlPatterns, ",")); + registration.setName("xssFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + Map initParameters = new HashMap(); + initParameters.put("excludes", excludes); + registration.setInitParameters(initParameters); + return registration; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + @ConditionalOnProperty(value = "referer.enabled", havingValue = "true") + public FilterRegistrationBean refererFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new RefererFilter()); + registration.addUrlPatterns(Constants.RESOURCE_PREFIX + "/*"); + registration.setName("refererFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + Map initParameters = new HashMap(); + initParameters.put("allowedDomains", allowedDomains); + registration.setInitParameters(initParameters); + return registration; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + public FilterRegistrationBean someFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new RepeatableFilter()); + registration.addUrlPatterns("/*"); + registration.setName("repeatableFilter"); + registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); + return registration; + } + +} diff --git a/src/main/java/com/evobms/framework/config/GenConfig.java b/src/main/java/com/evobms/framework/config/GenConfig.java new file mode 100644 index 0000000..e66807b --- /dev/null +++ b/src/main/java/com/evobms/framework/config/GenConfig.java @@ -0,0 +1,79 @@ +package com.evobms.framework.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 读取代码生成相关配置 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "gen") +public class GenConfig +{ + /** 作者 */ + public static String author; + + /** 生成包路径 */ + public static String packageName; + + /** 自动去除表前缀 */ + public static boolean autoRemovePre; + + /** 表前缀 */ + public static String tablePrefix; + + /** 是否允许生成文件覆盖到本地(自定义路径) */ + public static boolean allowOverwrite; + + 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; + } + + public static boolean isAllowOverwrite() + { + return allowOverwrite; + } + + public void setAllowOverwrite(boolean allowOverwrite) + { + GenConfig.allowOverwrite = allowOverwrite; + } +} diff --git a/src/main/java/com/evobms/framework/config/I18nConfig.java b/src/main/java/com/evobms/framework/config/I18nConfig.java new file mode 100644 index 0000000..951722c --- /dev/null +++ b/src/main/java/com/evobms/framework/config/I18nConfig.java @@ -0,0 +1,43 @@ +package com.evobms.framework.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; +import com.evobms.common.constant.Constants; + +/** + * 资源文件配置加载 + * + * @author ruoyi + */ +@Configuration +public class I18nConfig implements WebMvcConfigurer +{ + @Bean + public LocaleResolver localeResolver() + { + SessionLocaleResolver slr = new SessionLocaleResolver(); + // 默认语言 + slr.setDefaultLocale(Constants.DEFAULT_LOCALE); + return slr; + } + + @Bean + public LocaleChangeInterceptor localeChangeInterceptor() + { + LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); + // 参数名 + lci.setParamName("lang"); + return lci; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) + { + registry.addInterceptor(localeChangeInterceptor()); + } +} diff --git a/src/main/java/com/evobms/framework/config/KaptchaTextCreator.java b/src/main/java/com/evobms/framework/config/KaptchaTextCreator.java new file mode 100644 index 0000000..c8df510 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/KaptchaTextCreator.java @@ -0,0 +1,68 @@ +package com.evobms.framework.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 = random.nextInt(3); + if (randomoperands == 0) + { + result = x * y; + suChinese.append(CNUMBERS[x]); + suChinese.append("*"); + suChinese.append(CNUMBERS[y]); + } + else if (randomoperands == 1) + { + if ((x != 0) && y % x == 0) + { + result = y / x; + suChinese.append(CNUMBERS[y]); + suChinese.append("/"); + suChinese.append(CNUMBERS[x]); + } + else + { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + } + else if (randomoperands == 2) + { + if (x >= y) + { + result = x - y; + suChinese.append(CNUMBERS[x]); + suChinese.append("-"); + suChinese.append(CNUMBERS[y]); + } + else + { + result = y - x; + suChinese.append(CNUMBERS[y]); + suChinese.append("-"); + suChinese.append(CNUMBERS[x]); + } + } + suChinese.append("=?@" + result); + return suChinese.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/framework/config/MqttConfig.java b/src/main/java/com/evobms/framework/config/MqttConfig.java new file mode 100644 index 0000000..29fb55d --- /dev/null +++ b/src/main/java/com/evobms/framework/config/MqttConfig.java @@ -0,0 +1,189 @@ +package com.evobms.framework.config; + +import org.eclipse.paho.client.mqttv3.MqttConnectOptions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.core.MessageProducer; +import org.springframework.integration.handler.AbstractMessageHandler; +import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory; +import org.springframework.integration.mqtt.core.MqttPahoClientFactory; +import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter; +import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler; +import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.MessageHandler; +import org.slf4j.MDC; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +/** + * MQTT配置类 + * 只有在mqtt.enabled=true时才会加载此配置 + * + * @author evobms + */ +@Configuration +@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true") +public class MqttConfig { + + private static final Logger log = LoggerFactory.getLogger(MqttConfig.class); + + @Value("${mqtt.host}") + private String host; + + @Value("${mqtt.clientId}") + private String clientId; + + @Value("${mqtt.username}") + private String username; + + @Value("${mqtt.password}") + private String password; + + @Value("${mqtt.connectionTimeout}") + private int connectionTimeout; + + @Value("${mqtt.keepAliveInterval}") + private int keepAliveInterval; + + @Value("${mqtt.automaticReconnect}") + private boolean automaticReconnect; + + @Value("${mqtt.cleanSession}") + private boolean cleanSession; + + // 支持逗号分隔的多个主题,例如:/bbox/EVO0002/#,/bbox/000010000200003/# + @Value("#{'${mqtt.subscribeTopic}'.split(',')}") + private String[] subscribeTopics; + + /** + * MQTT客户端工厂 + */ + @Bean + public MqttPahoClientFactory mqttClientFactory() { + DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); + MqttConnectOptions options = new MqttConnectOptions(); + options.setServerURIs(new String[]{host}); + options.setAutomaticReconnect(automaticReconnect); + options.setCleanSession(cleanSession); + options.setConnectionTimeout(connectionTimeout); + options.setKeepAliveInterval(keepAliveInterval); + if (username != null && !username.isEmpty()) { + options.setUserName(username); + } + if (password != null && !password.isEmpty()) { + options.setPassword(password.toCharArray()); + } + factory.setConnectionOptions(options); + return factory; + } + + /** + * MQTT消息接收通道 + */ + @Bean + public MessageChannel mqttInputChannel() { + return new DirectChannel(); + } + + /** + * MQTT消息生产者(订阅) + */ + @Bean + public MessageProducer inbound() { + // 去除每个主题的首尾空格 + String[] topics = Arrays.stream(subscribeTopics) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .toArray(String[]::new); + log.info("MQTT订阅主题: {}", Arrays.toString(topics)); + + MqttPahoMessageDrivenChannelAdapter adapter = + new MqttPahoMessageDrivenChannelAdapter(clientId + "_inbound", mqttClientFactory(), topics); + adapter.setCompletionTimeout(5000); + // 使用字节载荷转换器,保留原始二进制帧 + DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter(); + converter.setPayloadAsBytes(true); + adapter.setConverter(converter); + adapter.setQos(1); + adapter.setOutputChannel(mqttInputChannel()); + return adapter; + } + + @Autowired(required = false) + private com.evobms.project.bms.service.MqttService mqttService; + + /** + * MQTT消息处理器 + */ + @Bean + @ServiceActivator(inputChannel = "mqttInputChannel") + public MessageHandler handler() { + return new AbstractMessageHandler() { + @Override + protected void handleMessageInternal(org.springframework.messaging.Message message) { + String topic = message.getHeaders().get("mqtt_receivedTopic").toString(); + try { + MDC.put("topic", topic); + // 将设备编号加入上下文,方便日志追踪 + String[] parts = topic.split("/"); + for (int i = 0; i < parts.length - 1; i++) { + if ("bbox".equalsIgnoreCase(parts[i])) { + MDC.put("deviceCode", parts[i + 1]); + break; + } + } + + Object payloadObj = message.getPayload(); + byte[] payloadBytes; + if (payloadObj instanceof byte[]) { + payloadBytes = (byte[]) payloadObj; + } else if (payloadObj instanceof String) { + // 尽最大可能保留原始字节(ISO_8859_1一一映射) + payloadBytes = ((String) payloadObj).getBytes(StandardCharsets.ISO_8859_1); + } else { + // 兜底:从toString获取,再按ISO_8859_1转换 + payloadBytes = payloadObj.toString().getBytes(StandardCharsets.ISO_8859_1); + } + + if (mqttService != null) { + mqttService.handleDeviceData(topic, payloadBytes); + } else { + log.warn("mqttService未注入,无法处理设备数据,主题: {}", topic); + } + } finally { + MDC.clear(); + } + } + }; + } + + /** + * MQTT消息发送通道 + */ + @Bean + public MessageChannel mqttOutboundChannel() { + return new DirectChannel(); + } + + /** + * MQTT消息发送处理器 + */ + @Bean + @ServiceActivator(inputChannel = "mqttOutboundChannel") + public MessageHandler mqttOutbound() { + MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId + "_outbound", mqttClientFactory()); + messageHandler.setAsync(true); + messageHandler.setDefaultTopic("evobms/command"); + messageHandler.setDefaultQos(1); + return messageHandler; + } +} diff --git a/src/main/java/com/evobms/framework/config/MyBatisConfig.java b/src/main/java/com/evobms/framework/config/MyBatisConfig.java new file mode 100644 index 0000000..65246a7 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/MyBatisConfig.java @@ -0,0 +1,132 @@ +package com.evobms.framework.config; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import javax.sql.DataSource; +import org.apache.ibatis.io.VFS; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.util.ClassUtils; +import com.evobms.common.utils.StringUtils; + +/** + * Mybatis支持*匹配扫描包 + * + * @author ruoyi + */ +@Configuration +public class MyBatisConfig +{ + @Autowired + private Environment env; + + static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; + + public static String setTypeAliasesPackage(String typeAliasesPackage) + { + ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); + MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver); + List allResult = new ArrayList(); + try + { + for (String aliasesPackage : typeAliasesPackage.split(",")) + { + List result = new ArrayList(); + aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN; + Resource[] resources = resolver.getResources(aliasesPackage); + if (resources != null && resources.length > 0) + { + MetadataReader metadataReader = null; + for (Resource resource : resources) + { + if (resource.isReadable()) + { + metadataReader = metadataReaderFactory.getMetadataReader(resource); + try + { + result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); + } + catch (ClassNotFoundException e) + { + e.printStackTrace(); + } + } + } + } + if (result.size() > 0) + { + HashSet hashResult = new HashSet(result); + allResult.addAll(hashResult); + } + } + if (allResult.size() > 0) + { + typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0])); + } + else + { + throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包"); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + return typeAliasesPackage; + } + + public Resource[] resolveMapperLocations(String[] mapperLocations) + { + ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); + List resources = new ArrayList(); + if (mapperLocations != null) + { + for (String mapperLocation : mapperLocations) + { + try + { + Resource[] mappers = resourceResolver.getResources(mapperLocation); + resources.addAll(Arrays.asList(mappers)); + } + catch (IOException e) + { + // ignore + } + } + } + return resources.toArray(new Resource[resources.size()]); + } + + @Bean + public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception + { + String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage"); + String mapperLocations = env.getProperty("mybatis.mapperLocations"); + String configLocation = env.getProperty("mybatis.configLocation"); + typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); + VFS.addImplClass(SpringBootVFS.class); + + final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); + sessionFactory.setDataSource(dataSource); + sessionFactory.setTypeAliasesPackage(typeAliasesPackage); + sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); + sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); + return sessionFactory.getObject(); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/framework/config/MybatisPlusConfig.java b/src/main/java/com/evobms/framework/config/MybatisPlusConfig.java new file mode 100644 index 0000000..b721ab2 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/MybatisPlusConfig.java @@ -0,0 +1,33 @@ +package com.evobms.framework.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * MyBatis-Plus配置类 + * + * @author evobms + */ +@Configuration +public class MybatisPlusConfig { + + /** + * MyBatis-Plus拦截器配置 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + + // 分页插件 + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + + // 乐观锁插件 + interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + + return interceptor; + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/framework/config/RedisConfig.java b/src/main/java/com/evobms/framework/config/RedisConfig.java new file mode 100644 index 0000000..1dd586e --- /dev/null +++ b/src/main/java/com/evobms/framework/config/RedisConfig.java @@ -0,0 +1,69 @@ +package com.evobms.framework.config; + +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.core.script.DefaultRedisScript; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * redis配置 + * + * @author ruoyi + */ +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport +{ + @Bean + @SuppressWarnings(value = { "unchecked", "rawtypes" }) + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) + { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + + // Hash的key也采用StringRedisSerializer的序列化方式 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(serializer); + + template.afterPropertiesSet(); + return template; + } + + @Bean + public DefaultRedisScript limitScript() + { + DefaultRedisScript redisScript = new DefaultRedisScript<>(); + redisScript.setScriptText(limitScriptText()); + redisScript.setResultType(Long.class); + return redisScript; + } + + /** + * 限流脚本 + */ + private String limitScriptText() + { + return "local key = KEYS[1]\n" + + "local count = tonumber(ARGV[1])\n" + + "local time = tonumber(ARGV[2])\n" + + "local current = redis.call('get', key);\n" + + "if current and tonumber(current) > count then\n" + + " return tonumber(current);\n" + + "end\n" + + "current = redis.call('incr', key)\n" + + "if tonumber(current) == 1 then\n" + + " redis.call('expire', key, time)\n" + + "end\n" + + "return tonumber(current);"; + } +} diff --git a/src/main/java/com/evobms/framework/config/ResourcesConfig.java b/src/main/java/com/evobms/framework/config/ResourcesConfig.java new file mode 100644 index 0000000..d4b422a --- /dev/null +++ b/src/main/java/com/evobms/framework/config/ResourcesConfig.java @@ -0,0 +1,71 @@ +package com.evobms.framework.config; + +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.CacheControl; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import com.evobms.common.constant.Constants; +import com.evobms.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 通用配置 + * + * @author ruoyi + */ +@Configuration +public class ResourcesConfig implements WebMvcConfigurer +{ + @Autowired + private RepeatSubmitInterceptor repeatSubmitInterceptor; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) + { + /** 本地文件上传路径 */ + registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**") + .addResourceLocations("file:" + RuoYiConfig.getProfile() + "/"); + + /** swagger配置 */ + registry.addResourceHandler("/swagger-ui/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") + .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic()); + } + + /** + * 自定义拦截规则 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) + { + registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**"); + } + + /** + * 跨域配置 + */ + @Bean + public CorsFilter corsFilter() + { + CorsConfiguration config = new CorsConfiguration(); + // 设置访问源地址 + config.addAllowedOriginPattern("*"); + // 设置访问源请求头 + config.addAllowedHeader("*"); + // 设置访问源请求方法 + config.addAllowedMethod("*"); + // 有效期 1800秒 + config.setMaxAge(1800L); + // 添加映射路径,拦截一切请求 + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + // 返回新的CorsFilter + return new CorsFilter(source); + } +} diff --git a/src/main/java/com/evobms/framework/config/RuoYiConfig.java b/src/main/java/com/evobms/framework/config/RuoYiConfig.java new file mode 100644 index 0000000..44f32b7 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/RuoYiConfig.java @@ -0,0 +1,111 @@ +package com.evobms.framework.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 读取项目相关配置 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "ruoyi") +public class RuoYiConfig +{ + /** 项目名称 */ + private String name; + + /** 版本 */ + private String version; + + /** 版权年份 */ + private String copyrightYear; + + /** 上传路径 */ + private static String profile; + + /** 获取地址开关 */ + private static boolean addressEnabled; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getCopyrightYear() + { + return copyrightYear; + } + + public void setCopyrightYear(String copyrightYear) + { + this.copyrightYear = copyrightYear; + } + + public static String getProfile() + { + return profile; + } + + public void setProfile(String profile) + { + RuoYiConfig.profile = profile; + } + + public static boolean isAddressEnabled() + { + return addressEnabled; + } + + public void setAddressEnabled(boolean addressEnabled) + { + RuoYiConfig.addressEnabled = addressEnabled; + } + + /** + * 获取导入上传路径 + */ + public static String getImportPath() + { + return getProfile() + "/import"; + } + + /** + * 获取头像上传路径 + */ + public static String getAvatarPath() + { + return getProfile() + "/avatar"; + } + + /** + * 获取下载路径 + */ + public static String getDownloadPath() + { + return getProfile() + "/download/"; + } + + /** + * 获取上传路径 + */ + public static String getUploadPath() + { + return getProfile() + "/upload"; + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/framework/config/ScheduleConfig.java b/src/main/java/com/evobms/framework/config/ScheduleConfig.java new file mode 100644 index 0000000..fccbf2c --- /dev/null +++ b/src/main/java/com/evobms/framework/config/ScheduleConfig.java @@ -0,0 +1,57 @@ +//package com.evobms.framework.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.scheduling.quartz.SchedulerFactoryBean; +//import javax.sql.DataSource; +//import java.util.Properties; +// +///** +// * 定时任务配置(单机部署建议默认走内存,如需集群需要创建qrtz数据库表/打开类注释) +// * +// * @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.springframework.scheduling.quartz.LocalDataSourceJobStore"); +// // 集群配置 +// prop.put("org.quartz.jobStore.isClustered", "true"); +// prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); +// prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "10"); +// 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 +// // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 +// factory.setOverwriteExistingJobs(true); +// // 设置自动启动,默认为true +// factory.setAutoStartup(true); +// +// return factory; +// } +//} diff --git a/src/main/java/com/evobms/framework/config/SecurityConfig.java b/src/main/java/com/evobms/framework/config/SecurityConfig.java new file mode 100644 index 0000000..9ae2f41 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/SecurityConfig.java @@ -0,0 +1,141 @@ +package com.evobms.framework.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.ProviderManager; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.authentication.logout.LogoutFilter; +import org.springframework.web.filter.CorsFilter; +import com.evobms.framework.config.properties.PermitAllUrlProperties; +import com.evobms.framework.security.filter.JwtAuthenticationTokenFilter; +import com.evobms.framework.security.handle.AuthenticationEntryPointImpl; +import com.evobms.framework.security.handle.LogoutSuccessHandlerImpl; + +/** + * spring security配置 + * + * @author ruoyi + */ +@EnableMethodSecurity(prePostEnabled = true, securedEnabled = true) +@Configuration +public class SecurityConfig +{ + /** + * 自定义用户认证逻辑 + */ + @Autowired + private UserDetailsService userDetailsService; + + /** + * 认证失败处理类 + */ + @Autowired + private AuthenticationEntryPointImpl unauthorizedHandler; + + /** + * 退出处理类 + */ + @Autowired + private LogoutSuccessHandlerImpl logoutSuccessHandler; + + /** + * token认证过滤器 + */ + @Autowired + private JwtAuthenticationTokenFilter authenticationTokenFilter; + + /** + * 跨域过滤器 + */ + @Autowired + private CorsFilter corsFilter; + + /** + * 允许匿名访问的地址 + */ + @Autowired + private PermitAllUrlProperties permitAllUrl; + + /** + * 身份验证实现 + */ + @Bean + public AuthenticationManager authenticationManager() + { + DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider(); + daoAuthenticationProvider.setUserDetailsService(userDetailsService); + daoAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder()); + return new ProviderManager(daoAuthenticationProvider); + } + + /** + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + @Bean + protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception + { + return httpSecurity + // CSRF禁用,因为不使用session + .csrf(csrf -> csrf.disable()) + // 禁用HTTP响应标头 + .headers((headersCustomizer) -> { + headersCustomizer.cacheControl(cache -> cache.disable()).frameOptions(options -> options.sameOrigin()); + }) + // 认证失败处理类 + .exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler)) + // 基于token,所以不需要session + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + // 注解标记允许匿名访问的url + .authorizeHttpRequests((requests) -> { + permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); + // 对于登录login 注册register 验证码captchaImage 允许匿名访问 + requests.antMatchers("/login", "/register", "/captchaImage").permitAll() + // 静态资源,可匿名访问 + .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() + .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() + .antMatchers("/devices/**","/ota/**").permitAll() + .antMatchers("/iot/**").permitAll() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated(); + }) + // 添加Logout filter + .logout(logout -> logout.logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler)) + // 添加JWT filter + .addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class) + // 添加CORS filter + .addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class) + .addFilterBefore(corsFilter, LogoutFilter.class) + .build(); + } + + /** + * 强散列哈希加密实现 + */ + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() + { + return new BCryptPasswordEncoder(); + } +} diff --git a/src/main/java/com/evobms/framework/config/SensitiveJsonSerializer.java b/src/main/java/com/evobms/framework/config/SensitiveJsonSerializer.java new file mode 100644 index 0000000..02828aa --- /dev/null +++ b/src/main/java/com/evobms/framework/config/SensitiveJsonSerializer.java @@ -0,0 +1,67 @@ +package com.evobms.framework.config; + +import java.io.IOException; +import java.util.Objects; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.framework.aspectj.lang.annotation.Sensitive; +import com.evobms.framework.aspectj.lang.enums.DesensitizedType; +import com.evobms.framework.security.LoginUser; + +/** + * 数据脱敏序列化过滤 + * + * @author ruoyi + */ +public class SensitiveJsonSerializer extends JsonSerializer implements ContextualSerializer +{ + private DesensitizedType desensitizedType; + + @Override + public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException + { + if (desensitization()) + { + gen.writeString(desensitizedType.desensitizer().apply(value)); + } + else + { + gen.writeString(value); + } + } + + @Override + public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) + throws JsonMappingException + { + Sensitive annotation = property.getAnnotation(Sensitive.class); + if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) + { + this.desensitizedType = annotation.desensitizedType(); + return this; + } + return prov.findValueSerializer(property.getType(), property); + } + + /** + * 是否需要脱敏处理 + */ + private boolean desensitization() + { + try + { + LoginUser securityUser = SecurityUtils.getLoginUser(); + // 管理员不脱敏 + return !securityUser.getUser().isAdmin(); + } + catch (Exception e) + { + return true; + } + } +} diff --git a/src/main/java/com/evobms/framework/config/ServerConfig.java b/src/main/java/com/evobms/framework/config/ServerConfig.java new file mode 100644 index 0000000..d780d22 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/ServerConfig.java @@ -0,0 +1,32 @@ +package com.evobms.framework.config; + +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Component; +import com.evobms.common.utils.ServletUtils; + +/** + * 服务相关配置 + * + * @author ruoyi + */ +@Component +public class ServerConfig +{ + /** + * 获取完整的请求路径,包括:域名,端口,上下文访问路径 + * + * @return 服务地址 + */ + public String getUrl() + { + HttpServletRequest request = ServletUtils.getRequest(); + return getDomain(request); + } + + public static String getDomain(HttpServletRequest request) + { + StringBuffer url = request.getRequestURL(); + String contextPath = request.getServletContext().getContextPath(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); + } +} diff --git a/src/main/java/com/evobms/framework/config/SwaggerConfig.java b/src/main/java/com/evobms/framework/config/SwaggerConfig.java new file mode 100644 index 0000000..8abcf83 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/SwaggerConfig.java @@ -0,0 +1,124 @@ +package com.evobms.framework.config; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import io.swagger.annotations.ApiOperation; +import io.swagger.models.auth.In; +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.service.SecurityScheme; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; + +/** + * Swagger2的接口配置 + * + * @author ruoyi + */ +@Configuration +public class SwaggerConfig +{ + /** 系统基础配置 */ + @Autowired + private RuoYiConfig ruoyiConfig; + + /** 是否开启swagger */ + @Value("${swagger.enabled}") + private boolean enabled; + + /** 设置请求的统一前缀 */ + @Value("${swagger.pathMapping}") + private String pathMapping; + + /** + * 创建API + */ + @Bean + public Docket createRestApi() + { + return new Docket(DocumentationType.OAS_30) + // 是否启用Swagger + .enable(enabled) + // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo()) + // 设置哪些接口暴露给Swagger展示 + .select() + // 扫描所有有注解的api,用这种方式更灵活 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 扫描指定包中的swagger注解 + // .apis(RequestHandlerSelectors.basePackage("com.evobms.project.tool.swagger")) + // 扫描所有 .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + /* 设置安全模式,swagger可以设置访问token */ + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .pathMapping(pathMapping); + } + + /** + * 安全模式,这里指定token通过Authorization头请求头传递 + */ + private List securitySchemes() + { + List apiKeyList = new ArrayList(); + apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue())); + return apiKeyList; + } + + /** + * 安全上下文 + */ + private List securityContexts() + { + List securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern().matches("/.*")) + .build()); + return securityContexts; + } + + /** + * 默认的安全上引用 + */ + 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() + { + // 用ApiInfoBuilder进行定制 + return new ApiInfoBuilder() + // 设置标题 + .title("标题:若依管理系统_接口文档") + // 描述 + .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") + // 作者信息 + .contact(new Contact(ruoyiConfig.getName(), null, null)) + // 版本 + .version("版本号:" + ruoyiConfig.getVersion()) + .build(); + } +} diff --git a/src/main/java/com/evobms/framework/config/ThreadPoolConfig.java b/src/main/java/com/evobms/framework/config/ThreadPoolConfig.java new file mode 100644 index 0000000..7f4645e --- /dev/null +++ b/src/main/java/com/evobms/framework/config/ThreadPoolConfig.java @@ -0,0 +1,63 @@ +package com.evobms.framework.config; + +import com.evobms.common.utils.Threads; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池配置 + * + * @author ruoyi + **/ +@Configuration +public class ThreadPoolConfig +{ + // 核心线程池大小 + private int corePoolSize = 50; + + // 最大可创建的线程数 + private int maxPoolSize = 200; + + // 队列最大长度 + private int queueCapacity = 1000; + + // 线程池维护线程所允许的空闲时间 + private int keepAliveSeconds = 300; + + @Bean(name = "threadPoolTaskExecutor") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() + { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setMaxPoolSize(maxPoolSize); + executor.setCorePoolSize(corePoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveSeconds); + // 线程池对拒绝任务(无线程可用)的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + /** + * 执行周期性或定时任务 + */ + @Bean(name = "scheduledExecutorService") + protected ScheduledExecutorService scheduledExecutorService() + { + return new ScheduledThreadPoolExecutor(corePoolSize, + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), + new ThreadPoolExecutor.CallerRunsPolicy()) + { + @Override + protected void afterExecute(Runnable r, Throwable t) + { + super.afterExecute(r, t); + Threads.printException(r, t); + } + }; + } +} diff --git a/src/main/java/com/evobms/framework/config/properties/DruidProperties.java b/src/main/java/com/evobms/framework/config/properties/DruidProperties.java new file mode 100644 index 0000000..28bf4ed --- /dev/null +++ b/src/main/java/com/evobms/framework/config/properties/DruidProperties.java @@ -0,0 +1,89 @@ +package com.evobms.framework.config.properties; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import com.alibaba.druid.pool.DruidDataSource; + +/** + * druid 配置属性 + * + * @author ruoyi + */ +@Configuration +public class DruidProperties +{ + @Value("${spring.datasource.druid.initialSize}") + private int initialSize; + + @Value("${spring.datasource.druid.minIdle}") + private int minIdle; + + @Value("${spring.datasource.druid.maxActive}") + private int maxActive; + + @Value("${spring.datasource.druid.maxWait}") + private int maxWait; + + @Value("${spring.datasource.druid.connectTimeout}") + private int connectTimeout; + + @Value("${spring.datasource.druid.socketTimeout}") + private int socketTimeout; + + @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") + private int timeBetweenEvictionRunsMillis; + + @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") + private int minEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") + private int maxEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.validationQuery}") + private String validationQuery; + + @Value("${spring.datasource.druid.testWhileIdle}") + private boolean testWhileIdle; + + @Value("${spring.datasource.druid.testOnBorrow}") + private boolean testOnBorrow; + + @Value("${spring.datasource.druid.testOnReturn}") + private boolean testOnReturn; + + public DruidDataSource dataSource(DruidDataSource datasource) + { + /** 配置初始化大小、最小、最大 */ + datasource.setInitialSize(initialSize); + datasource.setMaxActive(maxActive); + datasource.setMinIdle(minIdle); + + /** 配置获取连接等待超时的时间 */ + datasource.setMaxWait(maxWait); + + /** 配置驱动连接超时时间,检测数据库建立连接的超时时间,单位是毫秒 */ + datasource.setConnectTimeout(connectTimeout); + + /** 配置网络超时时间,等待数据库操作完成的网络超时时间,单位是毫秒 */ + datasource.setSocketTimeout(socketTimeout); + + /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ + datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + + /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */ + datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); + + /** + * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 + */ + datasource.setValidationQuery(validationQuery); + /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */ + datasource.setTestWhileIdle(testWhileIdle); + /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnBorrow(testOnBorrow); + /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnReturn(testOnReturn); + return datasource; + } +} diff --git a/src/main/java/com/evobms/framework/config/properties/PermitAllUrlProperties.java b/src/main/java/com/evobms/framework/config/properties/PermitAllUrlProperties.java new file mode 100644 index 0000000..bae0da7 --- /dev/null +++ b/src/main/java/com/evobms/framework/config/properties/PermitAllUrlProperties.java @@ -0,0 +1,73 @@ +package com.evobms.framework.config.properties; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.regex.Pattern; +import org.apache.commons.lang3.RegExUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import com.evobms.framework.aspectj.lang.annotation.Anonymous; + +/** + * 设置Anonymous注解允许匿名访问的url + * + * @author ruoyi + */ +@Configuration +public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware +{ + private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}"); + + private ApplicationContext applicationContext; + + private List urls = new ArrayList<>(); + + public String ASTERISK = "*"; + + @Override + public void afterPropertiesSet() + { + RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class); + Map map = mapping.getHandlerMethods(); + + map.keySet().forEach(info -> { + HandlerMethod handlerMethod = map.get(info); + + // 获取方法上边的注解 替代path variable 为 * + Anonymous method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Anonymous.class); + Optional.ofNullable(method).ifPresent(anonymous -> Objects.requireNonNull(info.getPatternsCondition().getPatterns()) + .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); + + // 获取类上边的注解, 替代path variable 为 * + Anonymous controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Anonymous.class); + Optional.ofNullable(controller).ifPresent(anonymous -> Objects.requireNonNull(info.getPatternsCondition().getPatterns()) + .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); + }); + } + + @Override + public void setApplicationContext(ApplicationContext context) throws BeansException + { + this.applicationContext = context; + } + + public List getUrls() + { + return urls; + } + + public void setUrls(List urls) + { + this.urls = urls; + } +} diff --git a/src/main/java/com/evobms/framework/datasource/DynamicDataSource.java b/src/main/java/com/evobms/framework/datasource/DynamicDataSource.java new file mode 100644 index 0000000..ffcfaad --- /dev/null +++ b/src/main/java/com/evobms/framework/datasource/DynamicDataSource.java @@ -0,0 +1,26 @@ +package com.evobms.framework.datasource; + +import java.util.Map; +import javax.sql.DataSource; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +/** + * 动态数据源 + * + * @author ruoyi + */ +public class DynamicDataSource extends AbstractRoutingDataSource +{ + public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) + { + super.setDefaultTargetDataSource(defaultTargetDataSource); + super.setTargetDataSources(targetDataSources); + super.afterPropertiesSet(); + } + + @Override + protected Object determineCurrentLookupKey() + { + return DynamicDataSourceContextHolder.getDataSourceType(); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/framework/datasource/DynamicDataSourceContextHolder.java b/src/main/java/com/evobms/framework/datasource/DynamicDataSourceContextHolder.java new file mode 100644 index 0000000..6f53468 --- /dev/null +++ b/src/main/java/com/evobms/framework/datasource/DynamicDataSourceContextHolder.java @@ -0,0 +1,45 @@ +package com.evobms.framework.datasource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 数据源切换处理 + * + * @author ruoyi + */ +public class DynamicDataSourceContextHolder +{ + public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class); + + /** + * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, + * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 + */ + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); + + /** + * 设置数据源的变量 + */ + public static void setDataSourceType(String dsType) + { + log.info("切换到{}数据源", dsType); + CONTEXT_HOLDER.set(dsType); + } + + /** + * 获得数据源的变量 + */ + public static String getDataSourceType() + { + return CONTEXT_HOLDER.get(); + } + + /** + * 清空数据源变量 + */ + public static void clearDataSourceType() + { + CONTEXT_HOLDER.remove(); + } +} diff --git a/src/main/java/com/evobms/framework/interceptor/RepeatSubmitInterceptor.java b/src/main/java/com/evobms/framework/interceptor/RepeatSubmitInterceptor.java new file mode 100644 index 0000000..4b3aab8 --- /dev/null +++ b/src/main/java/com/evobms/framework/interceptor/RepeatSubmitInterceptor.java @@ -0,0 +1,56 @@ +package com.evobms.framework.interceptor; + +import java.lang.reflect.Method; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import com.alibaba.fastjson2.JSON; +import com.evobms.common.utils.ServletUtils; +import com.evobms.framework.interceptor.annotation.RepeatSubmit; +import com.evobms.framework.web.domain.AjaxResult; + +/** + * 防止重复提交拦截器 + * + * @author ruoyi + */ +@Component +public abstract class RepeatSubmitInterceptor implements HandlerInterceptor +{ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception + { + if (handler instanceof HandlerMethod) + { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); + if (annotation != null) + { + if (this.isRepeatSubmit(request, annotation)) + { + AjaxResult ajaxResult = AjaxResult.error(annotation.message()); + ServletUtils.renderString(response, JSON.toJSONString(ajaxResult)); + return false; + } + } + return true; + } + else + { + return true; + } + } + + /** + * 验证是否重复提交由子类实现具体的防重复提交的规则 + * + * @param request 请求信息 + * @param annotation 防重复注解参数 + * @return 结果 + * @throws Exception + */ + public abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation); +} diff --git a/src/main/java/com/evobms/framework/interceptor/annotation/RepeatSubmit.java b/src/main/java/com/evobms/framework/interceptor/annotation/RepeatSubmit.java new file mode 100644 index 0000000..28bc0d8 --- /dev/null +++ b/src/main/java/com/evobms/framework/interceptor/annotation/RepeatSubmit.java @@ -0,0 +1,31 @@ +package com.evobms.framework.interceptor.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; + +/** + * 自定义注解防止表单重复提交 + * + * @author ruoyi + * + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit +{ + /** + * 间隔时间(ms),小于此时间视为重复提交 + */ + public int interval() default 5000; + + /** + * 提示消息 + */ + public String message() default "不允许重复提交,请稍后再试"; +} \ No newline at end of file diff --git a/src/main/java/com/evobms/framework/interceptor/impl/SameUrlDataInterceptor.java b/src/main/java/com/evobms/framework/interceptor/impl/SameUrlDataInterceptor.java new file mode 100644 index 0000000..7caf7ef --- /dev/null +++ b/src/main/java/com/evobms/framework/interceptor/impl/SameUrlDataInterceptor.java @@ -0,0 +1,110 @@ +package com.evobms.framework.interceptor.impl; + +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.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson2.JSON; +import com.evobms.common.constant.CacheConstants; +import com.evobms.common.filter.RepeatedlyRequestWrapper; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.http.HttpHelper; +import com.evobms.framework.interceptor.RepeatSubmitInterceptor; +import com.evobms.framework.interceptor.annotation.RepeatSubmit; +import com.evobms.framework.redis.RedisCache; + +/** + * 判断请求url和数据是否和上一次相同, + * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。 + * + * @author ruoyi + */ +@Component +public class SameUrlDataInterceptor extends RepeatSubmitInterceptor +{ + public final String REPEAT_PARAMS = "repeatParams"; + + public final String REPEAT_TIME = "repeatTime"; + + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + @Autowired + private RedisCache redisCache; + + @SuppressWarnings("unchecked") + @Override + public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) + { + String nowParams = ""; + if (request instanceof RepeatedlyRequestWrapper) + { + RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request; + nowParams = HttpHelper.getBodyString(repeatedlyRequest); + } + + // body参数为空,获取Parameter的数据 + if (StringUtils.isEmpty(nowParams)) + { + nowParams = JSON.toJSONString(request.getParameterMap()); + } + Map nowDataMap = new HashMap(); + nowDataMap.put(REPEAT_PARAMS, nowParams); + nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); + + // 请求地址(作为存放cache的key值) + String url = request.getRequestURI(); + + // 唯一值(没有消息头则使用请求地址) + String submitKey = StringUtils.trimToEmpty(request.getHeader(header)); + + // 唯一标识(指定key + url + 消息头) + String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey; + + Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); + if (sessionObj != null) + { + Map sessionMap = (Map) sessionObj; + if (sessionMap.containsKey(url)) + { + Map preDataMap = (Map) sessionMap.get(url); + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) + { + return true; + } + } + } + Map cacheMap = new HashMap(); + cacheMap.put(url, nowDataMap); + redisCache.setCacheObject(cacheRepeatKey, cacheMap, annotation.interval(), TimeUnit.MILLISECONDS); + return false; + } + + /** + * 判断参数是否相同 + */ + private boolean compareParams(Map nowMap, Map preMap) + { + String nowParams = (String) nowMap.get(REPEAT_PARAMS); + String preParams = (String) preMap.get(REPEAT_PARAMS); + return nowParams.equals(preParams); + } + + /** + * 判断两次间隔时间 + */ + private boolean compareTime(Map nowMap, Map preMap, int interval) + { + long time1 = (Long) nowMap.get(REPEAT_TIME); + long time2 = (Long) preMap.get(REPEAT_TIME); + if ((time1 - time2) < interval) + { + return true; + } + return false; + } +} diff --git a/src/main/java/com/evobms/framework/manager/AsyncManager.java b/src/main/java/com/evobms/framework/manager/AsyncManager.java new file mode 100644 index 0000000..83f9d2a --- /dev/null +++ b/src/main/java/com/evobms/framework/manager/AsyncManager.java @@ -0,0 +1,55 @@ +package com.evobms.framework.manager; + +import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import com.evobms.common.utils.Threads; +import com.evobms.common.utils.spring.SpringUtils; + +/** + * 异步任务管理器 + * + * @author ruoyi + */ +public class AsyncManager +{ + /** + * 操作延迟10毫秒 + */ + private final int OPERATE_DELAY_TIME = 10; + + /** + * 异步操作任务调度线程池 + */ + private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); + + /** + * 单例模式 + */ + private AsyncManager(){} + + private static AsyncManager me = new AsyncManager(); + + public static AsyncManager me() + { + return me; + } + + /** + * 执行任务 + * + * @param task 任务 + */ + public void execute(TimerTask task) + { + executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); + } + + /** + * 停止任务线程池 + */ + public void shutdown() + { + Threads.shutdownAndAwaitTermination(executor); + } +} diff --git a/src/main/java/com/evobms/framework/manager/ShutdownManager.java b/src/main/java/com/evobms/framework/manager/ShutdownManager.java new file mode 100644 index 0000000..93260d7 --- /dev/null +++ b/src/main/java/com/evobms/framework/manager/ShutdownManager.java @@ -0,0 +1,39 @@ +package com.evobms.framework.manager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import javax.annotation.PreDestroy; + +/** + * 确保应用退出时能关闭后台线程 + * + * @author ruoyi + */ +@Component +public class ShutdownManager +{ + private static final Logger logger = LoggerFactory.getLogger("sys-user"); + + @PreDestroy + public void destroy() + { + shutdownAsyncManager(); + } + + /** + * 停止异步执行任务 + */ + private void shutdownAsyncManager() + { + try + { + logger.info("====关闭后台任务任务线程池===="); + AsyncManager.me().shutdown(); + } + catch (Exception e) + { + logger.error(e.getMessage(), e); + } + } +} diff --git a/src/main/java/com/evobms/framework/manager/factory/AsyncFactory.java b/src/main/java/com/evobms/framework/manager/factory/AsyncFactory.java new file mode 100644 index 0000000..00e8ca5 --- /dev/null +++ b/src/main/java/com/evobms/framework/manager/factory/AsyncFactory.java @@ -0,0 +1,102 @@ +package com.evobms.framework.manager.factory; + +import java.util.TimerTask; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.evobms.common.constant.Constants; +import com.evobms.common.utils.LogUtils; +import com.evobms.common.utils.ServletUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.ip.AddressUtils; +import com.evobms.common.utils.ip.IpUtils; +import com.evobms.common.utils.spring.SpringUtils; +import com.evobms.project.monitor.domain.SysLogininfor; +import com.evobms.project.monitor.domain.SysOperLog; +import com.evobms.project.monitor.service.ISysLogininforService; +import com.evobms.project.monitor.service.ISysOperLogService; +import eu.bitwalker.useragentutils.UserAgent; + +/** + * 异步工厂(产生任务用) + * + * @author ruoyi + */ +public class AsyncFactory +{ + private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user"); + + /** + * 记录登录信息 + * + * @param username 用户名 + * @param status 状态 + * @param message 消息 + * @param args 列表 + * @return 任务task + */ + public static TimerTask recordLogininfor(final String username, final String status, final String message, + final Object... args) + { + final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + final String ip = IpUtils.getIpAddr(); + return new TimerTask() + { + @Override + public void run() + { + String address = AddressUtils.getRealAddressByIP(ip); + StringBuilder s = new StringBuilder(); + s.append(LogUtils.getBlock(ip)); + s.append(address); + s.append(LogUtils.getBlock(username)); + s.append(LogUtils.getBlock(status)); + s.append(LogUtils.getBlock(message)); + // 打印信息到日志 + sys_user_logger.info(s.toString(), args); + // 获取客户端操作系统 + String os = userAgent.getOperatingSystem().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + // 封装对象 + SysLogininfor logininfor = new SysLogininfor(); + logininfor.setUserName(username); + logininfor.setIpaddr(ip); + logininfor.setLoginLocation(address); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(message); + // 日志状态 + if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) + { + logininfor.setStatus(Constants.SUCCESS); + } + else if (Constants.LOGIN_FAIL.equals(status)) + { + logininfor.setStatus(Constants.FAIL); + } + // 插入数据 + SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor); + } + }; + } + + /** + * 操作日志记录 + * + * @param operLog 操作日志信息 + * @return 任务task + */ + public static TimerTask recordOper(final SysOperLog operLog) + { + return new TimerTask() + { + @Override + public void run() + { + // 远程查询操作地点 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); + SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); + } + }; + } +} diff --git a/src/main/java/com/evobms/framework/redis/RedisCache.java b/src/main/java/com/evobms/framework/redis/RedisCache.java new file mode 100644 index 0000000..ba833ee --- /dev/null +++ b/src/main/java/com/evobms/framework/redis/RedisCache.java @@ -0,0 +1,268 @@ +package com.evobms.framework.redis; + +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 RedisCache +{ + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) + { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) + { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) + { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) + { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获取有效时间 + * + * @param key Redis键 + * @return 有效时间 + */ + public long getExpire(final String key) + { + return redisTemplate.getExpire(key); + } + + /** + * 判断 key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public Boolean hasKey(String key) + { + return redisTemplate.hasKey(key); + } + + /** + * 获得缓存的基本对象。 + * + * @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 boolean deleteObject(final Collection collection) + { + return redisTemplate.delete(collection) > 0; + } + + /** + * 缓存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; + } + + /** + * 获得缓存的list对象 + * + * @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; + } + + /** + * 获得缓存的set + * + * @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); + } + } + + /** + * 获得缓存的Map + * + * @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); + } + + /** + * 删除Hash中的某条数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return 是否成功 + */ + public boolean deleteCacheMapValue(final String key, final String hKey) + { + return redisTemplate.opsForHash().delete(key, hKey) > 0; + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) + { + return redisTemplate.keys(pattern); + } +} diff --git a/src/main/java/com/evobms/framework/security/LoginBody.java b/src/main/java/com/evobms/framework/security/LoginBody.java new file mode 100644 index 0000000..a4a2053 --- /dev/null +++ b/src/main/java/com/evobms/framework/security/LoginBody.java @@ -0,0 +1,69 @@ +package com.evobms.framework.security; + +/** + * 用户登录对象 + * + * @author ruoyi + */ +public class LoginBody +{ + /** + * 用户名 + */ + private String username; + + /** + * 用户密码 + */ + private String password; + + /** + * 验证码 + */ + private String code; + + /** + * 唯一标识 + */ + private String uuid; + + 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; + } + + public String getCode() + { + return code; + } + + public void setCode(String code) + { + this.code = code; + } + + public String getUuid() + { + return uuid; + } + + public void setUuid(String uuid) + { + this.uuid = uuid; + } +} diff --git a/src/main/java/com/evobms/framework/security/LoginUser.java b/src/main/java/com/evobms/framework/security/LoginUser.java new file mode 100644 index 0000000..b7b6cb9 --- /dev/null +++ b/src/main/java/com/evobms/framework/security/LoginUser.java @@ -0,0 +1,266 @@ +package com.evobms.framework.security; + +import java.util.Collection; +import java.util.Set; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import com.alibaba.fastjson2.annotation.JSONField; +import com.evobms.project.system.domain.SysUser; + +/** + * 登录用户身份权限 + * + * @author ruoyi + */ +public class LoginUser implements UserDetails +{ + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 权限列表 + */ + private Set permissions; + + /** + * 用户信息 + */ + private SysUser user; + + public LoginUser() + { + } + + public LoginUser(SysUser user, Set permissions) + { + this.user = user; + this.permissions = permissions; + } + + public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) + { + this.userId = userId; + this.deptId = deptId; + this.user = user; + this.permissions = permissions; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + public String getToken() + { + return token; + } + + public void setToken(String token) + { + this.token = token; + } + + @JSONField(serialize = false) + @Override + public String getPassword() + { + return user.getPassword(); + } + + @Override + public String getUsername() + { + return user.getUserName(); + } + + /** + * 账户是否未过期,过期无法验证 + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonExpired() + { + return true; + } + + /** + * 指定用户是否解锁,锁定的用户无法进行身份验证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonLocked() + { + return true; + } + + /** + * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isCredentialsNonExpired() + { + return true; + } + + /** + * 是否可用 ,禁用的用户不能身份验证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isEnabled() + { + return true; + } + + public Long getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Long loginTime) + { + this.loginTime = loginTime; + } + + 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 getExpireTime() + { + return expireTime; + } + + public void setExpireTime(Long expireTime) + { + this.expireTime = expireTime; + } + + public Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + + public SysUser getUser() + { + return user; + } + + public void setUser(SysUser user) + { + this.user = user; + } + + @Override + public Collection getAuthorities() + { + return null; + } +} diff --git a/src/main/java/com/evobms/framework/security/RegisterBody.java b/src/main/java/com/evobms/framework/security/RegisterBody.java new file mode 100644 index 0000000..25fd1a7 --- /dev/null +++ b/src/main/java/com/evobms/framework/security/RegisterBody.java @@ -0,0 +1,11 @@ +package com.evobms.framework.security; + +/** + * 用户注册对象 + * + * @author ruoyi + */ +public class RegisterBody extends LoginBody +{ + +} diff --git a/src/main/java/com/evobms/framework/security/context/AuthenticationContextHolder.java b/src/main/java/com/evobms/framework/security/context/AuthenticationContextHolder.java new file mode 100644 index 0000000..72a1148 --- /dev/null +++ b/src/main/java/com/evobms/framework/security/context/AuthenticationContextHolder.java @@ -0,0 +1,28 @@ +package com.evobms.framework.security.context; + +import org.springframework.security.core.Authentication; + +/** + * 身份验证信息 + * + * @author ruoyi + */ +public class AuthenticationContextHolder +{ + private static final ThreadLocal contextHolder = new ThreadLocal<>(); + + public static Authentication getContext() + { + return contextHolder.get(); + } + + public static void setContext(Authentication context) + { + contextHolder.set(context); + } + + public static void clearContext() + { + contextHolder.remove(); + } +} diff --git a/src/main/java/com/evobms/framework/security/context/PermissionContextHolder.java b/src/main/java/com/evobms/framework/security/context/PermissionContextHolder.java new file mode 100644 index 0000000..fa589e1 --- /dev/null +++ b/src/main/java/com/evobms/framework/security/context/PermissionContextHolder.java @@ -0,0 +1,27 @@ +package com.evobms.framework.security.context; + +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import com.evobms.common.core.text.Convert; + +/** + * 权限信息 + * + * @author ruoyi + */ +public class PermissionContextHolder +{ + private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT"; + + public static void setContext(String permission) + { + RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission, + RequestAttributes.SCOPE_REQUEST); + } + + public static String getContext() + { + return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES, + RequestAttributes.SCOPE_REQUEST)); + } +} diff --git a/src/main/java/com/evobms/framework/security/filter/JwtAuthenticationTokenFilter.java b/src/main/java/com/evobms/framework/security/filter/JwtAuthenticationTokenFilter.java new file mode 100644 index 0000000..0d87745 --- /dev/null +++ b/src/main/java/com/evobms/framework/security/filter/JwtAuthenticationTokenFilter.java @@ -0,0 +1,44 @@ +package com.evobms.framework.security.filter; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.security.LoginUser; +import com.evobms.framework.security.service.TokenService; + +/** + * token过滤器 验证token有效性 + * + * @author ruoyi + */ +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter +{ + @Autowired + private TokenService tokenService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) + { + tokenService.verifyToken(loginUser); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + chain.doFilter(request, response); + } +} diff --git a/src/main/java/com/evobms/framework/security/handle/AuthenticationEntryPointImpl.java b/src/main/java/com/evobms/framework/security/handle/AuthenticationEntryPointImpl.java new file mode 100644 index 0000000..af058d4 --- /dev/null +++ b/src/main/java/com/evobms/framework/security/handle/AuthenticationEntryPointImpl.java @@ -0,0 +1,34 @@ +package com.evobms.framework.security.handle; + +import java.io.IOException; +import java.io.Serializable; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson2.JSON; +import com.evobms.common.constant.HttpStatus; +import com.evobms.common.utils.ServletUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.web.domain.AjaxResult; + +/** + * 认证失败处理类 返回未授权 + * + * @author ruoyi + */ +@Component +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable +{ + private static final long serialVersionUID = -8970718410437077606L; + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) + throws IOException + { + int code = HttpStatus.UNAUTHORIZED; + String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg))); + } +} diff --git a/src/main/java/com/evobms/framework/security/handle/LogoutSuccessHandlerImpl.java b/src/main/java/com/evobms/framework/security/handle/LogoutSuccessHandlerImpl.java new file mode 100644 index 0000000..4fa79be --- /dev/null +++ b/src/main/java/com/evobms/framework/security/handle/LogoutSuccessHandlerImpl.java @@ -0,0 +1,52 @@ +package com.evobms.framework.security.handle; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; +import com.alibaba.fastjson2.JSON; +import com.evobms.common.constant.Constants; +import com.evobms.common.utils.ServletUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.manager.AsyncManager; +import com.evobms.framework.manager.factory.AsyncFactory; +import com.evobms.framework.security.LoginUser; +import com.evobms.framework.security.service.TokenService; +import com.evobms.framework.web.domain.AjaxResult; + +/** + * 自定义退出处理类 返回成功 + * + * @author ruoyi + */ +@Configuration +public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler +{ + @Autowired + private TokenService tokenService; + + /** + * 退出处理 + * + * @return + */ + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException, ServletException + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser)) + { + String userName = loginUser.getUsername(); + // 删除用户缓存记录 + tokenService.delLoginUser(loginUser.getToken()); + // 记录用户退出日志 + AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功")); + } + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success("退出成功"))); + } +} diff --git a/src/main/java/com/evobms/framework/security/service/PermissionService.java b/src/main/java/com/evobms/framework/security/service/PermissionService.java new file mode 100644 index 0000000..a3cf700 --- /dev/null +++ b/src/main/java/com/evobms/framework/security/service/PermissionService.java @@ -0,0 +1,159 @@ +package com.evobms.framework.security.service; + +import java.util.Set; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import com.evobms.common.constant.Constants; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.security.LoginUser; +import com.evobms.framework.security.context.PermissionContextHolder; +import com.evobms.project.system.domain.SysRole; + +/** + * RuoYi首创 自定义权限实现,ss取自SpringSecurity首字母 + * + * @author ruoyi + */ +@Service("ss") +public class PermissionService +{ + /** + * 验证用户是否具备某权限 + * + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public boolean hasPermi(String permission) + { + if (StringUtils.isEmpty(permission)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) + { + return false; + } + PermissionContextHolder.setContext(permission); + return hasPermissions(loginUser.getPermissions(), permission); + } + + /** + * 验证用户是否不具备某权限,与 hasPermi逻辑相反 + * + * @param permission 权限字符串 + * @return 用户是否不具备某权限 + */ + public boolean lacksPermi(String permission) + { + return hasPermi(permission) != true; + } + + /** + * 验证用户是否具有以下任意一个权限 + * + * @param permissions 以 PERMISSION_DELIMETER 为分隔符的权限列表 + * @return 用户是否具有以下任意一个权限 + */ + public boolean hasAnyPermi(String permissions) + { + if (StringUtils.isEmpty(permissions)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) + { + return false; + } + PermissionContextHolder.setContext(permissions); + Set authorities = loginUser.getPermissions(); + for (String permission : permissions.split(Constants.PERMISSION_DELIMETER)) + { + if (permission != null && hasPermissions(authorities, permission)) + { + return true; + } + } + return false; + } + + /** + * 判断用户是否拥有某个角色 + * + * @param role 角色字符串 + * @return 用户是否具备某角色 + */ + public boolean hasRole(String role) + { + if (StringUtils.isEmpty(role)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) + { + return false; + } + for (SysRole sysRole : loginUser.getUser().getRoles()) + { + String roleKey = sysRole.getRoleKey(); + if (Constants.SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) + { + return true; + } + } + return false; + } + + /** + * 验证用户是否不具备某角色,与 isRole逻辑相反。 + * + * @param role 角色名称 + * @return 用户是否不具备某角色 + */ + public boolean lacksRole(String role) + { + return hasRole(role) != true; + } + + /** + * 验证用户是否具有以下任意一个角色 + * + * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 + * @return 用户是否具有以下任意一个角色 + */ + public boolean hasAnyRoles(String roles) + { + if (StringUtils.isEmpty(roles)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) + { + return false; + } + for (String role : roles.split(Constants.ROLE_DELIMETER)) + { + if (hasRole(role)) + { + return true; + } + } + return false; + } + + /** + * 判断是否包含权限 + * + * @param permissions 权限列表 + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + private boolean hasPermissions(Set permissions, String permission) + { + return permissions.contains(Constants.ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission)); + } +} diff --git a/src/main/java/com/evobms/framework/security/service/SysLoginService.java b/src/main/java/com/evobms/framework/security/service/SysLoginService.java new file mode 100644 index 0000000..6e9cb5c --- /dev/null +++ b/src/main/java/com/evobms/framework/security/service/SysLoginService.java @@ -0,0 +1,176 @@ +package com.evobms.framework.security.service; + +import javax.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; +import com.evobms.common.constant.CacheConstants; +import com.evobms.common.constant.Constants; +import com.evobms.common.constant.UserConstants; +import com.evobms.common.exception.ServiceException; +import com.evobms.common.exception.user.BlackListException; +import com.evobms.common.exception.user.CaptchaException; +import com.evobms.common.exception.user.CaptchaExpireException; +import com.evobms.common.exception.user.UserNotExistsException; +import com.evobms.common.exception.user.UserPasswordNotMatchException; +import com.evobms.common.utils.DateUtils; +import com.evobms.common.utils.MessageUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.ip.IpUtils; +import com.evobms.framework.manager.AsyncManager; +import com.evobms.framework.manager.factory.AsyncFactory; +import com.evobms.framework.redis.RedisCache; +import com.evobms.framework.security.LoginUser; +import com.evobms.framework.security.context.AuthenticationContextHolder; +import com.evobms.project.system.service.ISysConfigService; +import com.evobms.project.system.service.ISysUserService; + +/** + * 登录校验方法 + * + * @author ruoyi + */ +@Component +public class SysLoginService +{ + @Autowired + private TokenService tokenService; + + @Resource + private AuthenticationManager authenticationManager; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + /** + * 登录验证 + * + * @param username 用户名 + * @param password 密码 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public String login(String username, String password, String code, String uuid) + { + // 验证码校验 + validateCaptcha(username, code, uuid); + // 登录前置校验 + loginPreCheck(username, password); + // 用户验证 + Authentication authentication = null; + try + { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); + AuthenticationContextHolder.setContext(authenticationToken); + // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername + authentication = authenticationManager.authenticate(authenticationToken); + } + catch (Exception e) + { + if (e instanceof BadCredentialsException) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + throw new ServiceException(e.getMessage()); + } + } + finally + { + AuthenticationContextHolder.clearContext(); + } + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + recordLoginInfo(loginUser.getUserId()); + // 生成token + return tokenService.createToken(loginUser); + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) + { + boolean captchaEnabled = configService.selectCaptchaEnabled(); + if (captchaEnabled) + { + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); + String captcha = redisCache.getCacheObject(verifyKey); + if (captcha == null) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); + throw new CaptchaExpireException(); + } + redisCache.deleteObject(verifyKey); + if (!code.equalsIgnoreCase(captcha)) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); + throw new CaptchaException(); + } + } + } + + /** + * 登录前置校验 + * @param username 用户名 + * @param password 用户密码 + */ + public void loginPreCheck(String username, String password) + { + // 用户名或密码为空 错误 + if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null"))); + throw new UserNotExistsException(); + } + // 密码如果不在指定范围内 错误 + if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + // 用户名不在指定范围内 错误 + if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + // IP黑名单校验 + String blackStr = configService.selectConfigByKey("sys.login.blackIPList"); + if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked"))); + throw new BlackListException(); + } + } + + /** + * 记录登录信息 + * + * @param userId 用户ID + */ + public void recordLoginInfo(Long userId) + { + userService.updateLoginInfo(userId, IpUtils.getIpAddr(), DateUtils.getNowDate()); + } +} diff --git a/src/main/java/com/evobms/framework/security/service/SysPasswordService.java b/src/main/java/com/evobms/framework/security/service/SysPasswordService.java new file mode 100644 index 0000000..3d1baff --- /dev/null +++ b/src/main/java/com/evobms/framework/security/service/SysPasswordService.java @@ -0,0 +1,86 @@ +package com.evobms.framework.security.service; + +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; +import com.evobms.common.constant.CacheConstants; +import com.evobms.common.exception.user.UserPasswordNotMatchException; +import com.evobms.common.exception.user.UserPasswordRetryLimitExceedException; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.framework.redis.RedisCache; +import com.evobms.framework.security.context.AuthenticationContextHolder; +import com.evobms.project.system.domain.SysUser; + +/** + * 登录密码方法 + * + * @author ruoyi + */ +@Component +public class SysPasswordService +{ + @Autowired + private RedisCache redisCache; + + @Value(value = "${user.password.maxRetryCount}") + private int maxRetryCount; + + @Value(value = "${user.password.lockTime}") + private int lockTime; + + /** + * 登录账户密码错误次数缓存键名 + * + * @param username 用户名 + * @return 缓存键key + */ + private String getCacheKey(String username) + { + return CacheConstants.PWD_ERR_CNT_KEY + username; + } + + public void validate(SysUser user) + { + Authentication usernamePasswordAuthenticationToken = AuthenticationContextHolder.getContext(); + String username = usernamePasswordAuthenticationToken.getName(); + String password = usernamePasswordAuthenticationToken.getCredentials().toString(); + + Integer retryCount = redisCache.getCacheObject(getCacheKey(username)); + + if (retryCount == null) + { + retryCount = 0; + } + + if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) + { + throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime); + } + + if (!matches(user, password)) + { + retryCount = retryCount + 1; + redisCache.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); + throw new UserPasswordNotMatchException(); + } + else + { + clearLoginRecordCache(username); + } + } + + public boolean matches(SysUser user, String rawPassword) + { + return SecurityUtils.matchesPassword(rawPassword, user.getPassword()); + } + + public void clearLoginRecordCache(String loginName) + { + if (redisCache.hasKey(getCacheKey(loginName))) + { + redisCache.deleteObject(getCacheKey(loginName)); + } + } +} diff --git a/src/main/java/com/evobms/framework/security/service/SysPermissionService.java b/src/main/java/com/evobms/framework/security/service/SysPermissionService.java new file mode 100644 index 0000000..f6cdbd1 --- /dev/null +++ b/src/main/java/com/evobms/framework/security/service/SysPermissionService.java @@ -0,0 +1,88 @@ +package com.evobms.framework.security.service; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import com.evobms.common.constant.UserConstants; +import com.evobms.common.utils.StringUtils; +import com.evobms.project.system.domain.SysRole; +import com.evobms.project.system.domain.SysUser; +import com.evobms.project.system.service.ISysMenuService; +import com.evobms.project.system.service.ISysRoleService; + +/** + * 用户权限处理 + * + * @author ruoyi + */ +@Component +public class SysPermissionService +{ + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysMenuService menuService; + + /** + * 获取角色数据权限 + * + * @param user 用户信息 + * @return 角色权限信息 + */ + public Set getRolePermission(SysUser user) + { + Set roles = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) + { + roles.add("admin"); + } + else + { + roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId())); + } + return roles; + } + + /** + * 获取菜单数据权限 + * + * @param user 用户信息 + * @return 菜单权限信息 + */ + public Set getMenuPermission(SysUser user) + { + Set perms = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) + { + perms.add("*:*:*"); + } + else + { + List roles = user.getRoles(); + if (!CollectionUtils.isEmpty(roles)) + { + // 设置permissions属性,以便数据权限匹配权限 + for (SysRole role : roles) + { + if (StringUtils.equals(role.getStatus(), UserConstants.ROLE_NORMAL) && !role.isAdmin()) + { + Set rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId()); + role.setPermissions(rolePerms); + perms.addAll(rolePerms); + } + } + } + else + { + perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); + } + } + return perms; + } +} diff --git a/src/main/java/com/evobms/framework/security/service/SysRegisterService.java b/src/main/java/com/evobms/framework/security/service/SysRegisterService.java new file mode 100644 index 0000000..33d033e --- /dev/null +++ b/src/main/java/com/evobms/framework/security/service/SysRegisterService.java @@ -0,0 +1,117 @@ +package com.evobms.framework.security.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.evobms.common.constant.CacheConstants; +import com.evobms.common.constant.Constants; +import com.evobms.common.constant.UserConstants; +import com.evobms.common.exception.user.CaptchaException; +import com.evobms.common.exception.user.CaptchaExpireException; +import com.evobms.common.utils.DateUtils; +import com.evobms.common.utils.MessageUtils; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.manager.AsyncManager; +import com.evobms.framework.manager.factory.AsyncFactory; +import com.evobms.framework.redis.RedisCache; +import com.evobms.framework.security.RegisterBody; +import com.evobms.project.system.domain.SysUser; +import com.evobms.project.system.service.ISysConfigService; +import com.evobms.project.system.service.ISysUserService; + +/** + * 注册校验方法 + * + * @author ruoyi + */ +@Component +public class SysRegisterService +{ + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + @Autowired + private RedisCache redisCache; + + /** + * 注册 + */ + public String register(RegisterBody registerBody) + { + String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); + SysUser sysUser = new SysUser(); + sysUser.setUserName(username); + + // 验证码开关 + boolean captchaEnabled = configService.selectCaptchaEnabled(); + if (captchaEnabled) + { + validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + } + + if (StringUtils.isEmpty(username)) + { + msg = "用户名不能为空"; + } + else if (StringUtils.isEmpty(password)) + { + msg = "用户密码不能为空"; + } + else if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + msg = "账户长度必须在2到20个字符之间"; + } + else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + msg = "密码长度必须在5到20个字符之间"; + } + else if (!userService.checkUserNameUnique(sysUser)) + { + msg = "保存用户'" + username + "'失败,注册账号已存在"; + } + else + { + sysUser.setNickName(username); + sysUser.setPwdUpdateDate(DateUtils.getNowDate()); + sysUser.setPassword(SecurityUtils.encryptPassword(password)); + boolean regFlag = userService.registerUser(sysUser); + if (!regFlag) + { + msg = "注册失败,请联系系统管理人员"; + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"))); + } + } + return msg; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) + { + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) + { + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) + { + throw new CaptchaException(); + } + } +} diff --git a/src/main/java/com/evobms/framework/security/service/TokenService.java b/src/main/java/com/evobms/framework/security/service/TokenService.java new file mode 100644 index 0000000..bba9380 --- /dev/null +++ b/src/main/java/com/evobms/framework/security/service/TokenService.java @@ -0,0 +1,236 @@ +package com.evobms.framework.security.service; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import com.evobms.common.constant.CacheConstants; +import com.evobms.common.constant.Constants; +import com.evobms.common.utils.ServletUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.ip.AddressUtils; +import com.evobms.common.utils.ip.IpUtils; +import com.evobms.common.utils.uuid.IdUtils; +import com.evobms.framework.redis.RedisCache; +import com.evobms.framework.security.LoginUser; +import eu.bitwalker.useragentutils.UserAgent; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +/** + * token验证处理 + * + * @author ruoyi + */ +@Component +public class TokenService +{ + private static final Logger log = LoggerFactory.getLogger(TokenService.class); + + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + // 令牌秘钥 + @Value("${token.secret}") + private String secret; + + // 令牌有效期(默认30分钟) + @Value("${token.expireTime}") + private int expireTime; + + protected static final long MILLIS_SECOND = 1000; + + protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; + + private static final Long MILLIS_MINUTE_TWENTY = 20 * 60 * 1000L; + + @Autowired + private RedisCache redisCache; + + /** + * 获取用户身份信息 + * + * @return 用户信息 + */ + public LoginUser getLoginUser(HttpServletRequest request) + { + // 获取请求携带的令牌 + String token = getToken(request); + if (StringUtils.isNotEmpty(token)) + { + try + { + // 非JWT令牌(不包含'.')直接跳过,避免不必要的解析与错误日志 + if (!token.contains(".")) { + return null; + } + Claims claims = parseToken(token); + // 解析对应的权限以及用户信息 + String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); + String userKey = getTokenKey(uuid); + LoginUser user = redisCache.getCacheObject(userKey); + return user; + } + catch (Exception e) + { + log.debug("获取用户信息异常'{}'", e.getMessage()); + } + } + 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); + redisCache.deleteObject(userKey); + } + } + + /** + * 创建令牌 + * + * @param loginUser 用户信息 + * @return 令牌 + */ + public String createToken(LoginUser loginUser) + { + String token = IdUtils.fastUUID(); + loginUser.setToken(token); + setUserAgent(loginUser); + refreshToken(loginUser); + + Map claims = new HashMap<>(); + claims.put(Constants.LOGIN_USER_KEY, token); + claims.put(Constants.JWT_USERNAME, loginUser.getUsername()); + return createToken(claims); + } + + /** + * 验证令牌有效期,相差不足20分钟,自动刷新缓存 + * + * @param loginUser 登录信息 + * @return 令牌 + */ + public void verifyToken(LoginUser loginUser) + { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MILLIS_MINUTE_TWENTY) + { + refreshToken(loginUser); + } + } + + /** + * 刷新令牌有效期 + * + * @param loginUser 登录信息 + */ + public void refreshToken(LoginUser loginUser) + { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + // 根据uuid将loginUser缓存 + String userKey = getTokenKey(loginUser.getToken()); + redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); + } + + /** + * 设置用户代理信息 + * + * @param loginUser 登录信息 + */ + public void setUserAgent(LoginUser loginUser) + { + UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = IpUtils.getIpAddr(); + loginUser.setIpaddr(ip); + loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + loginUser.setBrowser(userAgent.getBrowser().getName()); + loginUser.setOs(userAgent.getOperatingSystem().getName()); + } + + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + private String createToken(Map claims) + { + String token = Jwts.builder() + .setClaims(claims) + .signWith(SignatureAlgorithm.HS512, secret).compact(); + return token; + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + private Claims parseToken(String token) + { + return Jwts.parser() + .setSigningKey(secret) + .parseClaimsJws(token) + .getBody(); + } + + /** + * 从令牌中获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public String getUsernameFromToken(String token) + { + Claims claims = parseToken(token); + return claims.getSubject(); + } + + /** + * 获取请求token + * + * @param request + * @return token + */ + private String getToken(HttpServletRequest request) + { + String token = request.getHeader(header); + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) + { + token = token.replace(Constants.TOKEN_PREFIX, ""); + } + return token; + } + + private String getTokenKey(String uuid) + { + return CacheConstants.LOGIN_TOKEN_KEY + uuid; + } +} diff --git a/src/main/java/com/evobms/framework/security/service/UserDetailsServiceImpl.java b/src/main/java/com/evobms/framework/security/service/UserDetailsServiceImpl.java new file mode 100644 index 0000000..6aa187a --- /dev/null +++ b/src/main/java/com/evobms/framework/security/service/UserDetailsServiceImpl.java @@ -0,0 +1,65 @@ +package com.evobms.framework.security.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Service; +import com.evobms.common.enums.UserStatus; +import com.evobms.common.exception.ServiceException; +import com.evobms.common.utils.MessageUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.security.LoginUser; +import com.evobms.project.system.domain.SysUser; +import com.evobms.project.system.service.ISysUserService; + +/** + * 用户验证处理 + * + * @author ruoyi + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService +{ + private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); + + @Autowired + private ISysUserService userService; + + @Autowired + private SysPasswordService passwordService; + + @Autowired + private SysPermissionService permissionService; + + @Override + public UserDetails loadUserByUsername(String username) + { + SysUser user = userService.selectUserByUserName(username); + if (StringUtils.isNull(user)) + { + log.info("登录用户:{} 不存在.", username); + throw new ServiceException(MessageUtils.message("user.not.exists")); + } + else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) + { + log.info("登录用户:{} 已被删除.", username); + throw new ServiceException(MessageUtils.message("user.password.delete")); + } + else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) + { + log.info("登录用户:{} 已被停用.", username); + throw new ServiceException(MessageUtils.message("user.blocked")); + } + + passwordService.validate(user); + + return createLoginUser(user); + } + + public UserDetails createLoginUser(SysUser user) + { + return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); + } +} diff --git a/src/main/java/com/evobms/framework/task/RyTask.java b/src/main/java/com/evobms/framework/task/RyTask.java new file mode 100644 index 0000000..20f1e33 --- /dev/null +++ b/src/main/java/com/evobms/framework/task/RyTask.java @@ -0,0 +1,28 @@ +package com.evobms.framework.task; + +import org.springframework.stereotype.Component; +import com.evobms.common.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/src/main/java/com/evobms/framework/web/controller/BaseController.java b/src/main/java/com/evobms/framework/web/controller/BaseController.java new file mode 100644 index 0000000..8d48098 --- /dev/null +++ b/src/main/java/com/evobms/framework/web/controller/BaseController.java @@ -0,0 +1,194 @@ +package com.evobms.framework.web.controller; + +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; +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.evobms.common.constant.HttpStatus; +import com.evobms.common.utils.DateUtils; +import com.evobms.common.utils.PageUtils; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.sql.SqlUtil; +import com.evobms.framework.security.LoginUser; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.PageDomain; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.framework.web.page.TableSupport; + +/** + * web层通用数据处理 + * + * @author ruoyi + */ +public class BaseController +{ + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + + /** + * 将前台传递过来的日期格式的字符串,自动转化为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() + { + PageUtils.startPage(); + } + + /** + * 设置请求排序数据 + */ + protected void startOrderBy() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) + { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + PageHelper.orderBy(orderBy); + } + } + + /** + * 清理分页的线程变量 + */ + protected void clearPage() + { + PageUtils.clearPage(); + } + + /** + * 响应请求分页数据 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTable(List list) + { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + + /** + * 返回成功 + */ + public AjaxResult success() + { + return AjaxResult.success(); + } + + /** + * 返回成功消息 + */ + public AjaxResult success(String message) + { + return AjaxResult.success(message); + } + + /** + * 返回成功消息 + */ + public AjaxResult success(Object data) + { + return AjaxResult.success(data); + } + + /** + * 返回失败消息 + */ + public AjaxResult error() + { + return AjaxResult.error(); + } + + /** + * 返回失败消息 + */ + public AjaxResult error(String message) + { + return AjaxResult.error(message); + } + + /** + * 返回警告消息 + */ + public AjaxResult warn(String message) + { + return AjaxResult.warn(message); + } + + /** + * 响应返回结果 + * + * @param rows 影响行数 + * @return 操作结果 + */ + protected AjaxResult toAjax(int rows) + { + return rows > 0 ? AjaxResult.success() : AjaxResult.error(); + } + + /** + * 响应返回结果 + * + * @param result 结果 + * @return 操作结果 + */ + protected AjaxResult toAjax(boolean result) + { + return result ? success() : error(); + } + + /** + * 获取用户缓存信息 + */ + public LoginUser getLoginUser() + { + return SecurityUtils.getLoginUser(); + } + + /** + * 获取登录用户id + */ + public Long getUserId() + { + return getLoginUser().getUserId(); + } + + /** + * 获取登录部门id + */ + public Long getDeptId() + { + return getLoginUser().getDeptId(); + } + + /** + * 获取登录用户名 + */ + public String getUsername() + { + return getLoginUser().getUsername(); + } +} diff --git a/src/main/java/com/evobms/framework/web/domain/AjaxResult.java b/src/main/java/com/evobms/framework/web/domain/AjaxResult.java new file mode 100644 index 0000000..b148d7a --- /dev/null +++ b/src/main/java/com/evobms/framework/web/domain/AjaxResult.java @@ -0,0 +1,216 @@ +package com.evobms.framework.web.domain; + +import java.util.HashMap; +import java.util.Objects; +import com.evobms.common.constant.HttpStatus; +import com.evobms.common.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); + } + } + + /** + * 返回成功消息 + * + * @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); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult warn(String msg) + { + return AjaxResult.warn(msg, null); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static AjaxResult warn(String msg, Object data) + { + return new AjaxResult(HttpStatus.WARN, 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); + } + + /** + * 是否为成功消息 + * + * @return 结果 + */ + public boolean isSuccess() + { + return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG)); + } + + /** + * 是否为警告消息 + * + * @return 结果 + */ + public boolean isWarn() + { + return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG)); + } + + /** + * 是否为错误消息 + * + * @return 结果 + */ + public boolean isError() + { + return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG)); + } + + /** + * 方便链式调用 + * + * @param key 键 + * @param value 值 + * @return 数据对象 + */ + @Override + public AjaxResult put(String key, Object value) + { + super.put(key, value); + return this; + } +} diff --git a/src/main/java/com/evobms/framework/web/domain/BaseEntity.java b/src/main/java/com/evobms/framework/web/domain/BaseEntity.java new file mode 100644 index 0000000..09b58d5 --- /dev/null +++ b/src/main/java/com/evobms/framework/web/domain/BaseEntity.java @@ -0,0 +1,118 @@ +package com.evobms.framework.web.domain; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; + +/** + * Entity基类 + * + * @author ruoyi + */ +public class BaseEntity implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 搜索值 */ + @JsonIgnore + 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; + + /** 请求参数 */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + 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/src/main/java/com/evobms/framework/web/domain/R.java b/src/main/java/com/evobms/framework/web/domain/R.java new file mode 100644 index 0000000..3e026af --- /dev/null +++ b/src/main/java/com/evobms/framework/web/domain/R.java @@ -0,0 +1,115 @@ +package com.evobms.framework.web.domain; + +import java.io.Serializable; +import com.evobms.common.constant.HttpStatus; + +/** + * 响应信息主体 + * + * @author ruoyi + */ +public class R implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 成功 */ + public static final int SUCCESS = HttpStatus.SUCCESS; + + /** 失败 */ + public static final int FAIL = HttpStatus.ERROR; + + private int code; + + private String msg; + + private T data; + + public static R ok() + { + return restResult(null, SUCCESS, "操作成功"); + } + + public static R ok(T data) + { + return restResult(data, SUCCESS, "操作成功"); + } + + public static R ok(T data, String msg) + { + return restResult(data, SUCCESS, msg); + } + + public static R fail() + { + return restResult(null, FAIL, "操作失败"); + } + + public static R fail(String msg) + { + return restResult(null, FAIL, msg); + } + + public static R fail(T data) + { + return restResult(data, FAIL, "操作失败"); + } + + 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; + } + + public static Boolean isError(R ret) + { + return !isSuccess(ret); + } + + public static Boolean isSuccess(R ret) + { + return R.SUCCESS == ret.getCode(); + } +} diff --git a/src/main/java/com/evobms/framework/web/domain/Server.java b/src/main/java/com/evobms/framework/web/domain/Server.java new file mode 100644 index 0000000..6580da4 --- /dev/null +++ b/src/main/java/com/evobms/framework/web/domain/Server.java @@ -0,0 +1,240 @@ +package com.evobms.framework.web.domain; + +import java.net.UnknownHostException; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import com.evobms.common.utils.Arith; +import com.evobms.common.utils.ip.IpUtils; +import com.evobms.framework.web.domain.server.Cpu; +import com.evobms.framework.web.domain.server.Jvm; +import com.evobms.framework.web.domain.server.Mem; +import com.evobms.framework.web.domain.server.Sys; +import com.evobms.framework.web.domain.server.SysFile; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.CentralProcessor.TickType; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.software.os.FileSystem; +import oshi.software.os.OSFileStore; +import oshi.software.os.OperatingSystem; +import oshi.util.Util; + +/** + * 服务器相关信息 + * + * @author ruoyi + */ +public class Server +{ + private static final int OSHI_WAIT_SECOND = 1000; + + /** + * CPU相关信息 + */ + private Cpu cpu = new Cpu(); + + /** + * 內存相关信息 + */ + private Mem mem = new Mem(); + + /** + * JVM相关信息 + */ + private Jvm jvm = new Jvm(); + + /** + * 服务器相关信息 + */ + private Sys sys = new Sys(); + + /** + * 磁盘相关信息 + */ + private List sysFiles = new LinkedList(); + + public Cpu getCpu() + { + return cpu; + } + + public void setCpu(Cpu cpu) + { + this.cpu = cpu; + } + + public Mem getMem() + { + return mem; + } + + public void setMem(Mem mem) + { + this.mem = mem; + } + + public Jvm getJvm() + { + return jvm; + } + + public void setJvm(Jvm jvm) + { + this.jvm = jvm; + } + + public Sys getSys() + { + return sys; + } + + public void setSys(Sys sys) + { + this.sys = sys; + } + + public List getSysFiles() + { + return sysFiles; + } + + public void setSysFiles(List sysFiles) + { + this.sysFiles = sysFiles; + } + + public void copyTo() throws Exception + { + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + + setCpuInfo(hal.getProcessor()); + + setMemInfo(hal.getMemory()); + + setSysInfo(); + + setJvmInfo(); + + setSysFiles(si.getOperatingSystem()); + } + + /** + * 设置CPU信息 + */ + private void setCpuInfo(CentralProcessor processor) + { + // CPU信息 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + Util.sleep(OSHI_WAIT_SECOND); + long[] ticks = processor.getSystemCpuLoadTicks(); + long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; + long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; + long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; + long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; + long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; + long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; + long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; + long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; + long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal; + cpu.setCpuNum(processor.getLogicalProcessorCount()); + cpu.setTotal(totalCpu); + cpu.setSys(cSys); + cpu.setUsed(user); + cpu.setWait(iowait); + cpu.setFree(idle); + } + + /** + * 设置内存信息 + */ + private void setMemInfo(GlobalMemory memory) + { + mem.setTotal(memory.getTotal()); + mem.setUsed(memory.getTotal() - memory.getAvailable()); + mem.setFree(memory.getAvailable()); + } + + /** + * 设置服务器信息 + */ + private void setSysInfo() + { + Properties props = System.getProperties(); + sys.setComputerName(IpUtils.getHostName()); + sys.setComputerIp(IpUtils.getHostIp()); + sys.setOsName(props.getProperty("os.name")); + sys.setOsArch(props.getProperty("os.arch")); + sys.setUserDir(props.getProperty("user.dir")); + } + + /** + * 设置Java虚拟机 + */ + private void setJvmInfo() throws UnknownHostException + { + Properties props = System.getProperties(); + jvm.setTotal(Runtime.getRuntime().totalMemory()); + jvm.setMax(Runtime.getRuntime().maxMemory()); + jvm.setFree(Runtime.getRuntime().freeMemory()); + jvm.setVersion(props.getProperty("java.version")); + jvm.setHome(props.getProperty("java.home")); + } + + /** + * 设置磁盘信息 + */ + private void setSysFiles(OperatingSystem os) + { + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + for (OSFileStore fs : fsArray) + { + long free = fs.getUsableSpace(); + long total = fs.getTotalSpace(); + long used = total - free; + SysFile sysFile = new SysFile(); + sysFile.setDirName(fs.getMount()); + sysFile.setSysTypeName(fs.getType()); + sysFile.setTypeName(fs.getName()); + sysFile.setTotal(convertFileSize(total)); + sysFile.setFree(convertFileSize(free)); + sysFile.setUsed(convertFileSize(used)); + sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100)); + sysFiles.add(sysFile); + } + } + + /** + * 字节转换 + * + * @param size 字节大小 + * @return 转换后值 + */ + public String convertFileSize(long size) + { + long kb = 1024; + long mb = kb * 1024; + long gb = mb * 1024; + if (size >= gb) + { + return String.format("%.1f GB", (float) size / gb); + } + else if (size >= mb) + { + float f = (float) size / mb; + return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); + } + else if (size >= kb) + { + float f = (float) size / kb; + return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); + } + else + { + return String.format("%d B", size); + } + } +} diff --git a/src/main/java/com/evobms/framework/web/domain/TreeEntity.java b/src/main/java/com/evobms/framework/web/domain/TreeEntity.java new file mode 100644 index 0000000..bfcdf1b --- /dev/null +++ b/src/main/java/com/evobms/framework/web/domain/TreeEntity.java @@ -0,0 +1,79 @@ +package com.evobms.framework.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; + + /** 父菜单ID */ + 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/src/main/java/com/evobms/framework/web/domain/TreeSelect.java b/src/main/java/com/evobms/framework/web/domain/TreeSelect.java new file mode 100644 index 0000000..b9930bb --- /dev/null +++ b/src/main/java/com/evobms/framework/web/domain/TreeSelect.java @@ -0,0 +1,93 @@ +package com.evobms.framework.web.domain; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.evobms.common.constant.UserConstants; +import com.evobms.common.utils.StringUtils; +import com.evobms.project.system.domain.SysDept; +import com.evobms.project.system.domain.SysMenu; + +/** + * Treeselect树结构实体类 + * + * @author ruoyi + */ +public class TreeSelect implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 节点ID */ + private Long id; + + /** 节点名称 */ + private String label; + + /** 节点禁用 */ + private boolean disabled = false; + + /** 子节点 */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List children; + + public TreeSelect() + { + + } + + public TreeSelect(SysDept dept) + { + this.id = dept.getDeptId(); + this.label = dept.getDeptName(); + this.disabled = StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()); + 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 boolean isDisabled() + { + return disabled; + } + + public void setDisabled(boolean disabled) + { + this.disabled = disabled; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/src/main/java/com/evobms/framework/web/domain/server/Cpu.java b/src/main/java/com/evobms/framework/web/domain/server/Cpu.java new file mode 100644 index 0000000..a3848a5 --- /dev/null +++ b/src/main/java/com/evobms/framework/web/domain/server/Cpu.java @@ -0,0 +1,101 @@ +package com.evobms.framework.web.domain.server; + +import com.evobms.common.utils.Arith; + +/** + * CPU相关信息 + * + * @author ruoyi + */ +public class Cpu +{ + /** + * 核心数 + */ + private int cpuNum; + + /** + * CPU总的使用率 + */ + private double total; + + /** + * CPU系统使用率 + */ + private double sys; + + /** + * CPU用户使用率 + */ + private double used; + + /** + * CPU当前等待率 + */ + private double wait; + + /** + * CPU当前空闲率 + */ + private double free; + + public int getCpuNum() + { + return cpuNum; + } + + public void setCpuNum(int cpuNum) + { + this.cpuNum = cpuNum; + } + + public double getTotal() + { + return Arith.round(Arith.mul(total, 100), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getSys() + { + return Arith.round(Arith.mul(sys / total, 100), 2); + } + + public void setSys(double sys) + { + this.sys = sys; + } + + public double getUsed() + { + return Arith.round(Arith.mul(used / total, 100), 2); + } + + public void setUsed(double used) + { + this.used = used; + } + + public double getWait() + { + return Arith.round(Arith.mul(wait / total, 100), 2); + } + + public void setWait(double wait) + { + this.wait = wait; + } + + public double getFree() + { + return Arith.round(Arith.mul(free / total, 100), 2); + } + + public void setFree(double free) + { + this.free = free; + } +} diff --git a/src/main/java/com/evobms/framework/web/domain/server/Jvm.java b/src/main/java/com/evobms/framework/web/domain/server/Jvm.java new file mode 100644 index 0000000..9a32dcd --- /dev/null +++ b/src/main/java/com/evobms/framework/web/domain/server/Jvm.java @@ -0,0 +1,130 @@ +package com.evobms.framework.web.domain.server; + +import java.lang.management.ManagementFactory; +import com.evobms.common.utils.Arith; +import com.evobms.common.utils.DateUtils; + +/** + * JVM相关信息 + * + * @author ruoyi + */ +public class Jvm +{ + /** + * 当前JVM占用的内存总数(M) + */ + private double total; + + /** + * JVM最大可用内存总数(M) + */ + private double max; + + /** + * JVM空闲内存(M) + */ + private double free; + + /** + * JDK版本 + */ + private String version; + + /** + * JDK路径 + */ + private String home; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getMax() + { + return Arith.div(max, (1024 * 1024), 2); + } + + public void setMax(double max) + { + this.max = max; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024), 2); + } + + public void setFree(double free) + { + this.free = free; + } + + public double getUsed() + { + return Arith.div(total - free, (1024 * 1024), 2); + } + + public double getUsage() + { + return Arith.mul(Arith.div(total - free, total, 4), 100); + } + + /** + * 获取JDK名称 + */ + public String getName() + { + return ManagementFactory.getRuntimeMXBean().getVmName(); + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getHome() + { + return home; + } + + public void setHome(String home) + { + this.home = home; + } + + /** + * JDK启动时间 + */ + public String getStartTime() + { + return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate()); + } + + /** + * JDK运行时间 + */ + public String getRunTime() + { + return DateUtils.timeDistance(DateUtils.getNowDate(), DateUtils.getServerStartDate()); + } + + /** + * 运行参数 + */ + public String getInputArgs() + { + return ManagementFactory.getRuntimeMXBean().getInputArguments().toString(); + } +} diff --git a/src/main/java/com/evobms/framework/web/domain/server/Mem.java b/src/main/java/com/evobms/framework/web/domain/server/Mem.java new file mode 100644 index 0000000..6ee5a7e --- /dev/null +++ b/src/main/java/com/evobms/framework/web/domain/server/Mem.java @@ -0,0 +1,61 @@ +package com.evobms.framework.web.domain.server; + +import com.evobms.common.utils.Arith; + +/** + * 內存相关信息 + * + * @author ruoyi + */ +public class Mem +{ + /** + * 内存总量 + */ + private double total; + + /** + * 已用内存 + */ + private double used; + + /** + * 剩余内存 + */ + private double free; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024 * 1024), 2); + } + + public void setTotal(long total) + { + this.total = total; + } + + public double getUsed() + { + return Arith.div(used, (1024 * 1024 * 1024), 2); + } + + public void setUsed(long used) + { + this.used = used; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024 * 1024), 2); + } + + public void setFree(long free) + { + this.free = free; + } + + public double getUsage() + { + return Arith.mul(Arith.div(used, total, 4), 100); + } +} diff --git a/src/main/java/com/evobms/framework/web/domain/server/Sys.java b/src/main/java/com/evobms/framework/web/domain/server/Sys.java new file mode 100644 index 0000000..cdcfb7b --- /dev/null +++ b/src/main/java/com/evobms/framework/web/domain/server/Sys.java @@ -0,0 +1,84 @@ +package com.evobms.framework.web.domain.server; + +/** + * 系统相关信息 + * + * @author ruoyi + */ +public class Sys +{ + /** + * 服务器名称 + */ + private String computerName; + + /** + * 服务器Ip + */ + private String computerIp; + + /** + * 项目路径 + */ + private String userDir; + + /** + * 操作系统 + */ + private String osName; + + /** + * 系统架构 + */ + private String osArch; + + public String getComputerName() + { + return computerName; + } + + public void setComputerName(String computerName) + { + this.computerName = computerName; + } + + public String getComputerIp() + { + return computerIp; + } + + public void setComputerIp(String computerIp) + { + this.computerIp = computerIp; + } + + public String getUserDir() + { + return userDir; + } + + public void setUserDir(String userDir) + { + this.userDir = userDir; + } + + public String getOsName() + { + return osName; + } + + public void setOsName(String osName) + { + this.osName = osName; + } + + public String getOsArch() + { + return osArch; + } + + public void setOsArch(String osArch) + { + this.osArch = osArch; + } +} diff --git a/src/main/java/com/evobms/framework/web/domain/server/SysFile.java b/src/main/java/com/evobms/framework/web/domain/server/SysFile.java new file mode 100644 index 0000000..4364de3 --- /dev/null +++ b/src/main/java/com/evobms/framework/web/domain/server/SysFile.java @@ -0,0 +1,114 @@ +package com.evobms.framework.web.domain.server; + +/** + * 系统文件相关信息 + * + * @author ruoyi + */ +public class SysFile +{ + /** + * 盘符路径 + */ + private String dirName; + + /** + * 盘符类型 + */ + private String sysTypeName; + + /** + * 文件类型 + */ + private String typeName; + + /** + * 总大小 + */ + private String total; + + /** + * 剩余大小 + */ + private String free; + + /** + * 已经使用量 + */ + private String used; + + /** + * 资源的使用率 + */ + private double usage; + + public String getDirName() + { + return dirName; + } + + public void setDirName(String dirName) + { + this.dirName = dirName; + } + + public String getSysTypeName() + { + return sysTypeName; + } + + public void setSysTypeName(String sysTypeName) + { + this.sysTypeName = sysTypeName; + } + + public String getTypeName() + { + return typeName; + } + + public void setTypeName(String typeName) + { + this.typeName = typeName; + } + + public String getTotal() + { + return total; + } + + public void setTotal(String total) + { + this.total = total; + } + + public String getFree() + { + return free; + } + + public void setFree(String free) + { + this.free = free; + } + + public String getUsed() + { + return used; + } + + public void setUsed(String used) + { + this.used = used; + } + + public double getUsage() + { + return usage; + } + + public void setUsage(double usage) + { + this.usage = usage; + } +} diff --git a/src/main/java/com/evobms/framework/web/exception/GlobalExceptionHandler.java b/src/main/java/com/evobms/framework/web/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..fd97401 --- /dev/null +++ b/src/main/java/com/evobms/framework/web/exception/GlobalExceptionHandler.java @@ -0,0 +1,145 @@ +package com.evobms.framework.web.exception; + +import javax.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingPathVariableException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import com.evobms.common.constant.HttpStatus; +import com.evobms.common.core.text.Convert; +import com.evobms.common.exception.DemoModeException; +import com.evobms.common.exception.ServiceException; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.html.EscapeUtil; +import com.evobms.framework.web.domain.AjaxResult; + +/** + * 全局异常处理器 + * + * @author ruoyi + */ +@RestControllerAdvice +public class GlobalExceptionHandler +{ + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + /** + * 权限校验异常 + */ + @ExceptionHandler(AccessDeniedException.class) + public AjaxResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage()); + return AjaxResult.error(HttpStatus.FORBIDDEN, "没有权限,请联系管理员授权"); + } + + /** + * 请求方式不支持 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, + HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); + return AjaxResult.error(e.getMessage()); + } + + /** + * 业务异常 + */ + @ExceptionHandler(ServiceException.class) + public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) + { + log.error(e.getMessage(), e); + Integer code = e.getCode(); + return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); + } + + /** + * 请求路径中缺少必需的路径变量 + */ + @ExceptionHandler(MissingPathVariableException.class) + public AjaxResult handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName())); + } + + /** + * 请求参数类型不匹配 + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public AjaxResult handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + String value = Convert.toStr(e.getValue()); + if (StringUtils.isNotEmpty(value)) + { + value = EscapeUtil.clean(value); + } + log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), value)); + } + + /** + * 拦截未知的运行时异常 + */ + @ExceptionHandler(RuntimeException.class) + public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生未知异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 系统异常 + */ + @ExceptionHandler(Exception.class) + public AjaxResult handleException(Exception e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(BindException.class) + public AjaxResult handleBindException(BindException e) + { + log.error(e.getMessage(), e); + String message = e.getAllErrors().get(0).getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) + { + log.error(e.getMessage(), e); + String message = e.getBindingResult().getFieldError().getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 演示模式异常 + */ + @ExceptionHandler(DemoModeException.class) + public AjaxResult handleDemoModeException(DemoModeException e) + { + return AjaxResult.error("演示模式,不允许操作"); + } +} diff --git a/src/main/java/com/evobms/framework/web/page/PageDomain.java b/src/main/java/com/evobms/framework/web/page/PageDomain.java new file mode 100644 index 0000000..9ef3f15 --- /dev/null +++ b/src/main/java/com/evobms/framework/web/page/PageDomain.java @@ -0,0 +1,101 @@ +package com.evobms.framework.web.page; + +import com.evobms.common.utils.StringUtils; + +/** + * 分页数据 + * + * @author ruoyi + */ +public class PageDomain +{ + /** 当前记录起始索引 */ + private Integer pageNum; + + /** 每页显示记录数 */ + private Integer pageSize; + + /** 排序列 */ + private String orderByColumn; + + /** 排序的方向desc或者asc */ + private String isAsc = "asc"; + + /** 分页参数合理化 */ + private Boolean reasonable = true; + + 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) + { + if (StringUtils.isNotEmpty(isAsc)) + { + // 兼容前端排序类型 + if ("ascending".equals(isAsc)) + { + isAsc = "asc"; + } + else if ("descending".equals(isAsc)) + { + isAsc = "desc"; + } + this.isAsc = isAsc; + } + } + + public Boolean getReasonable() + { + if (StringUtils.isNull(reasonable)) + { + return Boolean.TRUE; + } + return reasonable; + } + + public void setReasonable(Boolean reasonable) + { + this.reasonable = reasonable; + } +} diff --git a/src/main/java/com/evobms/framework/web/page/TableDataInfo.java b/src/main/java/com/evobms/framework/web/page/TableDataInfo.java new file mode 100644 index 0000000..0f23e62 --- /dev/null +++ b/src/main/java/com/evobms/framework/web/page/TableDataInfo.java @@ -0,0 +1,85 @@ +package com.evobms.framework.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, long 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; + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/framework/web/page/TableSupport.java b/src/main/java/com/evobms/framework/web/page/TableSupport.java new file mode 100644 index 0000000..776dde6 --- /dev/null +++ b/src/main/java/com/evobms/framework/web/page/TableSupport.java @@ -0,0 +1,56 @@ +package com.evobms.framework.web.page; + +import com.evobms.common.core.text.Convert; +import com.evobms.common.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 final String REASONABLE = "reasonable"; + + /** + * 封装分页对象 + */ + public static PageDomain getPageDomain() + { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1)); + pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10)); + pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); + pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); + pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE)); + return pageDomain; + } + + public static PageDomain buildPageRequest() + { + return getPageDomain(); + } +} diff --git a/src/main/java/com/evobms/project/Battery/controller/ExtremeValuesController.java b/src/main/java/com/evobms/project/Battery/controller/ExtremeValuesController.java new file mode 100644 index 0000000..3ce9d73 --- /dev/null +++ b/src/main/java/com/evobms/project/Battery/controller/ExtremeValuesController.java @@ -0,0 +1,104 @@ +package com.evobms.project.Battery.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.project.Battery.domain.ExtremeValues; +import com.evobms.project.Battery.service.IExtremeValuesService; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.web.page.TableDataInfo; + +/** + * 电池极值数据Controller + * + * @author 田志阳 + * @date 2025-10-14 + */ +@RestController +@RequestMapping("/BatteryData/BatteryData") +public class ExtremeValuesController extends BaseController +{ + @Autowired + private IExtremeValuesService extremeValuesService; + + /** + * 查询电池极值数据列表 + */ + @PreAuthorize("@ss.hasPermi('BatteryData:BatteryData:list')") + @GetMapping("/list") + public TableDataInfo list(ExtremeValues extremeValues) + { + startPage(); + List list = extremeValuesService.selectExtremeValuesList(extremeValues); + return getDataTable(list); + } + + /** + * 导出电池极值数据列表 + */ + @PreAuthorize("@ss.hasPermi('BatteryData:BatteryData:export')") + @Log(title = "电池极值数据", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ExtremeValues extremeValues) + { + List list = extremeValuesService.selectExtremeValuesList(extremeValues); + ExcelUtil util = new ExcelUtil(ExtremeValues.class); + util.exportExcel(response, list, "电池极值数据数据"); + } + + /** + * 获取电池极值数据详细信息 + */ + @PreAuthorize("@ss.hasPermi('BatteryData:BatteryData:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(extremeValuesService.selectExtremeValuesById(id)); + } + + /** + * 新增电池极值数据 + */ + @PreAuthorize("@ss.hasPermi('BatteryData:BatteryData:add')") + @Log(title = "电池极值数据", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ExtremeValues extremeValues) + { + return toAjax(extremeValuesService.insertExtremeValues(extremeValues)); + } + + /** + * 修改电池极值数据 + */ + @PreAuthorize("@ss.hasPermi('BatteryData:BatteryData:edit')") + @Log(title = "电池极值数据", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ExtremeValues extremeValues) + { + return toAjax(extremeValuesService.updateExtremeValues(extremeValues)); + } + + /** + * 删除电池极值数据 + */ + @PreAuthorize("@ss.hasPermi('BatteryData:BatteryData:remove')") + @Log(title = "电池极值数据", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(extremeValuesService.deleteExtremeValuesByIds(ids)); + } +} diff --git a/src/main/java/com/evobms/project/Battery/domain/ExtremeValues.java b/src/main/java/com/evobms/project/Battery/domain/ExtremeValues.java new file mode 100644 index 0000000..d4a0cae --- /dev/null +++ b/src/main/java/com/evobms/project/Battery/domain/ExtremeValues.java @@ -0,0 +1,255 @@ +package com.evobms.project.Battery.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.web.domain.BaseEntity; + +/** + * 电池极值数据对象 extreme_values + * + * @author 田志阳 + * @date 2025-10-14 + */ +public class ExtremeValues extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** 设备ID */ + @Excel(name = "设备ID") + private String deviceId; + + /** 数据时间戳 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "数据时间戳", width = 30, dateFormat = "yyyy-MM-dd") + private Date timestamp; + + /** 最高电压电池子系统号 */ + @Excel(name = "最高电压电池子系统号") + private Integer maxVoltageSubsystemNo; + + /** 最高电压电池单体代号 */ + @Excel(name = "最高电压电池单体代号") + private Integer maxVoltageBatteryNo; + + /** 电池单体电压最高值(V) */ + @Excel(name = "电池单体电压最高值(V)") + private BigDecimal maxVoltageValue; + + /** 最低电压电池子系统号 */ + @Excel(name = "最低电压电池子系统号") + private Integer minVoltageSubsystemNo; + + /** 最低电压电池单体代号 */ + @Excel(name = "最低电压电池单体代号") + private Integer minVoltageBatteryNo; + + /** 电池单体电压最低值(V) */ + @Excel(name = "电池单体电压最低值(V)") + private BigDecimal minVoltageValue; + + /** 最高温度子系统号 */ + @Excel(name = "最高温度子系统号") + private Integer maxTempSubsystemNo; + + /** 最高温度探针序号 */ + @Excel(name = "最高温度探针序号") + private Integer maxTempProbeNo; + + /** 最高温度值(℃) */ + @Excel(name = "最高温度值(℃)") + private BigDecimal maxTempValue; + + /** 最低温度子系统号 */ + @Excel(name = "最低温度子系统号") + private Integer minTempSubsystemNo; + + /** 最低温度探针序号 */ + @Excel(name = "最低温度探针序号") + private Integer minTempProbeNo; + + /** 最低温度值(℃) */ + @Excel(name = "最低温度值(℃)") + private BigDecimal minTempValue; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setTimestamp(Date timestamp) + { + this.timestamp = timestamp; + } + + public Date getTimestamp() + { + return timestamp; + } + + public void setMaxVoltageSubsystemNo(Integer maxVoltageSubsystemNo) + { + this.maxVoltageSubsystemNo = maxVoltageSubsystemNo; + } + + public Integer getMaxVoltageSubsystemNo() + { + return maxVoltageSubsystemNo; + } + + public void setMaxVoltageBatteryNo(Integer maxVoltageBatteryNo) + { + this.maxVoltageBatteryNo = maxVoltageBatteryNo; + } + + public Integer getMaxVoltageBatteryNo() + { + return maxVoltageBatteryNo; + } + + public void setMaxVoltageValue(BigDecimal maxVoltageValue) + { + this.maxVoltageValue = maxVoltageValue; + } + + public BigDecimal getMaxVoltageValue() + { + return maxVoltageValue; + } + + public void setMinVoltageSubsystemNo(Integer minVoltageSubsystemNo) + { + this.minVoltageSubsystemNo = minVoltageSubsystemNo; + } + + public Integer getMinVoltageSubsystemNo() + { + return minVoltageSubsystemNo; + } + + public void setMinVoltageBatteryNo(Integer minVoltageBatteryNo) + { + this.minVoltageBatteryNo = minVoltageBatteryNo; + } + + public Integer getMinVoltageBatteryNo() + { + return minVoltageBatteryNo; + } + + public void setMinVoltageValue(BigDecimal minVoltageValue) + { + this.minVoltageValue = minVoltageValue; + } + + public BigDecimal getMinVoltageValue() + { + return minVoltageValue; + } + + public void setMaxTempSubsystemNo(Integer maxTempSubsystemNo) + { + this.maxTempSubsystemNo = maxTempSubsystemNo; + } + + public Integer getMaxTempSubsystemNo() + { + return maxTempSubsystemNo; + } + + public void setMaxTempProbeNo(Integer maxTempProbeNo) + { + this.maxTempProbeNo = maxTempProbeNo; + } + + public Integer getMaxTempProbeNo() + { + return maxTempProbeNo; + } + + public void setMaxTempValue(BigDecimal maxTempValue) + { + this.maxTempValue = maxTempValue; + } + + public BigDecimal getMaxTempValue() + { + return maxTempValue; + } + + public void setMinTempSubsystemNo(Integer minTempSubsystemNo) + { + this.minTempSubsystemNo = minTempSubsystemNo; + } + + public Integer getMinTempSubsystemNo() + { + return minTempSubsystemNo; + } + + public void setMinTempProbeNo(Integer minTempProbeNo) + { + this.minTempProbeNo = minTempProbeNo; + } + + public Integer getMinTempProbeNo() + { + return minTempProbeNo; + } + + public void setMinTempValue(BigDecimal minTempValue) + { + this.minTempValue = minTempValue; + } + + public BigDecimal getMinTempValue() + { + return minTempValue; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("deviceId", getDeviceId()) + .append("timestamp", getTimestamp()) + .append("maxVoltageSubsystemNo", getMaxVoltageSubsystemNo()) + .append("maxVoltageBatteryNo", getMaxVoltageBatteryNo()) + .append("maxVoltageValue", getMaxVoltageValue()) + .append("minVoltageSubsystemNo", getMinVoltageSubsystemNo()) + .append("minVoltageBatteryNo", getMinVoltageBatteryNo()) + .append("minVoltageValue", getMinVoltageValue()) + .append("maxTempSubsystemNo", getMaxTempSubsystemNo()) + .append("maxTempProbeNo", getMaxTempProbeNo()) + .append("maxTempValue", getMaxTempValue()) + .append("minTempSubsystemNo", getMinTempSubsystemNo()) + .append("minTempProbeNo", getMinTempProbeNo()) + .append("minTempValue", getMinTempValue()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .append("createBy", getCreateBy()) + .append("updateBy", getUpdateBy()) + .toString(); + } +} diff --git a/src/main/java/com/evobms/project/Battery/mapper/ExtremeValuesMapper.java b/src/main/java/com/evobms/project/Battery/mapper/ExtremeValuesMapper.java new file mode 100644 index 0000000..3c1423c --- /dev/null +++ b/src/main/java/com/evobms/project/Battery/mapper/ExtremeValuesMapper.java @@ -0,0 +1,61 @@ +package com.evobms.project.Battery.mapper; + +import java.util.List; +import com.evobms.project.Battery.domain.ExtremeValues; + +/** + * 电池极值数据Mapper接口 + * + * @author 田志阳 + * @date 2025-10-14 + */ +public interface ExtremeValuesMapper +{ + /** + * 查询电池极值数据 + * + * @param id 电池极值数据主键 + * @return 电池极值数据 + */ + public ExtremeValues selectExtremeValuesById(Long id); + + /** + * 查询电池极值数据列表 + * + * @param extremeValues 电池极值数据 + * @return 电池极值数据集合 + */ + public List selectExtremeValuesList(ExtremeValues extremeValues); + + /** + * 新增电池极值数据 + * + * @param extremeValues 电池极值数据 + * @return 结果 + */ + public int insertExtremeValues(ExtremeValues extremeValues); + + /** + * 修改电池极值数据 + * + * @param extremeValues 电池极值数据 + * @return 结果 + */ + public int updateExtremeValues(ExtremeValues extremeValues); + + /** + * 删除电池极值数据 + * + * @param id 电池极值数据主键 + * @return 结果 + */ + public int deleteExtremeValuesById(Long id); + + /** + * 批量删除电池极值数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteExtremeValuesByIds(Long[] ids); +} diff --git a/src/main/java/com/evobms/project/Battery/service/IExtremeValuesService.java b/src/main/java/com/evobms/project/Battery/service/IExtremeValuesService.java new file mode 100644 index 0000000..1030cf8 --- /dev/null +++ b/src/main/java/com/evobms/project/Battery/service/IExtremeValuesService.java @@ -0,0 +1,61 @@ +package com.evobms.project.Battery.service; + +import java.util.List; +import com.evobms.project.Battery.domain.ExtremeValues; + +/** + * 电池极值数据Service接口 + * + * @author 田志阳 + * @date 2025-10-14 + */ +public interface IExtremeValuesService +{ + /** + * 查询电池极值数据 + * + * @param id 电池极值数据主键 + * @return 电池极值数据 + */ + public ExtremeValues selectExtremeValuesById(Long id); + + /** + * 查询电池极值数据列表 + * + * @param extremeValues 电池极值数据 + * @return 电池极值数据集合 + */ + public List selectExtremeValuesList(ExtremeValues extremeValues); + + /** + * 新增电池极值数据 + * + * @param extremeValues 电池极值数据 + * @return 结果 + */ + public int insertExtremeValues(ExtremeValues extremeValues); + + /** + * 修改电池极值数据 + * + * @param extremeValues 电池极值数据 + * @return 结果 + */ + public int updateExtremeValues(ExtremeValues extremeValues); + + /** + * 批量删除电池极值数据 + * + * @param ids 需要删除的电池极值数据主键集合 + * @return 结果 + */ + public int deleteExtremeValuesByIds(Long[] ids); + + /** + * 删除电池极值数据信息 + * + * @param id 电池极值数据主键 + * @return 结果 + */ + public int deleteExtremeValuesById(Long id); +} diff --git a/src/main/java/com/evobms/project/Battery/service/impl/ExtremeValuesServiceImpl.java b/src/main/java/com/evobms/project/Battery/service/impl/ExtremeValuesServiceImpl.java new file mode 100644 index 0000000..8047623 --- /dev/null +++ b/src/main/java/com/evobms/project/Battery/service/impl/ExtremeValuesServiceImpl.java @@ -0,0 +1,96 @@ +package com.evobms.project.Battery.service.impl; + +import java.util.List; +import com.evobms.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.evobms.project.Battery.mapper.ExtremeValuesMapper; +import com.evobms.project.Battery.domain.ExtremeValues; +import com.evobms.project.Battery.service.IExtremeValuesService; + +/** + * 电池极值数据Service业务层处理 + * + * @author 田志阳 + * @date 2025-10-14 + */ +@Service +public class ExtremeValuesServiceImpl implements IExtremeValuesService +{ + @Autowired + private ExtremeValuesMapper extremeValuesMapper; + + /** + * 查询电池极值数据 + * + * @param id 电池极值数据主键 + * @return 电池极值数据 + */ + @Override + public ExtremeValues selectExtremeValuesById(Long id) + { + return extremeValuesMapper.selectExtremeValuesById(id); + } + + /** + * 查询电池极值数据列表 + * + * @param extremeValues 电池极值数据 + * @return 电池极值数据 + */ + @Override + public List selectExtremeValuesList(ExtremeValues extremeValues) + { + return extremeValuesMapper.selectExtremeValuesList(extremeValues); + } + + /** + * 新增电池极值数据 + * + * @param extremeValues 电池极值数据 + * @return 结果 + */ + @Override + public int insertExtremeValues(ExtremeValues extremeValues) + { + extremeValues.setCreateTime(DateUtils.getNowDate()); + return extremeValuesMapper.insertExtremeValues(extremeValues); + } + + /** + * 修改电池极值数据 + * + * @param extremeValues 电池极值数据 + * @return 结果 + */ + @Override + public int updateExtremeValues(ExtremeValues extremeValues) + { + extremeValues.setUpdateTime(DateUtils.getNowDate()); + return extremeValuesMapper.updateExtremeValues(extremeValues); + } + + /** + * 批量删除电池极值数据 + * + * @param ids 需要删除的电池极值数据主键 + * @return 结果 + */ + @Override + public int deleteExtremeValuesByIds(Long[] ids) + { + return extremeValuesMapper.deleteExtremeValuesByIds(ids); + } + + /** + * 删除电池极值数据信息 + * + * @param id 电池极值数据主键 + * @return 结果 + */ + @Override + public int deleteExtremeValuesById(Long id) + { + return extremeValuesMapper.deleteExtremeValuesById(id); + } +} diff --git a/src/main/java/com/evobms/project/bms/controller/BmsDeviceController.java b/src/main/java/com/evobms/project/bms/controller/BmsDeviceController.java new file mode 100644 index 0000000..94576c0 --- /dev/null +++ b/src/main/java/com/evobms/project/bms/controller/BmsDeviceController.java @@ -0,0 +1,196 @@ +package com.evobms.project.bms.controller; + +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.bms.domain.BmsDevice; +import com.evobms.project.bms.service.IBmsDeviceService; +//import com.evobms.project.bms.service.MqttService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * BMS设备Controller + * + * @author evobms + * @date 2025-01-22 + */ +@RestController +@RequestMapping("/bms/device") +public class BmsDeviceController extends BaseController { + + @Autowired + private IBmsDeviceService bmsDeviceService; + +// @Autowired(required = false) +// private MqttService mqttService; + + /** + * 查询BMS设备列表 + */ + @PreAuthorize("@ss.hasPermi('bms:device:list')") + @GetMapping("/list") + public TableDataInfo list(BmsDevice bmsDevice) { + startPage(); + List list = bmsDeviceService.selectBmsDeviceList(bmsDevice); + return getDataTable(list); + } + + /** + * 获取BMS设备详细信息 + */ + @PreAuthorize("@ss.hasPermi('bms:device:query')") + @GetMapping(value = "/{deviceId}") + public AjaxResult getInfo(@PathVariable("deviceId") Long deviceId) { + return success(bmsDeviceService.selectBmsDeviceByDeviceId(deviceId)); + } + + /** + * 新增BMS设备 + */ + @PreAuthorize("@ss.hasPermi('bms:device:add')") + @Log(title = "BMS设备", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BmsDevice bmsDevice) { + return toAjax(bmsDeviceService.insertBmsDevice(bmsDevice)); + } + + /** + * 修改BMS设备 + */ + @PreAuthorize("@ss.hasPermi('bms:device:edit')") + @Log(title = "BMS设备", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BmsDevice bmsDevice) { + return toAjax(bmsDeviceService.updateBmsDevice(bmsDevice)); + } + + /** + * 删除BMS设备 + */ + @PreAuthorize("@ss.hasPermi('bms:device:remove')") + @Log(title = "BMS设备", businessType = BusinessType.DELETE) + @DeleteMapping("/{deviceIds}") + public AjaxResult remove(@PathVariable Long[] deviceIds) { + return toAjax(bmsDeviceService.deleteBmsDeviceByDeviceIds(deviceIds)); + } + + /** + * 批量更新设备状态 + */ + @PreAuthorize("@ss.hasPermi('bms:device:edit')") + @Log(title = "BMS设备状态", businessType = BusinessType.UPDATE) + @PutMapping("/status") + public AjaxResult updateStatus(@RequestBody Map params) { + Long[] deviceIds = (Long[]) params.get("deviceIds"); + String status = (String) params.get("status"); + return toAjax(bmsDeviceService.updateBmsDeviceStatus(deviceIds, status)); + } + +// /** +// * 查询设备状态 +// */ +// @PreAuthorize("@ss.hasPermi('bms:device:query')") +// @PostMapping("/queryStatus/{deviceCode}") +// public AjaxResult queryDeviceStatus(@PathVariable String deviceCode) { +// if (mqttService != null) { +// mqttService.queryDeviceStatus(deviceCode); +// return success("设备状态查询命令已发送"); +// } else { +// return error("MQTT服务未启用,无法发送查询命令"); +// } +// } +// +// /** +// * 重启设备 +// */ +// @PreAuthorize("@ss.hasPermi('bms:device:edit')") +// @Log(title = "重启BMS设备", businessType = BusinessType.UPDATE) +// @PostMapping("/restart/{deviceCode}") +// public AjaxResult restartDevice(@PathVariable String deviceCode) { +// if (mqttService != null) { +// mqttService.restartDevice(deviceCode); +// return success("设备重启命令已发送"); +// } else { +// return error("MQTT服务未启用,无法发送重启命令"); +// } +// } +// +// /** +// * 配置设备参数 +// */ +// @PreAuthorize("@ss.hasPermi('bms:device:edit')") +// @Log(title = "配置BMS设备", businessType = BusinessType.UPDATE) +// @PostMapping("/config/{deviceCode}") +// public AjaxResult configDevice(@PathVariable String deviceCode, @RequestBody Map config) { +// if (mqttService != null) { +// mqttService.configDevice(deviceCode, config); +// return success("设备配置命令已发送"); +// } else { +// return error("MQTT服务未启用,无法发送配置命令"); +// } +// } +// +// /** +// * 发送自定义MQTT消息 +// */ +// @PreAuthorize("@ss.hasPermi('bms:device:edit')") +// @Log(title = "发送MQTT消息", businessType = BusinessType.OTHER) +// @PostMapping("/mqtt/send") +// public AjaxResult sendMqttMessage(@RequestBody Map params) { +// if (mqttService != null) { +// String topic = params.get("topic"); +// String message = params.get("message"); +// mqttService.sendMessage(topic, message); +// return success("MQTT消息已发送"); +// } else { +// return error("MQTT服务未启用,无法发送消息"); +// } +// } + + /** + * 获取设备统计信息 + */ + @PreAuthorize("@ss.hasPermi('bms:device:list')") + @GetMapping("/statistics") + public AjaxResult getStatistics() { + Map statistics = new HashMap<>(); + + // 查询所有设备 + List allDevices = bmsDeviceService.selectBmsDeviceList(new BmsDevice()); + + // 统计设备数量 + long totalCount = allDevices.size(); + long onlineCount = allDevices.stream().filter(device -> "0".equals(device.getStatus())).count(); + long offlineCount = totalCount - onlineCount; + + // 计算平均温度 + double avgTemperature = allDevices.stream() + .filter(device -> device.getTemperature() != null) + .mapToDouble(BmsDevice::getTemperature) + .average() + .orElse(0.0); + + // 计算平均剩余电量 + double avgCapacity = allDevices.stream() + .filter(device -> device.getRemainingCapacity() != null) + .mapToDouble(BmsDevice::getRemainingCapacity) + .average() + .orElse(0.0); + + statistics.put("totalCount", totalCount); + statistics.put("onlineCount", onlineCount); + statistics.put("offlineCount", offlineCount); + statistics.put("avgTemperature", Math.round(avgTemperature * 100.0) / 100.0); + statistics.put("avgCapacity", Math.round(avgCapacity * 100.0) / 100.0); + + return success(statistics); + } +} diff --git a/src/main/java/com/evobms/project/bms/controller/GBT32960ExtremeDataExtractor.java b/src/main/java/com/evobms/project/bms/controller/GBT32960ExtremeDataExtractor.java new file mode 100644 index 0000000..319f107 --- /dev/null +++ b/src/main/java/com/evobms/project/bms/controller/GBT32960ExtremeDataExtractor.java @@ -0,0 +1,333 @@ +package com.evobms.project.bms.controller; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.util.Arrays; + +public class GBT32960ExtremeDataExtractor { + + /** + * 从完整的GBT32960协议数据中提取极值数据 + */ + public static ExtremeData extractExtremeData(byte[] receivedData, String deviceSn) { + try { + System.out.println("=== 开始提取极值数据 ==="); + + // 1. 解密数据 + byte[] decryptedData = decryptGBT32960Data(receivedData, deviceSn); + if (decryptedData == null) { + System.err.println("数据解密失败"); + return null; + } + System.out.println("解密后数据长度: " + decryptedData.length + " 字节"); + System.out.println("解密数据: " + bytesToHex(decryptedData)); + + // 2. 在数据单元中查找极值数据 + return findAndParseExtremeData(decryptedData); + + } catch (Exception e) { + System.err.println("提取极值数据时发生错误: " + e.getMessage()); + e.printStackTrace(); + return null; + } + } + + /** + * 解密GBT32960协议数据 + */ + private static byte[] decryptGBT32960Data(byte[] receivedData, String deviceSn) throws Exception { + // 检查起始位 + if (receivedData.length < 25 || receivedData[0] != 0x23 || receivedData[1] != 0x23) { + System.err.println("无效的GBT32960数据格式"); + return null; + } + + int offset = 2; // 跳过起始位 + + // 解析协议头部 + byte commandId = receivedData[offset++]; + byte responseFlag = receivedData[offset++]; + + // VIN码 (17字节) + offset += 17; + + // 加密方式 + byte encryptionMethod = receivedData[offset++]; + if (encryptionMethod != 0x03) { + System.err.println("不支持的解密方式: " + encryptionMethod); + return null; + } + + // 数据单元长度 + int dataUnitLength = ((receivedData[offset] & 0xFF) << 8) | (receivedData[offset + 1] & 0xFF); + offset += 2; + + System.out.println("数据单元长度: " + dataUnitLength); + + // 提取加密数据 + byte[] encryptedData = Arrays.copyOfRange(receivedData, offset, offset + dataUnitLength); + + // 生成AES密钥 + byte[] aesKey = generateAesKeyFromSn(deviceSn); + + // 解密数据 + return decryptData(encryptedData, aesKey); + } + + /** + * 从SN码生成AES密钥 + */ + private static byte[] generateAesKeyFromSn(String sn) { + String keyStr = sn; + while (keyStr.length() < 16) { + keyStr += "0"; + } + keyStr = keyStr.substring(0, 16); + return keyStr.getBytes(java.nio.charset.StandardCharsets.UTF_8); + } + + /** + * AES解密 + */ + private static byte[] decryptData(byte[] encryptedData, byte[] key) throws Exception { + SecretKeySpec secretKey = new SecretKeySpec(key, "AES"); + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secretKey); + return cipher.doFinal(encryptedData); + } + + /** + * 在数据单元中查找并解析极值数据 + */ + public static ExtremeData findAndParseExtremeData(byte[] dataUnit) { + if (dataUnit == null || dataUnit.length == 0) { + return null; + } + + int offset = 0; + while (offset < dataUnit.length) { + byte dataType = dataUnit[offset]; + + if (dataType == 0x06) { + System.out.println("找到极值数据,位置: " + offset); + return parseExtremeData(dataUnit, offset); + } + + // 跳过其他数据类型 + offset = skipDataItem(dataUnit, offset); + } + + System.out.println("未找到极值数据"); + return null; + } + + /** + * 解析极值数据 + */ + private static ExtremeData parseExtremeData(byte[] data, int offset) { + if (data == null || offset >= data.length) { + return null; + } + + ExtremeData extremeData = new ExtremeData(); + + try { + // 检查数据类型 + byte dataType = data[offset++]; + if (dataType != 0x06) { + System.err.println("错误的数据类型,期望0x06(极值数据),实际: 0x" + String.format("%02X", dataType)); + return null; + } + + // 数据长度 + byte dataLength = data[offset++]; + System.out.println("极值数据长度: " + (dataLength & 0xFF) + " 字节"); + + // 电池电压最高值 (2字节, 单位: 0.01V) + int maxVoltage = ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF); + offset += 2; + extremeData.setMaxVoltage(maxVoltage / 100.0); // 转换为V + System.out.println("最高电压原始值: " + maxVoltage + " (0.01V), 转换后: " + extremeData.getMaxVoltage() + "V"); + + // 电池电压最高所在子系统号 (1字节) + extremeData.setMaxVoltageSubsystemId(data[offset++] & 0xFF); + + // 电池电压最高所在电芯号 (1字节) + extremeData.setMaxVoltageCellId(data[offset++] & 0xFF); + + // 电池电压最低值 (2字节, 单位: 0.01V) + int minVoltage = ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF); + offset += 2; + extremeData.setMinVoltage(minVoltage / 100.0); // 转换为V + System.out.println("最低电压原始值: " + minVoltage + " (0.01V), 转换后: " + extremeData.getMinVoltage() + "V"); + + // 电池电压最低所在子系统号 (1字节) + extremeData.setMinVoltageSubsystemId(data[offset++] & 0xFF); + + // 电池电压最低所在电芯号 (1字节) + extremeData.setMinVoltageCellId(data[offset++] & 0xFF); + + // 电池温度最高值 (1字节, 偏移量40°C, 单位: 1°C) + int maxTemperature = (data[offset++] & 0xFF) - 40; + extremeData.setMaxTemperature(maxTemperature); + System.out.println("最高温度原始值: " + (data[offset-1] & 0xFF) + ", 转换后: " + maxTemperature + "°C"); + + // 电池温度最高所在子系统号 (1字节) + extremeData.setMaxTemperatureSubsystemId(data[offset++] & 0xFF); + + // 电池温度最高所在探针号 (1字节) + extremeData.setMaxTemperatureProbeId(data[offset++] & 0xFF); + + // 电池温度最低值 (1字节, 偏移量40°C, 单位: 1°C) + int minTemperature = (data[offset++] & 0xFF) - 40; + extremeData.setMinTemperature(minTemperature); + System.out.println("最低温度原始值: " + (data[offset-1] & 0xFF) + ", 转换后: " + minTemperature + "°C"); + + // 电池温度最低所在子系统号 (1字节) + extremeData.setMinTemperatureSubsystemId(data[offset++] & 0xFF); + + // 电池温度最低所在探针号 (1字节) + extremeData.setMinTemperatureProbeId(data[offset++] & 0xFF); + + System.out.println("极值数据解析完成"); + return extremeData; + + } catch (Exception e) { + System.err.println("解析极值数据时发生错误: " + e.getMessage()); + e.printStackTrace(); + return null; + } + } + + /** + * 跳过数据项 + */ + private static int skipDataItem(byte[] data, int offset) { + if (offset >= data.length) return offset; + + offset++; // 跳过数据类型 + if (offset < data.length) { + byte length = data[offset]; + offset += 1 + (length & 0xFF); // 跳过长度字节和数据内容 + } + + return offset; + } + + /** + * 字节数组转16进制字符串 + */ + private static String bytesToHex(byte[] bytes) { + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + sb.append(String.format("%02X", b)); + } + return sb.toString(); + } + + /** + * 极值数据实体类 + */ + public static class ExtremeData { + private double maxVoltage; // 最高电压 (V) + private int maxVoltageSubsystemId; // 最高电压子系统号 + private int maxVoltageCellId; // 最高电压电芯号 + private double minVoltage; // 最低电压 (V) + private int minVoltageSubsystemId; // 最低电压子系统号 + private int minVoltageCellId; // 最低电压电芯号 + private int maxTemperature; // 最高温度 (°C) + private int maxTemperatureSubsystemId; // 最高温度子系统号 + private int maxTemperatureProbeId; // 最高温度探针号 + private int minTemperature; // 最低温度 (°C) + private int minTemperatureSubsystemId; // 最低温度子系统号 + private int minTemperatureProbeId; // 最低温度探针号 + + // Getter和Setter方法 + public double getMaxVoltage() { return maxVoltage; } + public void setMaxVoltage(double maxVoltage) { this.maxVoltage = maxVoltage; } + + public int getMaxVoltageSubsystemId() { return maxVoltageSubsystemId; } + public void setMaxVoltageSubsystemId(int maxVoltageSubsystemId) { this.maxVoltageSubsystemId = maxVoltageSubsystemId; } + + public int getMaxVoltageCellId() { return maxVoltageCellId; } + public void setMaxVoltageCellId(int maxVoltageCellId) { this.maxVoltageCellId = maxVoltageCellId; } + + public double getMinVoltage() { return minVoltage; } + public void setMinVoltage(double minVoltage) { this.minVoltage = minVoltage; } + + public int getMinVoltageSubsystemId() { return minVoltageSubsystemId; } + public void setMinVoltageSubsystemId(int minVoltageSubsystemId) { this.minVoltageSubsystemId = minVoltageSubsystemId; } + + public int getMinVoltageCellId() { return minVoltageCellId; } + public void setMinVoltageCellId(int minVoltageCellId) { this.minVoltageCellId = minVoltageCellId; } + + public int getMaxTemperature() { return maxTemperature; } + public void setMaxTemperature(int maxTemperature) { this.maxTemperature = maxTemperature; } + + public int getMaxTemperatureSubsystemId() { return maxTemperatureSubsystemId; } + public void setMaxTemperatureSubsystemId(int maxTemperatureSubsystemId) { this.maxTemperatureSubsystemId = maxTemperatureSubsystemId; } + + public int getMaxTemperatureProbeId() { return maxTemperatureProbeId; } + public void setMaxTemperatureProbeId(int maxTemperatureProbeId) { this.maxTemperatureProbeId = maxTemperatureProbeId; } + + public int getMinTemperature() { return minTemperature; } + public void setMinTemperature(int minTemperature) { this.minTemperature = minTemperature; } + + public int getMinTemperatureSubsystemId() { return minTemperatureSubsystemId; } + public void setMinTemperatureSubsystemId(int minTemperatureSubsystemId) { this.minTemperatureSubsystemId = minTemperatureSubsystemId; } + + public int getMinTemperatureProbeId() { return minTemperatureProbeId; } + public void setMinTemperatureProbeId(int minTemperatureProbeId) { this.minTemperatureProbeId = minTemperatureProbeId; } + + @Override + public String toString() { + return String.format( + "=== 极值数据 ===\n" + + "电压信息:\n" + + " 最高电压: %.2f V (子系统%d, 电芯%d)\n" + + " 最低电压: %.2f V (子系统%d, 电芯%d)\n" + + "温度信息:\n" + + " 最高温度: %d°C (子系统%d, 探针%d)\n" + + " 最低温度: %d°C (子系统%d, 探针%d)", + maxVoltage, maxVoltageSubsystemId, maxVoltageCellId, + minVoltage, minVoltageSubsystemId, minVoltageCellId, + maxTemperature, maxTemperatureSubsystemId, maxTemperatureProbeId, + minTemperature, minTemperatureSubsystemId, minTemperatureProbeId + ); + } + } + + /** + * 测试方法 + */ + public static void main(String[] args) { + try { + // 模拟测试数据 + String testHexData = "23230200000000000000000000000000000000000003000C06420F01010FA102023C0101280202"; + byte[] testData = hexStringToByteArray(testHexData); + String deviceSn = "TEST123456789"; + + ExtremeData result = extractExtremeData(testData, deviceSn); + if (result != null) { + System.out.println(result.toString()); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 16进制字符串转字节数组 + */ + private static byte[] hexStringToByteArray(String hex) { + hex = hex.replaceAll("\\s", ""); + int len = hex.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + + Character.digit(hex.charAt(i + 1), 16)); + } + return data; + } +} diff --git a/src/main/java/com/evobms/project/bms/controller/GBT32960ExtremeDataParser.java b/src/main/java/com/evobms/project/bms/controller/GBT32960ExtremeDataParser.java new file mode 100644 index 0000000..a004e81 --- /dev/null +++ b/src/main/java/com/evobms/project/bms/controller/GBT32960ExtremeDataParser.java @@ -0,0 +1,220 @@ +package com.evobms.project.bms.controller; +public class GBT32960ExtremeDataParser { + + /** + * 解析极值数据 (数据类型 0x06) + */ + public static ExtremeData parseExtremeData(byte[] data, int offset) { + if (data == null || offset >= data.length) { + return null; + } + + ExtremeData extremeData = new ExtremeData(); + + try { + // 检查数据类型 + byte dataType = data[offset++]; + if (dataType != 0x06) { + System.err.println("错误的数据类型,期望0x06(极值数据),实际: 0x" + String.format("%02X", dataType)); + return null; + } + + // 数据长度 + byte dataLength = data[offset++]; + System.out.println("极值数据长度: " + (dataLength & 0xFF) + " 字节"); + + // 电池电压最高值 (2字节, 单位: 0.01V) + int maxVoltage = ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF); + offset += 2; + extremeData.setMaxVoltage(maxVoltage / 100.0); // 转换为V + + // 电池电压最高所在子系统号 (1字节) + extremeData.setMaxVoltageSubsystemId(data[offset++] & 0xFF); + + // 电池电压最高所在电芯号 (1字节) + extremeData.setMaxVoltageCellId(data[offset++] & 0xFF); + + // 电池电压最低值 (2字节, 单位: 0.01V) + int minVoltage = ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF); + offset += 2; + extremeData.setMinVoltage(minVoltage / 100.0); // 转换为V + + // 电池电压最低所在子系统号 (1字节) + extremeData.setMinVoltageSubsystemId(data[offset++] & 0xFF); + + // 电池电压最低所在电芯号 (1字节) + extremeData.setMinVoltageCellId(data[offset++] & 0xFF); + + // 电池温度最高值 (1字节, 偏移量40°C, 单位: 1°C) + int maxTemperature = (data[offset++] & 0xFF) - 40; + extremeData.setMaxTemperature(maxTemperature); + + // 电池温度最高所在子系统号 (1字节) + extremeData.setMaxTemperatureSubsystemId(data[offset++] & 0xFF); + + // 电池温度最高所在探针号 (1字节) + extremeData.setMaxTemperatureProbeId(data[offset++] & 0xFF); + + // 电池温度最低值 (1字节, 偏移量40°C, 单位: 1°C) + int minTemperature = (data[offset++] & 0xFF) - 40; + extremeData.setMinTemperature(minTemperature); + + // 电池温度最低所在子系统号 (1字节) + extremeData.setMinTemperatureSubsystemId(data[offset++] & 0xFF); + + // 电池温度最低所在探针号 (1字节) + extremeData.setMinTemperatureProbeId(data[offset++] & 0xFF); + + return extremeData; + + } catch (Exception e) { + System.err.println("解析极值数据时发生错误: " + e.getMessage()); + return null; + } + } + + /** + * 从完整的数据单元中查找并解析极值数据 + */ + public static ExtremeData findAndParseExtremeData(byte[] dataUnit) { + if (dataUnit == null || dataUnit.length == 0) { + return null; + } + + int offset = 0; + while (offset < dataUnit.length) { + byte dataType = dataUnit[offset]; + + if (dataType == 0x06) { + // 找到极值数据 + System.out.println("找到极值数据,位置: " + offset); + return parseExtremeData(dataUnit, offset); + } else { + // 跳过其他数据类型 + offset++; // 跳过数据类型 + if (offset < dataUnit.length) { + byte length = dataUnit[offset]; + offset += 1 + (length & 0xFF); // 跳过长度字节和数据内容 + } + } + } + + System.out.println("未找到极值数据"); + return null; + } + + /** + * 极值数据实体类 + */ + public static class ExtremeData { + private double maxVoltage; // 最高电压 (V) + private int maxVoltageSubsystemId; // 最高电压子系统号 + private int maxVoltageCellId; // 最高电压电芯号 + private double minVoltage; // 最低电压 (V) + private int minVoltageSubsystemId; // 最低电压子系统号 + private int minVoltageCellId; // 最低电压电芯号 + private int maxTemperature; // 最高温度 (°C) + private int maxTemperatureSubsystemId; // 最高温度子系统号 + private int maxTemperatureProbeId; // 最高温度探针号 + private int minTemperature; // 最低温度 (°C) + private int minTemperatureSubsystemId; // 最低温度子系统号 + private int minTemperatureProbeId; // 最低温度探针号 + + // Getter和Setter方法 + public double getMaxVoltage() { return maxVoltage; } + public void setMaxVoltage(double maxVoltage) { this.maxVoltage = maxVoltage; } + + public int getMaxVoltageSubsystemId() { return maxVoltageSubsystemId; } + public void setMaxVoltageSubsystemId(int maxVoltageSubsystemId) { this.maxVoltageSubsystemId = maxVoltageSubsystemId; } + + public int getMaxVoltageCellId() { return maxVoltageCellId; } + public void setMaxVoltageCellId(int maxVoltageCellId) { this.maxVoltageCellId = maxVoltageCellId; } + + public double getMinVoltage() { return minVoltage; } + public void setMinVoltage(double minVoltage) { this.minVoltage = minVoltage; } + + public int getMinVoltageSubsystemId() { return minVoltageSubsystemId; } + public void setMinVoltageSubsystemId(int minVoltageSubsystemId) { this.minVoltageSubsystemId = minVoltageSubsystemId; } + + public int getMinVoltageCellId() { return minVoltageCellId; } + public void setMinVoltageCellId(int minVoltageCellId) { this.minVoltageCellId = minVoltageCellId; } + + public int getMaxTemperature() { return maxTemperature; } + public void setMaxTemperature(int maxTemperature) { this.maxTemperature = maxTemperature; } + + public int getMaxTemperatureSubsystemId() { return maxTemperatureSubsystemId; } + public void setMaxTemperatureSubsystemId(int maxTemperatureSubsystemId) { this.maxTemperatureSubsystemId = maxTemperatureSubsystemId; } + + public int getMaxTemperatureProbeId() { return maxTemperatureProbeId; } + public void setMaxTemperatureProbeId(int maxTemperatureProbeId) { this.maxTemperatureProbeId = maxTemperatureProbeId; } + + public int getMinTemperature() { return minTemperature; } + public void setMinTemperature(int minTemperature) { this.minTemperature = minTemperature; } + + public int getMinTemperatureSubsystemId() { return minTemperatureSubsystemId; } + public void setMinTemperatureSubsystemId(int minTemperatureSubsystemId) { this.minTemperatureSubsystemId = minTemperatureSubsystemId; } + + public int getMinTemperatureProbeId() { return minTemperatureProbeId; } + public void setMinTemperatureProbeId(int minTemperatureProbeId) { this.minTemperatureProbeId = minTemperatureProbeId; } + + @Override + public String toString() { + return String.format( + "极值数据:\n" + + "电压 - 最高: %.2fV (子系统%d, 电芯%d)\n" + + "电压 - 最低: %.2fV (子系统%d, 电芯%d)\n" + + "温度 - 最高: %d°C (子系统%d, 探针%d)\n" + + "温度 - 最低: %d°C (子系统%d, 探针%d)", + maxVoltage, maxVoltageSubsystemId, maxVoltageCellId, + minVoltage, minVoltageSubsystemId, minVoltageCellId, + maxTemperature, maxTemperatureSubsystemId, maxTemperatureProbeId, + minTemperature, minTemperatureSubsystemId, minTemperatureProbeId + ); + } + } + + /** + * 测试方法 + */ + public static void main(String[] args) { + // 模拟极值数据 (16进制) + // 06 0C 0F A0 01 01 0C 80 02 02 3C 01 01 28 02 02 + // 解释: + // 06 - 数据类型(极值数据) + // 0C - 数据长度(12字节) + // 0F A0 - 最高电压: 4000 (40.00V) + // 01 - 最高电压子系统号: 1 + // 01 - 最高电压电芯号: 1 + // 0C 80 - 最低电压: 3200 (32.00V) + // 02 - 最低电压子系统号: 2 + // 02 - 最低电压电芯号: 2 + // 3C - 最高温度: 60 (60-40=20°C) + // 01 - 最高温度子系统号: 1 + // 01 - 最高温度探针号: 1 + // 28 - 最低温度: 40 (40-40=0°C) + // 02 - 最低温度子系统号: 2 + // 02 - 最低温度探针号: 2 + + byte[] testExtremeData = { + (byte) 0x06, // 数据类型 + (byte) 0x0C, // 数据长度 + (byte) 0x0F, (byte) 0xA0, // 最高电压 + (byte) 0x01, // 最高电压子系统号 + (byte) 0x01, // 最高电压电芯号 + (byte) 0x0C, (byte) 0x80, // 最低电压 + (byte) 0x02, // 最低电压子系统号 + (byte) 0x02, // 最低电压电芯号 + (byte) 0x3C, // 最高温度 + (byte) 0x01, // 最高温度子系统号 + (byte) 0x01, // 最高温度探针号 + (byte) 0x28, // 最低温度 + (byte) 0x02, // 最低温度子系统号 + (byte) 0x02 // 最低温度探针号 + }; + + ExtremeData result = parseExtremeData(testExtremeData, 0); + if (result != null) { + System.out.println(result.toString()); + } + } +} diff --git a/src/main/java/com/evobms/project/bms/controller/GBT32960FullDecoder.java b/src/main/java/com/evobms/project/bms/controller/GBT32960FullDecoder.java new file mode 100644 index 0000000..ed73cde --- /dev/null +++ b/src/main/java/com/evobms/project/bms/controller/GBT32960FullDecoder.java @@ -0,0 +1,300 @@ +package com.evobms.project.bms.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.util.Arrays; +public class GBT32960FullDecoder { + private static final Logger log = LoggerFactory.getLogger(GBT32960FullDecoder.class); + // 从SN码生成AES密钥 + private static byte[] generateKeyFromSn(String sn) { + StringBuilder keyStr = new StringBuilder(sn); + while (keyStr.length() < 16) { + keyStr.append("0"); + } + keyStr = new StringBuilder(keyStr.substring(0, 16)); + return keyStr.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8); + } + + // AES解密 + private static byte[] decryptData(byte[] encryptedData, byte[] key) throws Exception { + SecretKeySpec secretKey = new SecretKeySpec(key, "AES"); + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secretKey); + return cipher.doFinal(encryptedData); + } + + // BCC校验 + private static byte calculateBCC(byte[] data, int start, int end) { + byte bcc = 0; + for (int i = start; i < end; i++) { + bcc ^= data[i]; + } + return bcc; + } + + // 16进制字符串转字节数组 + private static byte[] hexStringToByteArray(String hex) { + hex = hex.replaceAll("\\s", ""); // 移除空格 + int len = hex.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + + Character.digit(hex.charAt(i + 1), 16)); + } + return data; + } + + // 字节数组转16进制字符串 + private static String bytesToHex(byte[] bytes) { + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + sb.append(String.format("%02X", b)); + } + return sb.toString(); + } + + // 详细的协议解析方法 + public static String parseGBT32960Data(byte[] receivedData, String deviceSn) { + String bytesData = null; + try { + log.info("=== GBT32960协议数据解析 ==="); + log.info("实际数据长度: " + receivedData.length + " 字节"); + // 1. 检查起始位 + if (receivedData.length < 2 || receivedData[0] != 0x23 || receivedData[1] != 0x23) { + log.error("无效的起始位或数据过短"); + return null; + } + log.info("起始位: 0x2323 ✓"); + + // 2. 打印完整数据用于调试 + log.info("完整数据: " + bytesToHex(receivedData)); + + // 3. 分析协议结构 + int offset = 2; // 跳过起始位 + + // 命令标识 + byte commandId = receivedData[offset++]; + log.info("命令标识: 0x" + String.format("%02X", commandId)); + + // 应答标志 + byte responseFlag = receivedData[offset++]; + log.info("应答标志: 0x" + String.format("%02X", responseFlag)); + + // VIN码 (17字节) + byte[] vin = Arrays.copyOfRange(receivedData, offset, offset + 17); + offset += 17; + log.info("VIN码: " + bytesToHex(vin) + " (" + new String(vin).trim() + ")"); + + // 加密方式 + byte encryptionMethod = receivedData[offset++]; + log.info("加密方式: 0x" + String.format("%02X", encryptionMethod)); + + if (encryptionMethod != 0x03) { + log.error("不支持的解密方式,期望AES128(0x03)"); + return null; + } + + // 数据单元长度 (WORD, 大端序) + int dataUnitLength = ((receivedData[offset] & 0xFF) << 8) | (receivedData[offset + 1] & 0xFF); + offset += 2; + log.info("声明的数据单元长度: " + dataUnitLength + " 字节"); + + // 计算当前头部长度 + int headerLength = offset; + log.info("协议头部长度: " + headerLength + " 字节"); + + // 剩余数据长度 + int remainingDataLength = receivedData.length - headerLength; + log.info("剩余数据长度: " + remainingDataLength + " 字节"); + + // 4. 重新计算期望长度 + // 方案1: 如果BCC是1字节 + int expectedLength1 = headerLength + dataUnitLength + 1; + // 方案2: 如果BCC是2字节(根据您最初描述) + int expectedLength2 = headerLength + dataUnitLength + 2; + + log.info("期望长度 (BCC=1字节): " + expectedLength1); + log.info("期望长度 (BCC=2字节): " + expectedLength2); + log.info("实际长度: " + receivedData.length); + + // 5. 确定正确的数据范围 + int encryptedDataStart = offset; + int encryptedDataEnd; + int bccStart; + + if (receivedData.length == expectedLength1) { + // BCC为1字节 + encryptedDataEnd = encryptedDataStart + dataUnitLength; + bccStart = encryptedDataEnd; + log.info("采用方案: BCC为1字节"); + } else if (receivedData.length == expectedLength2) { + // BCC为2字节 + encryptedDataEnd = encryptedDataStart + dataUnitLength; + bccStart = encryptedDataEnd; + log.info("采用方案: BCC为2字节"); + } else { + // 自动适应:使用剩余的所有数据作为加密数据 + encryptedDataEnd = receivedData.length - 1; // 假设BCC为1字节 + int actualDataUnitLength = encryptedDataEnd - encryptedDataStart; + log.info("长度不匹配,使用实际数据单元长度: " + actualDataUnitLength + " 字节"); + dataUnitLength = actualDataUnitLength; + bccStart = encryptedDataEnd; + } + + // 6. 提取加密数据 + byte[] encryptedData = Arrays.copyOfRange(receivedData, encryptedDataStart, encryptedDataStart + dataUnitLength); + log.info("加密数据长度: " + encryptedData.length + " 字节"); + log.info("加密数据 (前64字节): " + bytesToHex(Arrays.copyOf(encryptedData, Math.min(64, encryptedData.length))) + "..."); + + // 7. 提取BCC校验码 + int bccLength = receivedData.length - (encryptedDataStart + dataUnitLength); + byte[] receivedBCC = Arrays.copyOfRange(receivedData, encryptedDataStart + dataUnitLength, receivedData.length); + //log.info("BCC长度: " + bccLength + " 字节"); + //log.info("接收到的BCC: " + bytesToHex(receivedBCC)); + + // 8. 计算BCC校验范围:从命令单元开始到加密数据结束 + int bccCalcStart = 2; // 从命令标识开始 (跳过0x2323) + int bccCalcEnd = encryptedDataStart + dataUnitLength; + byte calculatedBCC = calculateBCC(receivedData, bccCalcStart, bccCalcEnd); + + log.info("BCC计算范围: 字节[" + bccCalcStart + "~" + bccCalcEnd + ")"); + log.info("计算出的BCC: 0x" + String.format("%02X", calculatedBCC)); + + // 验证BCC (只比较第一个字节) + if (receivedBCC.length > 0 && calculatedBCC == receivedBCC[0]) { + log.info("BCC校验通过 ✓"); + } else { + log.error("BCC校验失败!"); + } + + + //使用的AES密钥 + byte[] aesKey = generateKeyFromSn(deviceSn); + byte[] decryptedData = decryptData(encryptedData, aesKey); + bytesData = bytesToHex(decryptedData); + log.info("解密成功!"); + log.info("解密后数据长度: " + decryptedData.length + " 字节"); + log.info("解密后数据 (完整): " + bytesData); + + + // 10. 解析解密后的数据单元 + // parseDecryptedDataUnit(decryptedData); + + } catch (Exception e) { + log.error("解析过程中发生错误: " + e.getMessage()); + e.printStackTrace(); + } + return bytesData; + } + + private static void parseDecryptedDataUnit(byte[] decryptedData) { + log.info("\n=== 数据单元解析 ==="); + + if (decryptedData == null || decryptedData.length == 0) { + log.info("解密数据为空"); + return; + } + + log.info("数据单元总长度: " + decryptedData.length + " 字节"); + log.info("数据单元内容: " + bytesToHex(decryptedData)); + + // 尝试解析采集时间(前6字节BCD) + if (decryptedData.length >= 6) { + String ts = parseTimestampFromBCD(Arrays.copyOfRange(decryptedData, 0, 6)); + log.info("采集时间: " + ts + " (BCD)"); + } + + // 扫描数据块: [类型ID(1)] [长度(1)] + int offset = 6; // 时间之后 + int itemIndex = 0; + while (offset + 2 <= decryptedData.length) { + int typeId = decryptedData[offset] & 0xFF; + int length = decryptedData[offset + 1] & 0xFF; + int payloadStart = offset + 2; + int payloadEnd = payloadStart + length; + + // 长度异常时,尝试步进1字节继续 + if (payloadEnd > decryptedData.length) { + // 可能当前字节并非数据块起点(例如信息标志位),小步扫描跳过 + offset += 1; + continue; + } + + byte[] payload = Arrays.copyOfRange(decryptedData, payloadStart, payloadEnd); + log.info(String.format("数据块[%d] 类型: %s, 长度: %d, 起止: %d-%d", itemIndex++, typeName(typeId), length, payloadStart, payloadEnd - 1)); + log.info("数据块HEX: " + bytesToHex(Arrays.copyOf(payload, Math.min(64, payload.length))) + (payload.length > 64 ? "..." : "")); + + // 极值数据尝试详细解析 + if (typeId == 0x06) { + try { + GBT32960ExtremeDataParser.ExtremeData extreme = GBT32960ExtremeDataParser.parseExtremeData(Arrays.copyOfRange(decryptedData, offset, payloadEnd), 0); + if (extreme != null) { + log.info("极值数据解析结果: " + extreme.toString()); + } + } catch (Exception ex) { + log.warn("极值数据解析异常: " + ex.getMessage()); + } + } + + offset = payloadEnd; + } + + // 兼容旧的极值扫描逻辑 + GBT32960ExtremeDataExtractor.ExtremeData andParseExtremeData = GBT32960ExtremeDataExtractor.findAndParseExtremeData(decryptedData); + if (andParseExtremeData != null) { + log.info(andParseExtremeData.toString()); + } else { + log.info("未找到极值数据或解析失败"); + } + } + + /** + * 跳过数据项 + */ + private static int skipDataItem(byte[] data, int offset) { + if (offset >= data.length) return offset; + + offset++; // 跳过数据类型 + if (offset < data.length) { + byte length = data[offset]; + offset += 1 + (length & 0xFF); // 跳过长度字节和数据内容 + } + + return offset; + } + + private static String typeName(int typeId) { + switch (typeId & 0xFF) { + case 0x01: return "整车数据"; + case 0x02: return "驱动电机数据"; + case 0x03: return "燃料电池数据"; + case 0x04: return "发动机数据"; + case 0x05: return "车辆位置数据"; + case 0x06: return "极值数据"; + case 0x07: return "报警数据"; + case 0x08: return "储能装置电压数据"; + case 0x09: return "储能装置温度数据"; + default: return String.format("未知类型(0x%02X)", typeId); + } + } + + // BCD字节转十进制整数 + private static int bcdToInt(byte b) { + return ((b >> 4) & 0x0F) * 10 + (b & 0x0F); + } + + // 解析采集时间(BCD YY MM DD hh mm ss) + private static String parseTimestampFromBCD(byte[] data) { + if (data == null || data.length < 6) return "未知"; + int year = 2000 + bcdToInt(data[0]); + int month = bcdToInt(data[1]); + int day = bcdToInt(data[2]); + int hour = bcdToInt(data[3]); + int minute = bcdToInt(data[4]); + int second = bcdToInt(data[5]); + return String.format("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, second); + } +} diff --git a/src/main/java/com/evobms/project/bms/controller/GBT32960MqttReceiver.java b/src/main/java/com/evobms/project/bms/controller/GBT32960MqttReceiver.java new file mode 100644 index 0000000..8c6ecb2 --- /dev/null +++ b/src/main/java/com/evobms/project/bms/controller/GBT32960MqttReceiver.java @@ -0,0 +1,49 @@ +package com.evobms.project.bms.controller; + +import org.eclipse.paho.client.mqttv3.*; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class GBT32960MqttReceiver { + private static final String BROKER = "tcp://61.182.73.218:1883"; + private static final String CLIENT_ID = "evobms-client"; + private static final String TOPIC = "/bbox/EVO0002/#"; + private static final String DEVICE_SN = "EVO0002"; + + @Bean + public void initMQtt() throws MqttException { + MqttClient client = new MqttClient(BROKER, CLIENT_ID, new MemoryPersistence()); + + MqttConnectOptions options = new MqttConnectOptions(); + options.setCleanSession(true); + + client.setCallback(new MqttCallback() { + @Override + public void connectionLost(Throwable cause) { + System.out.println("MQTT连接断开: " + cause.getMessage()); + } + + @Override + public void messageArrived(String topic, MqttMessage message) { + System.out.println("\n收到MQTT消息,主题: " + topic); + System.out.println("QoS: " + message.getQos()); + + // 直接处理字节数组 + byte[] payload = message.getPayload(); + // GBT32960FullDecoder.parseGBT32960Data(payload, DEVICE_SN); + + } + + @Override + public void deliveryComplete(IMqttDeliveryToken token) { + // 发布完成回调 + } + }); + + client.connect(options); + client.subscribe(TOPIC); + System.out.println("已成功连接到MQTT Broker并订阅主题: " + TOPIC); + } +} diff --git a/src/main/java/com/evobms/project/bms/controller/MqttPublishController.java b/src/main/java/com/evobms/project/bms/controller/MqttPublishController.java new file mode 100644 index 0000000..7584d49 --- /dev/null +++ b/src/main/java/com/evobms/project/bms/controller/MqttPublishController.java @@ -0,0 +1,226 @@ +package com.evobms.project.bms.controller; + +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.common.constant.Constants; +import com.evobms.common.constant.BboxApiConstants; +import com.evobms.common.utils.StringUtils; +import com.evobms.project.bms.service.MqttService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import javax.servlet.http.HttpServletRequest; +import org.springframework.web.bind.annotation.GetMapping; +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 org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * MQTT消息发布控制器 + * 用于测试MQTT消息的发布和接收 + * + * @author ruoyi + * @date 2024-01-01 + */ +@RestController +@RequestMapping("/bms/mqtt") +public class MqttPublishController { + private static final Logger log = LoggerFactory.getLogger(MqttPublishController.class); + + @Autowired(required = false) + private MqttService mqttService; + + @Value("${token.header}") + private String tokenHeader; + + /** + * 发布测试消息到指定主题 + */ + @PostMapping("/publish") + // @Log(title = "MQTT消息发布", businessType = BusinessType.INSERT) + public AjaxResult publishMessage(@RequestParam String topic, @RequestParam String message) { + try { + if (mqttService == null) { + return AjaxResult.error("MQTT服务未启用"); + } + + mqttService.sendMessage(topic, message); + log.info("发布消息成功 -> 主题: {}, 内容: {}", topic, message); + return AjaxResult.success("消息发布成功", "主题: " + topic + ", 内容: " + message); + } catch (Exception e) { + log.error("发布消息失败 -> 主题: {}, 错误: {}", topic, e.getMessage(), e); + return AjaxResult.error("消息发布失败: " + e.getMessage()); + } + } + + /** + * 发布原始十六进制字节消息到指定主题 + */ + @PostMapping("/publishHex") + public AjaxResult publishHex(@RequestParam String topic, @RequestParam String hex) { + try { + if (mqttService == null) { + return AjaxResult.error("MQTT服务未启用"); + } + + byte[] payload = parseHexToBytes(hex); + mqttService.sendMessageBytes(topic, payload); + log.info("发布HEX消息成功 -> 主题: {}, 长度: {}, HEX: {}", topic, payload.length, toHex(payload)); + return AjaxResult.success("HEX消息发布成功", "主题: " + topic + ", 字节长度: " + payload.length); + } catch (Exception e) { + log.error("发布HEX消息失败 -> 主题: {}, 错误: {}", topic, e.getMessage(), e); + return AjaxResult.error("HEX消息发布失败: " + e.getMessage()); + } + } + + /** + * 获取当前请求的鉴权令牌(从请求头读取并去除前缀) + */ + @GetMapping("/authToken") + public AjaxResult getAuthToken(HttpServletRequest request) { + try { + String raw = request.getHeader(tokenHeader); + String token = raw; + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { + token = token.replace(Constants.TOKEN_PREFIX, ""); + } + if (StringUtils.isEmpty(token)) { + return AjaxResult.error(BboxApiConstants.CODE_UNAUTHORIZED, BboxApiConstants.MSG_UNAUTHORIZED + ":未检测到令牌,请登录或在请求头设置 " + tokenHeader); + } + AjaxResult ajax = AjaxResult.success(); + ajax.put(Constants.TOKEN, token); + ajax.put("header", tokenHeader); + return ajax; + } catch (Exception e) { + log.error("获取鉴权令牌失败: {}", e.getMessage(), e); + return AjaxResult.error("获取鉴权令牌失败: " + e.getMessage()); + } + } + + private static byte[] parseHexToBytes(String hex) { + String s = hex.replace("0x", "").replace("0X", "").replaceAll("\\s+", ""); + if (s.length() == 0) { + throw new IllegalArgumentException("HEX字符串为空"); + } + if (s.length() % 2 != 0) { + throw new IllegalArgumentException("HEX长度必须为偶数"); + } + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + String byteStr = s.substring(i, i + 2); + int val = Integer.parseInt(byteStr, 16); + data[i / 2] = (byte) val; + } + return data; + } + + private static String toHex(byte[] bytes) { + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + sb.append(String.format("%02X ", b)); + } + return sb.toString().trim(); + } + + /** + * 发布设备数据测试消息 + */ + @PostMapping("/publishDeviceData") + // @Log(title = "设备数据发布", businessType = BusinessType.INSERT) + public AjaxResult publishDeviceData(@RequestParam String deviceCode) { + try { + if (mqttService == null) { + return AjaxResult.error("MQTT服务未启用"); + } + + // 构造测试数据 + String testData = "{" + + "\"voltage\": 12.5," + + "\"current\": 2.3," + + "\"capacity\": 85.6," + + "\"temperature\": 25.8," + + "\"timestamp\": " + System.currentTimeMillis() + + "}"; + + String topic = "evobms/" + deviceCode + "/data"; + mqttService.sendMessage(topic, testData); + log.info("设备数据发布成功 -> 设备: {}, 主题: {}", deviceCode, topic); + + return AjaxResult.success("设备数据发布成功", + "主题: " + topic + ", 数据: " + testData); + } catch (Exception e) { + log.error("设备数据发布失败 -> 设备: {}, 错误: {}", deviceCode, e.getMessage(), e); + return AjaxResult.error("设备数据发布失败: " + e.getMessage()); + } + } + + /** + * 快速测试 - 发布消息到test设备 + */ + @GetMapping("/quickTest") + public AjaxResult quickTest() { + try { + if (mqttService == null) { + return AjaxResult.error("MQTT服务未启用"); + } + + // 发布到test设备 + String topic = "evobms/test/data"; + String testData = "{" + + "\"voltage\": 13.2," + + "\"current\": 1.8," + + "\"capacity\": 92.3," + + "\"temperature\": 23.5," + + "\"timestamp\": " + System.currentTimeMillis() + + "}"; + + mqttService.sendMessage(topic, testData); + log.info("快速测试消息已发布 -> 主题: {}", topic); + + return AjaxResult.success("快速测试完成", + "已发布消息到主题: " + topic + ", 请查看控制台日志"); + } catch (Exception e) { + log.error("快速测试失败 -> 错误: {}", e.getMessage(), e); + return AjaxResult.error("快速测试失败: " + e.getMessage()); + } + } + + /** + * 批量发布测试消息 + */ + @PostMapping("/batchPublish") + // @Log(title = "批量MQTT消息发布", businessType = BusinessType.INSERT) + public AjaxResult batchPublish(@RequestParam String deviceCode, @RequestParam(defaultValue = "5") int count) { + try { + if (mqttService == null) { + return AjaxResult.error("MQTT服务未启用"); + } + + String topic = "evobms/" + deviceCode + "/data"; + + for (int i = 0; i < count; i++) { + String testData = "{" + + "\"voltage\": " + (12.0 + Math.random() * 2) + "," + + "\"current\": " + (1.0 + Math.random() * 3) + "," + + "\"capacity\": " + (80 + Math.random() * 20) + "," + + "\"temperature\": " + (20 + Math.random() * 10) + "," + + "\"timestamp\": " + System.currentTimeMillis() + + "}"; + + mqttService.sendMessage(topic, testData); + log.debug("批量发布第{}条 -> 主题: {}", i + 1, topic); + + // 间隔100ms + Thread.sleep(100); + } + + return AjaxResult.success("批量发布完成", + "已发布 " + count + " 条消息到主题: " + topic); + } catch (Exception e) { + log.error("批量发布失败 -> 设备: {}, 错误: {}", deviceCode, e.getMessage(), e); + return AjaxResult.error("批量发布失败: " + e.getMessage()); + } + } +} diff --git a/src/main/java/com/evobms/project/bms/controller/MqttTestController.java b/src/main/java/com/evobms/project/bms/controller/MqttTestController.java new file mode 100644 index 0000000..5aa32e3 --- /dev/null +++ b/src/main/java/com/evobms/project/bms/controller/MqttTestController.java @@ -0,0 +1,97 @@ +package com.evobms.project.bms.controller; + +import com.evobms.project.bms.service.MqttService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.HashMap; +import java.util.Map; + +/** + * MQTT测试控制器 + * 用于测试MQTT消息处理功能 + * + * @author BMS System + * @date 2024 + */ +@RestController +@RequestMapping("/mqtt/test") +public class MqttTestController { + private static final Logger log = LoggerFactory.getLogger(MqttTestController.class); + + @Autowired + private MqttService mqttService; + + /** + * 测试handleDeviceData方法 + * + * @param topic MQTT主题 + * @param payload 消息内容 + * @return 测试结果 + */ + @PostMapping("/handleDeviceData") + public Map testHandleDeviceData( + @RequestParam String topic, + @RequestParam byte[] payload) { + + Map result = new HashMap<>(); + + try { + // 调用handleDeviceData方法 + mqttService.handleDeviceData(topic, payload); + log.info("测试处理设备数据,topic={}, payload={}", topic, payload); + + result.put("success", true); + result.put("message", "消息处理成功"); + result.put("topic", topic); + result.put("payload", payload); + + // 解析主题获取设备编号(模拟方法内部逻辑) + String[] topicParts = topic.split("/"); + if (topicParts.length >= 3) { + String deviceCode = topicParts[1]; + result.put("extractedDeviceCode", deviceCode); + } + + } catch (Exception e) { + log.error("测试处理设备数据发生错误: {}", e.getMessage(), e); + result.put("success", false); + result.put("message", "消息处理失败: " + e.getMessage()); + result.put("error", e.getClass().getSimpleName()); + } + + return result; + } + + /** + * 生成测试数据 + * + * @return 测试用的JSON数据 + */ + @GetMapping("/generateTestData") + public Map generateTestData() { + Map testData = new HashMap<>(); + testData.put("voltage", 12.5); + testData.put("current", 2.3); + testData.put("capacity", 85.6); + testData.put("temperature", 25.8); + testData.put("timestamp", System.currentTimeMillis()); + + return testData; + } + + /* *//** + * 快速测试 - 使用预设的主题和数据 + * + * @return 测试结果 + *//* + @PostMapping("/quickTest") + public Map quickTest() { + String topic = "evobms/test/data"; + String payload = "{\"voltage\":12.5,\"current\":2.3,\"capacity\":85.6,\"temperature\":25.8}"; + log.info("快速测试触发,topic={}, payload={}", topic, payload); + + return testHandleDeviceData(topic, payload); + }*/ +} diff --git a/src/main/java/com/evobms/project/bms/domain/BmsDevice.java b/src/main/java/com/evobms/project/bms/domain/BmsDevice.java new file mode 100644 index 0000000..8eaedbc --- /dev/null +++ b/src/main/java/com/evobms/project/bms/domain/BmsDevice.java @@ -0,0 +1,203 @@ +package com.evobms.project.bms.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.web.domain.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * BMS设备对象 bms_device + * + * @author evobms + * @date 2025-01-22 + */ +@TableName("bms_device") +public class BmsDevice extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 设备ID */ + @TableId(type = IdType.AUTO) + private Long deviceId; + + /** 设备编号 */ + @Excel(name = "设备编号") + private String deviceCode; + + /** 设备名称 */ + @Excel(name = "设备名称") + private String deviceName; + + /** 设备类型 */ + @Excel(name = "设备类型") + private String deviceType; + + /** 设备状态(0正常 1停用) */ + @Excel(name = "设备状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 电池容量(Ah) */ + @Excel(name = "电池容量") + private Double batteryCapacity; + + /** 额定电压(V) */ + @Excel(name = "额定电压") + private Double ratedVoltage; + + /** 当前电压(V) */ + private Double currentVoltage; + + /** 当前电流(A) */ + private Double currentCurrent; + + /** 剩余电量(%) */ + private Double remainingCapacity; + + /** 温度(℃) */ + private Double temperature; + + /** 最后通信时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date lastCommTime; + + /** 删除标志(0代表存在 2代表删除) */ + @TableLogic + private String delFlag; + + /** 版本号(乐观锁) */ + @Version + private Integer version; + + public void setDeviceId(Long deviceId) { + this.deviceId = deviceId; + } + + public Long getDeviceId() { + return deviceId; + } + + public void setDeviceCode(String deviceCode) { + this.deviceCode = deviceCode; + } + + public String getDeviceCode() { + return deviceCode; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceType() { + return deviceType; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + + public void setBatteryCapacity(Double batteryCapacity) { + this.batteryCapacity = batteryCapacity; + } + + public Double getBatteryCapacity() { + return batteryCapacity; + } + + public void setRatedVoltage(Double ratedVoltage) { + this.ratedVoltage = ratedVoltage; + } + + public Double getRatedVoltage() { + return ratedVoltage; + } + + public void setCurrentVoltage(Double currentVoltage) { + this.currentVoltage = currentVoltage; + } + + public Double getCurrentVoltage() { + return currentVoltage; + } + + public void setCurrentCurrent(Double currentCurrent) { + this.currentCurrent = currentCurrent; + } + + public Double getCurrentCurrent() { + return currentCurrent; + } + + public void setRemainingCapacity(Double remainingCapacity) { + this.remainingCapacity = remainingCapacity; + } + + public Double getRemainingCapacity() { + return remainingCapacity; + } + + public void setTemperature(Double temperature) { + this.temperature = temperature; + } + + public Double getTemperature() { + return temperature; + } + + public void setLastCommTime(Date lastCommTime) { + this.lastCommTime = lastCommTime; + } + + public Date getLastCommTime() { + return lastCommTime; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDelFlag() { + return delFlag; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Integer getVersion() { + return version; + } + + @Override + public String toString() { + return "BmsDevice{" + + "deviceId=" + deviceId + + ", deviceCode='" + deviceCode + '\'' + + ", deviceName='" + deviceName + '\'' + + ", deviceType='" + deviceType + '\'' + + ", status='" + status + '\'' + + ", batteryCapacity=" + batteryCapacity + + ", ratedVoltage=" + ratedVoltage + + ", currentVoltage=" + currentVoltage + + ", currentCurrent=" + currentCurrent + + ", remainingCapacity=" + remainingCapacity + + ", temperature=" + temperature + + ", lastCommTime=" + lastCommTime + + ", delFlag='" + delFlag + '\'' + + ", version=" + version + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/bms/mapper/BmsDeviceMapper.java b/src/main/java/com/evobms/project/bms/mapper/BmsDeviceMapper.java new file mode 100644 index 0000000..b1edfe5 --- /dev/null +++ b/src/main/java/com/evobms/project/bms/mapper/BmsDeviceMapper.java @@ -0,0 +1,43 @@ +package com.evobms.project.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evobms.project.bms.domain.BmsDevice; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * BMS设备Mapper接口 + * + * @author evobms + * @date 2025-01-22 + */ +@Mapper +public interface BmsDeviceMapper extends BaseMapper { + + /** + * 查询BMS设备列表 + * + * @param bmsDevice BMS设备 + * @return BMS设备集合 + */ + List selectBmsDeviceList(BmsDevice bmsDevice); + + /** + * 根据设备编号查询设备信息 + * + * @param deviceCode 设备编号 + * @return BMS设备 + */ + BmsDevice selectBmsDeviceByCode(@Param("deviceCode") String deviceCode); + + /** + * 批量更新设备状态 + * + * @param deviceIds 设备ID数组 + * @param status 状态 + * @return 结果 + */ + int updateBmsDeviceStatus(@Param("deviceIds") Long[] deviceIds, @Param("status") String status); +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/bms/service/IBmsDeviceService.java b/src/main/java/com/evobms/project/bms/service/IBmsDeviceService.java new file mode 100644 index 0000000..88987ca --- /dev/null +++ b/src/main/java/com/evobms/project/bms/service/IBmsDeviceService.java @@ -0,0 +1,80 @@ +package com.evobms.project.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.evobms.project.bms.domain.BmsDevice; + +import java.util.List; + +/** + * BMS设备Service接口 + * + * @author evobms + * @date 2025-01-22 + */ +public interface IBmsDeviceService extends IService { + + /** + * 查询BMS设备 + * + * @param deviceId BMS设备主键 + * @return BMS设备 + */ + BmsDevice selectBmsDeviceByDeviceId(Long deviceId); + + /** + * 查询BMS设备列表 + * + * @param bmsDevice BMS设备 + * @return BMS设备集合 + */ + List selectBmsDeviceList(BmsDevice bmsDevice); + + /** + * 新增BMS设备 + * + * @param bmsDevice BMS设备 + * @return 结果 + */ + int insertBmsDevice(BmsDevice bmsDevice); + + /** + * 修改BMS设备 + * + * @param bmsDevice BMS设备 + * @return 结果 + */ + int updateBmsDevice(BmsDevice bmsDevice); + + /** + * 批量删除BMS设备 + * + * @param deviceIds 需要删除的BMS设备主键集合 + * @return 结果 + */ + int deleteBmsDeviceByDeviceIds(Long[] deviceIds); + + /** + * 删除BMS设备信息 + * + * @param deviceId BMS设备主键 + * @return 结果 + */ + int deleteBmsDeviceByDeviceId(Long deviceId); + + /** + * 根据设备编号查询设备信息 + * + * @param deviceCode 设备编号 + * @return BMS设备 + */ + BmsDevice selectBmsDeviceByCode(String deviceCode); + + /** + * 批量更新设备状态 + * + * @param deviceIds 设备ID数组 + * @param status 状态 + * @return 结果 + */ + int updateBmsDeviceStatus(Long[] deviceIds, String status); +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/bms/service/MqttService.java b/src/main/java/com/evobms/project/bms/service/MqttService.java new file mode 100644 index 0000000..8653427 --- /dev/null +++ b/src/main/java/com/evobms/project/bms/service/MqttService.java @@ -0,0 +1,933 @@ +package com.evobms.project.bms.service; + +import com.alibaba.fastjson2.JSON; +import com.evobms.project.bms.domain.BmsDevice; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.messaging.MessageChannel; +import org.springframework.stereotype.Service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.GeneralSecurityException; + +import com.evobms.project.system.service.IBmsDevicesService; +import com.evobms.project.system.domain.BmsDevices; + +import static com.evobms.project.bms.controller.GBT32960FullDecoder.parseGBT32960Data; +import static oshi.util.ParseUtil.hexStringToByteArray; + +/** + * MQTT服务类 + * 只有在mqtt.enabled=true时才会加载此服务 + * + * @author evobms + */ +@Service +@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true") +public class MqttService { + private static final Logger log = LoggerFactory.getLogger(MqttService.class); + + @Autowired + private MessageChannel mqttOutboundChannel; + + @Autowired + private IBmsDevicesService bmsDevicesService; + + @Value("${mqtt.publishTopic}") + private String publishTopic; + + @Value("${mqtt.defaultQos}") + private int defaultQos; + + @Value("${mqtt.dataHeaderLength:12}") + private int dataHeaderLength; + + /** + * 发送MQTT消息 + * + * @param topic 主题 + * @param payload 消息内容 + */ + public void sendMessage(String topic, String payload) { + log.info("发送MQTT消息 -> 主题: {}, QOS: {}, 载荷: {}", topic, defaultQos, payload); + mqttOutboundChannel.send(MessageBuilder.withPayload(payload) + .setHeader("mqtt_topic", topic) + .setHeader("mqtt_qos", defaultQos) + .build()); + } + + /** + * 发送MQTT字节消息 + * + * @param topic 主题 + * @param payload 原始字节 + */ + public void sendMessageBytes(String topic, byte[] payload) { + log.info("发送MQTT字节消息 -> 主题: {}, QOS: {}, 长度: {}, HEX: {}", topic, defaultQos, payload.length, toHex(payload)); + mqttOutboundChannel.send(MessageBuilder.withPayload(payload) + .setHeader("mqtt_topic", topic) + .setHeader("mqtt_qos", defaultQos) + .build()); + } + + private static String toHex(byte[] bytes) { + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + sb.append(String.format("%02X ", b)); + } + return sb.toString().trim(); + } + + private static byte[] parseHex(String hex) { + String cleaned = hex.replaceAll("[^0-9A-Fa-f]", ""); + if ((cleaned.length() % 2) != 0) { + throw new IllegalArgumentException("HEX长度不是偶数"); + } + int len = cleaned.length() / 2; + byte[] out = new byte[len]; + for (int i = 0; i < len; i++) { + int hi = Character.digit(cleaned.charAt(2 * i), 16); + int lo = Character.digit(cleaned.charAt(2 * i + 1), 16); + out[i] = (byte) ((hi << 4) | lo); + } + return out; + } + + private static byte computeBcc(byte[] buf, int startInclusive, int endExclusive) { + byte b = 0; + for (int i = startInclusive; i < endExclusive; i++) { + b ^= buf[i]; + } + return b; + } + + private static byte[] deriveKeyFromSn(String sn) { + byte[] key = new byte[16]; + byte[] snBytes = sn == null ? new byte[0] : sn.getBytes(StandardCharsets.UTF_8); + int copy = Math.min(snBytes.length, 16); + System.arraycopy(snBytes, 0, key, 0, copy); + return key; + } + + private static byte[] aesEcbPkcs5Decrypt(byte[] ciphertext, byte[] key) throws GeneralSecurityException { + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + SecretKeySpec spec = new SecretKeySpec(key, "AES"); + cipher.init(Cipher.DECRYPT_MODE, spec); + return cipher.doFinal(ciphertext); + } + + private static byte[] aesEcbPkcs5Encrypt(byte[] plaintext, byte[] key) throws GeneralSecurityException { + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + SecretKeySpec spec = new SecretKeySpec(key, "AES"); + cipher.init(Cipher.ENCRYPT_MODE, spec); + return cipher.doFinal(plaintext); + } + + /** + * 发送设备控制命令 + * + * @param deviceCode 设备编号 + * @param command 控制命令 + */ + public void sendDeviceCommand(String deviceCode, String command) { + Map commandData = new HashMap<>(); + commandData.put("deviceCode", deviceCode); + commandData.put("command", command); + commandData.put("timestamp", new Date()); + + String topic = "evobms/" + deviceCode + "/command"; + String payload = JSON.toJSONString(commandData); + + sendMessage(topic, payload); + } + + /** + * 处理接收到的设备数据 + * + * @param topic 主题 + * @param message 消息内容 + */ + public void handleDeviceData(String topic, byte[] message) { + try { + // 从主题提取设备唯一编号(紧跟在"bbox"后面的段) + String[] topicParts = topic.split("/"); + String deviceCode = null; + for (int i = 0; i < topicParts.length - 1; i++) { + if ("bbox".equalsIgnoreCase(topicParts[i])) { + deviceCode = topicParts[i + 1]; + break; + } + } + if (deviceCode == null) { + // 兜底:考虑有无前导斜杠 + deviceCode = topicParts[topic.startsWith("/") ? 2 : 1]; + } + + log.info("处理设备数据 -> 设备: {}, 主题: {}, 长度: {}", deviceCode, topic, message == null ? 0 : message.length); + + // 根据设备唯一编号查询系统表的SN码;查询不到则回退使用deviceCode + String deviceSn = lookupDeviceSnByCode(deviceCode); + if (deviceSn == null || deviceSn.isEmpty()) { + deviceSn = deviceCode; + } + + // 直接解析GB/T 32960二进制帧 + String data = parseGBT32960Data(message, deviceSn); + // 逐字段解析返回的data字符串 + parseDataFields(data, deviceSn); + } catch (Exception e) { + log.error("处理设备数据时发生错误: {}", e.getMessage(), e); + } + } + /** + * 逐字段解析数据字符串 - 直接解析十六进制数据 + * + * @param data 十六进制数据字符串 + * @param deviceSn 设备SN码 + */ + private void parseDataFields(String data, String deviceSn) { + if (data == null || data.isEmpty()) { + log.warn("设备 {}: 无有效数据可解析", deviceSn); + return; + } + try { + log.info("设备 {} 原始数据: {}", deviceSn, data); + + // 清理数据,移除非十六进制字符 + String cleanData = data.replaceAll("[^0-9A-Fa-f]", ""); + + if (cleanData.length() < 4) { + log.warn("设备 {}: 数据长度不足", deviceSn); + return; + } + + // 将十六进制字符串转换为字节数组 + byte[] message = hexStringToByteArray(cleanData); + + // 直接解析字节数组 + parseMessageBytes(message, deviceSn); + + } catch (Exception e) { + log.error("设备 {} 解析数据字段时发生错误: {}", deviceSn, e.getMessage(), e); + } + } + + /** + * 解析字节数组数据 - 修正版(基于测试代码校准) + */ + private void parseMessageBytes(byte[] message, String deviceSn) { + if (message == null || message.length < 4) { + log.warn("设备 {}: 数据长度不足", deviceSn); + return; + } + + try { + int index = 0; + + log.info("设备 {} 完整数据长度: {} 字节", deviceSn, message.length); + + // 1. 起始位 (2字节) + byte startByte1 = message[index++]; + byte startByte2 = message[index++]; + log.info("设备 {} - 起始位: 0x{} 0x{}", deviceSn, + String.format("%02X", startByte1), String.format("%02X", startByte2)); + + // 2. 命令标识 (1字节) + byte commandFlag = message[index++]; + String commandType = (commandFlag == 0x02) ? "实时信息" : + (commandFlag == 0x03) ? "补发信息" : "自定义协议"; + log.info("设备 {} - 命令标识: 0x{} ({})", deviceSn, + String.format("%02X", commandFlag), commandType); + + // 3. 应答标识 (1字节) + byte responseFlag = message[index++]; + log.info("设备 {} - 应答标识: 0x{}", deviceSn, String.format("%02X", responseFlag)); + + // 4. 时间信息 - 修正时间解析逻辑 + if (message.length > index + 5) { + int year = (message[index++] & 0xFF) + 2000; + int month = message[index++] & 0xFF; + int day = message[index++] & 0xFF; + int hour = message[index++] & 0xFF; + int minute = message[index++] & 0xFF; + int second = message[index++] & 0xFF; + + // 更严格的时间有效性检查 + if (isValidTime(year, month, day, hour, minute, second)) { + String time = String.format("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, second); + log.info("设备 {} - 时间: {}", deviceSn, time); + saveTimeData(deviceSn, time); + } else { + log.info("设备 {} - 时间: 无效时间数据({}-{}-{} {}:{}:{})", + deviceSn, year, month, day, hour, minute, second); + // 不退回索引,继续处理后续数据 + } + } + + // 5. 查找数据段标识 + while (index < message.length - 10) { + byte dataFlag = message[index]; + + switch (dataFlag) { + case (byte) 0xFF: // 跳过填充字节 + index++; + break; + case 0x01: // 整车数据 + index = parseVehicleData(message, index, deviceSn); + break; + /* case 0x05: // 位置信息 + index = parseLocationData(message, index, deviceSn); + break;*/ + case 0x06: // 极值数据 + index = parseExtremeData(message, index, deviceSn); + break; + case 0x08: // 单体电压数据 + index = parseCellVoltageData(message, index, deviceSn); + break; + case 0x09: // 单体温度数据 + index = parseCellTemperatureData(message, index, deviceSn); + break; + case (byte) 0x80: // 累计充放电量 + index = parseChargeDischargeData(message, index, deviceSn); + break; + default: + // 检查是否是有效的数据标识 + if (isDataIdentifier(dataFlag)) { + log.info("设备 {} - 未知数据标识: 0x{}", deviceSn, String.format("%02X", dataFlag)); + } + index++; + break; + } + + if (index >= message.length) { + break; + } + } + + log.info("设备 {} 数据解析完成,总处理字节数: {}", deviceSn, index); + + } catch (Exception e) { + log.error("设备 {} 解析字节数据时发生错误: {}", deviceSn, e.getMessage(), e); + } + } + + /** + * 检查时间有效性 - 更严格的检查 + */ + private boolean isValidTime(int year, int month, int day, int hour, int minute, int second) { + // 排除明显的无效值(0xFF等) + if (year > 2100 || month == 0 || month > 12 || day == 0 || day > 31 || + hour > 23 || minute > 59 || second > 59) { + return false; + } + + // 基本合理性检查 + return year >= 2020 && year <= 2100 && + month >= 1 && month <= 12 && + day >= 1 && day <= 31 && + hour >= 0 && hour <= 23 && + minute >= 0 && minute <= 59 && + second >= 0 && second <= 59; + } + + /** + * 检查是否是数据标识 + */ + private boolean isDataIdentifier(byte flag) { + return flag == 0x01 || flag == 0x05 || flag == 0x06 || + flag == 0x08 || flag == 0x09 || flag == (byte) 0x80; + } + + /** + * 解析整车数据 - 修正版 + */ + private int parseVehicleData(byte[] message, int index, String deviceSn) { + try { + log.info("设备 {} - 发现整车数据标识: 0x{}", deviceSn, String.format("%02X", message[index])); + index++; // 跳过数据标识(0x01) + + if (message.length > index + 12) { + // 充电状态 (索引32) + byte chargeStatus = message[index]; + String chargeStatusDesc = getChargeStatusDescription(chargeStatus); + log.info("设备 {} - 充电状态: 0x{} ({})", deviceSn, + String.format("%02X", chargeStatus), chargeStatusDesc); + + // 跳过保留字节 (索引33-39) + index += 8; + + // 总电压 (索引40-41) - 单位:0.1V + int totalVoltage = ((message[index] & 0xFF) << 8) | (message[index + 1] & 0xFF); + index += 2; + double voltageValue = totalVoltage * 0.1; + log.info("设备 {} - 总电压: {} V", deviceSn, voltageValue); + + // 总电流 (索引42-43) - 修正电流计算 + int totalCurrent = ((message[index] & 0xFF) << 8) | (message[index + 1] & 0xFF); + index += 2; + double currentValue = calculateCurrent(totalCurrent); + log.info("设备 {} - 总电流: {} A", deviceSn, currentValue); + + // SOC (索引44) - 单位:% + int soc = message[index++] & 0xFF; + log.info("设备 {} - SOC: {} %", deviceSn, soc); + + // 跳过保留字节 (索引45-46) + index += 2; + + // 正极绝缘电阻 (索引47-48) - 单位:Ω + int insulationResistance = ((message[index] & 0xFF) << 8) | (message[index + 1] & 0xFF); + index += 2; + log.info("设备 {} - 正极绝缘电阻: {} Ω", deviceSn, insulationResistance); + + } else { + log.warn("设备 {} - 整车数据长度不足", deviceSn); + index += 9; // 跳过整车数据段 + } + + } catch (Exception e) { + log.error("设备 {} 解析整车数据时发生错误: {}", deviceSn, e.getMessage()); + } + + return index; + } + + /** + * 解析极值数据 - 修正版 + */ + private int parseExtremeData(byte[] message, int index, String deviceSn) { + try { + log.info("设备 {} - 发现极值数据标识: 0x{}", deviceSn, String.format("%02X", message[index])); + index++; // 跳过数据标识(0x06) + + if (message.length > index + 13) { + // 最高电压信息 (索引62-65) + byte maxVoltageSystem = message[index++]; + byte maxVoltageProbe = message[index++]; + int maxVoltage = ((message[index] & 0xFF) << 8) | (message[index + 1] & 0xFF); + index += 2; + double maxVoltageValue = maxVoltage * 0.001; // 修正:单位V,不是mV + log.info("设备 {} - 最高电压: 子系统{}-探针{}, {}V", deviceSn, + maxVoltageSystem, maxVoltageProbe, maxVoltageValue); + + // 最低电压信息 (索引66-69) + byte minVoltageSystem = message[index++]; + byte minVoltageProbe = message[index++]; + int minVoltage = ((message[index] & 0xFF) << 8) | (message[index + 1] & 0xFF); + index += 2; + double minVoltageValue = minVoltage * 0.001; // 修正:单位V,不是mV + log.info("设备 {} - 最低电压: 子系统{}-探针{}, {}V", deviceSn, + minVoltageSystem, minVoltageProbe, minVoltageValue); + + // 最高温度信息 (索引70-72) + byte maxTempSystem = message[index++]; + byte maxTempProbe = message[index++]; + byte maxTemperature = message[index++]; + int maxTempValue = maxTemperature - 40; // 温度偏移量-40°C + log.info("设备 {} - 最高温度: 子系统{}-探针{}, {}°C", deviceSn, + maxTempSystem, maxTempProbe, maxTempValue); + + // 最低温度信息 (索引73-75) + byte minTempSystem = message[index++]; + byte minTempProbe = message[index++]; + byte minTemperature = message[index++]; + int minTempValue = minTemperature - 40; // 温度偏移量-40°C + log.info("设备 {} - 最低温度: 子系统{}-探针{}, {}°C", deviceSn, + minTempSystem, minTempProbe, minTempValue); + + } else { + log.warn("设备 {} - 极值数据长度不足", deviceSn); + index += 14; + } + + } catch (Exception e) { + log.error("设备 {} 解析极值数据时发生错误: {}", deviceSn, e.getMessage()); + } + + return index; + } + + /** + * 解析单体电压数据 - 修正版 + */ + private int parseCellVoltageData(byte[] message, int index, String deviceSn) { + try { + log.info("设备 {} - 发现单体电压数据标识: 0x{}", deviceSn, String.format("%02X", message[index])); + index++; // 跳过数据标识(0x08) + + if (message.length > index + 10) { + // 子系统信息 + byte subsystemCount = message[index++]; + byte subsystemNum = message[index++]; + + // 可充电储能装置总压 (索引79-80) + int storageVoltage = ((message[index] & 0xFF) << 8) | (message[index + 1] & 0xFF); + index += 2; + double storageVoltageValue = storageVoltage * 0.1; + log.info("设备 {} - 储能装置总压: {} V", deviceSn, storageVoltageValue); + + // 可充电储能装置总流 (索引81-82) + int storageCurrent = ((message[index] & 0xFF) << 8) | (message[index + 1] & 0xFF); + index += 2; + double storageCurrentValue = calculateCurrent(storageCurrent); + log.info("设备 {} - 储能装置总流: {} A", deviceSn, storageCurrentValue); + + // 单体电压总数 (索引83-84) + int totalCellCount = ((message[index] & 0xFF) << 8) | (message[index + 1] & 0xFF); + index += 2; + + // 本帧起始电芯序号 (索引85-86) + int startCellIndex = ((message[index] & 0xFF) << 8) | (message[index + 1] & 0xFF); + index += 2; + + // 本帧电芯总数 (索引87) + int frameCellCount = message[index++] & 0xFF; + + log.info("设备 {} - 单体电压概要: 子系统{}/{}, 总数{}个, 本帧{}-{}", deviceSn, + subsystemNum, subsystemCount, totalCellCount, + startCellIndex, startCellIndex + frameCellCount - 1); + + // 解析单体电压数据 + if (message.length >= index + frameCellCount * 2) { + parseCellVoltages(message, index, deviceSn, startCellIndex, frameCellCount); + index += frameCellCount * 2; + } else { + log.warn("设备 {} - 单体电压数据长度不足,期望{}字节,实际剩余{}字节", + deviceSn, frameCellCount * 2, message.length - index); + index = message.length; // 跳到结尾 + } + } else { + log.warn("设备 {} - 单体电压数据头长度不足", deviceSn); + } + + } catch (Exception e) { + log.error("设备 {} 解析单体电压数据时发生错误: {}", deviceSn, e.getMessage(), e); + } + + return index; + } + + /** + * 解析单体温度数据 - 修正版 + */ + private int parseCellTemperatureData(byte[] message, int index, String deviceSn) { + try { + log.info("设备 {} - 发现单体温度数据标识: 0x{}", deviceSn, String.format("%02X", message[index])); + index++; // 跳过数据标识(0x09) + + if (message.length > index + 5) { + // 子系统信息 + byte subsystemCount = message[index++]; + byte subsystemNum = message[index++]; + + // 单体温度总数 (索引451-452) + int totalTempCount = ((message[index] & 0xFF) << 8) | (message[index + 1] & 0xFF); + index += 2; + + log.info("设备 {} - 单体温度概要: 子系统{}/{}, 总数{}个", deviceSn, + subsystemNum, subsystemCount, totalTempCount); + + // 解析单体温度数据 + if (message.length >= index + totalTempCount) { + parseCellTemperatures(message, index, deviceSn, totalTempCount); + index += totalTempCount; + } else { + log.warn("设备 {} - 单体温度数据长度不足", deviceSn); + index = message.length; + } + } else { + log.warn("设备 {} - 单体温度数据头长度不足", deviceSn); + } + + } catch (Exception e) { + log.error("设备 {} 解析单体温度数据时发生错误: {}", deviceSn, e.getMessage(), e); + } + + return index; + } + + /** + * 解析累计充放电量 + */ + private int parseChargeDischargeData(byte[] message, int index, String deviceSn) { + try { + log.info("设备 {} - 发现累计充放电标识: 0x{}", deviceSn, String.format("%02X", message[index])); + index++; // 跳过数据标识(0x80) + + if (message.length > index + 9) { + // 跳过保留字节 (索引544-545) + index += 2; + + // 累计放电电量 (索引546-549) + long dischargeEnergy = ((message[index] & 0xFFL) << 24) | + ((message[index + 1] & 0xFFL) << 16) | + ((message[index + 2] & 0xFFL) << 8) | + (message[index + 3] & 0xFFL); + index += 4; + + // 累计充电电量 (索引550-553) + long chargeEnergy = ((message[index] & 0xFFL) << 24) | + ((message[index + 1] & 0xFFL) << 16) | + ((message[index + 2] & 0xFFL) << 8) | + (message[index + 3] & 0xFFL); + index += 4; + + double dischargeKwh = dischargeEnergy * 0.1; // 单位:0.1kWh + double chargeKwh = chargeEnergy * 0.1; + + log.info("设备 {} - 累计充放电量: 放电{}kWh, 充电{}kWh", deviceSn, dischargeKwh, chargeKwh); + + saveChargeDischargeSummary(deviceSn, dischargeKwh, chargeKwh); + + } else { + log.warn("设备 {} - 充放电数据长度不足", deviceSn); + index += 10; + } + + } catch (Exception e) { + log.error("设备 {} 解析充放电数据时发生错误: {}", deviceSn, e.getMessage(), e); + } + + return index; + } + +// ========== 辅助方法 ========== + + /** + * 计算电流值 - 根据协议调整 + */ + private double calculateCurrent(int rawCurrent) { + // 根据测试数据调整电流计算公式 + // 原始公式: (rawCurrent - 10000) * 0.1 + // 需要根据实际测试数据校准 + return (rawCurrent - 10000) * 0.1; + } + + /** + * 获取充电状态描述 + */ + private String getChargeStatusDescription(byte chargeStatus) { + switch (chargeStatus & 0xFF) { + case 0x01: return "停车充电"; + case 0x02: return "行驶充电"; + case 0x03: return "未充电"; + case 0x04: return "充电完成"; + case 0xFF: return "无效值"; + default: return "未知状态"; + } + } + + /** + * 解析单体电压详细数据 + */ + private void parseCellVoltages(byte[] message, int startIndex, String deviceSn, + int startCellIndex, int cellCount) { + try { + List voltages = new ArrayList<>(); + int validCount = 0; + + for (int i = 0; i < cellCount; i++) { + int voltage = ((message[startIndex + i * 2] & 0xFF) << 8) | + (message[startIndex + i * 2 + 1] & 0xFF); + double voltageValue = voltage * 0.001; // 单位:V + voltages.add(voltageValue); + + if (voltage > 0) { + validCount++; + } + + // 记录前几个电芯电压 + if (i < 3) { + log.debug("设备 {} - 电芯{}电压: {}V", deviceSn, startCellIndex + i, voltageValue); + } + } + + if (validCount > 0) { + double minVoltage = voltages.stream().mapToDouble(v -> v).min().orElse(0); + double maxVoltage = voltages.stream().mapToDouble(v -> v).max().orElse(0); + double avgVoltage = voltages.stream().mapToDouble(v -> v).average().orElse(0); + + log.info("设备 {} - 电压统计: {}-{}号电芯, 有效{}/{}个, 范围{}-{}V, 平均{}V", + deviceSn, startCellIndex, startCellIndex + cellCount - 1, + validCount, cellCount, minVoltage, maxVoltage, avgVoltage); + } else { + log.info("设备 {} - 单体电压: 全部为0V", deviceSn); + } + } catch (Exception e) { + log.error("设备 {} 解析单体电压详细数据时发生错误: {}", deviceSn, e.getMessage()); + } + } + + /** + * 解析单体温度详细数据 + */ + private void parseCellTemperatures(byte[] message, int startIndex, String deviceSn, int tempCount) { + try { + List temperatures = new ArrayList<>(); + int validCount = 0; + + for (int i = 0; i < tempCount; i++) { + int temperature = message[startIndex + i] & 0xFF; + int tempValue = temperature - 40; // 温度偏移量 + temperatures.add(tempValue); + + if (temperature != 0) { + validCount++; + } + + // 记录前几个温度 + if (i < 3) { + log.debug("设备 {} - 温度探头{}: {}°C", deviceSn, i + 1, tempValue); + } + } + + if (validCount > 0) { + int minTemp = temperatures.stream().mapToInt(v -> v).min().orElse(0); + int maxTemp = temperatures.stream().mapToInt(v -> v).max().orElse(0); + double avgTemp = temperatures.stream().mapToInt(v -> v).average().orElse(0); + + log.info("设备 {} - 温度统计: 有效{}/{}个, 范围{}-{}°C, 平均{}°C", + deviceSn, validCount, tempCount, minTemp, maxTemp, avgTemp); + } else { + log.info("设备 {} - 单体温度: 全部为无效值", deviceSn); + } + } catch (Exception e) { + log.error("设备 {} 解析单体温度详细数据时发生错误: {}", deviceSn, e.getMessage()); + } + } + + /** + * 十六进制字符串转字节数组 + */ + private byte[] hexStringToByteArray(String hex) { + int len = hex.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + + Character.digit(hex.charAt(i + 1), 16)); + } + return data; + } + + + /** + * 保存单体电压数据 + */ + private void saveCellVoltageData(String deviceSn, byte subsystemNum, int startIndex, + int count, List voltages, double min, double max, double avg) { + // TODO: 实现单体电压数据保存逻辑 + log.debug("保存设备 {} 子系统 {} 电压数据: 起始{}, 数量{}, 范围{}-{}V", + deviceSn, subsystemNum, startIndex, count, min, max); + } + + /** + * 保存单体温度数据 + */ + private void saveCellTemperatureData(String deviceSn, byte subsystemNum, int count, + List temperatures, int min, int max, double avg) { + // TODO: 实现单体温度数据保存逻辑 + log.debug("保存设备 {} 子系统 {} 温度数据: 数量{}, 范围{}-{}°C", + deviceSn, subsystemNum, count, min, max); + } + + /** + * 保存充放电统计 + */ + private void saveChargeDischargeSummary(String deviceSn, double dischargeKwh, double chargeKwh) { + // TODO: 实现充放电数据保存逻辑 + log.debug("保存设备 {} 充放电统计: 放电{}kWh, 充电{}kWh", deviceSn, dischargeKwh, chargeKwh); + } + /** + * 保存时间数据 + */ + private void saveTimeData(String deviceSn, String time) { + // TODO: 实现时间数据保存逻辑 + log.debug("保存设备 {} 时间数据: {}", deviceSn, time); + } + /** + * 保存整车数据 + */ + private void saveVehicleData(String deviceSn, String voltage, String current, + String soc, String chargeStatus, String time) { + // TODO: 实现保存到数据库的逻辑 + // 示例:vehicleDataService.save(deviceSn, voltage, current, soc, chargeStatus, time); + } + + /** + * 处理位置数据 + */ + private void processLocationData(String deviceSn, String longitude, + String latitude, String time) { + // TODO: 实现位置数据处理逻辑 + // 示例:locationService.updateDeviceLocation(deviceSn, longitude, latitude, time); + } + + /** + * 保存极值数据 + */ + private void saveExtremeData(String deviceSn, String maxVoltage, String minVoltage, + String maxTemperature, String minTemperature, String time) { + // TODO: 实现极值数据保存逻辑 + } + + /** + * 处理单体电压数据 + */ + private void processCellVoltageData(String deviceSn, Map fieldMap) { + // TODO: 如果有详细的单体电压数据,在这里处理 + } + + /** + * 处理单体温度数据 + */ + private void processCellTemperatureData(String deviceSn, Map fieldMap) { + // TODO: 如果有详细的单体温度数据,在这里处理 + } + + /** + * 保存充放电数据 + */ + private void saveChargeDischargeData(String deviceSn, String dischargeEnergy, + String chargeEnergy, String time) { + // TODO: 实现充放电数据保存逻辑 + } + + + + + + + + + + + + + + + + + + + + + + + /** + * 更新设备数据 + * + * @param device 设备对象 + * @param data 数据 + */ + private void updateDeviceData(BmsDevice device, Map data) { + if (data.containsKey("voltage")) { + device.setCurrentVoltage(Double.valueOf(data.get("voltage").toString())); + } + if (data.containsKey("current")) { + device.setCurrentCurrent(Double.valueOf(data.get("current").toString())); + } + if (data.containsKey("capacity")) { + device.setRemainingCapacity(Double.valueOf(data.get("capacity").toString())); + } + if (data.containsKey("temperature")) { + device.setTemperature(Double.valueOf(data.get("temperature").toString())); + } + + device.setLastCommTime(new Date()); + } + + /** + * 发送设备状态查询命令 + * + * @param deviceCode 设备编号 + */ + public void queryDeviceStatus(String deviceCode) { + sendDeviceCommand(deviceCode, "STATUS_QUERY"); + } + + /** + * 发送设备重启命令 + * + * @param deviceCode 设备编号 + */ + public void restartDevice(String deviceCode) { + sendDeviceCommand(deviceCode, "RESTART"); + } + + /** + * 发送设备配置命令 + * + * @param deviceCode 设备编号 + * @param config 配置参数 + */ + public void configDevice(String deviceCode, Map config) { + Map commandData = new HashMap<>(); + commandData.put("deviceCode", deviceCode); + commandData.put("command", "CONFIG"); + commandData.put("config", config); + commandData.put("timestamp", new Date()); + + String topic = "evobms/" + deviceCode + "/command"; + String payload = JSON.toJSONString(commandData); + + sendMessage(topic, payload); + } + + // 下行加密与BCC组帧:传入头部与明文数据单元,返回整体帧(含BCC) + public byte[] buildEncryptedFrame(String deviceSn, byte[] header, byte[] plainDataUnit) { + try { + byte[] key = deriveKeyFromSn(deviceSn); + byte[] enc = aesEcbPkcs5Encrypt(plainDataUnit, key); + byte[] frame = new byte[header.length + enc.length + 1]; + System.arraycopy(header, 0, frame, 0, header.length); + System.arraycopy(enc, 0, frame, header.length, enc.length); + byte bcc = computeBcc(frame, 0, header.length + enc.length); + frame[frame.length - 1] = bcc; + return frame; + } catch (GeneralSecurityException e) { + log.error("AES加密失败: {}", e.getMessage(), e); + return new byte[0]; + } + } + + // 便捷:使用HEX传入头部与数据单元 + public byte[] buildEncryptedFrameFromHex(String deviceSn, String headerHex, String dataHex) { + byte[] header = parseHex(headerHex); + byte[] plain = parseHex(dataHex); + return buildEncryptedFrame(deviceSn, header, plain); + } + + // 计算不含BCC的HEX帧的BCC值(返回两位HEX字符串) + public String computeBccForHexFrame(String frameHexWithoutBcc) { + byte[] frame = parseHex(frameHexWithoutBcc); + byte bcc = computeBcc(frame, 0, frame.length); + return String.format("%02X", bcc); + } + /** + * 根据设备唯一编号(deviceCode)查询系统设备表的SN码 + */ + private String lookupDeviceSnByCode(String deviceCode) { + try { + BmsDevices query = new BmsDevices(); + query.setDeviceId(deviceCode); + List list = bmsDevicesService.selectBmsDevicesList(query); + if (list != null && !list.isEmpty()) { + String sn = list.get(0).getDeviceSn(); + if (sn != null && !sn.isEmpty()) { + return sn; + } + } + } catch (Exception e) { + log.warn("查询设备SN失败: {}", e.getMessage()); + } + return null; + } +} diff --git a/src/main/java/com/evobms/project/bms/service/impl/BmsDeviceServiceImpl.java b/src/main/java/com/evobms/project/bms/service/impl/BmsDeviceServiceImpl.java new file mode 100644 index 0000000..ca53c26 --- /dev/null +++ b/src/main/java/com/evobms/project/bms/service/impl/BmsDeviceServiceImpl.java @@ -0,0 +1,115 @@ +package com.evobms.project.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.evobms.common.utils.DateUtils; +import com.evobms.project.bms.domain.BmsDevice; +import com.evobms.project.bms.mapper.BmsDeviceMapper; +import com.evobms.project.bms.service.IBmsDeviceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * BMS设备Service业务层处理 + * + * @author evobms + * @date 2025-01-22 + */ +@Service +public class BmsDeviceServiceImpl extends ServiceImpl implements IBmsDeviceService { + + @Autowired + private BmsDeviceMapper bmsDeviceMapper; + + /** + * 查询BMS设备 + * + * @param deviceId BMS设备主键 + * @return BMS设备 + */ + @Override + public BmsDevice selectBmsDeviceByDeviceId(Long deviceId) { + return bmsDeviceMapper.selectById(deviceId); + } + + /** + * 查询BMS设备列表 + * + * @param bmsDevice BMS设备 + * @return BMS设备 + */ + @Override + public List selectBmsDeviceList(BmsDevice bmsDevice) { + return bmsDeviceMapper.selectBmsDeviceList(bmsDevice); + } + + /** + * 新增BMS设备 + * + * @param bmsDevice BMS设备 + * @return 结果 + */ + @Override + public int insertBmsDevice(BmsDevice bmsDevice) { + bmsDevice.setCreateTime(DateUtils.getNowDate()); + return bmsDeviceMapper.insert(bmsDevice); + } + + /** + * 修改BMS设备 + * + * @param bmsDevice BMS设备 + * @return 结果 + */ + @Override + public int updateBmsDevice(BmsDevice bmsDevice) { + bmsDevice.setUpdateTime(DateUtils.getNowDate()); + return bmsDeviceMapper.updateById(bmsDevice); + } + + /** + * 批量删除BMS设备 + * + * @param deviceIds 需要删除的BMS设备主键 + * @return 结果 + */ + @Override + public int deleteBmsDeviceByDeviceIds(Long[] deviceIds) { + return bmsDeviceMapper.deleteBatchIds(java.util.Arrays.asList(deviceIds)); + } + + /** + * 删除BMS设备信息 + * + * @param deviceId BMS设备主键 + * @return 结果 + */ + @Override + public int deleteBmsDeviceByDeviceId(Long deviceId) { + return bmsDeviceMapper.deleteById(deviceId); + } + + /** + * 根据设备编号查询设备信息 + * + * @param deviceCode 设备编号 + * @return BMS设备 + */ + @Override + public BmsDevice selectBmsDeviceByCode(String deviceCode) { + return bmsDeviceMapper.selectBmsDeviceByCode(deviceCode); + } + + /** + * 批量更新设备状态 + * + * @param deviceIds 设备ID数组 + * @param status 状态 + * @return 结果 + */ + @Override + public int updateBmsDeviceStatus(Long[] deviceIds, String status) { + return bmsDeviceMapper.updateBmsDeviceStatus(deviceIds, status); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/common/CaptchaController.java b/src/main/java/com/evobms/project/common/CaptchaController.java new file mode 100644 index 0000000..a09a7db --- /dev/null +++ b/src/main/java/com/evobms/project/common/CaptchaController.java @@ -0,0 +1,98 @@ +package com.evobms.project.common; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.FastByteArrayOutputStream; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import com.google.code.kaptcha.Producer; +import com.evobms.common.constant.CacheConstants; +import com.evobms.common.constant.Constants; +import com.evobms.common.utils.sign.Base64; +import com.evobms.common.utils.uuid.IdUtils; +import com.evobms.framework.redis.RedisCache; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.project.system.service.ISysConfigService; + +/** + * 验证码操作处理 + * + * @author ruoyi + */ +@RestController +public class CaptchaController +{ + @Resource(name = "captchaProducer") + private Producer captchaProducer; + + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + + @Autowired + private RedisCache redisCache; + + // 验证码类型 + @Value("${ruoyi.captchaType}") + private String captchaType; + + @Autowired + private ISysConfigService configService; + + /** + * 生成验证码 + */ + @GetMapping("/captchaImage") + public AjaxResult getCode(HttpServletResponse response) throws IOException + { + AjaxResult ajax = AjaxResult.success(); + boolean captchaEnabled = configService.selectCaptchaEnabled(); + ajax.put("captchaEnabled", captchaEnabled); + if (!captchaEnabled) + { + return ajax; + } + + // 保存验证码信息 + String uuid = IdUtils.simpleUUID(); + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; + + String capStr = null, code = null; + BufferedImage image = null; + + // 生成验证码 + 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); + } + + redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); + // 转换流信息写出 + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try + { + ImageIO.write(image, "jpg", os); + } + catch (IOException e) + { + return AjaxResult.error(e.getMessage()); + } + + ajax.put("uuid", uuid); + ajax.put("img", Base64.encode(os.toByteArray())); + return ajax; + } +} diff --git a/src/main/java/com/evobms/project/common/CommonController.java b/src/main/java/com/evobms/project/common/CommonController.java new file mode 100644 index 0000000..4ecb2d9 --- /dev/null +++ b/src/main/java/com/evobms/project/common/CommonController.java @@ -0,0 +1,162 @@ +package com.evobms.project.common; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.file.FileUploadUtils; +import com.evobms.common.utils.file.FileUtils; +import com.evobms.framework.config.RuoYiConfig; +import com.evobms.framework.config.ServerConfig; +import com.evobms.framework.web.domain.AjaxResult; + +/** + * 通用请求处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/common") +public class CommonController +{ + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + + @Autowired + private ServerConfig serverConfig; + + private static final String FILE_DELIMETER = ","; + + /** + * 通用下载请求 + * + * @param fileName 文件名称 + * @param delete 是否删除 + */ + @GetMapping("/download") + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) + { + try + { + if (!FileUtils.checkAllowDownload(fileName)) + { + throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); + } + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); + String filePath = RuoYiConfig.getDownloadPath() + fileName; + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) + { + FileUtils.deleteFile(filePath); + } + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } + + /** + * 通用上传请求(单个) + */ + @PostMapping("/upload") + public AjaxResult uploadFile(MultipartFile file) throws Exception + { + try + { + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + AjaxResult ajax = AjaxResult.success(); + ajax.put("url", url); + ajax.put("fileName", fileName); + ajax.put("newFileName", FileUtils.getName(fileName)); + ajax.put("originalFilename", file.getOriginalFilename()); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 通用上传请求(多个) + */ + @PostMapping("/uploads") + public AjaxResult uploadFiles(List files) throws Exception + { + try + { + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + List urls = new ArrayList(); + List fileNames = new ArrayList(); + List newFileNames = new ArrayList(); + List originalFilenames = new ArrayList(); + for (MultipartFile file : files) + { + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + urls.add(url); + fileNames.add(fileName); + newFileNames.add(FileUtils.getName(fileName)); + originalFilenames.add(file.getOriginalFilename()); + } + AjaxResult ajax = AjaxResult.success(); + ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); + ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); + ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); + ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 本地资源通用下载 + */ + @GetMapping("/download/resource") + public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) + throws Exception + { + try + { + if (!FileUtils.checkAllowDownload(resource)) + { + throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); + } + // 本地资源路径 + String localPath = RuoYiConfig.getProfile(); + // 数据库资源地址 + String downloadPath = localPath + FileUtils.stripPrefix(resource); + // 下载名称 + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, downloadName); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } +} diff --git a/src/main/java/com/evobms/project/iot/controller/IotAuthController.java b/src/main/java/com/evobms/project/iot/controller/IotAuthController.java new file mode 100644 index 0000000..0a8ee29 --- /dev/null +++ b/src/main/java/com/evobms/project/iot/controller/IotAuthController.java @@ -0,0 +1,636 @@ +package com.evobms.project.iot.controller; + +import com.alibaba.fastjson2.JSON; +import com.evobms.common.constant.BboxApiConstants; +import com.evobms.common.constant.Constants; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.AesEcbPkcs5Utils; +import com.evobms.project.iot.service.DeviceTokenService; +import com.evobms.project.system.domain.BmsDevices; +import com.evobms.project.system.service.IBmsDevicesService; +import com.evobms.project.ota.service.IOtaTasksService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +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.RequestParam; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletRequest; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.net.URI; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.SecureRandom; +import java.security.MessageDigest; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 设备鉴权令牌接口 + * 路径:POST /iot/auth/token + */ +@RestController +@RequestMapping("/iot") +public class IotAuthController { + private static final Logger log = LoggerFactory.getLogger(IotAuthController.class); + + @Autowired(required = false) + private IBmsDevicesService bmsDevicesService; + + @Autowired + private DeviceTokenService deviceTokenService; + + @Value("${token.header:Authorization}") + private String tokenHeader; + + @Value("${mqtt.host:tcp://localhost:1883}") + private String mqttHostUri; + @Value("${mqtt.username:00000001}") + private String mqttUsername; + @Value("${mqtt.password:741a03a10f3de6b2}") + private String mqttPassword; + + @Autowired(required = false) + private IOtaTasksService otaTasksService; + + @Value("${ota.count:001}") + private String otaCount; + + // OTA文件存储位置:支持 classpath 或 文件系统目录,例如:classpath:/ota 或 /data/ota + @Value("${ota.repo:classpath:/ota}") + private String otaRepo; + + // OTA分片大小(字节),规范为1KB=1024字节 + @Value("${ota.chunk-size:1024}") + private int otaChunkSize; + // 说明:首片头摘要计算基于“首片1024字节数据”;此项仅控制头部编码模式 + @Value("${ota.header-format:binary32}") + private String otaHeaderFormat; + + /** + * 设备请求令牌 + * 请求体:{ sn, device, version } + * 返回:{ code, success, token } + */ + @PostMapping("/auth/token") + public Map requestToken(@RequestBody Map body) { + String sn = safeTrim(body.get("sn")); + String model = safeTrim(body.get("device")); + String version = safeTrim(body.get("version")); + + MDC.put("sn", sn); + MDC.put("model", model); + MDC.put("version", version); + + Map resp = new HashMap<>(); + + try { + if (StringUtils.isEmpty(sn)) { + resp.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + resp.put("success", "0"); + return resp; + } + + // 根据规范:sn 作为设备唯一编码,这里映射为平台系统侧 BBOX 管理中的 deviceId + BmsDevices device = null; + if (bmsDevicesService != null) { + BmsDevices query = new BmsDevices(); + // 依据设备上报的SN,使用系统侧BmsDevices的deviceSn字段进行校验 + query.setDeviceSn(sn); + List list = bmsDevicesService.selectBmsDevicesList(query); + if (list != null && !list.isEmpty()) { + device = list.get(0); + } + } + + if (device == null) { + log.warn("设备未注册: sn={}", sn); + resp.put("code", BboxApiConstants.CODE_DEVICE_NOT_REGISTERED); + resp.put("success", "0"); + return resp; + } + + if ("1".equals(device.getStatus())) { // 1=停用/禁用 + log.warn("设备已被禁用: sn={}", sn); + resp.put("code", BboxApiConstants.CODE_DEVICE_DISABLED); + resp.put("success", "0"); + return resp; + } + + // 设备合法,改为自定义非JWT令牌,长度固定65 + String token = deviceTokenService.issueTokenForSn(sn); + log.info("BBOX设备token: {}", token); + log.info("设备令牌签发成功: sn={} model={} version={} tokenLen={}", sn, model, version, token != null ? token.length() : 0); + resp.put("code", BboxApiConstants.CODE_SUCCESS); + resp.put("success", "1"); + resp.put("token", token); + return resp; + } catch (Exception e) { + log.error("设备令牌签发异常: {}", e.getMessage(), e); + resp.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + resp.put("success", "0"); + return resp; + } finally { + MDC.clear(); + } + } + + private static String safeTrim(String s) { + return s == null ? null : s.trim(); + } + + /** + * 获取设备端 MQTT 登录信息 + * 类型:GET,请求头须带鉴权令牌:`Authorization: Bearer ` + * 路径:/iot/auth/mqtt + * 请求参数:version(可选) + * 返回:{ code, success, data(Base64) } + */ + @GetMapping("/auth/mqtt") + public Map getMqttCredentials(@RequestParam(value = "version", required = false) String version, + HttpServletRequest request) { + Map resp = new HashMap<>(); + try { + // 解析设备令牌,获取设备SN(非JWT) + String sn = deviceTokenService.resolveSn(request); + if (StringUtils.isEmpty(sn)) { + resp.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + resp.put("success", "0"); + return resp; + } + + // 解析 MQTT 主机与端口 + String host = "61.182.73.218"; + int port = 1883; + try { + URI uri = new URI(mqttHostUri); + if (uri.getHost() != null) { + host = uri.getHost(); + } + if (uri.getPort() != -1) { + port = uri.getPort(); + } + } catch (Exception ignore) {} + + String use = fixLengthRight(mqttUsername, 8); + String pass = fixLengthRight(mqttPassword,16); + + Map data = new HashMap<>(); + data.put("clientid", sn); + data.put("host", host); + data.put("port", String.valueOf(port)); + data.put("user", use); + data.put("passwd", pass); + + String json = JSON.toJSONString(data); + log.debug("登录mqtt信息====》{}",json); + String key16 = fixLengthRight(sn, 16); // AES密钥:sn后补0到16位 + String encryptedBase64 = AesEcbPkcs5Utils.encryptToAscII16(json, key16); + log.debug("登录mqtt信息加密===================》{}",encryptedBase64); + resp.put("code", BboxApiConstants.CODE_SUCCESS); + resp.put("success", "1"); + resp.put("data", encryptedBase64); + return resp; + } catch (Exception e) { + resp.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + resp.put("success", "0"); + return resp; + } + } + + /** + * 设备登录并上报固件版本,服务端判断是否需要OTA升级 + * 类型:POST,请求头须带鉴权令牌:`Authorization: Bearer ` + * 路径:/iot/auth/login + * 请求参数(body):{ "version":"1.0.0" } + * 返回:{ code(3位), success(1位), update(1位), version(5位), url(11位), count(3位) } + */ + @PostMapping("/auth/login") + public Map deviceLogin(@RequestBody(required = false) String body, @RequestParam(value = "version", required = false) String versionParam, HttpServletRequest request) { + Map resp = new HashMap<>(); + try { + // 解析自定义令牌获取设备SN + String sn = deviceTokenService.resolveSn(request); + if (StringUtils.isEmpty(sn)) { + resp.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + resp.put("success", "0"); + return resp; + } + String currVersion = safeTrim(versionParam); + if (StringUtils.isEmpty(currVersion) && body != null) { + String raw = body.trim(); + try { + Map m = JSON.parseObject(raw, Map.class); + currVersion = safeTrim(m.get("version")); + } catch (Exception ignore) { + int idxEq = raw.indexOf('='); + int idxColon = raw.indexOf(':'); + if (StringUtils.isEmpty(currVersion) && idxEq != -1) { + String key = safeTrim(raw.substring(0, idxEq)); + String val = safeTrim(raw.substring(idxEq + 1)); + if ("version".equalsIgnoreCase(key)) currVersion = val; + } + if (StringUtils.isEmpty(currVersion) && idxColon != -1) { + String key = safeTrim(raw.substring(0, idxColon)); + String val = safeTrim(raw.substring(idxColon + 1)); + if ("version".equalsIgnoreCase(key)) currVersion = val; + } + if (StringUtils.isEmpty(currVersion) && raw.matches("[0-9]+(\\.[0-9]+)*")) { + currVersion = raw; + } + } + } + MDC.put("sn", sn); + MDC.put("version", currVersion); + + if (StringUtils.isEmpty(sn)) { + resp.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + resp.put("success", "0"); + return resp; + } + + // 查询设备信息 + BmsDevices device = null; + if (bmsDevicesService != null) { + BmsDevices query = new BmsDevices(); + query.setDeviceSn(sn); + List list = bmsDevicesService.selectBmsDevicesList(query); + if (list != null && !list.isEmpty()) { + device = list.get(0); + } + } + + if (device == null) { + log.warn("设备未注册: sn={}", sn); + resp.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + resp.put("success", "0"); + return resp; + } + + // 目标升级版本:直接取设备记录中的固件版本(跳过 OTA 任务查询) + String targetVersion = null; + try { targetVersion = device.getFirmwareVersion(); + } catch (Exception ignore) { + + } + + // 版本比较,决定是否更新 + boolean needUpdate = false; + if (!StringUtils.isEmpty(targetVersion)) { + if (StringUtils.isEmpty(currVersion)) { + needUpdate = true; + } else { + needUpdate = isVersionGreater(targetVersion, currVersion); + } + } + + String update = needUpdate ? "1" : "0"; + String retVersion = fixOrTrimRight(needUpdate ? targetVersion : StringUtils.defaultString(currVersion), 5); + // 固件下载起始路径(设备从 000 分片开始下载),相对路径模式 + String url = "/iot/ota/000"; + // count 为分片总数,3 位字符串。优先动态计算;无法读取固件时回退至配置;不更新返回 "000" + String count; + if (needUpdate) { + // 若存在目标版本,对应固件可用时,动态计算分片总数(总长度含 64 字节校验头);否则回退配置值 + Integer dynamicCount = computeOtaChunkCount(targetVersion); + if (dynamicCount != null && dynamicCount > 0) { + // 转为 3 位字符串(左侧补零),例如 7 -> "007" + count = fixLengthLeft(String.valueOf(dynamicCount), 3); + } else { + // 回退使用配置 `ota.count`,默认 "001" + count = fixLengthLeft(StringUtils.defaultString(otaCount), 3); + } + } else { + // 不需要更新,设备无需下载,返回 "000" + count = fixLengthLeft("000", 3); + } + // 详细日志 + log.info("设备登录决策: sn={} currVersion={} targetVersion={} needUpdate={} count={}", + sn, currVersion, targetVersion, needUpdate, count); + + resp.put("code", BboxApiConstants.CODE_SUCCESS); + resp.put("success", "1"); + resp.put("update", update); + resp.put("version", retVersion); + resp.put("url", url); + resp.put("count", count); + return resp; + } catch (Exception e) { + resp.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + resp.put("success", "0"); + return resp; + } + } + + // 语义化版本比较:target > current 返回 true + private static boolean isVersionGreater(String target, String current) { + try { + String[] ta = StringUtils.defaultString(target).split("\\."); + String[] ca = StringUtils.defaultString(current).split("\\."); + int len = Math.max(ta.length, ca.length); + for (int i = 0; i < len; i++) { + int tv = i < ta.length ? Integer.parseInt(ta[i]) : 0; + int cv = i < ca.length ? Integer.parseInt(ca[i]) : 0; + if (tv != cv) return tv > cv; + } + return false; // 完全相等 + } catch (Exception e) { + // 解析异常时,仅判断不相等则视为需要更新 + return !StringUtils.equals(StringUtils.defaultString(target), StringUtils.defaultString(current)); + } + } + + /** + * OTA 固件分片下载接口(仅 binary32) + * - 鉴权:请求头需携带 `Authorization: Bearer `(与设备登录相同) + * - 路径:`/iot/ota/{num}`,num 为三位数字字符串(000 起始) + * - 参数:`version`(必填,目标固件版本号,例如 `1.0.1`) + * - 响应: + * 成功:`application/octet-stream` 二进制数据;每次返回最多 1024 字节(最后一片可能不足 1024) + * 失败:`{ code, success }` JSON,错误码沿用 `BboxApiConstants` + * - 首片摘要计算:针对首片1024字节数据生成摘要并作为校验头:32字节SHA-256原始摘要 + * - 首片结构:`[header] + [首片数据(最多1024)]`,总长 `headerLen + 1024` + * - 后续分片:与首片相同,每片前置相同模式的校验头(摘要基于该分片的数据),随后紧跟该分片数据 + */ + @GetMapping("/ota/{num}") + public Object downloadOtaChunk(@PathVariable("num") String num, + @RequestParam(value = "version", required = false) String version, + HttpServletRequest request) { + Map err = new HashMap<>(); + try { + // BBOX设备鉴权 + String sn = deviceTokenService.resolveSn(request); + if (StringUtils.isEmpty(sn)) { + log.warn("OTA下载未授权: Authorization 缺失或无效"); + err.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + err.put("success", "0"); + return err; + } + MDC.put("sn", sn); + MDC.put("version", version); + + if (StringUtils.isEmpty(version)) { + //固件文件不存在 + log.warn("OTA下载版本缺失: sn={}", sn); + err.put("code", BboxApiConstants.CODE_FILE_NOT_FOUND); + err.put("success", "0"); + return err; + } + + // 加载固件并构造带校验头的负载 + byte[] firmware = loadFirmwareBytes(version); + if (firmware == null || firmware.length == 0) { + log.warn("OTA固件不存在: sn={} version={} repo={}", sn, version, otaRepo); + err.put("code", BboxApiConstants.CODE_FILE_NOT_FOUND); + err.put("success", "0"); + return err; + } + // 校验分片编号 + if (StringUtils.isEmpty(num) || num.length() != 3) { + log.warn("OTA分片编号非法: sn={} version={} num={}", sn, version, num); + err.put("code", BboxApiConstants.CODE_NOT_FOUND); + err.put("success", "0"); + return err; + } + int idx; + try { + idx = Integer.parseInt(num); + } catch (Exception e) { + log.warn("OTA分片编号解析失败: sn={} version={} num={}", sn, version, num); + err.put("code", BboxApiConstants.CODE_NOT_FOUND); + err.put("success", "0"); + return err; + } + + //计算总分片数 + int firmwareBytes = firmware.length; + int chunks = (firmwareBytes + otaChunkSize - 1) / otaChunkSize; + if (idx == 0) { + try { + int previewLen = Math.min(otaChunkSize, firmwareBytes); + byte[] preview = Arrays.copyOfRange(firmware, 0, previewLen); + // 变更说明:headerSHA256日志打印为“首片1024字节数据”的摘要,而非整包 + String headerHex = sha256Hex(preview); + log.info("OTA下载开始: sn={} version={} headerSHA256={} headerMode={} chunkSize={} firmwareBytes={} chunks={}", sn, version, headerHex, "binary32", otaChunkSize, firmwareBytes, chunks); + } catch (Exception ignore) { + log.info("OTA下载开始: sn={} version={} headerMode={} chunkSize={} firmwareBytes={} chunks={}", sn, version, "binary32", otaChunkSize, firmwareBytes, chunks); + } + } + + // 组包分片:首片返回 [header] + byte[] chunk; + String mode = "binary32"; + if (idx == 0) { + // :头部 + 实际数据(首片不补齐) + int firstDataLen = Math.min(otaChunkSize, firmwareBytes); + byte[] firstData = Arrays.copyOfRange(firmware, 0, firstDataLen); + byte[] header = sha256Bytes(firstData); + int headerLen = header.length; + // 合并 header 与首片固件数据,首片总长 = headerLen + firstDataLen + chunk = new byte[headerLen + firstDataLen]; + System.arraycopy(header, 0, chunk, 0, headerLen); + System.arraycopy(firstData, 0, chunk, headerLen, firstDataLen); + + log.info("OTA首片长度: sn={} version={} num={} headerMode={} headerLen={} dataLen={} totalLen={}", + sn, version, num, mode, headerLen, firstDataLen, chunk.length); + try { + log.info("OTA首片头HEX({}): {}", headerLen, toHex(header)); + int prefixLen = Math.min(64, firstData.length); + log.info("OTA首片数据HEX前{}字节: {}", prefixLen, toHex(Arrays.copyOfRange(firstData, 0, prefixLen))); + } catch (Exception ignore) {} + } else { + // 后续分片:从首片实际数据(1024)之后开始切片;并在分片前置校验头(摘要基于该分片数据) + int firstDataLen = Math.min(otaChunkSize, firmwareBytes); + int offset = firstDataLen + (idx - 1) * otaChunkSize; + if (offset >= firmwareBytes) { + log.warn("OTA分片越界: sn={} version={} num={} offset={} firmwareBytes={} chunks={}", sn, version, num, offset, firmwareBytes, chunks); + err.put("code", BboxApiConstants.CODE_NOT_FOUND); + err.put("success", "0"); + return err; + } + int dataLen = Math.min(otaChunkSize, firmwareBytes - offset); + byte[] data = Arrays.copyOfRange(firmware, offset, offset + dataLen); + byte[] dataForDigest; + int dataOutLen; + if (dataLen < otaChunkSize) { + dataForDigest = new byte[otaChunkSize]; + System.arraycopy(data, 0, dataForDigest, 0, dataLen); + dataOutLen = otaChunkSize; + } else { + dataForDigest = data; + dataOutLen = dataLen; + } + byte[] header = sha256Bytes(dataForDigest); + int headerLen = header.length; + chunk = new byte[headerLen + dataOutLen]; + System.arraycopy(header, 0, chunk, 0, headerLen); + System.arraycopy(dataForDigest, 0, chunk, headerLen, dataOutLen); + log.info("OTA分片长度: sn={} version={} num={} headerMode={} headerLen={} dataLen={} totalLen={}", sn, version, num, mode, headerLen, dataOutLen, chunk.length); + try { + log.info("OTA分片头HEX({}): {}", headerLen, toHex(header)); + int prefixLen = Math.min(64, dataForDigest.length); + log.info("OTA分片数据HEX前{}字节: {}", prefixLen, toHex(Arrays.copyOfRange(dataForDigest, 0, prefixLen))); + } catch (Exception ignore) {} + } + log.debug("OTA分片发送: sn={} version={} num={} chunkLen={}", + sn, version, num, chunk.length); + + return ResponseEntity + .ok() + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .contentLength(chunk.length) + .body(chunk); + } catch (Exception e) { + log.error("OTA分片下载异常: {}", e.getMessage(), e); + err.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + err.put("success", "0"); + return err; + } finally { + MDC.clear(); + } +} + + /** + * 动态计算 OTA 分片总数 + * - 规则:仅按固件数据长度计算(不含首片校验头) + * - 分片:按 `ota.chunk-size`(默认 1024 字节)切分,向上取整 + * - 返回:无法读取固件或异常时返回 null + */ + private Integer computeOtaChunkCount(String version) { + try { + if (StringUtils.isEmpty(version)) return null; + byte[] firmware = loadFirmwareBytes(version); + if (firmware == null || firmware.length == 0) return null; + int firmwareBytes = firmware.length; + int chunks = (firmwareBytes + otaChunkSize - 1) / otaChunkSize; + return Math.max(chunks, 1); + } catch (Exception e) { + return null; + } + } + + /** + * 构造 OTA 负载(仅 binary32) + * - 格式:`[32字节SHA256原始摘要] + [固件]` + * - 摘要口径:统一基于“首片1024字节数据”,与分片接口首片一致 + */ + private byte[] buildOtaPayload(byte[] firmware) throws Exception { + int firstDataLen = Math.min(otaChunkSize, firmware.length); + byte[] firstData = Arrays.copyOfRange(firmware, 0, firstDataLen); + byte[] digest = sha256Bytes(firstData); + byte[] payload = new byte[digest.length + firmware.length]; + System.arraycopy(digest, 0, payload, 0, digest.length); + System.arraycopy(firmware, 0, payload, digest.length, firmware.length); + return payload; + } + + /** + * 读取固件字节 + * - 支持:`classpath:` 或 文件系统目录 + * - 映射:固件文件命名为 `.bin`,目录为 `ota.repo` 指定位置 + * - 返回:文件不存在或访问失败返回 null + */ + private byte[] loadFirmwareBytes(String version) { + try { + if (otaRepo.startsWith("classpath:")) { + String base = otaRepo.substring("classpath:".length()); + if (!base.endsWith("/")) base = base + "/"; + String rel = base + version + ".bin"; + Resource res = new ClassPathResource(rel); + if (!res.exists()) return null; + try (InputStream in = res.getInputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + byte[] buf = new byte[4096]; + int r; + while ((r = in.read(buf)) != -1) bos.write(buf, 0, r); + return bos.toByteArray(); + } + } else { + String base = otaRepo; + if (!base.endsWith("/")) base = base + "/"; + Path p = Paths.get(base + version + ".bin"); + if (!Files.exists(p)) return null; + return Files.readAllBytes(p); + } + } catch (Exception e) { + return null; + } + } + + /** + * 计算 SHA256 的十六进制字符串 + * - 输出:小写,长度 64 的 ASCII 字符串 + * - 输入:固件原始字节 + */ + private static String sha256Hex(byte[] data) throws Exception { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] digest = md.digest(data); + StringBuilder sb = new StringBuilder(digest.length ); + for (byte b : digest) { + //转为 16 进制字符串 + String s = Integer.toHexString(0xff & b); + if (s.length() == 1) sb.append('0'); + sb.append(s); + } + return sb.toString(); + } + + private static byte[] sha256Bytes(byte[] data) throws Exception { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + return md.digest(data); + } + + private static String toHex(byte[] data) { + if (data == null) return ""; + StringBuilder sb = new StringBuilder(data.length * 2); + for (byte b : data) { + String s = Integer.toHexString(0xff & b); + if (s.length() == 1) sb.append('0'); + sb.append(s); + } + return sb.toString(); + } + + private static String fixLengthRight(String s, int len) { + if (s == null) s = ""; + if (s.length() >= len) return s.substring(0, len); + StringBuilder sb = new StringBuilder(len); + sb.append(s); + while (sb.length() < len) sb.append('0'); + return sb.toString(); + } + + private static String fixLengthLeft(String s, int len) { + if (s == null) s = ""; + if (s.length() >= len) return s.substring(s.length() - len); + StringBuilder sb = new StringBuilder(len); + while (sb.length() < len - s.length()) sb.append('0'); + sb.append(s); + return sb.toString(); + } + + private static String fixOrTrimRight(String s, int len) { + if (s == null) s = ""; + if (s.length() == len) return s; + if (s.length() > len) return s.substring(0, len); + StringBuilder sb = new StringBuilder(len); + sb.append(s); + while (sb.length() < len) sb.append('0'); + return sb.toString(); + } +} diff --git a/src/main/java/com/evobms/project/iot/controller/IotOtaController.java b/src/main/java/com/evobms/project/iot/controller/IotOtaController.java new file mode 100644 index 0000000..fe980a1 --- /dev/null +++ b/src/main/java/com/evobms/project/iot/controller/IotOtaController.java @@ -0,0 +1,78 @@ +package com.evobms.project.iot.controller; + +import com.evobms.common.constant.BboxApiConstants; +import com.evobms.common.utils.StringUtils; +import com.evobms.project.iot.service.DeviceTokenService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Autowired; +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 javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; + +/** + * OTA状态上报接口控制器 + * 路径:POST /iot/ota/status + * 头部:Authorization: Bearer + * 请求体:{ "version":"1.0.0", "status":"1" } // status: 0下载失败,1下载成功(含验证) + * 返回:{ code(200), success("1") } + */ +@RestController +@RequestMapping("/iot/ota") +public class IotOtaController { + private static final Logger log = LoggerFactory.getLogger(IotOtaController.class); + + @Autowired + private DeviceTokenService deviceTokenService; + + @PostMapping("/status") + public Map reportOtaStatus(@RequestBody Map body, + HttpServletRequest request) { + Map resp = new HashMap<>(); + try { + // 设备鉴权(非JWT令牌) + String sn = deviceTokenService.resolveSn(request); + if (StringUtils.isEmpty(sn)) { + resp.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + resp.put("success", "0"); + return resp; + } + String prevVersion = safeTrim(body.get("version")); + String statusStr = safeTrim(body.get("status")); + MDC.put("sn", sn); + MDC.put("version", prevVersion); + + // 规范化状态:仅识别 "1" 为成功,其余按失败处理;仍返回成功表示上报接口调用成功 + String normalizedStatus = "0"; + if ("1".equals(statusStr)) { + normalizedStatus = "1"; + } + + log.info("OTA状态上报: sn={} prevVersion={} status={} (0失败,1成功)", + sn, prevVersion, normalizedStatus); + + // 此处可根据需要更新任务或设备状态(留空实现,避免误改) + + resp.put("code", BboxApiConstants.CODE_SUCCESS); + resp.put("success", "1"); + return resp; + } catch (Exception e) { + log.error("OTA状态上报异常: {}", e.getMessage(), e); + resp.put("code", BboxApiConstants.CODE_UNAUTHORIZED); + resp.put("success", "0"); + return resp; + } finally { + MDC.clear(); + } + } + + private static String safeTrim(String s) { + return s == null ? null : s.trim(); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/iot/service/DeviceTokenService.java b/src/main/java/com/evobms/project/iot/service/DeviceTokenService.java new file mode 100644 index 0000000..cdf46fb --- /dev/null +++ b/src/main/java/com/evobms/project/iot/service/DeviceTokenService.java @@ -0,0 +1,114 @@ +package com.evobms.project.iot.service; + +import com.evobms.common.constant.Constants; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.redis.RedisCache; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.security.SecureRandom; +import java.util.concurrent.TimeUnit; + +/** + * 设备自定义令牌服务(非JWT) + * - 生成固定长度(65)的随机令牌 + * - 将 token -> sn 映射存入缓存并设置TTL + * - 从请求中解析并校验令牌,返回设备SN + */ +@Component +public class DeviceTokenService { + private static final String KEY_PREFIX = "iot_device_token:"; + private static final char[] CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray(); + private final SecureRandom random = new SecureRandom(); + + @Value("${token.header:Authorization}") + private String header; + + @Value("${token.expireTime:30}") + private int expireMinutes; + + @Autowired + private RedisCache redisCache; + + /** + * 生成并缓存设备令牌 + */ + public String issueTokenForSn(String sn) { + String token = randomToken(64); + String key = KEY_PREFIX + token; + redisCache.setCacheObject(key, sn, expireMinutes, TimeUnit.MINUTES); + return token; + } + + /** + * 从请求解析并校验令牌,返回设备SN + */ + public String resolveSn(HttpServletRequest request) { + String token = getToken(request); + if (StringUtils.isEmpty(token)) return null; + String key = KEY_PREFIX + token; + return redisCache.getCacheObject(key); + } + + /** + * 获取请求头中的令牌并去除前缀 + */ + public String getToken(HttpServletRequest request) { + // 先按配置的头名读取;若缺失则回退常见头名 + String token = request.getHeader(header); + if (StringUtils.isEmpty(token)) { + token = request.getHeader("Authorization"); + } + if (StringUtils.isEmpty(token)) { + token = request.getHeader("iot_device_token"); + } + if (StringUtils.isEmpty(token)) { + token = request.getHeader("X-Device-Token"); + } + if (StringUtils.isEmpty(token)) { + return null; + } + // 规范化:去除前后空格,并不区分大小写地移除 "Bearer " 前缀 + String normalized = token.trim(); + String prefix = Constants.TOKEN_PREFIX; // "Bearer " + int pLen = prefix.length(); + if (normalized.length() >= pLen && normalized.regionMatches(true, 0, prefix, 0, pLen)) { + normalized = normalized.substring(pLen); + } + + int ws = indexOfWhitespace(normalized); + if (ws > 0) { + normalized = normalized.substring(0, ws); + } + return StringUtils.isEmpty(normalized) ? null : normalized.trim(); + } + + private static int indexOfWhitespace(String s) { + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (Character.isWhitespace(c)) { + return i; + } + } + return -1; + } + + /** + * 撤销令牌 + */ + public void revoke(String token) { + if (StringUtils.isEmpty(token)) return; + String key = KEY_PREFIX + token; + redisCache.deleteObject(key); + } + + private String randomToken(int len) { + StringBuilder sb = new StringBuilder(len); + for (int i = 0; i < len; i++) { + sb.append(CHARS[random.nextInt(CHARS.length)]); + } + return sb.toString(); + } +} diff --git a/src/main/java/com/evobms/project/iot/service/IotDeviceTokenService.java b/src/main/java/com/evobms/project/iot/service/IotDeviceTokenService.java new file mode 100644 index 0000000..b18850f --- /dev/null +++ b/src/main/java/com/evobms/project/iot/service/IotDeviceTokenService.java @@ -0,0 +1,55 @@ +package com.evobms.project.iot.service; + +import com.evobms.framework.redis.RedisCache; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.concurrent.TimeUnit; + +/** + * 设备令牌服务:管理 token 与设备SN 的映射 + */ +@Service +public class IotDeviceTokenService { + + @Autowired + private RedisCache redisCache; + + @Value("${iot.token.ttlSeconds:86400}") + private int ttlSeconds; + + private static final String KEY_PREFIX = "iot:device:token:"; + + /** + * 为设备SN签发令牌,并缓存映射关系(带有效期) + */ + public String issueTokenForSn(String sn) { + String token = generateHexToken64(); + String key = KEY_PREFIX + token; + redisCache.setCacheObject(key, sn, ttlSeconds, TimeUnit.SECONDS); + return token; + } + + /** + * 根据令牌解析设备SN + */ + public String getSnByToken(String token) { + if (token == null || token.isEmpty()) { + return null; + } + String key = KEY_PREFIX + token; + return redisCache.getCacheObject(key); + } + + private static String generateHexToken64() { + byte[] bytes = new byte[32]; + new SecureRandom().nextBytes(bytes); + StringBuilder sb = new StringBuilder(64); + for (byte b : bytes) { + sb.append(String.format("%02X", b)); + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/monitor/controller/CacheController.java b/src/main/java/com/evobms/project/monitor/controller/CacheController.java new file mode 100644 index 0000000..963196e --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/controller/CacheController.java @@ -0,0 +1,121 @@ +package com.evobms.project.monitor.controller; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.TreeSet; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.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.evobms.common.constant.CacheConstants; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.project.monitor.domain.SysCache; + +/** + * 缓存监控 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/cache") +public class CacheController +{ + @Autowired + private RedisTemplate redisTemplate; + + private final static List caches = new ArrayList(); + { + caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息")); + caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息")); + caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典")); + caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码")); + caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交")); + caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理")); + caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数")); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Properties info = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info()); + Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); + Object dbSize = redisTemplate.execute((RedisCallback) connection -> connection.dbSize()); + + Map result = new HashMap<>(3); + result.put("info", info); + result.put("dbSize", dbSize); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + result.put("commandStats", pieList); + return AjaxResult.success(result); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getNames") + public AjaxResult cache() + { + return AjaxResult.success(caches); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getKeys/{cacheName}") + public AjaxResult getCacheKeys(@PathVariable String cacheName) + { + Set cacheKeys = redisTemplate.keys(cacheName + "*"); + return AjaxResult.success(new TreeSet<>(cacheKeys)); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getValue/{cacheName}/{cacheKey}") + public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) + { + String cacheValue = redisTemplate.opsForValue().get(cacheKey); + SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue); + return AjaxResult.success(sysCache); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheName/{cacheName}") + public AjaxResult clearCacheName(@PathVariable String cacheName) + { + Collection cacheKeys = redisTemplate.keys(cacheName + "*"); + redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheKey/{cacheKey}") + public AjaxResult clearCacheKey(@PathVariable String cacheKey) + { + redisTemplate.delete(cacheKey); + return AjaxResult.success(); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheAll") + public AjaxResult clearCacheAll() + { + Collection cacheKeys = redisTemplate.keys("*"); + redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } +} diff --git a/src/main/java/com/evobms/project/monitor/controller/ServerController.java b/src/main/java/com/evobms/project/monitor/controller/ServerController.java new file mode 100644 index 0000000..057b8c0 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/controller/ServerController.java @@ -0,0 +1,27 @@ +package com.evobms.project.monitor.controller; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.domain.Server; + +/** + * 服务器监控 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/server") +public class ServerController +{ + @PreAuthorize("@ss.hasPermi('monitor:server:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Server server = new Server(); + server.copyTo(); + return AjaxResult.success(server); + } +} diff --git a/src/main/java/com/evobms/project/monitor/controller/SysJobController.java b/src/main/java/com/evobms/project/monitor/controller/SysJobController.java new file mode 100644 index 0000000..b78be43 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/controller/SysJobController.java @@ -0,0 +1,185 @@ +package com.evobms.project.monitor.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +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.evobms.common.constant.Constants; +import com.evobms.common.exception.job.TaskException; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.job.CronUtils; +import com.evobms.common.utils.job.ScheduleUtils; +import com.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.monitor.domain.SysJob; +import com.evobms.project.monitor.service.ISysJobService; + +/** + * 调度任务信息操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/job") +public class SysJobController extends BaseController +{ + @Autowired + private ISysJobService jobService; + + /** + * 查询定时任务列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:list')") + @GetMapping("/list") + public TableDataInfo list(SysJob sysJob) + { + startPage(); + List list = jobService.selectJobList(sysJob); + return getDataTable(list); + } + + /** + * 导出定时任务列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:export')") + @Log(title = "定时任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJob sysJob) + { + List list = jobService.selectJobList(sysJob); + ExcelUtil util = new ExcelUtil(SysJob.class); + util.exportExcel(response, list, "定时任务"); + } + + /** + * 获取定时任务详细信息 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:query')") + @GetMapping(value = "/{jobId}") + public AjaxResult getInfo(@PathVariable("jobId") Long jobId) + { + return success(jobService.selectJobById(jobId)); + } + + /** + * 新增定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:add')") + @Log(title = "定时任务", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("新增任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } + else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + job.setCreateBy(getUsername()); + return toAjax(jobService.insertJob(job)); + } + + /** + * 修改定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:edit')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("修改任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } + else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + job.setUpdateBy(getUsername()); + return toAjax(jobService.updateJob(job)); + } + + /** + * 定时任务状态修改 + */ + @PreAuthorize("@ss.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("@ss.hasPermi('monitor:job:changeStatus')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/run") + public AjaxResult run(@RequestBody SysJob job) throws SchedulerException + { + boolean result = jobService.run(job); + return result ? success() : error("任务不存在或已过期!"); + } + + /** + * 删除定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "定时任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobIds}") + public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException + { + jobService.deleteJobByIds(jobIds); + return success(); + } +} diff --git a/src/main/java/com/evobms/project/monitor/controller/SysJobLogController.java b/src/main/java/com/evobms/project/monitor/controller/SysJobLogController.java new file mode 100644 index 0000000..27450bf --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/controller/SysJobLogController.java @@ -0,0 +1,92 @@ +package com.evobms.project.monitor.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +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.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.monitor.domain.SysJobLog; +import com.evobms.project.monitor.service.ISysJobLogService; + +/** + * 调度日志操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/jobLog") +public class SysJobLogController extends BaseController +{ + @Autowired + private ISysJobLogService jobLogService; + + /** + * 查询定时任务调度日志列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:list')") + @GetMapping("/list") + public TableDataInfo list(SysJobLog sysJobLog) + { + startPage(); + List list = jobLogService.selectJobLogList(sysJobLog); + return getDataTable(list); + } + + /** + * 导出定时任务调度日志列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:export')") + @Log(title = "任务调度日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJobLog sysJobLog) + { + List list = jobLogService.selectJobLogList(sysJobLog); + ExcelUtil util = new ExcelUtil(SysJobLog.class); + util.exportExcel(response, list, "调度日志"); + } + + /** + * 根据调度编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:query')") + @GetMapping(value = "/{jobLogId}") + public AjaxResult getInfo(@PathVariable Long jobLogId) + { + return success(jobLogService.selectJobLogById(jobLogId)); + } + + + /** + * 删除定时任务调度日志 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "定时任务调度日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobLogIds}") + public AjaxResult remove(@PathVariable Long[] jobLogIds) + { + return toAjax(jobLogService.deleteJobLogByIds(jobLogIds)); + } + + /** + * 清空定时任务调度日志 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "调度日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + jobLogService.cleanJobLog(); + return success(); + } +} diff --git a/src/main/java/com/evobms/project/monitor/controller/SysLogininforController.java b/src/main/java/com/evobms/project/monitor/controller/SysLogininforController.java new file mode 100644 index 0000000..02611f4 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/controller/SysLogininforController.java @@ -0,0 +1,82 @@ +package com.evobms.project.monitor.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +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.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.security.service.SysPasswordService; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.monitor.domain.SysLogininfor; +import com.evobms.project.monitor.service.ISysLogininforService; + +/** + * 系统访问记录 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/logininfor") +public class SysLogininforController extends BaseController +{ + @Autowired + private ISysLogininforService logininforService; + + @Autowired + private SysPasswordService passwordService; + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") + @GetMapping("/list") + public TableDataInfo list(SysLogininfor logininfor) + { + startPage(); + List list = logininforService.selectLogininforList(logininfor); + return getDataTable(list); + } + + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysLogininfor logininfor) + { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil util = new ExcelUtil(SysLogininfor.class); + util.exportExcel(response, list, "登录日志"); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public AjaxResult remove(@PathVariable Long[] infoIds) + { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + logininforService.cleanLogininfor(); + return success(); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @GetMapping("/unlock/{userName}") + public AjaxResult unlock(@PathVariable("userName") String userName) + { + passwordService.clearLoginRecordCache(userName); + return success(); + } +} diff --git a/src/main/java/com/evobms/project/monitor/controller/SysOperlogController.java b/src/main/java/com/evobms/project/monitor/controller/SysOperlogController.java new file mode 100644 index 0000000..55acb0b --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/controller/SysOperlogController.java @@ -0,0 +1,69 @@ +package com.evobms.project.monitor.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +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.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.monitor.domain.SysOperLog; +import com.evobms.project.monitor.service.ISysOperLogService; + +/** + * 操作日志记录 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/operlog") +public class SysOperlogController extends BaseController +{ + @Autowired + private ISysOperLogService operLogService; + + @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") + @GetMapping("/list") + public TableDataInfo list(SysOperLog operLog) + { + startPage(); + List list = operLogService.selectOperLogList(operLog); + return getDataTable(list); + } + + @Log(title = "操作日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysOperLog operLog) + { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil util = new ExcelUtil(SysOperLog.class); + util.exportExcel(response, list, "操作日志"); + } + + @Log(title = "操作日志", businessType = BusinessType.DELETE) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/{operIds}") + public AjaxResult remove(@PathVariable Long[] operIds) + { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + @Log(title = "操作日志", businessType = BusinessType.CLEAN) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/clean") + public AjaxResult clean() + { + operLogService.cleanOperLog(); + return success(); + } +} diff --git a/src/main/java/com/evobms/project/monitor/controller/SysUserOnlineController.java b/src/main/java/com/evobms/project/monitor/controller/SysUserOnlineController.java new file mode 100644 index 0000000..272551b --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/controller/SysUserOnlineController.java @@ -0,0 +1,83 @@ +package com.evobms.project.monitor.controller; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +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.evobms.common.constant.CacheConstants; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.redis.RedisCache; +import com.evobms.framework.security.LoginUser; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.monitor.domain.SysUserOnline; +import com.evobms.project.system.service.ISysUserOnlineService; + +/** + * 在线用户监控 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/online") +public class SysUserOnlineController extends BaseController +{ + @Autowired + private ISysUserOnlineService userOnlineService; + + @Autowired + private RedisCache redisCache; + + @PreAuthorize("@ss.hasPermi('monitor:online:list')") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) + { + Collection keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); + List userOnlineList = new ArrayList(); + for (String key : keys) + { + LoginUser user = redisCache.getCacheObject(key); + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) + { + userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); + } + else if (StringUtils.isNotEmpty(ipaddr)) + { + userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); + } + else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) + { + userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); + } + else + { + userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); + } + } + Collections.reverse(userOnlineList); + userOnlineList.removeAll(Collections.singleton(null)); + return getDataTable(userOnlineList); + } + + /** + * 强退用户 + */ + @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public AjaxResult forceLogout(@PathVariable String tokenId) + { + redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId); + return success(); + } +} diff --git a/src/main/java/com/evobms/project/monitor/domain/SysCache.java b/src/main/java/com/evobms/project/monitor/domain/SysCache.java new file mode 100644 index 0000000..6871984 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/domain/SysCache.java @@ -0,0 +1,81 @@ +package com.evobms.project.monitor.domain; + +import com.evobms.common.utils.StringUtils; + +/** + * 缓存信息 + * + * @author ruoyi + */ +public class SysCache +{ + /** 缓存名称 */ + private String cacheName = ""; + + /** 缓存键名 */ + private String cacheKey = ""; + + /** 缓存内容 */ + private String cacheValue = ""; + + /** 备注 */ + private String remark = ""; + + public SysCache() + { + + } + + public SysCache(String cacheName, String remark) + { + this.cacheName = cacheName; + this.remark = remark; + } + + public SysCache(String cacheName, String cacheKey, String cacheValue) + { + this.cacheName = StringUtils.replace(cacheName, ":", ""); + this.cacheKey = StringUtils.replace(cacheKey, cacheName, ""); + this.cacheValue = cacheValue; + } + + public String getCacheName() + { + return cacheName; + } + + public void setCacheName(String cacheName) + { + this.cacheName = cacheName; + } + + public String getCacheKey() + { + return cacheKey; + } + + public void setCacheKey(String cacheKey) + { + this.cacheKey = cacheKey; + } + + public String getCacheValue() + { + return cacheValue; + } + + public void setCacheValue(String cacheValue) + { + this.cacheValue = cacheValue; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } +} diff --git a/src/main/java/com/evobms/project/monitor/domain/SysJob.java b/src/main/java/com/evobms/project/monitor/domain/SysJob.java new file mode 100644 index 0000000..e93e799 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/domain/SysJob.java @@ -0,0 +1,171 @@ +package com.evobms.project.monitor.domain; + +import java.util.Date; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.evobms.common.constant.ScheduleConstants; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.job.CronUtils; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.evobms.framework.web.domain.BaseEntity; + +/** + * 定时任务调度表 sys_job + * + * @author ruoyi + */ +public class SysJob extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 任务ID */ + @Excel(name = "任务序号", cellType = ColumnType.NUMERIC) + private Long jobId; + + /** 任务名称 */ + @Excel(name = "任务名称") + private String jobName; + + /** 任务组名 */ + @Excel(name = "任务组名") + private String jobGroup; + + /** 调用目标字符串 */ + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** cron执行表达式 */ + @Excel(name = "执行表达式 ") + private String cronExpression; + + /** cron计划策略 */ + @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行") + private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; + + /** 是否并发执行(0允许 1禁止) */ + @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止") + private String concurrent; + + /** 任务状态(0正常 1暂停) */ + @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停") + private String status; + + public Long getJobId() + { + return jobId; + } + + public void setJobId(Long jobId) + { + this.jobId = jobId; + } + + @NotBlank(message = "任务名称不能为空") + @Size(min = 0, max = 64, message = "任务名称不能超过64个字符") + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + @NotBlank(message = "调用目标字符串不能为空") + @Size(min = 0, max = 500, message = "调用目标字符串长度不能超过500个字符") + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + @NotBlank(message = "Cron执行表达式不能为空") + @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符") + public String getCronExpression() + { + return cronExpression; + } + + public void setCronExpression(String cronExpression) + { + this.cronExpression = cronExpression; + } + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public Date getNextValidTime() + { + if (StringUtils.isNotEmpty(cronExpression)) + { + return CronUtils.getNextExecution(cronExpression); + } + return null; + } + + public String getMisfirePolicy() + { + return misfirePolicy; + } + + public void setMisfirePolicy(String misfirePolicy) + { + this.misfirePolicy = misfirePolicy; + } + + public String getConcurrent() + { + return concurrent; + } + + public void setConcurrent(String concurrent) + { + this.concurrent = concurrent; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobId", getJobId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("cronExpression", getCronExpression()) + .append("nextValidTime", getNextValidTime()) + .append("misfirePolicy", getMisfirePolicy()) + .append("concurrent", getConcurrent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/monitor/domain/SysJobLog.java b/src/main/java/com/evobms/project/monitor/domain/SysJobLog.java new file mode 100644 index 0000000..001d64b --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/domain/SysJobLog.java @@ -0,0 +1,155 @@ +package com.evobms.project.monitor.domain; + +import java.util.Date; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.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正常 1失败) */ + @Excel(name = "执行状态", readConverterExp = "0=正常,1=失败") + private String status; + + /** 异常信息 */ + @Excel(name = "异常信息") + private String exceptionInfo; + + /** 开始时间 */ + private Date startTime; + + /** 停止时间 */ + private Date stopTime; + + public Long getJobLogId() + { + return jobLogId; + } + + public void setJobLogId(Long jobLogId) + { + this.jobLogId = jobLogId; + } + + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + public String getJobMessage() + { + return jobMessage; + } + + public void setJobMessage(String jobMessage) + { + this.jobMessage = jobMessage; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getExceptionInfo() + { + return exceptionInfo; + } + + public void setExceptionInfo(String exceptionInfo) + { + this.exceptionInfo = exceptionInfo; + } + + public Date getStartTime() + { + return startTime; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getStopTime() + { + return stopTime; + } + + public void setStopTime(Date stopTime) + { + this.stopTime = stopTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobLogId", getJobLogId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("jobMessage", getJobMessage()) + .append("status", getStatus()) + .append("exceptionInfo", getExceptionInfo()) + .append("startTime", getStartTime()) + .append("stopTime", getStopTime()) + .toString(); + } +} diff --git a/src/main/java/com/evobms/project/monitor/domain/SysLogininfor.java b/src/main/java/com/evobms/project/monitor/domain/SysLogininfor.java new file mode 100644 index 0000000..f4b4909 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/domain/SysLogininfor.java @@ -0,0 +1,144 @@ +package com.evobms.project.monitor.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.evobms.framework.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; + + /** 登录IP地址 */ + @Excel(name = "登录地址") + private String ipaddr; + + /** 登录地点 */ + @Excel(name = "登录地点") + private String loginLocation; + + /** 浏览器类型 */ + @Excel(name = "浏览器") + private String browser; + + /** 操作系统 */ + @Excel(name = "操作系统") + private String os; + + /** 提示消息 */ + @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 loginTime; + + 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 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 String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public Date getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Date loginTime) + { + this.loginTime = loginTime; + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/monitor/domain/SysOperLog.java b/src/main/java/com/evobms/project/monitor/domain/SysOperLog.java new file mode 100644 index 0000000..a41fed9 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/domain/SysOperLog.java @@ -0,0 +1,269 @@ +package com.evobms.project.monitor.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.evobms.framework.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=生成代码,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 operLocation; + + /** 请求参数 */ + @Excel(name = "请求参数") + private String operParam; + + /** 返回参数 */ + @Excel(name = "返回参数") + private String jsonResult; + + /** 操作状态(0正常 1异常) */ + @Excel(name = "状态", readConverterExp = "0=正常,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; + + /** 消耗时间 */ + @Excel(name = "消耗时间", suffix = "毫秒") + private Long costTime; + + 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 getOperLocation() + { + return operLocation; + } + + public void setOperLocation(String operLocation) + { + this.operLocation = operLocation; + } + + 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; + } + + public Long getCostTime() + { + return costTime; + } + + public void setCostTime(Long costTime) + { + this.costTime = costTime; + } +} diff --git a/src/main/java/com/evobms/project/monitor/domain/SysUserOnline.java b/src/main/java/com/evobms/project/monitor/domain/SysUserOnline.java new file mode 100644 index 0000000..787f923 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/domain/SysUserOnline.java @@ -0,0 +1,113 @@ +package com.evobms.project.monitor.domain; + +/** + * 当前在线会话 + * + * @author ruoyi + */ +public class SysUserOnline +{ + /** 会话编号 */ + private String tokenId; + + /** 部门名称 */ + private String deptName; + + /** 用户名称 */ + private String userName; + + /** 登录IP地址 */ + private String ipaddr; + + /** 登录地址 */ + private String loginLocation; + + /** 浏览器类型 */ + private String browser; + + /** 操作系统 */ + private String os; + + /** 登录时间 */ + private Long loginTime; + + public String getTokenId() + { + return tokenId; + } + + public void setTokenId(String tokenId) + { + this.tokenId = tokenId; + } + + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + 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/src/main/java/com/evobms/project/monitor/mapper/SysJobLogMapper.java b/src/main/java/com/evobms/project/monitor/mapper/SysJobLogMapper.java new file mode 100644 index 0000000..f8dfacd --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/mapper/SysJobLogMapper.java @@ -0,0 +1,64 @@ +package com.evobms.project.monitor.mapper; + +import java.util.List; +import com.evobms.project.monitor.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/src/main/java/com/evobms/project/monitor/mapper/SysJobMapper.java b/src/main/java/com/evobms/project/monitor/mapper/SysJobMapper.java new file mode 100644 index 0000000..2897628 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/mapper/SysJobMapper.java @@ -0,0 +1,67 @@ +package com.evobms.project.monitor.mapper; + +import java.util.List; +import com.evobms.project.monitor.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/src/main/java/com/evobms/project/monitor/mapper/SysLogininforMapper.java b/src/main/java/com/evobms/project/monitor/mapper/SysLogininforMapper.java new file mode 100644 index 0000000..3873228 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/mapper/SysLogininforMapper.java @@ -0,0 +1,42 @@ +package com.evobms.project.monitor.mapper; + +import java.util.List; +import com.evobms.project.monitor.domain.SysLogininfor; + +/** + * 系统访问日志情况信息 数据层 + * + * @author ruoyi + */ +public interface SysLogininforMapper +{ + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void 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/src/main/java/com/evobms/project/monitor/mapper/SysOperLogMapper.java b/src/main/java/com/evobms/project/monitor/mapper/SysOperLogMapper.java new file mode 100644 index 0000000..b0547be --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/mapper/SysOperLogMapper.java @@ -0,0 +1,48 @@ +package com.evobms.project.monitor.mapper; + +import java.util.List; +import com.evobms.project.monitor.domain.SysOperLog; + +/** + * 操作日志 数据层 + * + * @author ruoyi + */ +public interface SysOperLogMapper +{ + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void 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/src/main/java/com/evobms/project/monitor/service/ISysJobLogService.java b/src/main/java/com/evobms/project/monitor/service/ISysJobLogService.java new file mode 100644 index 0000000..51a5964 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/service/ISysJobLogService.java @@ -0,0 +1,56 @@ +package com.evobms.project.monitor.service; + +import java.util.List; +import com.evobms.project.monitor.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/src/main/java/com/evobms/project/monitor/service/ISysJobService.java b/src/main/java/com/evobms/project/monitor/service/ISysJobService.java new file mode 100644 index 0000000..1919aba --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/service/ISysJobService.java @@ -0,0 +1,102 @@ +package com.evobms.project.monitor.service; + +import java.util.List; +import org.quartz.SchedulerException; +import com.evobms.common.exception.job.TaskException; +import com.evobms.project.monitor.domain.SysJob; + +/** + * 定时任务调度信息信息 服务层 + * + * @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; + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + * @return 结果 + */ + public int deleteJob(SysJob job) throws SchedulerException; + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + public void deleteJobByIds(Long[] jobIds) throws SchedulerException; + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + * @return 结果 + */ + public int changeStatus(SysJob job) throws SchedulerException; + + /** + * 立即运行任务 + * + * @param job 调度信息 + * @return 结果 + */ + public boolean run(SysJob job) throws SchedulerException; + + /** + * 新增任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int insertJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 更新任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int updateJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + public boolean checkCronExpressionIsValid(String cronExpression); +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/monitor/service/ISysLogininforService.java b/src/main/java/com/evobms/project/monitor/service/ISysLogininforService.java new file mode 100644 index 0000000..921aefa --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/service/ISysLogininforService.java @@ -0,0 +1,40 @@ +package com.evobms.project.monitor.service; + +import java.util.List; +import com.evobms.project.monitor.domain.SysLogininfor; + +/** + * 系统访问日志情况信息 服务层 + * + * @author ruoyi + */ +public interface ISysLogininforService +{ + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void 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/src/main/java/com/evobms/project/monitor/service/ISysOperLogService.java b/src/main/java/com/evobms/project/monitor/service/ISysOperLogService.java new file mode 100644 index 0000000..98fa8a1 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/service/ISysOperLogService.java @@ -0,0 +1,48 @@ +package com.evobms.project.monitor.service; + +import java.util.List; +import com.evobms.project.monitor.domain.SysOperLog; + +/** + * 操作日志 服务层 + * + * @author ruoyi + */ +public interface ISysOperLogService +{ + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void 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/src/main/java/com/evobms/project/monitor/service/impl/SysJobLogServiceImpl.java b/src/main/java/com/evobms/project/monitor/service/impl/SysJobLogServiceImpl.java new file mode 100644 index 0000000..96d6411 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/service/impl/SysJobLogServiceImpl.java @@ -0,0 +1,87 @@ +package com.evobms.project.monitor.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.evobms.project.monitor.domain.SysJobLog; +import com.evobms.project.monitor.mapper.SysJobLogMapper; +import com.evobms.project.monitor.service.ISysJobLogService; + +/** + * 定时任务调度日志信息 服务层 + * + * @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/src/main/java/com/evobms/project/monitor/service/impl/SysJobServiceImpl.java b/src/main/java/com/evobms/project/monitor/service/impl/SysJobServiceImpl.java new file mode 100644 index 0000000..d657b58 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/service/impl/SysJobServiceImpl.java @@ -0,0 +1,261 @@ +package com.evobms.project.monitor.service.impl; + +import java.util.List; +import javax.annotation.PostConstruct; +import org.quartz.JobDataMap; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.evobms.common.constant.ScheduleConstants; +import com.evobms.common.exception.job.TaskException; +import com.evobms.common.utils.job.CronUtils; +import com.evobms.common.utils.job.ScheduleUtils; +import com.evobms.project.monitor.domain.SysJob; +import com.evobms.project.monitor.mapper.SysJobMapper; +import com.evobms.project.monitor.service.ISysJobService; + +/** + * 定时任务调度信息 服务层 + * + * @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(rollbackFor = Exception.class) + public int pauseJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 恢复任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int resumeJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + int rows = jobMapper.deleteJobById(jobId); + if (rows > 0) + { + scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Long[] jobIds) throws SchedulerException + { + for (Long jobId : jobIds) + { + SysJob job = jobMapper.selectJobById(jobId); + deleteJob(job); + } + } + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int changeStatus(SysJob job) throws SchedulerException + { + int rows = 0; + String status = job.getStatus(); + if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) + { + rows = resumeJob(job); + } + else if (ScheduleConstants.Status.PAUSE.getValue().equals(status)) + { + rows = pauseJob(job); + } + return rows; + } + + /** + * 立即运行任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean run(SysJob job) throws SchedulerException + { + boolean result = false; + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + SysJob properties = selectJobById(job.getJobId()); + // 参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties); + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + result = true; + scheduler.triggerJob(jobKey, dataMap); + } + return result; + } + + /** + * 新增任务 + * + * @param job 调度信息 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertJob(SysJob job) throws SchedulerException, TaskException + { + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.insertJob(job); + if (rows > 0) + { + ScheduleUtils.createScheduleJob(scheduler, job); + } + return rows; + } + + /** + * 更新任务的时间表达式 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateJob(SysJob job) throws SchedulerException, TaskException + { + SysJob properties = selectJobById(job.getJobId()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + updateSchedulerJob(job, properties.getJobGroup()); + } + return rows; + } + + /** + * 更新任务 + * + * @param job 任务对象 + * @param jobGroup 任务组名 + */ + public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException + { + Long jobId = job.getJobId(); + // 判断是否存在 + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(jobKey); + } + ScheduleUtils.createScheduleJob(scheduler, job); + } + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + @Override + public boolean checkCronExpressionIsValid(String cronExpression) + { + return CronUtils.isValid(cronExpression); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/monitor/service/impl/SysLogininforServiceImpl.java b/src/main/java/com/evobms/project/monitor/service/impl/SysLogininforServiceImpl.java new file mode 100644 index 0000000..867d6ed --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/service/impl/SysLogininforServiceImpl.java @@ -0,0 +1,65 @@ +package com.evobms.project.monitor.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.evobms.project.monitor.domain.SysLogininfor; +import com.evobms.project.monitor.mapper.SysLogininforMapper; +import com.evobms.project.monitor.service.ISysLogininforService; + +/** + * 系统访问日志情况信息 服务层处理 + * + * @author ruoyi + */ +@Service +public class SysLogininforServiceImpl implements ISysLogininforService +{ + + @Autowired + private SysLogininforMapper logininforMapper; + + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + @Override + public void insertLogininfor(SysLogininfor logininfor) + { + 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/src/main/java/com/evobms/project/monitor/service/impl/SysOperLogServiceImpl.java b/src/main/java/com/evobms/project/monitor/service/impl/SysOperLogServiceImpl.java new file mode 100644 index 0000000..4382986 --- /dev/null +++ b/src/main/java/com/evobms/project/monitor/service/impl/SysOperLogServiceImpl.java @@ -0,0 +1,76 @@ +package com.evobms.project.monitor.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.evobms.project.monitor.domain.SysOperLog; +import com.evobms.project.monitor.mapper.SysOperLogMapper; +import com.evobms.project.monitor.service.ISysOperLogService; + +/** + * 操作日志 服务层处理 + * + * @author ruoyi + */ +@Service +public class SysOperLogServiceImpl implements ISysOperLogService +{ + @Autowired + private SysOperLogMapper operLogMapper; + + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + @Override + public void insertOperlog(SysOperLog operLog) + { + 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/src/main/java/com/evobms/project/ota/controller/OtaTasksController.java b/src/main/java/com/evobms/project/ota/controller/OtaTasksController.java new file mode 100644 index 0000000..cbb5f3c --- /dev/null +++ b/src/main/java/com/evobms/project/ota/controller/OtaTasksController.java @@ -0,0 +1,103 @@ +package com.evobms.project.ota.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.project.ota.domain.OtaTasks; +import com.evobms.project.ota.service.IOtaTasksService; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.web.page.TableDataInfo; + +/** + * OTA任务Controller + * + * @author ruoyi + * @date 2025-10-14 + */ +@RestController +@RequestMapping("/ota/tasks") +public class OtaTasksController extends BaseController +{ + @Autowired + private IOtaTasksService otaTasksService; + + /** + * 查询OTA任务列表 + */ + //@PreAuthorize("@ss.hasPermi('OTA:tasks:list')") + @GetMapping("/list") + public TableDataInfo list(OtaTasks otaTasks) + { + startPage(); + List list = otaTasksService.selectOtaTasksList(otaTasks); + return getDataTable(list); + } + + /** + * 导出OTA任务列表 + */ + //@PreAuthorize("@ss.hasPermi('OTA:tasks:export')") + @Log(title = "OTA任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, OtaTasks otaTasks) + { + List list = otaTasksService.selectOtaTasksList(otaTasks); + ExcelUtil util = new ExcelUtil(OtaTasks.class); + util.exportExcel(response, list, "OTA任务数据"); + } + + /** + * 获取OTA任务详细信息 + */ + //@PreAuthorize("@ss.hasPermi('OTA:tasks:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(otaTasksService.selectOtaTasksById(id)); + } + + /** + * 新增OTA任务 + */ + //@PreAuthorize("@ss.hasPermi('OTA:tasks:add')") + @Log(title = "OTA任务", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody OtaTasks otaTasks) + { + return toAjax(otaTasksService.insertOtaTasks(otaTasks)); + } + + /** + * 修改OTA任务 + */ + //@PreAuthorize("@ss.hasPermi('OTA:tasks:edit')") + @Log(title = "OTA任务", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody OtaTasks otaTasks) + { + return toAjax(otaTasksService.updateOtaTasks(otaTasks)); + } + + /** + * 删除OTA任务 + */ + @Log(title = "OTA任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + return toAjax(otaTasksService.deleteOtaTasksByIds(ids)); + } +} diff --git a/src/main/java/com/evobms/project/ota/domain/OtaTasks.java b/src/main/java/com/evobms/project/ota/domain/OtaTasks.java new file mode 100644 index 0000000..f6c8310 --- /dev/null +++ b/src/main/java/com/evobms/project/ota/domain/OtaTasks.java @@ -0,0 +1,165 @@ +package com.evobms.project.ota.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.web.domain.BaseEntity; + +/** + * OTA任务对象 ota_tasks + * + * @author ruoyi + * @date 2025-10-14 + */ +public class OtaTasks extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 任务ID(UUID) */ + private String id; + + /** 设备ID */ + @Excel(name = "设备ID") + private String deviceId; + + /** 任务名称 */ + @Excel(name = "任务名称") + private String taskName; + + /** 目标固件版本 */ + @Excel(name = "目标固件版本") + private String firmwareVersion; + + /** 任务状态 */ + @Excel(name = "任务状态") + private String status; + + /** 升级进度(0-100) */ + @Excel(name = "升级进度(0-100)") + private Long progress; + + /** 开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date startTime; + + /** 结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date endTime; + + /** 错误信息 */ + @Excel(name = "错误信息") + private String errorMessage; + + public void setId(String id) + { + this.id = id; + } + + public String getId() + { + return id; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setTaskName(String taskName) + { + this.taskName = taskName; + } + + public String getTaskName() + { + return taskName; + } + + public void setFirmwareVersion(String firmwareVersion) + { + this.firmwareVersion = firmwareVersion; + } + + public String getFirmwareVersion() + { + return firmwareVersion; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + public void setProgress(Long progress) + { + this.progress = progress; + } + + public Long getProgress() + { + return progress; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getStartTime() + { + return startTime; + } + + public void setEndTime(Date endTime) + { + this.endTime = endTime; + } + + public Date getEndTime() + { + return endTime; + } + + public void setErrorMessage(String errorMessage) + { + this.errorMessage = errorMessage; + } + + public String getErrorMessage() + { + return errorMessage; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("deviceId", getDeviceId()) + .append("taskName", getTaskName()) + .append("firmwareVersion", getFirmwareVersion()) + .append("status", getStatus()) + .append("progress", getProgress()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("errorMessage", getErrorMessage()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .append("updateBy", getUpdateBy()) + .append("createBy", getCreateBy()) + .toString(); + } +} diff --git a/src/main/java/com/evobms/project/ota/mapper/OtaTasksMapper.java b/src/main/java/com/evobms/project/ota/mapper/OtaTasksMapper.java new file mode 100644 index 0000000..9f54c54 --- /dev/null +++ b/src/main/java/com/evobms/project/ota/mapper/OtaTasksMapper.java @@ -0,0 +1,61 @@ +package com.evobms.project.ota.mapper; + +import java.util.List; +import com.evobms.project.ota.domain.OtaTasks; + +/** + * OTA任务Mapper接口 + * + * @author ruoyi + * @date 2025-10-14 + */ +public interface OtaTasksMapper +{ + /** + * 查询OTA任务 + * + * @param id OTA任务主键 + * @return OTA任务 + */ + public OtaTasks selectOtaTasksById(String id); + + /** + * 查询OTA任务列表 + * + * @param otaTasks OTA任务 + * @return OTA任务集合 + */ + public List selectOtaTasksList(OtaTasks otaTasks); + + /** + * 新增OTA任务 + * + * @param otaTasks OTA任务 + * @return 结果 + */ + public int insertOtaTasks(OtaTasks otaTasks); + + /** + * 修改OTA任务 + * + * @param otaTasks OTA任务 + * @return 结果 + */ + public int updateOtaTasks(OtaTasks otaTasks); + + /** + * 删除OTA任务 + * + * @param id OTA任务主键 + * @return 结果 + */ + public int deleteOtaTasksById(String id); + + /** + * 批量删除OTA任务 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteOtaTasksByIds(String[] ids); +} diff --git a/src/main/java/com/evobms/project/ota/service/IOtaTasksService.java b/src/main/java/com/evobms/project/ota/service/IOtaTasksService.java new file mode 100644 index 0000000..4dea87c --- /dev/null +++ b/src/main/java/com/evobms/project/ota/service/IOtaTasksService.java @@ -0,0 +1,61 @@ +package com.evobms.project.ota.service; + +import java.util.List; +import com.evobms.project.ota.domain.OtaTasks; + +/** + * OTA任务Service接口 + * + * @author ruoyi + * @date 2025-10-14 + */ +public interface IOtaTasksService +{ + /** + * 查询OTA任务 + * + * @param id OTA任务主键 + * @return OTA任务 + */ + public OtaTasks selectOtaTasksById(String id); + + /** + * 查询OTA任务列表 + * + * @param otaTasks OTA任务 + * @return OTA任务集合 + */ + public List selectOtaTasksList(OtaTasks otaTasks); + + /** + * 新增OTA任务 + * + * @param otaTasks OTA任务 + * @return 结果 + */ + public int insertOtaTasks(OtaTasks otaTasks); + + /** + * 修改OTA任务 + * + * @param otaTasks OTA任务 + * @return 结果 + */ + public int updateOtaTasks(OtaTasks otaTasks); + + /** + * 批量删除OTA任务 + * + * @param ids 需要删除的OTA任务主键集合 + * @return 结果 + */ + public int deleteOtaTasksByIds(String[] ids); + + /** + * 删除OTA任务信息 + * + * @param id OTA任务主键 + * @return 结果 + */ + public int deleteOtaTasksById(String id); +} diff --git a/src/main/java/com/evobms/project/ota/service/impl/OtaTasksServiceImpl.java b/src/main/java/com/evobms/project/ota/service/impl/OtaTasksServiceImpl.java new file mode 100644 index 0000000..847f7ab --- /dev/null +++ b/src/main/java/com/evobms/project/ota/service/impl/OtaTasksServiceImpl.java @@ -0,0 +1,105 @@ +package com.evobms.project.ota.service.impl; + +import java.util.List; +import com.evobms.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.evobms.project.ota.mapper.OtaTasksMapper; +import com.evobms.project.ota.domain.OtaTasks; +import com.evobms.project.ota.service.IOtaTasksService; + +/** + * OTA任务Service业务层处理 + * + * @author ruoyi + * @date 2025-10-14 + */ +@Service +public class OtaTasksServiceImpl implements IOtaTasksService +{ + @Autowired + private OtaTasksMapper otaTasksMapper; + + /** + * 查询OTA任务 + * + * @param id OTA任务主键 + * @return OTA任务 + */ + @Override + public OtaTasks selectOtaTasksById(String id) + { + return otaTasksMapper.selectOtaTasksById(id); + } + + /** + * 查询OTA任务列表 + * + * @param otaTasks OTA任务 + * @return OTA任务 + */ + @Override + public List selectOtaTasksList(OtaTasks otaTasks) + { + return otaTasksMapper.selectOtaTasksList(otaTasks); + } + + /** + * 新增OTA任务 + * + * @param otaTasks OTA任务 + * @return 结果 + */ + @Override + public int insertOtaTasks(OtaTasks otaTasks) { + if (otaTasks.getId() == null || otaTasks.getId().isEmpty()) { + otaTasks.setId(java.util.UUID.randomUUID().toString()); + } + // 按表结构默认:status NOT NULL DEFAULT 'pending',progress NOT NULL DEFAULT 0 + if (otaTasks.getStatus() == null) { + otaTasks.setStatus("pending"); // 若是枚举:otaTasks.setStatus(OtaStatus.PENDING); + } + if (otaTasks.getProgress() == null) { + otaTasks.setProgress(0L); + } + otaTasks.setCreateTime(DateUtils.getNowDate()); + return otaTasksMapper.insertOtaTasks(otaTasks); + } + + /** + * 修改OTA任务 + * + * @param otaTasks OTA任务 + * @return 结果 + */ + @Override + public int updateOtaTasks(OtaTasks otaTasks) + { + otaTasks.setUpdateTime(DateUtils.getNowDate()); + return otaTasksMapper.updateOtaTasks(otaTasks); + } + + /** + * 批量删除OTA任务 + * + * @param ids 需要删除的OTA任务主键 + * @return 结果 + */ + @Override + public int deleteOtaTasksByIds(String[] ids) + { + return otaTasksMapper.deleteOtaTasksByIds(ids); + } + + /** + * 删除OTA任务信息 + * + * @param id OTA任务主键 + * @return 结果 + */ + @Override + public int deleteOtaTasksById(String id) + { + return otaTasksMapper.deleteOtaTasksById(id); + } +} diff --git a/src/main/java/com/evobms/project/system/controller/BmsDevicesController.java b/src/main/java/com/evobms/project/system/controller/BmsDevicesController.java new file mode 100644 index 0000000..a2dd460 --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/BmsDevicesController.java @@ -0,0 +1,98 @@ +package com.evobms.project.system.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.project.system.domain.BmsDevices; +import com.evobms.project.system.service.IBmsDevicesService; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.web.page.TableDataInfo; + +/** + * BBOX管理Controller + * + * @author 田志阳 + * @date 2025-10-10 + */ +@RestController +@RequestMapping("/devices/devices") +public class BmsDevicesController extends BaseController +{ + @Autowired + private IBmsDevicesService bmsDevicesService; + + /** + * 查询BBOX管理列表 + */ + @GetMapping("/list") + public TableDataInfo list(BmsDevices bmsDevices) + { + startPage(); + List list = bmsDevicesService.selectBmsDevicesList(bmsDevices); + return getDataTable(list); + } + + /** + * 导出BBOX管理列表 + */ + @Log(title = "BBOX管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BmsDevices bmsDevices) + { + List list = bmsDevicesService.selectBmsDevicesList(bmsDevices); + ExcelUtil util = new ExcelUtil(BmsDevices.class); + util.exportExcel(response, list, "BBOX管理数据"); + } + + /** + * 获取BBOX管理详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(bmsDevicesService.selectBmsDevicesById(id)); + } + + /** + * 新增BBOX管理 + */ + @Log(title = "BBOX管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BmsDevices bmsDevices) + { + return toAjax(bmsDevicesService.insertBmsDevices(bmsDevices)); + } + + /** + * 修改BBOX管理 + */ + @Log(title = "BBOX管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BmsDevices bmsDevices) + { + return toAjax(bmsDevicesService.updateBmsDevices(bmsDevices)); + } + + /** + * 删除BBOX管理 + */ + @Log(title = "BBOX管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + return toAjax(bmsDevicesService.deleteBmsDevicesByIds(ids)); + } +} diff --git a/src/main/java/com/evobms/project/system/controller/SysConfigController.java b/src/main/java/com/evobms/project/system/controller/SysConfigController.java new file mode 100644 index 0000000..9a8e325 --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysConfigController.java @@ -0,0 +1,133 @@ +package com.evobms.project.system.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.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.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.system.domain.SysConfig; +import com.evobms.project.system.service.ISysConfigService; + +/** + * 参数配置 信息操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/config") +public class SysConfigController extends BaseController +{ + @Autowired + private ISysConfigService configService; + + /** + * 获取参数配置列表 + */ + @PreAuthorize("@ss.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("@ss.hasPermi('system:config:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysConfig config) + { + List list = configService.selectConfigList(config); + ExcelUtil util = new ExcelUtil(SysConfig.class); + util.exportExcel(response, list, "参数数据"); + } + + /** + * 根据参数编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:config:query')") + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable Long configId) + { + return success(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + */ + @GetMapping(value = "/configKey/{configKey}") + public AjaxResult getConfigKey(@PathVariable String configKey) + { + return success(configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:add')") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysConfig config) + { + if (!configService.checkConfigKeyUnique(config)) + { + return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setCreateBy(getUsername()); + return toAjax(configService.insertConfig(config)); + } + + /** + * 修改参数配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:edit')") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysConfig config) + { + if (!configService.checkConfigKeyUnique(config)) + { + return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setUpdateBy(getUsername()); + return toAjax(configService.updateConfig(config)); + } + + /** + * 删除参数配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "参数管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public AjaxResult remove(@PathVariable Long[] configIds) + { + configService.deleteConfigByIds(configIds); + return success(); + } + + /** + * 刷新参数缓存 + */ + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "参数管理", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() + { + configService.resetConfigCache(); + return success(); + } +} diff --git a/src/main/java/com/evobms/project/system/controller/SysDeptController.java b/src/main/java/com/evobms/project/system/controller/SysDeptController.java new file mode 100644 index 0000000..e4d0d28 --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysDeptController.java @@ -0,0 +1,132 @@ +package com.evobms.project.system.controller; + +import java.util.List; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.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.evobms.common.constant.UserConstants; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.project.system.domain.SysDept; +import com.evobms.project.system.service.ISysDeptService; + +/** + * 部门信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/dept") +public class SysDeptController extends BaseController +{ + @Autowired + private ISysDeptService deptService; + + /** + * 获取部门列表 + */ + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list") + public AjaxResult list(SysDept dept) + { + List depts = deptService.selectDeptList(dept); + return success(depts); + } + + /** + * 查询部门列表(排除节点) + */ + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list/exclude/{deptId}") + public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) + { + List depts = deptService.selectDeptList(new SysDept()); + depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); + return success(depts); + } + + /** + * 根据部门编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:dept:query')") + @GetMapping(value = "/{deptId}") + public AjaxResult getInfo(@PathVariable Long deptId) + { + deptService.checkDeptDataScope(deptId); + return success(deptService.selectDeptById(deptId)); + } + + /** + * 新增部门 + */ + @PreAuthorize("@ss.hasPermi('system:dept:add')") + @Log(title = "部门管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDept dept) + { + if (!deptService.checkDeptNameUnique(dept)) + { + return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + dept.setCreateBy(getUsername()); + return toAjax(deptService.insertDept(dept)); + } + + /** + * 修改部门 + */ + @PreAuthorize("@ss.hasPermi('system:dept:edit')") + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDept dept) + { + Long deptId = dept.getDeptId(); + deptService.checkDeptDataScope(deptId); + if (!deptService.checkDeptNameUnique(dept)) + { + return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + else if (dept.getParentId().equals(deptId)) + { + return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + } + else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) + { + return error("该部门包含未停用的子部门!"); + } + dept.setUpdateBy(getUsername()); + return toAjax(deptService.updateDept(dept)); + } + + /** + * 删除部门 + */ + @PreAuthorize("@ss.hasPermi('system:dept:remove')") + @Log(title = "部门管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public AjaxResult remove(@PathVariable Long deptId) + { + if (deptService.hasChildByDeptId(deptId)) + { + return warn("存在下级部门,不允许删除"); + } + if (deptService.checkDeptExistUser(deptId)) + { + return warn("部门存在用户,不允许删除"); + } + deptService.checkDeptDataScope(deptId); + return toAjax(deptService.deleteDeptById(deptId)); + } +} diff --git a/src/main/java/com/evobms/project/system/controller/SysDictDataController.java b/src/main/java/com/evobms/project/system/controller/SysDictDataController.java new file mode 100644 index 0000000..cd382f6 --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysDictDataController.java @@ -0,0 +1,121 @@ +package com.evobms.project.system.controller; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +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.evobms.common.utils.StringUtils; +import com.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.system.domain.SysDictData; +import com.evobms.project.system.service.ISysDictDataService; +import com.evobms.project.system.service.ISysDictTypeService; + +/** + * 数据字典信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/dict/data") +public class SysDictDataController extends BaseController +{ + @Autowired + private ISysDictDataService dictDataService; + + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize("@ss.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("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictData dictData) + { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil util = new ExcelUtil(SysDictData.class); + util.exportExcel(response, list, "字典数据"); + } + + /** + * 查询字典数据详细 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictCode}") + public AjaxResult getInfo(@PathVariable Long dictCode) + { + return success(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + */ + @GetMapping(value = "/type/{dictType}") + public AjaxResult dictType(@PathVariable String dictType) + { + List data = dictTypeService.selectDictDataByType(dictType); + if (StringUtils.isNull(data)) + { + data = new ArrayList(); + } + return success(data); + } + + /** + * 新增字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "字典数据", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictData dict) + { + dict.setCreateBy(getUsername()); + return toAjax(dictDataService.insertDictData(dict)); + } + + /** + * 修改保存字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "字典数据", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictData dict) + { + dict.setUpdateBy(getUsername()); + return toAjax(dictDataService.updateDictData(dict)); + } + + /** + * 删除字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public AjaxResult remove(@PathVariable Long[] dictCodes) + { + dictDataService.deleteDictDataByIds(dictCodes); + return success(); + } +} diff --git a/src/main/java/com/evobms/project/system/controller/SysDictTypeController.java b/src/main/java/com/evobms/project/system/controller/SysDictTypeController.java new file mode 100644 index 0000000..a6762d2 --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysDictTypeController.java @@ -0,0 +1,131 @@ +package com.evobms.project.system.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.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.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.system.domain.SysDictType; +import com.evobms.project.system.service.ISysDictTypeService; + +/** + * 数据字典信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/dict/type") +public class SysDictTypeController extends BaseController +{ + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize("@ss.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("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictType dictType) + { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil util = new ExcelUtil(SysDictType.class); + util.exportExcel(response, list, "字典类型"); + } + + /** + * 查询字典类型详细 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictId}") + public AjaxResult getInfo(@PathVariable Long dictId) + { + return success(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictType dict) + { + if (!dictTypeService.checkDictTypeUnique(dict)) + { + return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dict.setCreateBy(getUsername()); + return toAjax(dictTypeService.insertDictType(dict)); + } + + /** + * 修改字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "字典类型", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictType dict) + { + if (!dictTypeService.checkDictTypeUnique(dict)) + { + return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dict.setUpdateBy(getUsername()); + return toAjax(dictTypeService.updateDictType(dict)); + } + + /** + * 删除字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public AjaxResult remove(@PathVariable Long[] dictIds) + { + dictTypeService.deleteDictTypeByIds(dictIds); + return success(); + } + + /** + * 刷新字典缓存 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() + { + dictTypeService.resetDictCache(); + return success(); + } + + /** + * 获取字典选择框列表 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + List dictTypes = dictTypeService.selectDictTypeAll(); + return success(dictTypes); + } +} diff --git a/src/main/java/com/evobms/project/system/controller/SysIndexController.java b/src/main/java/com/evobms/project/system/controller/SysIndexController.java new file mode 100644 index 0000000..2732590 --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysIndexController.java @@ -0,0 +1,29 @@ +package com.evobms.project.system.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.config.RuoYiConfig; + +/** + * 首页 + * + * @author ruoyi + */ +@RestController +public class SysIndexController +{ + /** 系统基础配置 */ + @Autowired + private RuoYiConfig ruoyiConfig; + + /** + * 访问首页,提示语 + */ + @RequestMapping("/") + public String index() + { + return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); + } +} diff --git a/src/main/java/com/evobms/project/system/controller/SysLoginController.java b/src/main/java/com/evobms/project/system/controller/SysLoginController.java new file mode 100644 index 0000000..8f0f1d4 --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysLoginController.java @@ -0,0 +1,131 @@ +package com.evobms.project.system.controller; + +import java.util.Date; +import java.util.List; +import java.util.Set; +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.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.evobms.common.constant.Constants; +import com.evobms.common.core.text.Convert; +import com.evobms.common.utils.DateUtils; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.security.LoginBody; +import com.evobms.framework.security.LoginUser; +import com.evobms.framework.security.service.SysLoginService; +import com.evobms.framework.security.service.SysPermissionService; +import com.evobms.framework.security.service.TokenService; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.project.system.domain.SysMenu; +import com.evobms.project.system.domain.SysUser; +import com.evobms.project.system.service.ISysConfigService; +import com.evobms.project.system.service.ISysMenuService; + +/** + * 登录验证 + * + * @author ruoyi + */ +@RestController +public class SysLoginController +{ + @Autowired + private SysLoginService loginService; + + @Autowired + private ISysMenuService menuService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private TokenService tokenService; + + @Autowired + private ISysConfigService configService; + + /** + * 登录方法 + * + * @param loginBody 登录信息 + * @return 结果 + */ + @PostMapping("/login") + public AjaxResult login(@RequestBody LoginBody loginBody) + { + AjaxResult ajax = AjaxResult.success(); + // 生成令牌 + String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), + loginBody.getUuid()); + ajax.put(Constants.TOKEN, token); + return ajax; + } + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @GetMapping("getInfo") + public AjaxResult getInfo() + { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser user = loginUser.getUser(); + // 角色集合 + Set roles = permissionService.getRolePermission(user); + // 权限集合 + Set permissions = permissionService.getMenuPermission(user); + if (!loginUser.getPermissions().equals(permissions)) + { + loginUser.setPermissions(permissions); + tokenService.refreshToken(loginUser); + } + AjaxResult ajax = AjaxResult.success(); + ajax.put("user", user); + ajax.put("roles", roles); + ajax.put("permissions", permissions); + ajax.put("isDefaultModifyPwd", initPasswordIsModify(user.getPwdUpdateDate())); + ajax.put("isPasswordExpired", passwordIsExpiration(user.getPwdUpdateDate())); + return ajax; + } + + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @GetMapping("getRouters") + public AjaxResult getRouters() + { + Long userId = SecurityUtils.getUserId(); + List menus = menuService.selectMenuTreeByUserId(userId); + return AjaxResult.success(menuService.buildMenus(menus)); + } + + // 检查初始密码是否提醒修改 + public boolean initPasswordIsModify(Date pwdUpdateDate) + { + Integer initPasswordModify = Convert.toInt(configService.selectConfigByKey("sys.account.initPasswordModify")); + return initPasswordModify != null && initPasswordModify == 1 && pwdUpdateDate == null; + } + + // 检查密码是否过期 + public boolean passwordIsExpiration(Date pwdUpdateDate) + { + Integer passwordValidateDays = Convert.toInt(configService.selectConfigByKey("sys.account.passwordValidateDays")); + if (passwordValidateDays != null && passwordValidateDays > 0) + { + if (StringUtils.isNull(pwdUpdateDate)) + { + // 如果从未修改过初始密码,直接提醒过期 + return true; + } + Date nowDate = DateUtils.getNowDate(); + return DateUtils.differentDaysByMillisecond(nowDate, pwdUpdateDate) > passwordValidateDays; + } + return false; + } +} diff --git a/src/main/java/com/evobms/project/system/controller/SysMenuController.java b/src/main/java/com/evobms/project/system/controller/SysMenuController.java new file mode 100644 index 0000000..58ca5bc --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysMenuController.java @@ -0,0 +1,142 @@ +package com.evobms.project.system.controller; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.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.evobms.common.constant.UserConstants; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.project.system.domain.SysMenu; +import com.evobms.project.system.service.ISysMenuService; + +/** + * 菜单信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/menu") +public class SysMenuController extends BaseController +{ + @Autowired + private ISysMenuService menuService; + + /** + * 获取菜单列表 + */ + @PreAuthorize("@ss.hasPermi('system:menu:list')") + @GetMapping("/list") + public AjaxResult list(SysMenu menu) + { + List menus = menuService.selectMenuList(menu, getUserId()); + return success(menus); + } + + /** + * 根据菜单编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:menu:query')") + @GetMapping(value = "/{menuId}") + public AjaxResult getInfo(@PathVariable Long menuId) + { + return success(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @GetMapping("/treeselect") + public AjaxResult treeselect(SysMenu menu) + { + List menus = menuService.selectMenuList(menu, getUserId()); + return success(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + */ + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) + { + List menus = menuService.selectMenuList(getUserId()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); + ajax.put("menus", menuService.buildMenuTreeSelect(menus)); + return ajax; + } + + /** + * 新增菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:add')") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysMenu menu) + { + if (!menuService.checkMenuNameUnique(menu)) + { + return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) + { + return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + menu.setCreateBy(getUsername()); + return toAjax(menuService.insertMenu(menu)); + } + + /** + * 修改菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:edit')") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysMenu menu) + { + if (!menuService.checkMenuNameUnique(menu)) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + else if (menu.getMenuId().equals(menu.getParentId())) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + } + menu.setUpdateBy(getUsername()); + return toAjax(menuService.updateMenu(menu)); + } + + /** + * 删除菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:remove')") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public AjaxResult remove(@PathVariable("menuId") Long menuId) + { + if (menuService.hasChildByMenuId(menuId)) + { + return warn("存在子菜单,不允许删除"); + } + if (menuService.checkMenuExistRole(menuId)) + { + return warn("菜单已分配,不允许删除"); + } + return toAjax(menuService.deleteMenuById(menuId)); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/system/controller/SysNoticeController.java b/src/main/java/com/evobms/project/system/controller/SysNoticeController.java new file mode 100644 index 0000000..2bceb7a --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysNoticeController.java @@ -0,0 +1,91 @@ +package com.evobms.project.system.controller; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.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.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.system.domain.SysNotice; +import com.evobms.project.system.service.ISysNoticeService; + +/** + * 公告 信息操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/notice") +public class SysNoticeController extends BaseController +{ + @Autowired + private ISysNoticeService noticeService; + + /** + * 获取通知公告列表 + */ + @PreAuthorize("@ss.hasPermi('system:notice:list')") + @GetMapping("/list") + public TableDataInfo list(SysNotice notice) + { + startPage(); + List list = noticeService.selectNoticeList(notice); + return getDataTable(list); + } + + /** + * 根据通知公告编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:notice:query')") + @GetMapping(value = "/{noticeId}") + public AjaxResult getInfo(@PathVariable Long noticeId) + { + return success(noticeService.selectNoticeById(noticeId)); + } + + /** + * 新增通知公告 + */ + @PreAuthorize("@ss.hasPermi('system:notice:add')") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysNotice notice) + { + notice.setCreateBy(getUsername()); + return toAjax(noticeService.insertNotice(notice)); + } + + /** + * 修改通知公告 + */ + @PreAuthorize("@ss.hasPermi('system:notice:edit')") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysNotice notice) + { + notice.setUpdateBy(getUsername()); + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 删除通知公告 + */ + @PreAuthorize("@ss.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/src/main/java/com/evobms/project/system/controller/SysPostController.java b/src/main/java/com/evobms/project/system/controller/SysPostController.java new file mode 100644 index 0000000..f0679c4 --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysPostController.java @@ -0,0 +1,129 @@ +package com.evobms.project.system.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.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.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.system.domain.SysPost; +import com.evobms.project.system.service.ISysPostService; + +/** + * 岗位信息操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/post") +public class SysPostController extends BaseController +{ + @Autowired + private ISysPostService postService; + + /** + * 获取岗位列表 + */ + @PreAuthorize("@ss.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("@ss.hasPermi('system:post:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysPost post) + { + List list = postService.selectPostList(post); + ExcelUtil util = new ExcelUtil(SysPost.class); + util.exportExcel(response, list, "岗位数据"); + } + + /** + * 根据岗位编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:post:query')") + @GetMapping(value = "/{postId}") + public AjaxResult getInfo(@PathVariable Long postId) + { + return success(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @PreAuthorize("@ss.hasPermi('system:post:add')") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysPost post) + { + if (!postService.checkPostNameUnique(post)) + { + return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } + else if (!postService.checkPostCodeUnique(post)) + { + return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + post.setCreateBy(getUsername()); + return toAjax(postService.insertPost(post)); + } + + /** + * 修改岗位 + */ + @PreAuthorize("@ss.hasPermi('system:post:edit')") + @Log(title = "岗位管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysPost post) + { + if (!postService.checkPostNameUnique(post)) + { + return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } + else if (!postService.checkPostCodeUnique(post)) + { + return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + post.setUpdateBy(getUsername()); + return toAjax(postService.updatePost(post)); + } + + /** + * 删除岗位 + */ + @PreAuthorize("@ss.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 success(posts); + } +} diff --git a/src/main/java/com/evobms/project/system/controller/SysProfileController.java b/src/main/java/com/evobms/project/system/controller/SysProfileController.java new file mode 100644 index 0000000..f35e4d5 --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysProfileController.java @@ -0,0 +1,148 @@ +package com.evobms.project.system.controller; + +import java.util.Map; +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.evobms.common.utils.DateUtils; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.file.FileUploadUtils; +import com.evobms.common.utils.file.FileUtils; +import com.evobms.common.utils.file.MimeTypeUtils; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.config.RuoYiConfig; +import com.evobms.framework.security.LoginUser; +import com.evobms.framework.security.service.TokenService; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.project.system.domain.SysUser; +import com.evobms.project.system.service.ISysUserService; + +/** + * 个人信息 业务处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/user/profile") +public class SysProfileController extends BaseController +{ + @Autowired + private ISysUserService userService; + + @Autowired + private TokenService tokenService; + + /** + * 个人信息 + */ + @GetMapping + public AjaxResult profile() + { + LoginUser loginUser = getLoginUser(); + SysUser user = loginUser.getUser(); + AjaxResult ajax = AjaxResult.success(user); + ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); + ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); + return ajax; + } + + /** + * 修改用户 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult updateProfile(@RequestBody SysUser user) + { + LoginUser loginUser = getLoginUser(); + SysUser currentUser = loginUser.getUser(); + currentUser.setNickName(user.getNickName()); + currentUser.setEmail(user.getEmail()); + currentUser.setPhonenumber(user.getPhonenumber()); + currentUser.setSex(user.getSex()); + if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser)) + { + return error("修改用户'" + loginUser.getUsername() + "'失败,手机号码已存在"); + } + if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser)) + { + return error("修改用户'" + loginUser.getUsername() + "'失败,邮箱账号已存在"); + } + if (userService.updateUserProfile(currentUser) > 0) + { + // 更新缓存用户信息 + tokenService.setLoginUser(loginUser); + return success(); + } + return error("修改个人信息异常,请联系管理员"); + } + + /** + * 重置密码 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public AjaxResult updatePwd(@RequestBody Map params) + { + String oldPassword = params.get("oldPassword"); + String newPassword = params.get("newPassword"); + LoginUser loginUser = getLoginUser(); + Long userId = loginUser.getUserId(); + String password = loginUser.getPassword(); + if (!SecurityUtils.matchesPassword(oldPassword, password)) + { + return error("修改密码失败,旧密码错误"); + } + if (SecurityUtils.matchesPassword(newPassword, password)) + { + return error("新密码不能与旧密码相同"); + } + newPassword = SecurityUtils.encryptPassword(newPassword); + if (userService.resetUserPwd(userId, newPassword) > 0) + { + // 更新缓存用户密码&密码最后更新时间 + loginUser.getUser().setPwdUpdateDate(DateUtils.getNowDate()); + loginUser.getUser().setPassword(newPassword); + tokenService.setLoginUser(loginUser); + return success(); + } + return error("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + */ + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping("/avatar") + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception + { + if (!file.isEmpty()) + { + LoginUser loginUser = getLoginUser(); + String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION, true); + if (userService.updateUserAvatar(loginUser.getUserId(), avatar)) + { + String oldAvatar = loginUser.getUser().getAvatar(); + if (StringUtils.isNotEmpty(oldAvatar)) + { + FileUtils.deleteFile(RuoYiConfig.getProfile() + FileUtils.stripPrefix(oldAvatar)); + } + AjaxResult ajax = AjaxResult.success(); + ajax.put("imgUrl", avatar); + // 更新缓存用户头像 + loginUser.getUser().setAvatar(avatar); + tokenService.setLoginUser(loginUser); + return ajax; + } + } + return error("上传图片异常,请联系管理员"); + } +} diff --git a/src/main/java/com/evobms/project/system/controller/SysRegisterController.java b/src/main/java/com/evobms/project/system/controller/SysRegisterController.java new file mode 100644 index 0000000..3672380 --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysRegisterController.java @@ -0,0 +1,38 @@ +package com.evobms.project.system.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.security.RegisterBody; +import com.evobms.framework.security.service.SysRegisterService; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.project.system.service.ISysConfigService; + +/** + * 注册验证 + * + * @author ruoyi + */ +@RestController +public class SysRegisterController extends BaseController +{ + @Autowired + private SysRegisterService registerService; + + @Autowired + private ISysConfigService configService; + + @PostMapping("/register") + public AjaxResult register(@RequestBody RegisterBody user) + { + if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) + { + return error("当前系统没有开启注册功能!"); + } + String msg = registerService.register(user); + return StringUtils.isEmpty(msg) ? success() : error(msg); + } +} diff --git a/src/main/java/com/evobms/project/system/controller/SysRoleController.java b/src/main/java/com/evobms/project/system/controller/SysRoleController.java new file mode 100644 index 0000000..55efe1e --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysRoleController.java @@ -0,0 +1,262 @@ +package com.evobms.project.system.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.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.evobms.common.utils.StringUtils; +import com.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.security.LoginUser; +import com.evobms.framework.security.service.SysPermissionService; +import com.evobms.framework.security.service.TokenService; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.system.domain.SysDept; +import com.evobms.project.system.domain.SysRole; +import com.evobms.project.system.domain.SysUser; +import com.evobms.project.system.domain.SysUserRole; +import com.evobms.project.system.service.ISysDeptService; +import com.evobms.project.system.service.ISysRoleService; +import com.evobms.project.system.service.ISysUserService; + +/** + * 角色信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/role") +public class SysRoleController extends BaseController +{ + @Autowired + private ISysRoleService roleService; + + @Autowired + private TokenService tokenService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISysDeptService deptService; + + @PreAuthorize("@ss.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("@ss.hasPermi('system:role:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysRole role) + { + List list = roleService.selectRoleList(role); + ExcelUtil util = new ExcelUtil(SysRole.class); + util.exportExcel(response, list, "角色数据"); + } + + /** + * 根据角色编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping(value = "/{roleId}") + public AjaxResult getInfo(@PathVariable Long roleId) + { + roleService.checkRoleDataScope(roleId); + return success(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @PreAuthorize("@ss.hasPermi('system:role:add')") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysRole role) + { + if (!roleService.checkRoleNameUnique(role)) + { + return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } + else if (!roleService.checkRoleKeyUnique(role)) + { + return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + role.setCreateBy(getUsername()); + return toAjax(roleService.insertRole(role)); + + } + + /** + * 修改保存角色 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + if (!roleService.checkRoleNameUnique(role)) + { + return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } + else if (!roleService.checkRoleKeyUnique(role)) + { + return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + role.setUpdateBy(getUsername()); + + if (roleService.updateRole(role) > 0) + { + // 更新缓存用户权限 + LoginUser loginUser = getLoginUser(); + if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) + { + loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName())); + loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser())); + tokenService.setLoginUser(loginUser); + } + return success(); + } + return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + } + + /** + * 修改保存数据权限 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public AjaxResult dataScope(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 状态修改 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + role.setUpdateBy(getUsername()); + return toAjax(roleService.updateRoleStatus(role)); + } + + /** + * 删除角色 + */ + @PreAuthorize("@ss.hasPermi('system:role:remove')") + @Log(title = "角色管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public AjaxResult remove(@PathVariable Long[] roleIds) + { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 获取角色选择框列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + return success(roleService.selectRoleAll()); + } + + /** + * 查询已分配用户角色列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(SysUser user) + { + startPage(); + List list = userService.selectAllocatedList(user); + return getDataTable(list); + } + + /** + * 查询未分配用户角色列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(SysUser user) + { + startPage(); + List list = userService.selectUnallocatedList(user); + return getDataTable(list); + } + + /** + * 取消授权用户 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancel") + public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole) + { + return toAjax(roleService.deleteAuthUser(userRole)); + } + + /** + * 批量取消授权用户 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancelAll") + public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds) + { + return toAjax(roleService.deleteAuthUsers(roleId, userIds)); + } + + /** + * 批量选择用户授权 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/selectAll") + public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds) + { + roleService.checkRoleDataScope(roleId); + return toAjax(roleService.insertAuthUsers(roleId, userIds)); + } + + /** + * 获取对应角色部门树列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping(value = "/deptTree/{roleId}") + public AjaxResult deptTree(@PathVariable("roleId") Long roleId) + { + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", deptService.selectDeptTreeList(new SysDept())); + return ajax; + } +} diff --git a/src/main/java/com/evobms/project/system/controller/SysUserController.java b/src/main/java/com/evobms/project/system/controller/SysUserController.java new file mode 100644 index 0000000..de7f614 --- /dev/null +++ b/src/main/java/com/evobms/project/system/controller/SysUserController.java @@ -0,0 +1,256 @@ +package com.evobms.project.system.controller; + +import java.util.List; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +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.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.poi.ExcelUtil; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.system.domain.SysDept; +import com.evobms.project.system.domain.SysRole; +import com.evobms.project.system.domain.SysUser; +import com.evobms.project.system.service.ISysDeptService; +import com.evobms.project.system.service.ISysPostService; +import com.evobms.project.system.service.ISysRoleService; +import com.evobms.project.system.service.ISysUserService; + +/** + * 用户信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/user") +public class SysUserController extends BaseController +{ + @Autowired + private ISysUserService userService; + + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysDeptService deptService; + + @Autowired + private ISysPostService postService; + + /** + * 获取用户列表 + */ + @PreAuthorize("@ss.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("@ss.hasPermi('system:user:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysUser user) + { + List list = userService.selectUserList(user); + ExcelUtil util = new ExcelUtil(SysUser.class); + util.exportExcel(response, list, "用户数据"); + } + + @Log(title = "用户管理", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.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 = getUsername(); + String message = userService.importUser(userList, updateSupport, operName); + return success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) + { + ExcelUtil util = new ExcelUtil(SysUser.class); + util.importTemplateExcel(response, "用户数据"); + } + + /** + * 根据用户编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping(value = { "/", "/{userId}" }) + public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) + { + AjaxResult ajax = AjaxResult.success(); + if (StringUtils.isNotNull(userId)) + { + userService.checkUserDataScope(userId); + SysUser sysUser = userService.selectUserById(userId); + ajax.put(AjaxResult.DATA_TAG, sysUser); + ajax.put("postIds", postService.selectPostListByUserId(userId)); + ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); + } + 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()); + return ajax; + } + + /** + * 新增用户 + */ + @PreAuthorize("@ss.hasPermi('system:user:add')") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysUser user) + { + deptService.checkDeptDataScope(user.getDeptId()); + roleService.checkRoleDataScope(user.getRoleIds()); + if (!userService.checkUserNameUnique(user)) + { + return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } + else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) + { + return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } + else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) + { + return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setCreateBy(getUsername()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + return toAjax(userService.insertUser(user)); + } + + /** + * 修改用户 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + deptService.checkDeptDataScope(user.getDeptId()); + roleService.checkRoleDataScope(user.getRoleIds()); + if (!userService.checkUserNameUnique(user)) + { + return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } + else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) + { + return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } + else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) + { + return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setUpdateBy(getUsername()); + return toAjax(userService.updateUser(user)); + } + + /** + * 删除用户 + */ + @PreAuthorize("@ss.hasPermi('system:user:remove')") + @Log(title = "用户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) + { + if (ArrayUtils.contains(userIds, getUserId())) + { + return error("当前用户不能删除"); + } + return toAjax(userService.deleteUserByIds(userIds)); + } + + /** + * 重置密码 + */ + @PreAuthorize("@ss.hasPermi('system:user:resetPwd')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public AjaxResult resetPwd(@RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setUpdateBy(getUsername()); + return toAjax(userService.resetPwd(user)); + } + + /** + * 状态修改 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + user.setUpdateBy(getUsername()); + return toAjax(userService.updateUserStatus(user)); + } + + /** + * 根据用户编号获取授权角色 + */ + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping("/authRole/{userId}") + public AjaxResult authRole(@PathVariable("userId") Long userId) + { + AjaxResult ajax = AjaxResult.success(); + SysUser user = userService.selectUserById(userId); + List roles = roleService.selectRolesByUserId(userId); + ajax.put("user", user); + ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + return ajax; + } + + /** + * 用户授权角色 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.GRANT) + @PutMapping("/authRole") + public AjaxResult insertAuthRole(Long userId, Long[] roleIds) + { + userService.checkUserDataScope(userId); + roleService.checkRoleDataScope(roleIds); + userService.insertUserAuth(userId, roleIds); + return success(); + } + + /** + * 获取部门树列表 + */ + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/deptTree") + public AjaxResult deptTree(SysDept dept) + { + return success(deptService.selectDeptTreeList(dept)); + } +} diff --git a/src/main/java/com/evobms/project/system/domain/BmsDevices.java b/src/main/java/com/evobms/project/system/domain/BmsDevices.java new file mode 100644 index 0000000..2804035 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/BmsDevices.java @@ -0,0 +1,59 @@ +package com.evobms.project.system.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.web.domain.BaseEntity; + +/** + * BBOX管理对象 bms_devices + * + * @author 田志阳 + * @date 2025-10-10 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class BmsDevices extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private String id; + + /** 设备唯一编号 */ + @Excel(name = "设备唯一编号") + private String deviceId; + + /** 设备名称 */ + @Excel(name = "设备名称") + private String deviceName; + /** 设备名称 */ + @Excel(name = "设备SN码") + private String deviceSn; + + /** 设备类型 */ + @Excel(name = "设备类型") + private String deviceType; + + /** 设备状态 */ + @Excel(name = "设备状态") + private String status; + + /** 设备IP地址 */ + @Excel(name = "设备IP地址") + private String ipAddress; + + /** 固件版本号 */ + @Excel(name = "固件版本号") + private String firmwareVersion; + + /** 最后在线时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "最后在线时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date lastOnline; + +} diff --git a/src/main/java/com/evobms/project/system/domain/SysConfig.java b/src/main/java/com/evobms/project/system/domain/SysConfig.java new file mode 100644 index 0000000..883bd27 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysConfig.java @@ -0,0 +1,111 @@ +package com.evobms.project.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.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.evobms.framework.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; + + /** 系统内置(Y是 N否) */ + @Excel(name = "系统内置", readConverterExp = "Y=是,N=否") + private String configType; + + public Long getConfigId() + { + return configId; + } + + public void setConfigId(Long configId) + { + this.configId = configId; + } + + @NotBlank(message = "参数名称不能为空") + @Size(min = 0, max = 100, message = "参数名称不能超过100个字符") + public String getConfigName() + { + return configName; + } + + public void setConfigName(String configName) + { + this.configName = configName; + } + + @NotBlank(message = "参数键名长度不能为空") + @Size(min = 0, max = 100, message = "参数键名长度不能超过100个字符") + public String getConfigKey() + { + return configKey; + } + + public void setConfigKey(String configKey) + { + this.configKey = configKey; + } + + @NotBlank(message = "参数键值不能为空") + @Size(min = 0, max = 500, message = "参数键值长度不能超过500个字符") + public String getConfigValue() + { + return configValue; + } + + public void setConfigValue(String configValue) + { + this.configValue = configValue; + } + + public String getConfigType() + { + return configType; + } + + public void setConfigType(String configType) + { + this.configType = configType; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("configId", getConfigId()) + .append("configName", getConfigName()) + .append("configKey", getConfigKey()) + .append("configValue", getConfigValue()) + .append("configType", getConfigType()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/src/main/java/com/evobms/project/system/domain/SysDept.java b/src/main/java/com/evobms/project/system/domain/SysDept.java new file mode 100644 index 0000000..0c5d327 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysDept.java @@ -0,0 +1,203 @@ +package com.evobms.project.system.domain; + +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.framework.web.domain.BaseEntity; + +/** + * 部门表 sys_dept + * + * @author ruoyi + */ +public class SysDept extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 部门ID */ + private Long deptId; + + /** 父部门ID */ + private Long parentId; + + /** 祖级列表 */ + private String ancestors; + + /** 部门名称 */ + private String deptName; + + /** 显示顺序 */ + private Integer orderNum; + + /** 负责人 */ + private String leader; + + /** 联系电话 */ + private String phone; + + /** 邮箱 */ + private String email; + + /** 部门状态:0正常,1停用 */ + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + 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; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer 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/src/main/java/com/evobms/project/system/domain/SysDictData.java b/src/main/java/com/evobms/project/system/domain/SysDictData.java new file mode 100644 index 0000000..c267599 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysDictData.java @@ -0,0 +1,176 @@ +package com.evobms.project.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.evobms.common.constant.UserConstants; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.evobms.framework.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; + + /** 是否默认(Y是 N否) */ + @Excel(name = "是否默认", readConverterExp = "Y=是,N=否") + private String isDefault; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,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); + } + + 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/src/main/java/com/evobms/project/system/domain/SysDictType.java b/src/main/java/com/evobms/project/system/domain/SysDictType.java new file mode 100644 index 0000000..005a923 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysDictType.java @@ -0,0 +1,96 @@ +package com.evobms.project.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.evobms.framework.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正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,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个字符") + @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") + 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/src/main/java/com/evobms/project/system/domain/SysMenu.java b/src/main/java/com/evobms/project/system/domain/SysMenu.java new file mode 100644 index 0000000..e1be3ab --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysMenu.java @@ -0,0 +1,274 @@ +package com.evobms.project.system.domain; + +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.framework.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; + + /** 父菜单ID */ + private Long parentId; + + /** 显示顺序 */ + private Integer orderNum; + + /** 路由地址 */ + private String path; + + /** 组件路径 */ + private String component; + + /** 路由参数 */ + private String query; + + /** 路由名称,默认和路由地址相同的驼峰格式(注意:因为vue3版本的router会删除名称相同路由,为避免名字的冲突,特殊情况可以自定义) */ + private String routeName; + + /** 是否为外链(0是 1否) */ + private String isFrame; + + /** 是否缓存(0缓存 1不缓存) */ + private String isCache; + + /** 类型(M目录 C菜单 F按钮) */ + private String menuType; + + /** 显示状态(0显示 1隐藏) */ + private String visible; + + /** 菜单状态(0正常 1停用) */ + private String status; + + /** 权限字符串 */ + private String perms; + + /** 菜单图标 */ + private String icon; + + /** 子菜单 */ + private List 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; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") + public String getPath() + { + return path; + } + + public void setPath(String path) + { + this.path = path; + } + + @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") + public String getComponent() + { + return component; + } + + public void setComponent(String component) + { + this.component = component; + } + + public String getQuery() + { + return query; + } + + public void setQuery(String query) + { + this.query = query; + } + + public String getRouteName() + { + return routeName; + } + + public void setRouteName(String routeName) + { + this.routeName = routeName; + } + + public String getIsFrame() + { + return isFrame; + } + + public void setIsFrame(String isFrame) + { + this.isFrame = isFrame; + } + + public String getIsCache() + { + return isCache; + } + + public void setIsCache(String isCache) + { + this.isCache = isCache; + } + + @NotBlank(message = "菜单类型不能为空") + public String getMenuType() + { + return menuType; + } + + public void setMenuType(String menuType) + { + this.menuType = menuType; + } + + public String getVisible() + { + return visible; + } + + public void setVisible(String visible) + { + this.visible = visible; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") + public String getPerms() + { + return perms; + } + + public void setPerms(String perms) + { + this.perms = perms; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } + + public List 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("query", getQuery()) + .append("routeName", getRouteName()) + .append("isFrame", getIsFrame()) + .append("IsCache", getIsCache()) + .append("menuType", getMenuType()) + .append("visible", getVisible()) + .append("status ", getStatus()) + .append("perms", getPerms()) + .append("icon", getIcon()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/src/main/java/com/evobms/project/system/domain/SysNotice.java b/src/main/java/com/evobms/project/system/domain/SysNotice.java new file mode 100644 index 0000000..096af83 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysNotice.java @@ -0,0 +1,102 @@ +package com.evobms.project.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.evobms.common.xss.Xss; +import com.evobms.framework.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正常 1关闭) */ + private String status; + + public Long getNoticeId() + { + return noticeId; + } + + public void setNoticeId(Long noticeId) + { + this.noticeId = noticeId; + } + + public void setNoticeTitle(String noticeTitle) + { + this.noticeTitle = noticeTitle; + } + + @Xss(message = "公告标题不能包含脚本字符") + @NotBlank(message = "公告标题不能为空") + @Size(min = 0, max = 50, message = "公告标题不能超过50个字符") + public String getNoticeTitle() + { + return noticeTitle; + } + + public void setNoticeType(String noticeType) + { + this.noticeType = noticeType; + } + + public String getNoticeType() + { + return noticeType; + } + + public void setNoticeContent(String noticeContent) + { + this.noticeContent = noticeContent; + } + + public String getNoticeContent() + { + return noticeContent; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("noticeId", getNoticeId()) + .append("noticeTitle", getNoticeTitle()) + .append("noticeType", getNoticeType()) + .append("noticeContent", getNoticeContent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/src/main/java/com/evobms/project/system/domain/SysPost.java b/src/main/java/com/evobms/project/system/domain/SysPost.java new file mode 100644 index 0000000..4577717 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysPost.java @@ -0,0 +1,124 @@ +package com.evobms.project.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.evobms.framework.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 Integer postSort; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 用户是否存在此岗位标识 默认不存在 */ + private boolean flag = false; + + public Long getPostId() + { + return postId; + } + + public void setPostId(Long postId) + { + this.postId = postId; + } + + @NotBlank(message = "岗位编码不能为空") + @Size(min = 0, max = 64, message = "岗位编码长度不能超过64个字符") + public String getPostCode() + { + return postCode; + } + + public void setPostCode(String postCode) + { + this.postCode = postCode; + } + + @NotBlank(message = "岗位名称不能为空") + @Size(min = 0, max = 50, message = "岗位名称长度不能超过50个字符") + public String getPostName() + { + return postName; + } + + public void setPostName(String postName) + { + this.postName = postName; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getPostSort() + { + return postSort; + } + + public void setPostSort(Integer postSort) + { + this.postSort = postSort; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public boolean isFlag() + { + return flag; + } + + public void setFlag(boolean flag) + { + this.flag = flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("postId", getPostId()) + .append("postCode", getPostCode()) + .append("postName", getPostName()) + .append("postSort", getPostSort()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/src/main/java/com/evobms/project/system/domain/SysRole.java b/src/main/java/com/evobms/project/system/domain/SysRole.java new file mode 100644 index 0000000..8f15c39 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysRole.java @@ -0,0 +1,241 @@ +package com.evobms.project.system.domain; + +import java.util.Set; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.evobms.framework.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 Integer roleSort; + + /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */ + @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") + private String dataScope; + + /** 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */ + private boolean menuCheckStrictly; + + /** 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */ + private boolean deptCheckStrictly; + + /** 角色状态(0正常 1停用) */ + @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 用户是否存在此角色标识 默认不存在 */ + private boolean flag = false; + + /** 菜单组 */ + private Long[] menuIds; + + /** 部门组(数据权限) */ + private Long[] deptIds; + + /** 角色菜单权限 */ + private Set permissions; + + 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; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getRoleSort() + { + return roleSort; + } + + public void setRoleSort(Integer 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 Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + + @Override + 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/src/main/java/com/evobms/project/system/domain/SysRoleDept.java b/src/main/java/com/evobms/project/system/domain/SysRoleDept.java new file mode 100644 index 0000000..c809102 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysRoleDept.java @@ -0,0 +1,46 @@ +package com.evobms.project.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/src/main/java/com/evobms/project/system/domain/SysRoleMenu.java b/src/main/java/com/evobms/project/system/domain/SysRoleMenu.java new file mode 100644 index 0000000..33cde89 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysRoleMenu.java @@ -0,0 +1,46 @@ +package com.evobms.project.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/src/main/java/com/evobms/project/system/domain/SysUser.java b/src/main/java/com/evobms/project/system/domain/SysUser.java new file mode 100644 index 0000000..69efe6a --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysUser.java @@ -0,0 +1,338 @@ +package com.evobms.project.system.domain; + +import java.util.Date; +import java.util.List; +import javax.validation.constraints.*; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.common.xss.Xss; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.evobms.framework.aspectj.lang.annotation.Excel.Type; +import com.evobms.framework.aspectj.lang.annotation.Excels; +import com.evobms.framework.web.domain.BaseEntity; + +/** + * 用户对象 sys_user + * + * @author ruoyi + */ +public class SysUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 用户ID */ + @Excel(name = "用户序号", type = Type.EXPORT, 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 = "手机号码", cellType = ColumnType.TEXT) + private String phonenumber; + + /** 用户性别 */ + @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") + private String sex; + + /** 用户头像 */ + private String avatar; + + /** 密码 */ + private String password; + + /** 账号状态(0正常 1停用) */ + @Excel(name = "账号状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 最后登录IP */ + @Excel(name = "最后登录IP", type = Type.EXPORT) + private String loginIp; + + /** 最后登录时间 */ + @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) + private Date loginDate; + + /** 密码最后更新时间 */ + private Date pwdUpdateDate; + + /** 部门对象 */ + @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; + + /** 角色ID */ + private Long roleId; + + 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; + } + + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") + public String getNickName() + { + return nickName; + } + + public void setNickName(String nickName) + { + this.nickName = nickName; + } + + @Xss(message = "用户账号不能包含脚本字符") + @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; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + 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 Date getPwdUpdateDate() + { + return pwdUpdateDate; + } + + public void setPwdUpdateDate(Date pwdUpdateDate) + { + this.pwdUpdateDate = pwdUpdateDate; + } + + 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; + } + + 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("deptId", getDeptId()) + .append("userName", getUserName()) + .append("nickName", getNickName()) + .append("email", getEmail()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("avatar", getAvatar()) + .append("password", getPassword()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("loginIp", getLoginIp()) + .append("loginDate", getLoginDate()) + .append("pwdUpdateDate", getPwdUpdateDate()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("dept", getDept()) + .toString(); + } +} diff --git a/src/main/java/com/evobms/project/system/domain/SysUserPost.java b/src/main/java/com/evobms/project/system/domain/SysUserPost.java new file mode 100644 index 0000000..527d40a --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysUserPost.java @@ -0,0 +1,46 @@ +package com.evobms.project.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/src/main/java/com/evobms/project/system/domain/SysUserRole.java b/src/main/java/com/evobms/project/system/domain/SysUserRole.java new file mode 100644 index 0000000..74506bc --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/SysUserRole.java @@ -0,0 +1,46 @@ +package com.evobms.project.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/src/main/java/com/evobms/project/system/domain/vo/MetaVo.java b/src/main/java/com/evobms/project/system/domain/vo/MetaVo.java new file mode 100644 index 0000000..6b94042 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/vo/MetaVo.java @@ -0,0 +1,106 @@ +package com.evobms.project.system.domain.vo; + +import com.evobms.common.utils.StringUtils; + +/** + * 路由显示信息 + * + * @author ruoyi + */ +public class MetaVo +{ + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,对应路径src/assets/icons/svg + */ + private String icon; + + /** + * 设置为true,则不会被 缓存 + */ + private boolean noCache; + + /** + * 内链地址(http(s)://开头) + */ + private String link; + + public MetaVo() + { + } + + public MetaVo(String title, String icon) + { + this.title = title; + this.icon = icon; + } + + public MetaVo(String title, String icon, boolean noCache) + { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public MetaVo(String title, String icon, String link) + { + this.title = title; + this.icon = icon; + this.link = link; + } + + public MetaVo(String title, String icon, boolean noCache, String link) + { + this.title = title; + this.icon = icon; + this.noCache = noCache; + if (StringUtils.ishttp(link)) + { + this.link = link; + } + } + + public boolean isNoCache() + { + return noCache; + } + + public void setNoCache(boolean noCache) + { + this.noCache = noCache; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } + + public String getLink() + { + return link; + } + + public void setLink(String link) + { + this.link = link; + } +} diff --git a/src/main/java/com/evobms/project/system/domain/vo/RouterVo.java b/src/main/java/com/evobms/project/system/domain/vo/RouterVo.java new file mode 100644 index 0000000..b48bc67 --- /dev/null +++ b/src/main/java/com/evobms/project/system/domain/vo/RouterVo.java @@ -0,0 +1,148 @@ +package com.evobms.project.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; + + /** + * 路由参数:如 {"id": 1, "name": "ry"} + */ + private String query; + + /** + * 当你一个路由下面的 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 String getQuery() + { + return query; + } + + public void setQuery(String query) + { + this.query = query; + } + + public Boolean getAlwaysShow() + { + return alwaysShow; + } + + public void setAlwaysShow(Boolean alwaysShow) + { + this.alwaysShow = alwaysShow; + } + + public MetaVo getMeta() + { + return meta; + } + + public void setMeta(MetaVo meta) + { + this.meta = meta; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/src/main/java/com/evobms/project/system/mapper/BmsDevicesMapper.java b/src/main/java/com/evobms/project/system/mapper/BmsDevicesMapper.java new file mode 100644 index 0000000..320b075 --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/BmsDevicesMapper.java @@ -0,0 +1,61 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import com.evobms.project.system.domain.BmsDevices; + +/** + * BBOX管理Mapper接口 + * + * @author 田志阳 + * @date 2025-10-10 + */ +public interface BmsDevicesMapper +{ + /** + * 查询BBOX管理 + * + * @param id BBOX管理主键 + * @return BBOX管理 + */ + public BmsDevices selectBmsDevicesById(String id); + + /** + * 查询BBOX管理列表 + * + * @param bmsDevices BBOX管理 + * @return BBOX管理集合 + */ + public List selectBmsDevicesList(BmsDevices bmsDevices); + + /** + * 新增BBOX管理 + * + * @param bmsDevices BBOX管理 + * @return 结果 + */ + public int insertBmsDevices(BmsDevices bmsDevices); + + /** + * 修改BBOX管理 + * + * @param bmsDevices BBOX管理 + * @return 结果 + */ + public int updateBmsDevices(BmsDevices bmsDevices); + + /** + * 删除BBOX管理 + * + * @param id BBOX管理主键 + * @return 结果 + */ + public int deleteBmsDevicesById(String id); + + /** + * 批量删除BBOX管理 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteBmsDevicesByIds(String[] ids); +} diff --git a/src/main/java/com/evobms/project/system/mapper/SysConfigMapper.java b/src/main/java/com/evobms/project/system/mapper/SysConfigMapper.java new file mode 100644 index 0000000..c2f4ae8 --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysConfigMapper.java @@ -0,0 +1,76 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import com.evobms.project.system.domain.SysConfig; + +/** + * 参数配置 数据层 + * + * @author ruoyi + */ +public interface SysConfigMapper +{ + /** + * 查询参数配置信息 + * + * @param config 参数配置信息 + * @return 参数配置信息 + */ + public SysConfig selectConfig(SysConfig config); + + /** + * 通过ID查询配置 + * + * @param configId 参数ID + * @return 参数配置信息 + */ + public SysConfig selectConfigById(Long configId); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + public List 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); +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/system/mapper/SysDeptMapper.java b/src/main/java/com/evobms/project/system/mapper/SysDeptMapper.java new file mode 100644 index 0000000..f020236 --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysDeptMapper.java @@ -0,0 +1,118 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.evobms.project.system.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 父部门ID + * @return 结果 + */ + public SysDept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") Long parentId); + + /** + * 新增部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int insertDept(SysDept dept); + + /** + * 修改部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int updateDept(SysDept dept); + + /** + * 修改所在部门正常状态 + * + * @param deptIds 部门ID组 + */ + public void updateDeptStatusNormal(Long[] deptIds); + + /** + * 修改子元素关系 + * + * @param depts 子元素 + * @return 结果 + */ + public int updateDeptChildren(@Param("depts") List depts); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + public int deleteDeptById(Long deptId); +} diff --git a/src/main/java/com/evobms/project/system/mapper/SysDictDataMapper.java b/src/main/java/com/evobms/project/system/mapper/SysDictDataMapper.java new file mode 100644 index 0000000..06da180 --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysDictDataMapper.java @@ -0,0 +1,95 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.evobms.project.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/src/main/java/com/evobms/project/system/mapper/SysDictTypeMapper.java b/src/main/java/com/evobms/project/system/mapper/SysDictTypeMapper.java new file mode 100644 index 0000000..7b837c0 --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysDictTypeMapper.java @@ -0,0 +1,83 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import com.evobms.project.system.domain.SysDictType; + +/** + * 字典表 数据层 + * + * @author ruoyi + */ +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/src/main/java/com/evobms/project/system/mapper/SysMenuMapper.java b/src/main/java/com/evobms/project/system/mapper/SysMenuMapper.java new file mode 100644 index 0000000..d34787b --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysMenuMapper.java @@ -0,0 +1,125 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.evobms.project.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查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + public List selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户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 父菜单ID + * @return 结果 + */ + public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId); +} diff --git a/src/main/java/com/evobms/project/system/mapper/SysNoticeMapper.java b/src/main/java/com/evobms/project/system/mapper/SysNoticeMapper.java new file mode 100644 index 0000000..41b8fee --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysNoticeMapper.java @@ -0,0 +1,60 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import com.evobms.project.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); +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/system/mapper/SysPostMapper.java b/src/main/java/com/evobms/project/system/mapper/SysPostMapper.java new file mode 100644 index 0000000..63e7fb5 --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysPostMapper.java @@ -0,0 +1,99 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import com.evobms.project.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/src/main/java/com/evobms/project/system/mapper/SysRoleDeptMapper.java b/src/main/java/com/evobms/project/system/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..629615c --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysRoleDeptMapper.java @@ -0,0 +1,44 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import com.evobms.project.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/src/main/java/com/evobms/project/system/mapper/SysRoleMapper.java b/src/main/java/com/evobms/project/system/mapper/SysRoleMapper.java new file mode 100644 index 0000000..0030bb8 --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysRoleMapper.java @@ -0,0 +1,107 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import com.evobms.project.system.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/src/main/java/com/evobms/project/system/mapper/SysRoleMenuMapper.java b/src/main/java/com/evobms/project/system/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..46e95ee --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysRoleMenuMapper.java @@ -0,0 +1,44 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import com.evobms.project.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/src/main/java/com/evobms/project/system/mapper/SysUserMapper.java b/src/main/java/com/evobms/project/system/mapper/SysUserMapper.java new file mode 100644 index 0000000..a481164 --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysUserMapper.java @@ -0,0 +1,147 @@ +package com.evobms.project.system.mapper; + +import java.util.Date; +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.evobms.project.system.domain.SysUser; + +/** + * 用户表 数据层 + * + * @author ruoyi + */ +public interface SysUserMapper +{ + /** + * 根据条件分页查询用户列表 + * + * @param sysUser 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserList(SysUser sysUser); + + /** + * 根据条件分页查询已配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectAllocatedList(SysUser user); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUnallocatedList(SysUser user); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public SysUser selectUserByUserName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + public SysUser selectUserById(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int insertUser(SysUser user); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(SysUser user); + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + public int updateUserAvatar(@Param("userId") Long userId, @Param("avatar") String avatar); + + /** + * 修改用户状态 + * + * @param userId 用户ID + * @param status 状态 + * @return 结果 + */ + public int updateUserStatus(@Param("userId") Long userId, @Param("status") String status); + + /** + * 更新用户登录信息(IP和登录时间) + * + * @param userId 用户ID + * @param loginIp 登录IP地址 + * @param loginDate 登录时间 + * @return 结果 + */ + public int updateLoginInfo(@Param("userId") Long userId, @Param("loginIp") String loginIp, @Param("loginDate") Date loginDate); + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + public int resetUserPwd(@Param("userId") Long userId, @Param("password") String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds); + + /** + * 校验用户名称是否唯一 + * + * @param userName 用户名称 + * @return 结果 + */ + public SysUser checkUserNameUnique(String userName); + + /** + * 校验手机号码是否唯一 + * + * @param phonenumber 手机号码 + * @return 结果 + */ + public SysUser checkPhoneUnique(String phonenumber); + + /** + * 校验email是否唯一 + * + * @param email 用户邮箱 + * @return 结果 + */ + public SysUser checkEmailUnique(String email); +} diff --git a/src/main/java/com/evobms/project/system/mapper/SysUserPostMapper.java b/src/main/java/com/evobms/project/system/mapper/SysUserPostMapper.java new file mode 100644 index 0000000..e9d4b01 --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysUserPostMapper.java @@ -0,0 +1,44 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import com.evobms.project.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/src/main/java/com/evobms/project/system/mapper/SysUserRoleMapper.java b/src/main/java/com/evobms/project/system/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..282f46b --- /dev/null +++ b/src/main/java/com/evobms/project/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,62 @@ +package com.evobms.project.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.evobms.project.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/src/main/java/com/evobms/project/system/service/IBmsDevicesService.java b/src/main/java/com/evobms/project/system/service/IBmsDevicesService.java new file mode 100644 index 0000000..7245ffd --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/IBmsDevicesService.java @@ -0,0 +1,61 @@ +package com.evobms.project.system.service; + +import java.util.List; +import com.evobms.project.system.domain.BmsDevices; + +/** + * BBOX管理Service接口 + * + * @author 田志阳 + * @date 2025-10-10 + */ +public interface IBmsDevicesService +{ + /** + * 查询BBOX管理 + * + * @param id BBOX管理主键 + * @return BBOX管理 + */ + public BmsDevices selectBmsDevicesById(String id); + + /** + * 查询BBOX管理列表 + * + * @param bmsDevices BBOX管理 + * @return BBOX管理集合 + */ + public List selectBmsDevicesList(BmsDevices bmsDevices); + + /** + * 新增BBOX管理 + * + * @param bmsDevices BBOX管理 + * @return 结果 + */ + public int insertBmsDevices(BmsDevices bmsDevices); + + /** + * 修改BBOX管理 + * + * @param bmsDevices BBOX管理 + * @return 结果 + */ + public int updateBmsDevices(BmsDevices bmsDevices); + + /** + * 批量删除BBOX管理 + * + * @param ids 需要删除的BBOX管理主键集合 + * @return 结果 + */ + public int deleteBmsDevicesByIds(String[] ids); + + /** + * 删除BBOX管理信息 + * + * @param id BBOX管理主键 + * @return 结果 + */ + public int deleteBmsDevicesById(String id); +} diff --git a/src/main/java/com/evobms/project/system/service/ISysConfigService.java b/src/main/java/com/evobms/project/system/service/ISysConfigService.java new file mode 100644 index 0000000..aa91ce4 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/ISysConfigService.java @@ -0,0 +1,89 @@ +package com.evobms.project.system.service; + +import java.util.List; +import com.evobms.project.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); + + /** + * 获取验证码开关 + * + * @return true开启,false关闭 + */ + public boolean selectCaptchaEnabled(); + + /** + * 查询参数配置列表 + * + * @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 + */ + public void deleteConfigByIds(Long[] configIds); + + /** + * 加载参数缓存数据 + */ + public void loadingConfigCache(); + + /** + * 清空参数缓存数据 + */ + public void clearConfigCache(); + + /** + * 重置参数缓存数据 + */ + public void resetConfigCache(); + + /** + * 校验参数键名是否唯一 + * + * @param config 参数信息 + * @return 结果 + */ + public boolean checkConfigKeyUnique(SysConfig config); +} diff --git a/src/main/java/com/evobms/project/system/service/ISysDeptService.java b/src/main/java/com/evobms/project/system/service/ISysDeptService.java new file mode 100644 index 0000000..5b05f75 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/ISysDeptService.java @@ -0,0 +1,124 @@ +package com.evobms.project.system.service; + +import java.util.List; +import com.evobms.framework.web.domain.TreeSelect; +import com.evobms.project.system.domain.SysDept; + +/** + * 部门管理 服务层 + * + * @author ruoyi + */ +public interface ISysDeptService +{ + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + public List selectDeptList(SysDept dept); + + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + public List selectDeptTreeList(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 boolean checkDeptNameUnique(SysDept dept); + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + public void checkDeptDataScope(Long deptId); + + /** + * 新增保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int insertDept(SysDept dept); + + /** + * 修改保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int updateDept(SysDept dept); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + public int deleteDeptById(Long deptId); +} diff --git a/src/main/java/com/evobms/project/system/service/ISysDictDataService.java b/src/main/java/com/evobms/project/system/service/ISysDictDataService.java new file mode 100644 index 0000000..fa8a9f3 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/ISysDictDataService.java @@ -0,0 +1,60 @@ +package com.evobms.project.system.service; + +import java.util.List; +import com.evobms.project.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 + */ + public void deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int insertDictData(SysDictData dictData); + + /** + * 修改保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int updateDictData(SysDictData dictData); +} diff --git a/src/main/java/com/evobms/project/system/service/ISysDictTypeService.java b/src/main/java/com/evobms/project/system/service/ISysDictTypeService.java new file mode 100644 index 0000000..5137fec --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/ISysDictTypeService.java @@ -0,0 +1,98 @@ +package com.evobms.project.system.service; + +import java.util.List; +import com.evobms.project.system.domain.SysDictData; +import com.evobms.project.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 + */ + public void deleteDictTypeByIds(Long[] dictIds); + + /** + * 加载字典缓存数据 + */ + public void loadingDictCache(); + + /** + * 清空字典缓存数据 + */ + public void clearDictCache(); + + /** + * 重置字典缓存数据 + */ + public void resetDictCache(); + + /** + * 新增保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int insertDictType(SysDictType dictType); + + /** + * 修改保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int updateDictType(SysDictType dictType); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + public boolean checkDictTypeUnique(SysDictType dictType); +} diff --git a/src/main/java/com/evobms/project/system/service/ISysMenuService.java b/src/main/java/com/evobms/project/system/service/ISysMenuService.java new file mode 100644 index 0000000..bcb3fe7 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/ISysMenuService.java @@ -0,0 +1,144 @@ +package com.evobms.project.system.service; + +import java.util.List; +import java.util.Set; +import com.evobms.framework.web.domain.TreeSelect; +import com.evobms.project.system.domain.SysMenu; +import com.evobms.project.system.domain.vo.RouterVo; + +/** + * 菜单 业务层 + * + * @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 roleId 角色ID + * @return 权限列表 + */ + public Set selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户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 boolean checkMenuNameUnique(SysMenu menu); +} diff --git a/src/main/java/com/evobms/project/system/service/ISysNoticeService.java b/src/main/java/com/evobms/project/system/service/ISysNoticeService.java new file mode 100644 index 0000000..b42ee1e --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/ISysNoticeService.java @@ -0,0 +1,60 @@ +package com.evobms.project.system.service; + +import java.util.List; +import com.evobms.project.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/src/main/java/com/evobms/project/system/service/ISysPostService.java b/src/main/java/com/evobms/project/system/service/ISysPostService.java new file mode 100644 index 0000000..7613646 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/ISysPostService.java @@ -0,0 +1,99 @@ +package com.evobms.project.system.service; + +import java.util.List; +import com.evobms.project.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 boolean checkPostNameUnique(SysPost post); + + /** + * 校验岗位编码 + * + * @param post 岗位信息 + * @return 结果 + */ + public boolean checkPostCodeUnique(SysPost post); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + public int countUserPostById(Long postId); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + public int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + public int deletePostByIds(Long[] postIds); + + /** + * 新增保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int insertPost(SysPost post); + + /** + * 修改保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int updatePost(SysPost post); +} diff --git a/src/main/java/com/evobms/project/system/service/ISysRoleService.java b/src/main/java/com/evobms/project/system/service/ISysRoleService.java new file mode 100644 index 0000000..3810cd2 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/ISysRoleService.java @@ -0,0 +1,173 @@ +package com.evobms.project.system.service; + +import java.util.List; +import java.util.Set; +import com.evobms.project.system.domain.SysRole; +import com.evobms.project.system.domain.SysUserRole; + +/** + * 角色业务层 + * + * @author ruoyi + */ +public interface ISysRoleService +{ + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + public List selectRoleList(SysRole role); + + /** + * 根据用户ID查询角色列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + public List selectRolesByUserId(Long userId); + + /** + * 根据用户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 boolean checkRoleNameUnique(SysRole role); + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + public boolean checkRoleKeyUnique(SysRole role); + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + public void checkRoleAllowed(SysRole role); + + /** + * 校验角色是否有数据权限 + * + * @param roleIds 角色id + */ + public void checkRoleDataScope(Long... roleIds); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + public int countUserRoleByRoleId(Long roleId); + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int insertRole(SysRole role); + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRole(SysRole role); + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRoleStatus(SysRole role); + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int authDataScope(SysRole role); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds); + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + public int deleteAuthUser(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + public int deleteAuthUsers(Long roleId, Long[] userIds); + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + public int insertAuthUsers(Long roleId, Long[] userIds); +} diff --git a/src/main/java/com/evobms/project/system/service/ISysUserOnlineService.java b/src/main/java/com/evobms/project/system/service/ISysUserOnlineService.java new file mode 100644 index 0000000..1559259 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/ISysUserOnlineService.java @@ -0,0 +1,48 @@ +package com.evobms.project.system.service; + +import com.evobms.framework.security.LoginUser; +import com.evobms.project.monitor.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/src/main/java/com/evobms/project/system/service/ISysUserService.java b/src/main/java/com/evobms/project/system/service/ISysUserService.java new file mode 100644 index 0000000..50b18f4 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/ISysUserService.java @@ -0,0 +1,217 @@ +package com.evobms.project.system.service; + +import java.util.Date; +import java.util.List; +import com.evobms.project.system.domain.SysUser; + +/** + * 用户 业务层 + * + * @author ruoyi + */ +public interface ISysUserService +{ + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserList(SysUser user); + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectAllocatedList(SysUser user); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUnallocatedList(SysUser user); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public SysUser selectUserByUserName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + public SysUser selectUserById(Long userId); + + /** + * 根据用户ID查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + public String selectUserRoleGroup(String userName); + + /** + * 根据用户ID查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + public String selectUserPostGroup(String userName); + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean checkUserNameUnique(SysUser user); + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean checkPhoneUnique(SysUser user); + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean checkEmailUnique(SysUser user); + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + public void checkUserAllowed(SysUser user); + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + public void checkUserDataScope(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int insertUser(SysUser user); + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean registerUser(SysUser user); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(SysUser user); + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + public void insertUserAuth(Long userId, Long[] roleIds); + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUserStatus(SysUser user); + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUserProfile(SysUser user); + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + public boolean updateUserAvatar(Long userId, String avatar); + + /** + * 更新用户登录信息(IP和登录时间) + * + * @param userId 用户ID + * @param loginIp 登录IP地址 + * @param loginDate 登录时间 + * @return 结果 + */ + public void updateLoginInfo(Long userId, String loginIp, Date loginDate); + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + public int resetPwd(SysUser user); + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + public int resetUserPwd(Long userId, 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/src/main/java/com/evobms/project/system/service/impl/BmsDevicesServiceImpl.java b/src/main/java/com/evobms/project/system/service/impl/BmsDevicesServiceImpl.java new file mode 100644 index 0000000..be5d28d --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/impl/BmsDevicesServiceImpl.java @@ -0,0 +1,96 @@ +package com.evobms.project.system.service.impl; + +import java.util.List; +import com.evobms.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.evobms.project.system.mapper.BmsDevicesMapper; +import com.evobms.project.system.domain.BmsDevices; +import com.evobms.project.system.service.IBmsDevicesService; + +/** + * BBOX管理Service业务层处理 + * + * @author 田志阳 + * @date 2025-10-10 + */ +@Service +public class BmsDevicesServiceImpl implements IBmsDevicesService +{ + @Autowired + private BmsDevicesMapper bmsDevicesMapper; + + /** + * 查询BBOX管理 + * + * @param id BBOX管理主键 + * @return BBOX管理 + */ + @Override + public BmsDevices selectBmsDevicesById(String id) + { + return bmsDevicesMapper.selectBmsDevicesById(id); + } + + /** + * 查询BBOX管理列表 + * + * @param bmsDevices BBOX管理 + * @return BBOX管理 + */ + @Override + public List selectBmsDevicesList(BmsDevices bmsDevices) + { + return bmsDevicesMapper.selectBmsDevicesList(bmsDevices); + } + + /** + * 新增BBOX管理 + * + * @param bmsDevices BBOX管理 + * @return 结果 + */ + @Override + public int insertBmsDevices(BmsDevices bmsDevices) + { + bmsDevices.setCreateTime(DateUtils.getNowDate()); + return bmsDevicesMapper.insertBmsDevices(bmsDevices); + } + + /** + * 修改BBOX管理 + * + * @param bmsDevices BBOX管理 + * @return 结果 + */ + @Override + public int updateBmsDevices(BmsDevices bmsDevices) + { + bmsDevices.setUpdateTime(DateUtils.getNowDate()); + return bmsDevicesMapper.updateBmsDevices(bmsDevices); + } + + /** + * 批量删除BBOX管理 + * + * @param ids 需要删除的BBOX管理主键 + * @return 结果 + */ + @Override + public int deleteBmsDevicesByIds(String[] ids) + { + return bmsDevicesMapper.deleteBmsDevicesByIds(ids); + } + + /** + * 删除BBOX管理信息 + * + * @param id BBOX管理主键 + * @return 结果 + */ + @Override + public int deleteBmsDevicesById(String id) + { + return bmsDevicesMapper.deleteBmsDevicesById(id); + } +} diff --git a/src/main/java/com/evobms/project/system/service/impl/SysConfigServiceImpl.java b/src/main/java/com/evobms/project/system/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..7113bfb --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,229 @@ +package com.evobms.project.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.evobms.common.constant.CacheConstants; +import com.evobms.common.constant.UserConstants; +import com.evobms.common.core.text.Convert; +import com.evobms.common.exception.ServiceException; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.redis.RedisCache; +import com.evobms.project.system.domain.SysConfig; +import com.evobms.project.system.mapper.SysConfigMapper; +import com.evobms.project.system.service.ISysConfigService; + +/** + * 参数配置 服务层实现 + * + * @author ruoyi + */ +@Service +public class SysConfigServiceImpl implements ISysConfigService +{ + @Autowired + private SysConfigMapper configMapper; + + @Autowired + private RedisCache redisCache; + + /** + * 项目启动时,初始化参数到缓存 + */ + @PostConstruct + public void init() + { + loadingConfigCache(); + } + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + @Override + public SysConfig selectConfigById(Long configId) + { + SysConfig config = new SysConfig(); + config.setConfigId(configId); + return configMapper.selectConfig(config); + } + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数key + * @return 参数键值 + */ + @Override + public String selectConfigByKey(String configKey) + { + String configValue = Convert.toStr(redisCache.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)) + { + redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue()); + return retConfig.getConfigValue(); + } + return StringUtils.EMPTY; + } + + /** + * 获取验证码开关 + * + * @return true开启,false关闭 + */ + @Override + public boolean selectCaptchaEnabled() + { + String captchaEnabled = selectConfigByKey("sys.account.captchaEnabled"); + if (StringUtils.isEmpty(captchaEnabled)) + { + return true; + } + return Convert.toBool(captchaEnabled); + } + + /** + * 查询参数配置列表 + * + * @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) + { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public int updateConfig(SysConfig config) + { + SysConfig temp = configMapper.selectConfigById(config.getConfigId()); + if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) + { + redisCache.deleteObject(getCacheKey(temp.getConfigKey())); + } + + int row = configMapper.updateConfig(config); + if (row > 0) + { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + @Override + public void deleteConfigByIds(Long[] configIds) + { + for (Long configId : configIds) + { + SysConfig config = selectConfigById(configId); + if (StringUtils.equals(UserConstants.YES, config.getConfigType())) + { + throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + } + configMapper.deleteConfigById(configId); + redisCache.deleteObject(getCacheKey(config.getConfigKey())); + } + } + + /** + * 加载参数缓存数据 + */ + @Override + public void loadingConfigCache() + { + List configsList = configMapper.selectConfigList(new SysConfig()); + for (SysConfig config : configsList) + { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + } + + /** + * 清空参数缓存数据 + */ + @Override + public void clearConfigCache() + { + Collection keys = redisCache.keys(CacheConstants.SYS_CONFIG_KEY + "*"); + redisCache.deleteObject(keys); + } + + /** + * 重置参数缓存数据 + */ + @Override + public void resetConfigCache() + { + clearConfigCache(); + loadingConfigCache(); + } + + /** + * 校验参数键名是否唯一 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public boolean checkConfigKeyUnique(SysConfig config) + { + Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId(); + SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey()); + if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + private String getCacheKey(String configKey) + { + return CacheConstants.SYS_CONFIG_KEY + configKey; + } +} diff --git a/src/main/java/com/evobms/project/system/service/impl/SysDeptServiceImpl.java b/src/main/java/com/evobms/project/system/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..085769e --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,338 @@ +package com.evobms.project.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.evobms.common.constant.UserConstants; +import com.evobms.common.core.text.Convert; +import com.evobms.common.exception.ServiceException; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.spring.SpringUtils; +import com.evobms.framework.aspectj.lang.annotation.DataScope; +import com.evobms.framework.web.domain.TreeSelect; +import com.evobms.project.system.domain.SysDept; +import com.evobms.project.system.domain.SysRole; +import com.evobms.project.system.domain.SysUser; +import com.evobms.project.system.mapper.SysDeptMapper; +import com.evobms.project.system.mapper.SysRoleMapper; +import com.evobms.project.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 dept 部门信息 + * @return 部门树信息集合 + */ + @Override + public List selectDeptTreeList(SysDept dept) + { + List depts = SpringUtils.getAopProxy(this).selectDeptList(dept); + return buildDeptTreeSelect(depts); + } + + /** + * 构建前端所需要树结构 + * + * @param depts 部门列表 + * @return 树结构列表 + */ + @Override + public List buildDeptTree(List depts) + { + List returnList = new ArrayList(); + List tempList = depts.stream().map(SysDept::getDeptId).collect(Collectors.toList()); + for (SysDept dept : depts) + { + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(dept.getParentId())) + { + recursionFn(depts, dept); + returnList.add(dept); + } + } + if (returnList.isEmpty()) + { + returnList = depts; + } + return returnList; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + @Override + public List 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; + } + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + @Override + public boolean checkDeptExistUser(Long deptId) + { + int result = deptMapper.checkDeptExistUser(deptId); + return result > 0; + } + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public boolean checkDeptNameUnique(SysDept dept) + { + Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId(); + SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId()); + if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + @Override + public void checkDeptDataScope(Long deptId) + { + if (!SysUser.isAdmin(SecurityUtils.getUserId()) && StringUtils.isNotNull(deptId)) + { + SysDept dept = new SysDept(); + dept.setDeptId(deptId); + List depts = SpringUtils.getAopProxy(this).selectDeptList(dept); + if (StringUtils.isEmpty(depts)) + { + throw new ServiceException("没有权限访问部门数据!"); + } + } + } + + /** + * 新增保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public int insertDept(SysDept dept) + { + SysDept info = deptMapper.selectDeptById(dept.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) + { + throw new ServiceException("部门停用,不允许新增"); + } + dept.setAncestors(info.getAncestors() + "," + dept.getParentId()); + return deptMapper.insertDept(dept); + } + + /** + * 修改保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public int updateDept(SysDept dept) + { + SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId()); + SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId()); + if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) + { + String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); + } + int result = deptMapper.updateDept(dept); + if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) + && !StringUtils.equals("0", dept.getAncestors())) + { + // 如果该部门是启用状态,则启用该部门的所有上级部门 + updateParentDeptStatusNormal(dept); + } + return result; + } + + /** + * 修改该部门的父级部门状态 + * + * @param dept 当前部门 + */ + private void updateParentDeptStatusNormal(SysDept dept) + { + String ancestors = dept.getAncestors(); + Long[] deptIds = Convert.toLongArray(ancestors); + deptMapper.updateDeptStatusNormal(deptIds); + } + + /** + * 修改子元素关系 + * + * @param deptId 被修改的部门ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) + { + List children = deptMapper.selectChildrenDeptById(deptId); + for (SysDept child : children) + { + child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + } + if (children.size() > 0) + { + deptMapper.updateDeptChildren(children); + } + } + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public int deleteDeptById(Long deptId) + { + return deptMapper.deleteDeptById(deptId); + } + + /** + * 递归列表 + */ + private void recursionFn(List 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/src/main/java/com/evobms/project/system/service/impl/SysDictDataServiceImpl.java b/src/main/java/com/evobms/project/system/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..5d16b26 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,111 @@ +package com.evobms.project.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.evobms.common.utils.DictUtils; +import com.evobms.project.system.domain.SysDictData; +import com.evobms.project.system.mapper.SysDictDataMapper; +import com.evobms.project.system.service.ISysDictDataService; + +/** + * 字典 业务层处理 + * + * @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 + */ + @Override + public void deleteDictDataByIds(Long[] dictCodes) + { + for (Long dictCode : dictCodes) + { + SysDictData data = selectDictDataById(dictCode); + dictDataMapper.deleteDictDataById(dictCode); + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + } + + /** + * 新增保存字典数据信息 + * + * @param data 字典数据信息 + * @return 结果 + */ + @Override + public int insertDictData(SysDictData data) + { + int row = dictDataMapper.insertDictData(data); + if (row > 0) + { + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + return row; + } + + /** + * 修改保存字典数据信息 + * + * @param data 字典数据信息 + * @return 结果 + */ + @Override + public int updateDictData(SysDictData data) + { + int row = dictDataMapper.updateDictData(data); + if (row > 0) + { + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + return row; + } +} diff --git a/src/main/java/com/evobms/project/system/service/impl/SysDictTypeServiceImpl.java b/src/main/java/com/evobms/project/system/service/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..0e6ac5e --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,223 @@ +package com.evobms.project.system.service.impl; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import javax.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.evobms.common.constant.UserConstants; +import com.evobms.common.exception.ServiceException; +import com.evobms.common.utils.DictUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.project.system.domain.SysDictData; +import com.evobms.project.system.domain.SysDictType; +import com.evobms.project.system.mapper.SysDictDataMapper; +import com.evobms.project.system.mapper.SysDictTypeMapper; +import com.evobms.project.system.service.ISysDictTypeService; + +/** + * 字典 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysDictTypeServiceImpl implements ISysDictTypeService +{ + @Autowired + private SysDictTypeMapper dictTypeMapper; + + @Autowired + private SysDictDataMapper dictDataMapper; + + /** + * 项目启动时,初始化字典到缓存 + */ + @PostConstruct + public void init() + { + loadingDictCache(); + } + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + @Override + public List 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 + */ + @Override + public void deleteDictTypeByIds(Long[] dictIds) + { + for (Long dictId : dictIds) + { + SysDictType dictType = selectDictTypeById(dictId); + if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0) + { + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + dictTypeMapper.deleteDictTypeById(dictId); + DictUtils.removeDictCache(dictType.getDictType()); + } + } + + /** + * 加载字典缓存数据 + */ + @Override + public void loadingDictCache() + { + SysDictData dictData = new SysDictData(); + dictData.setStatus("0"); + Map> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType)); + for (Map.Entry> entry : dictDataMap.entrySet()) + { + DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList())); + } + } + + /** + * 清空字典缓存数据 + */ + @Override + public void clearDictCache() + { + DictUtils.clearDictCache(); + } + + /** + * 重置字典缓存数据 + */ + @Override + public void resetDictCache() + { + clearDictCache(); + loadingDictCache(); + } + + /** + * 新增保存字典类型信息 + * + * @param dict 字典类型信息 + * @return 结果 + */ + @Override + public int insertDictType(SysDictType dict) + { + int row = dictTypeMapper.insertDictType(dict); + if (row > 0) + { + DictUtils.setDictCache(dict.getDictType(), null); + } + return row; + } + + /** + * 修改保存字典类型信息 + * + * @param dict 字典类型信息 + * @return 结果 + */ + @Override + @Transactional + public int updateDictType(SysDictType dict) + { + SysDictType oldDict = dictTypeMapper.selectDictTypeById(dict.getDictId()); + dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType()); + int row = dictTypeMapper.updateDictType(dict); + if (row > 0) + { + List dictDatas = dictDataMapper.selectDictDataByType(dict.getDictType()); + DictUtils.setDictCache(dict.getDictType(), dictDatas); + } + return row; + } + + /** + * 校验字典类型称是否唯一 + * + * @param dict 字典类型 + * @return 结果 + */ + @Override + public boolean checkDictTypeUnique(SysDictType dict) + { + Long dictId = StringUtils.isNull(dict.getDictId()) ? -1L : dict.getDictId(); + SysDictType dictType = dictTypeMapper.checkDictTypeUnique(dict.getDictType()); + if (StringUtils.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } +} diff --git a/src/main/java/com/evobms/project/system/service/impl/SysMenuServiceImpl.java b/src/main/java/com/evobms/project/system/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..d7a72f7 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,543 @@ +package com.evobms.project.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.evobms.common.constant.Constants; +import com.evobms.common.constant.UserConstants; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.web.domain.TreeSelect; +import com.evobms.project.system.domain.SysMenu; +import com.evobms.project.system.domain.SysRole; +import com.evobms.project.system.domain.SysUser; +import com.evobms.project.system.domain.vo.MetaVo; +import com.evobms.project.system.domain.vo.RouterVo; +import com.evobms.project.system.mapper.SysMenuMapper; +import com.evobms.project.system.mapper.SysRoleMapper; +import com.evobms.project.system.mapper.SysRoleMenuMapper; +import com.evobms.project.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 roleId 角色ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByRoleId(Long roleId) + { + List perms = menuMapper.selectMenuPermsByRoleId(roleId); + 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.setQuery(menu.getQuery()); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + List cMenus = menu.getChildren(); + if (StringUtils.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) + { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } + else if (isMenuFrame(menu)) + { + router.setMeta(null); + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(getRouteName(menu.getRouteName(), menu.getPath())); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + children.setQuery(menu.getQuery()); + childrenList.add(children); + router.setChildren(childrenList); + } + else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) + { + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); + router.setPath("/"); + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + String routerPath = innerLinkReplaceEach(menu.getPath()); + children.setPath(routerPath); + children.setComponent(UserConstants.INNER_LINK); + children.setName(getRouteName(menu.getRouteName(), routerPath)); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 构建前端所需要树结构 + * + * @param menus 菜单列表 + * @return 树结构列表 + */ + @Override + public List buildMenuTree(List menus) + { + List returnList = new ArrayList(); + List tempList = menus.stream().map(SysMenu::getMenuId).collect(Collectors.toList()); + 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; + } + + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean checkMenuExistRole(Long menuId) + { + int result = roleMenuMapper.checkMenuExistRole(menuId); + return result > 0; + } + + /** + * 新增保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public int insertMenu(SysMenu menu) + { + return menuMapper.insertMenu(menu); + } + + /** + * 修改保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public int updateMenu(SysMenu menu) + { + return menuMapper.updateMenu(menu); + } + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public int deleteMenuById(Long menuId) + { + return menuMapper.deleteMenuById(menuId); + } + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public boolean checkMenuNameUnique(SysMenu menu) + { + Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId(); + SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId()); + if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 获取路由名称 + * + * @param menu 菜单信息 + * @return 路由名称 + */ + public String getRouteName(SysMenu menu) + { + // 非外链并且是一级目录(类型为目录) + if (isMenuFrame(menu)) + { + return StringUtils.EMPTY; + } + return getRouteName(menu.getRouteName(), menu.getPath()); + } + + /** + * 获取路由名称,如没有配置路由名称则取路由地址 + * + * @param name 路由名称 + * @param path 路由地址 + * @return 路由名称(驼峰格式) + */ + public String getRouteName(String name, String path) + { + String routerName = StringUtils.isNotEmpty(name) ? name : path; + return StringUtils.capitalize(routerName); + } + + /** + * 获取路由地址 + * + * @param menu 菜单信息 + * @return 路由地址 + */ + public String getRouterPath(SysMenu menu) + { + String routerPath = menu.getPath(); + // 内链打开外网方式 + if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) + { + routerPath = innerLinkReplaceEach(routerPath); + } + // 非外链并且是一级目录(类型为目录) + if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType()) + && UserConstants.NO_FRAME.equals(menu.getIsFrame())) + { + routerPath = "/" + menu.getPath(); + } + // 非外链并且是一级目录(类型为菜单) + else if (isMenuFrame(menu)) + { + routerPath = "/"; + } + return routerPath; + } + + /** + * 获取组件信息 + * + * @param menu 菜单信息 + * @return 组件信息 + */ + public String getComponent(SysMenu menu) + { + String component = UserConstants.LAYOUT; + if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) + { + component = menu.getComponent(); + } + else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu)) + { + component = UserConstants.INNER_LINK; + } + else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) + { + component = UserConstants.PARENT_VIEW; + } + return component; + } + + /** + * 是否为菜单内部跳转 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isMenuFrame(SysMenu menu) + { + return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType()) + && menu.getIsFrame().equals(UserConstants.NO_FRAME); + } + + /** + * 是否为parent_view组件 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isParentView(SysMenu menu) + { + return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()); + } + + /** + * 是否为内链组件 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isInnerLink(SysMenu menu) + { + return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath()); + } + + /** + * 根据父节点的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(); + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + 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; + } + + /** + * 内链域名特殊字符替换 + * + * @return 替换后的内链域名 + */ + public String innerLinkReplaceEach(String path) + { + return StringUtils.replaceEach(path, new String[] { Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":" }, + new String[] { "", "", "", "/", "/" }); + } +} diff --git a/src/main/java/com/evobms/project/system/service/impl/SysNoticeServiceImpl.java b/src/main/java/com/evobms/project/system/service/impl/SysNoticeServiceImpl.java new file mode 100644 index 0000000..a057555 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/impl/SysNoticeServiceImpl.java @@ -0,0 +1,92 @@ +package com.evobms.project.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.evobms.project.system.domain.SysNotice; +import com.evobms.project.system.mapper.SysNoticeMapper; +import com.evobms.project.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/src/main/java/com/evobms/project/system/service/impl/SysPostServiceImpl.java b/src/main/java/com/evobms/project/system/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..111e8a6 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/impl/SysPostServiceImpl.java @@ -0,0 +1,178 @@ +package com.evobms.project.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.evobms.common.constant.UserConstants; +import com.evobms.common.exception.ServiceException; +import com.evobms.common.utils.StringUtils; +import com.evobms.project.system.domain.SysPost; +import com.evobms.project.system.mapper.SysPostMapper; +import com.evobms.project.system.mapper.SysUserPostMapper; +import com.evobms.project.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 boolean checkPostNameUnique(SysPost post) + { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + SysPost info = postMapper.checkPostNameUnique(post.getPostName()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验岗位编码是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostCodeUnique(SysPost post) + { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + SysPost info = postMapper.checkPostCodeUnique(post.getPostCode()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int countUserPostById(Long postId) + { + return userPostMapper.countUserPostById(postId); + } + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int deletePostById(Long postId) + { + return postMapper.deletePostById(postId); + } + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + @Override + public int deletePostByIds(Long[] postIds) + { + for (Long postId : postIds) + { + SysPost post = selectPostById(postId); + if (countUserPostById(postId) > 0) + { + throw new ServiceException(String.format("%1$s已分配,不能删除", post.getPostName())); + } + } + return postMapper.deletePostByIds(postIds); + } + + /** + * 新增保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public int insertPost(SysPost post) + { + return postMapper.insertPost(post); + } + + /** + * 修改保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public int updatePost(SysPost post) + { + return postMapper.updatePost(post); + } +} diff --git a/src/main/java/com/evobms/project/system/service/impl/SysRoleServiceImpl.java b/src/main/java/com/evobms/project/system/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..2f84fca --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,427 @@ +package com.evobms.project.system.service.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.evobms.common.constant.UserConstants; +import com.evobms.common.exception.ServiceException; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.spring.SpringUtils; +import com.evobms.framework.aspectj.lang.annotation.DataScope; +import com.evobms.project.system.domain.SysRole; +import com.evobms.project.system.domain.SysRoleDept; +import com.evobms.project.system.domain.SysRoleMenu; +import com.evobms.project.system.domain.SysUser; +import com.evobms.project.system.domain.SysUserRole; +import com.evobms.project.system.mapper.SysRoleDeptMapper; +import com.evobms.project.system.mapper.SysRoleMapper; +import com.evobms.project.system.mapper.SysRoleMenuMapper; +import com.evobms.project.system.mapper.SysUserRoleMapper; +import com.evobms.project.system.service.ISysRoleService; + +/** + * 角色 业务层处理 + * + * @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 List selectRolesByUserId(Long userId) + { + List userRoles = roleMapper.selectRolePermissionByUserId(userId); + List roles = selectRoleAll(); + for (SysRole role : roles) + { + for (SysRole userRole : userRoles) + { + if (role.getRoleId().longValue() == userRole.getRoleId().longValue()) + { + role.setFlag(true); + break; + } + } + } + return roles; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set 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 boolean checkRoleNameUnique(SysRole role) + { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleKeyUnique(SysRole role) + { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + @Override + public void checkRoleAllowed(SysRole role) + { + if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()) + { + throw new ServiceException("不允许操作超级管理员角色"); + } + } + + /** + * 校验角色是否有数据权限 + * + * @param roleIds 角色id + */ + @Override + public void checkRoleDataScope(Long... roleIds) + { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) + { + for (Long roleId : roleIds) + { + SysRole role = new SysRole(); + role.setRoleId(roleId); + List roles = SpringUtils.getAopProxy(this).selectRoleList(role); + if (StringUtils.isEmpty(roles)) + { + throw new ServiceException("没有权限访问角色数据!"); + } + } + } + } + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public int countUserRoleByRoleId(Long roleId) + { + return userRoleMapper.countUserRoleByRoleId(roleId); + } + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + 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)); + checkRoleDataScope(roleId); + SysRole role = selectRoleById(roleId); + if (countUserRoleByRoleId(roleId) > 0) + { + throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName())); + } + } + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenu(roleIds); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDept(roleIds); + return roleMapper.deleteRoleByIds(roleIds); + } + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + @Override + public int deleteAuthUser(SysUserRole userRole) + { + return userRoleMapper.deleteUserRoleInfo(userRole); + } + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + @Override + public int deleteAuthUsers(Long roleId, Long[] userIds) + { + return userRoleMapper.deleteUserRoleInfos(roleId, userIds); + } + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要授权的用户数据ID + * @return 结果 + */ + @Override + public int insertAuthUsers(Long roleId, Long[] userIds) + { + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long userId : userIds) + { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + return userRoleMapper.batchUserRole(list); + } +} diff --git a/src/main/java/com/evobms/project/system/service/impl/SysUserOnlineServiceImpl.java b/src/main/java/com/evobms/project/system/service/impl/SysUserOnlineServiceImpl.java new file mode 100644 index 0000000..bf96047 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/impl/SysUserOnlineServiceImpl.java @@ -0,0 +1,96 @@ +package com.evobms.project.system.service.impl; + +import org.springframework.stereotype.Service; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.security.LoginUser; +import com.evobms.project.monitor.domain.SysUserOnline; +import com.evobms.project.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) || StringUtils.isNull(user.getUser())) + { + return null; + } + SysUserOnline sysUserOnline = new SysUserOnline(); + sysUserOnline.setTokenId(user.getToken()); + sysUserOnline.setUserName(user.getUsername()); + sysUserOnline.setIpaddr(user.getIpaddr()); + sysUserOnline.setLoginLocation(user.getLoginLocation()); + sysUserOnline.setBrowser(user.getBrowser()); + sysUserOnline.setOs(user.getOs()); + sysUserOnline.setLoginTime(user.getLoginTime()); + if (StringUtils.isNotNull(user.getUser().getDept())) + { + sysUserOnline.setDeptName(user.getUser().getDept().getDeptName()); + } + return sysUserOnline; + } +} diff --git a/src/main/java/com/evobms/project/system/service/impl/SysUserServiceImpl.java b/src/main/java/com/evobms/project/system/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..eb140f9 --- /dev/null +++ b/src/main/java/com/evobms/project/system/service/impl/SysUserServiceImpl.java @@ -0,0 +1,565 @@ +package com.evobms.project.system.service.impl; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import javax.validation.Validator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import com.evobms.common.constant.UserConstants; +import com.evobms.common.exception.ServiceException; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.common.utils.bean.BeanValidators; +import com.evobms.common.utils.spring.SpringUtils; +import com.evobms.framework.aspectj.lang.annotation.DataScope; +import com.evobms.project.system.domain.SysPost; +import com.evobms.project.system.domain.SysRole; +import com.evobms.project.system.domain.SysUser; +import com.evobms.project.system.domain.SysUserPost; +import com.evobms.project.system.domain.SysUserRole; +import com.evobms.project.system.mapper.SysPostMapper; +import com.evobms.project.system.mapper.SysRoleMapper; +import com.evobms.project.system.mapper.SysUserMapper; +import com.evobms.project.system.mapper.SysUserPostMapper; +import com.evobms.project.system.mapper.SysUserRoleMapper; +import com.evobms.project.system.service.ISysConfigService; +import com.evobms.project.system.service.ISysDeptService; +import com.evobms.project.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; + + @Autowired + private ISysDeptService deptService; + + @Autowired + protected Validator validator; + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectUserList(SysUser user) + { + return userMapper.selectUserList(user); + } + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectAllocatedList(SysUser user) + { + return userMapper.selectAllocatedList(user); + } + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectUnallocatedList(SysUser user) + { + return userMapper.selectUnallocatedList(user); + } + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + @Override + public SysUser selectUserByUserName(String userName) + { + return userMapper.selectUserByUserName(userName); + } + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @Override + public SysUser selectUserById(Long userId) + { + return userMapper.selectUserById(userId); + } + + /** + * 查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserRoleGroup(String userName) + { + List list = roleMapper.selectRolesByUserName(userName); + if (CollectionUtils.isEmpty(list)) + { + return StringUtils.EMPTY; + } + return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(",")); + } + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserPostGroup(String userName) + { + List list = postMapper.selectPostsByUserName(userName); + if (CollectionUtils.isEmpty(list)) + { + return StringUtils.EMPTY; + } + return list.stream().map(SysPost::getPostName).collect(Collectors.joining(",")); + } + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean checkUserNameUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkUserNameUnique(user.getUserName()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public boolean checkPhoneUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public boolean checkEmailUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkEmailUnique(user.getEmail()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + @Override + public void checkUserAllowed(SysUser user) + { + if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) + { + throw new ServiceException("不允许操作超级管理员用户"); + } + } + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + @Override + public void checkUserDataScope(Long userId) + { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) + { + SysUser user = new SysUser(); + user.setUserId(userId); + List users = SpringUtils.getAopProxy(this).selectUserList(user); + if (StringUtils.isEmpty(users)) + { + throw new ServiceException("没有权限访问用户数据!"); + } + } + } + + /** + * 新增保存用户信息 + * + * @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 + public boolean registerUser(SysUser user) + { + return userMapper.insertUser(user) > 0; + } + + /** + * 修改保存用户信息 + * + * @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 userId 用户ID + * @param roleIds 角色组 + */ + @Override + @Transactional + public void insertUserAuth(Long userId, Long[] roleIds) + { + userRoleMapper.deleteUserRoleByUserId(userId); + insertUserRole(userId, roleIds); + } + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserStatus(SysUser user) + { + return userMapper.updateUserStatus(user.getUserId(), user.getStatus()); + } + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserProfile(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + @Override + public boolean updateUserAvatar(Long userId, String avatar) + { + return userMapper.updateUserAvatar(userId, avatar) > 0; + } + + /** + * 更新用户登录信息(IP和登录时间) + * + * @param userId 用户ID + * @param loginIp 登录IP地址 + * @param loginDate 登录时间 + * @return 结果 + */ + public void updateLoginInfo(Long userId, String loginIp, Date loginDate) + { + userMapper.updateLoginInfo(userId, loginIp, loginDate); + } + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int resetPwd(SysUser user) + { + return userMapper.resetUserPwd(user.getUserId(), user.getPassword()); + } + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + @Override + public int resetUserPwd(Long userId, String password) + { + return userMapper.resetUserPwd(userId, password); + } + + /** + * 新增用户角色信息 + * + * @param user 用户对象 + */ + public void insertUserRole(SysUser user) + { + this.insertUserRole(user.getUserId(), user.getRoleIds()); + } + + /** + * 新增用户岗位信息 + * + * @param user 用户对象 + */ + public void insertUserPost(SysUser user) + { + Long[] posts = user.getPostIds(); + if (StringUtils.isNotEmpty(posts)) + { + // 新增用户与岗位管理 + List list = new ArrayList(posts.length); + for (Long postId : posts) + { + SysUserPost up = new SysUserPost(); + up.setUserId(user.getUserId()); + up.setPostId(postId); + list.add(up); + } + userPostMapper.batchUserPost(list); + } + } + + /** + * 新增用户角色信息 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + public void insertUserRole(Long userId, Long[] roleIds) + { + if (StringUtils.isNotEmpty(roleIds)) + { + // 新增用户与角色管理 + List list = new ArrayList(roleIds.length); + for (Long roleId : roleIds) + { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + userRoleMapper.batchUserRole(list); + } + } + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + @Transactional + 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)); + checkUserDataScope(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 ServiceException("导入用户数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + for (SysUser user : userList) + { + try + { + // 验证是否存在这个用户 + SysUser u = userMapper.selectUserByUserName(user.getUserName()); + if (StringUtils.isNull(u)) + { + BeanValidators.validateWithException(validator, user); + deptService.checkDeptDataScope(user.getDeptId()); + String password = configService.selectConfigByKey("sys.user.initPassword"); + user.setPassword(SecurityUtils.encryptPassword(password)); + user.setCreateBy(operName); + userMapper.insertUser(user); + successNum++; + successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 导入成功"); + } + else if (isUpdateSupport) + { + BeanValidators.validateWithException(validator, user); + checkUserAllowed(u); + checkUserDataScope(u.getUserId()); + deptService.checkDeptDataScope(user.getDeptId()); + user.setUserId(u.getUserId()); + user.setDeptId(u.getDeptId()); + user.setUpdateBy(operName); + userMapper.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 + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } + else + { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } +} diff --git a/src/main/java/com/evobms/project/tool/gen/controller/GenController.java b/src/main/java/com/evobms/project/tool/gen/controller/GenController.java new file mode 100644 index 0000000..75a1046 --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/controller/GenController.java @@ -0,0 +1,263 @@ +package com.evobms.project.tool.gen.controller; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.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.alibaba.druid.DbType; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; +import com.evobms.common.core.text.Convert; +import com.evobms.common.utils.SecurityUtils; +import com.evobms.common.utils.sql.SqlUtil; +import com.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import com.evobms.framework.config.GenConfig; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.framework.web.page.TableDataInfo; +import com.evobms.project.tool.gen.domain.GenTable; +import com.evobms.project.tool.gen.domain.GenTableColumn; +import com.evobms.project.tool.gen.service.IGenTableColumnService; +import com.evobms.project.tool.gen.service.IGenTableService; + +/** + * 代码生成 操作处理 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/tool/gen") +public class GenController extends BaseController +{ + @Autowired + private IGenTableService genTableService; + + @Autowired + private IGenTableColumnService genTableColumnService; + + /** + * 查询代码生成列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/list") + public TableDataInfo genList(GenTable genTable) + { + startPage(); + List list = genTableService.selectGenTableList(genTable); + return getDataTable(list); + } + + /** + * 获取代码生成信息 + */ + @PreAuthorize("@ss.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 success(map); + } + + /** + * 查询数据库列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/db/list") + public TableDataInfo dataList(GenTable genTable) + { + startPage(); + List list = genTableService.selectDbTableList(genTable); + return getDataTable(list); + } + + /** + * 查询数据表字段列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping(value = "/column/{tableId}") + public TableDataInfo columnList(Long tableId) + { + TableDataInfo dataInfo = new TableDataInfo(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 导入表结构(保存) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:import')") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public AjaxResult importTableSave(String tables) + { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + List tableList = genTableService.selectDbTableListByNames(tableNames); + genTableService.importGenTable(tableList, SecurityUtils.getUsername()); + return success(); + } + + /** + * 创建表结构(保存) + */ + @PreAuthorize("@ss.hasRole('admin')") + @Log(title = "创建表", businessType = BusinessType.OTHER) + @PostMapping("/createTable") + public AjaxResult createTableSave(String sql) + { + try + { + SqlUtil.filterKeyword(sql); + List sqlStatements = SQLUtils.parseStatements(sql, DbType.mysql); + List tableNames = new ArrayList<>(); + for (SQLStatement sqlStatement : sqlStatements) + { + if (sqlStatement instanceof MySqlCreateTableStatement) + { + MySqlCreateTableStatement createTableStatement = (MySqlCreateTableStatement) sqlStatement; + if (genTableService.createTable(createTableStatement.toString())) + { + String tableName = createTableStatement.getTableName().replaceAll("`", ""); + tableNames.add(tableName); + } + } + } + List tableList = genTableService.selectDbTableListByNames(tableNames.toArray(new String[tableNames.size()])); + String operName = SecurityUtils.getUsername(); + genTableService.importGenTable(tableList, operName); + return AjaxResult.success(); + } + catch (Exception e) + { + logger.error(e.getMessage(), e); + return AjaxResult.error("创建表结构异常"); + } + } + + /** + * 修改保存代码生成业务 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult editSave(@Validated @RequestBody GenTable genTable) + { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return success(); + } + + /** + * 删除代码生成 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:remove')") + @Log(title = "代码生成", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public AjaxResult remove(@PathVariable Long[] tableIds) + { + genTableService.deleteGenTableByIds(tableIds); + return success(); + } + + /** + * 预览代码 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:preview')") + @GetMapping("/preview/{tableId}") + public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException + { + Map dataMap = genTableService.previewCode(tableId); + return success(dataMap); + } + + /** + * 生成代码(下载方式) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableName}") + public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException + { + byte[] data = genTableService.downloadCode(tableName); + genCode(response, data); + } + + /** + * 生成代码(自定义路径) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableName}") + public AjaxResult genCode(@PathVariable("tableName") String tableName) + { + if (!GenConfig.isAllowOverwrite()) + { + return AjaxResult.error("【系统预设】不允许生成文件覆盖到本地"); + } + genTableService.generatorCode(tableName); + return success(); + } + + /** + * 同步数据库 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableName}") + public AjaxResult synchDb(@PathVariable("tableName") String tableName) + { + genTableService.synchDb(tableName); + return success(); + } + + /** + * 批量生成代码 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tables) throws IOException + { + String[] tableNames = Convert.toStrArray(tables); + byte[] data = genTableService.downloadCode(tableNames); + genCode(response, data); + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException + { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + 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()); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/tool/gen/domain/GenTable.java b/src/main/java/com/evobms/project/tool/gen/domain/GenTable.java new file mode 100644 index 0000000..e57d57d --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/domain/GenTable.java @@ -0,0 +1,385 @@ +package com.evobms.project.tool.gen.domain; + +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import org.apache.commons.lang3.ArrayUtils; +import com.evobms.common.constant.GenConstants; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.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; + + /** 前端类型(element-ui模版 element-plus模版) */ + private String tplWebType; + + /** 生成包路径 */ + @NotBlank(message = "生成包路径不能为空") + private String packageName; + + /** 生成模块名 */ + @NotBlank(message = "生成模块名不能为空") + private String moduleName; + + /** 生成业务名 */ + @NotBlank(message = "生成业务名不能为空") + private String businessName; + + /** 生成功能名 */ + @NotBlank(message = "生成功能名不能为空") + private String functionName; + + /** 生成作者 */ + @NotBlank(message = "作者不能为空") + private String functionAuthor; + + /** 生成代码方式(0zip压缩包 1自定义路径) */ + private String genType; + + /** 生成路径(不填默认项目路径) */ + private String genPath; + + /** 主键信息 */ + private GenTableColumn pkColumn; + + /** 子表信息 */ + private GenTable subTable; + + /** 表列信息 */ + @Valid + private List columns; + + /** 其它生成选项 */ + private String options; + + /** 树编码字段 */ + private String treeCode; + + /** 树父编码字段 */ + private String treeParentCode; + + /** 树名称字段 */ + private String treeName; + + /** 上级菜单ID字段 */ + private Long parentMenuId; + + /** 上级菜单名称字段 */ + private String parentMenuName; + + public Long getTableId() + { + return tableId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public String getTableName() + { + return tableName; + } + + public void setTableName(String tableName) + { + this.tableName = tableName; + } + + public String getTableComment() + { + return tableComment; + } + + public void setTableComment(String tableComment) + { + this.tableComment = tableComment; + } + + public String getSubTableName() + { + return subTableName; + } + + public void setSubTableName(String subTableName) + { + this.subTableName = subTableName; + } + + public String getSubTableFkName() + { + return subTableFkName; + } + + public void setSubTableFkName(String subTableFkName) + { + this.subTableFkName = subTableFkName; + } + + public String getClassName() + { + return className; + } + + public void setClassName(String className) + { + this.className = className; + } + + public String getTplCategory() + { + return tplCategory; + } + + public void setTplCategory(String tplCategory) + { + this.tplCategory = tplCategory; + } + + public String getTplWebType() + { + return tplWebType; + } + + public void setTplWebType(String tplWebType) + { + this.tplWebType = tplWebType; + } + + public String getPackageName() + { + return packageName; + } + + public void setPackageName(String packageName) + { + this.packageName = packageName; + } + + public String getModuleName() + { + return moduleName; + } + + public void setModuleName(String moduleName) + { + this.moduleName = moduleName; + } + + public String getBusinessName() + { + return businessName; + } + + public void setBusinessName(String businessName) + { + this.businessName = businessName; + } + + public String getFunctionName() + { + return functionName; + } + + public void setFunctionName(String functionName) + { + this.functionName = functionName; + } + + public String getFunctionAuthor() + { + return functionAuthor; + } + + public void setFunctionAuthor(String functionAuthor) + { + this.functionAuthor = functionAuthor; + } + + public String getGenType() + { + return genType; + } + + public void setGenType(String genType) + { + this.genType = genType; + } + + public String getGenPath() + { + return genPath; + } + + public void setGenPath(String genPath) + { + this.genPath = genPath; + } + + public GenTableColumn getPkColumn() + { + return pkColumn; + } + + public void setPkColumn(GenTableColumn pkColumn) + { + this.pkColumn = pkColumn; + } + + public GenTable getSubTable() + { + return subTable; + } + + public void setSubTable(GenTable subTable) + { + this.subTable = subTable; + } + + public List 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 Long getParentMenuId() + { + return parentMenuId; + } + + public void setParentMenuId(Long 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); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/tool/gen/domain/GenTableColumn.java b/src/main/java/com/evobms/project/tool/gen/domain/GenTableColumn.java new file mode 100644 index 0000000..51a6bcc --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/domain/GenTableColumn.java @@ -0,0 +1,373 @@ +package com.evobms.project.tool.gen.domain; + +import javax.validation.constraints.NotBlank; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.web.domain.BaseEntity; + +/** + * 代码生成业务字段表 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; + + /** 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) */ + private String queryType; + + /** 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) */ + private String htmlType; + + /** 字典类型 */ + private String dictType; + + /** 排序 */ + private Integer sort; + + public void setColumnId(Long columnId) + { + this.columnId = columnId; + } + + public Long getColumnId() + { + return columnId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public Long getTableId() + { + return tableId; + } + + public void setColumnName(String columnName) + { + this.columnName = columnName; + } + + public String getColumnName() + { + return columnName; + } + + public void setColumnComment(String columnComment) + { + this.columnComment = columnComment; + } + + public String getColumnComment() + { + return columnComment; + } + + public void setColumnType(String columnType) + { + this.columnType = columnType; + } + + public String getColumnType() + { + return columnType; + } + + public void setJavaType(String javaType) + { + this.javaType = javaType; + } + + public String getJavaType() + { + return javaType; + } + + public void setJavaField(String javaField) + { + this.javaField = javaField; + } + + public String getJavaField() + { + return javaField; + } + + public String getCapJavaField() + { + return StringUtils.capitalize(javaField); + } + + public void setIsPk(String isPk) + { + this.isPk = isPk; + } + + public String getIsPk() + { + return isPk; + } + + public boolean isPk() + { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) + { + return isPk != null && StringUtils.equals("1", isPk); + } + + public String getIsIncrement() + { + return isIncrement; + } + + public void setIsIncrement(String isIncrement) + { + this.isIncrement = isIncrement; + } + + public boolean isIncrement() + { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) + { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public void setIsRequired(String isRequired) + { + this.isRequired = isRequired; + } + + public String getIsRequired() + { + return isRequired; + } + + public boolean isRequired() + { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) + { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public void setIsInsert(String isInsert) + { + this.isInsert = isInsert; + } + + public String getIsInsert() + { + return isInsert; + } + + public boolean isInsert() + { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) + { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public void setIsEdit(String isEdit) + { + this.isEdit = isEdit; + } + + public String getIsEdit() + { + return isEdit; + } + + public boolean isEdit() + { + return isInsert(this.isEdit); + } + + public boolean isEdit(String isEdit) + { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public void setIsList(String isList) + { + this.isList = isList; + } + + public String getIsList() + { + return isList; + } + + public boolean isList() + { + return isList(this.isList); + } + + public boolean isList(String isList) + { + return isList != null && StringUtils.equals("1", isList); + } + + public void setIsQuery(String isQuery) + { + this.isQuery = isQuery; + } + + public String getIsQuery() + { + return isQuery; + } + + public boolean isQuery() + { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) + { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public void setQueryType(String queryType) + { + this.queryType = queryType; + } + + public String getQueryType() + { + return queryType; + } + + public String getHtmlType() + { + return htmlType; + } + + public void setHtmlType(String htmlType) + { + this.htmlType = htmlType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getDictType() + { + return dictType; + } + + public void setSort(Integer sort) + { + this.sort = sort; + } + + public Integer getSort() + { + return sort; + } + + public boolean isSuperColumn() + { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", "remark", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); + } + + public boolean isUsableColumn() + { + return isUsableColumn(javaField); + } + + public static boolean isUsableColumn(String javaField) + { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public String readConverterExp() + { + String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) + { + for (String value : remarks.split(" ")) + { + if (StringUtils.isNotEmpty(value)) + { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append("").append(startStr).append("=").append(endStr).append(","); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } + else + { + return this.columnComment; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/tool/gen/mapper/GenTableColumnMapper.java b/src/main/java/com/evobms/project/tool/gen/mapper/GenTableColumnMapper.java new file mode 100644 index 0000000..8e9c8bb --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/mapper/GenTableColumnMapper.java @@ -0,0 +1,60 @@ +package com.evobms.project.tool.gen.mapper; + +import java.util.List; +import com.evobms.project.tool.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); +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/tool/gen/mapper/GenTableMapper.java b/src/main/java/com/evobms/project/tool/gen/mapper/GenTableMapper.java new file mode 100644 index 0000000..0819e53 --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/mapper/GenTableMapper.java @@ -0,0 +1,91 @@ +package com.evobms.project.tool.gen.mapper; + +import java.util.List; +import com.evobms.project.tool.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(); + + /** + * 查询表ID业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 查询表名称业务信息 + * + * @param tableName 表名称 + * @return 业务信息 + */ + public GenTable selectGenTableByName(String tableName); + + /** + * 新增业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int insertGenTable(GenTable genTable); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int updateGenTable(GenTable genTable); + + /** + * 批量删除业务 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableByIds(Long[] ids); + + /** + * 创建表 + * + * @param sql 表结构 + * @return 结果 + */ + public int createTable(String sql); +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/tool/gen/service/GenTableColumnServiceImpl.java b/src/main/java/com/evobms/project/tool/gen/service/GenTableColumnServiceImpl.java new file mode 100644 index 0000000..5ea4d5e --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/service/GenTableColumnServiceImpl.java @@ -0,0 +1,68 @@ +package com.evobms.project.tool.gen.service; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.evobms.common.core.text.Convert; +import com.evobms.project.tool.gen.domain.GenTableColumn; +import com.evobms.project.tool.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)); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/tool/gen/service/GenTableServiceImpl.java b/src/main/java/com/evobms/project/tool/gen/service/GenTableServiceImpl.java new file mode 100644 index 0000000..2926362 --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/service/GenTableServiceImpl.java @@ -0,0 +1,531 @@ +package com.evobms.project.tool.gen.service; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.evobms.common.constant.Constants; +import com.evobms.common.constant.GenConstants; +import com.evobms.common.core.text.CharsetKit; +import com.evobms.common.exception.ServiceException; +import com.evobms.common.utils.StringUtils; +import com.evobms.project.tool.gen.domain.GenTable; +import com.evobms.project.tool.gen.domain.GenTableColumn; +import com.evobms.project.tool.gen.mapper.GenTableColumnMapper; +import com.evobms.project.tool.gen.mapper.GenTableMapper; +import com.evobms.project.tool.gen.util.GenUtils; +import com.evobms.project.tool.gen.util.VelocityInitializer; +import com.evobms.project.tool.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 genTableColumn : genTable.getColumns()) + { + genTableColumnMapper.updateGenTableColumn(genTableColumn); + } + } + } + + /** + * 删除业务对象 + * + * @param tableIds 需要删除的数据ID + * @return 结果 + */ + @Override + @Transactional + public void deleteGenTableByIds(Long[] tableIds) + { + genTableMapper.deleteGenTableByIds(tableIds); + genTableColumnMapper.deleteGenTableColumnByIds(tableIds); + } + + /** + * 创建表 + * + * @param sql 创建表语句 + * @return 结果 + */ + @Override + public boolean createTable(String sql) + { + return genTableMapper.createTable(sql) == 0; + } + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + @Override + @Transactional + public void importGenTable(List tableList, String operName) + { + 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 ServiceException("导入失败:" + e.getMessage()); + } + } + + /** + * 预览代码 + * + * @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(), table.getTplWebType()); + for (String template : templates) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + @Override + public byte[] downloadCode(String tableName) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableName, zip); + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + */ + @Override + public void generatorCode(String tableName) + { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType()); + for (String template : templates) + { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + String path = getGenPath(table, template); + FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); + } + catch (IOException e) + { + throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); + } + } + } + } + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + @Override + @Transactional + public void synchDb(String tableName) + { + GenTable table = genTableMapper.selectGenTableByName(tableName); + List tableColumns = table.getColumns(); + Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); + + List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + if (StringUtils.isEmpty(dbTableColumns)) + { + throw new ServiceException("同步数据失败,原表结构不存在"); + } + List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + + dbTableColumns.forEach(column -> { + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) + { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setColumnId(prevColumn.getColumnId()); + if (column.isList()) + { + // 如果是列表,继续保留查询方式/字典类型选项 + column.setDictType(prevColumn.getDictType()); + column.setQueryType(prevColumn.getQueryType()); + } + if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() + && (column.isInsert() || column.isEdit()) + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) + { + // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 + column.setIsRequired(prevColumn.getIsRequired()); + column.setHtmlType(prevColumn.getHtmlType()); + } + genTableColumnMapper.updateGenTableColumn(column); + } + else + { + genTableColumnMapper.insertGenTableColumn(column); + } + }); + + List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); + if (StringUtils.isNotEmpty(delColumns)) + { + genTableColumnMapper.deleteGenTableColumns(delColumns); + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableNames) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) + { + generatorCode(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(String tableName, ZipOutputStream zip) + { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType()); + for (String template : templates) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IOUtils.write(sw.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } + catch (IOException e) + { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + } + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + @Override + public void validateEdit(GenTable genTable) + { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) + { + String options = JSON.toJSONString(genTable.getParams()); + JSONObject paramsObj = JSON.parseObject(options); + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) + { + throw new ServiceException("树编码字段不能为空"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) + { + throw new ServiceException("树父编码字段不能为空"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) + { + throw new ServiceException("树名称字段不能为空"); + } + } + else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) + { + if (StringUtils.isEmpty(genTable.getSubTableName())) + { + throw new ServiceException("关联子表的表名不能为空"); + } + else if (StringUtils.isEmpty(genTable.getSubTableFkName())) + { + throw new ServiceException("子表关联的外键名不能为空"); + } + } + } + + /** + * 设置主键列信息 + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTable table) + { + for (GenTableColumn column : table.getColumns()) + { + if (column.isPk()) + { + table.setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getPkColumn())) + { + table.setPkColumn(table.getColumns().get(0)); + } + if (GenConstants.TPL_SUB.equals(table.getTplCategory())) + { + for (GenTableColumn column : table.getSubTable().getColumns()) + { + if (column.isPk()) + { + table.getSubTable().setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getSubTable().getPkColumn())) + { + table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); + } + } + } + + /** + * 设置主子表信息 + * + * @param table 业务表信息 + */ + public void setSubTable(GenTable table) + { + String subTableName = table.getSubTableName(); + if (StringUtils.isNotEmpty(subTableName)) + { + table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); + } + } + + /** + * 设置代码生成其他选项值 + * + * @param genTable 设置后的生成对象 + */ + public void setTableFromOptions(GenTable genTable) + { + JSONObject paramsObj = JSON.parseObject(genTable.getOptions()); + if (StringUtils.isNotNull(paramsObj)) + { + String treeCode = paramsObj.getString(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + Long parentMenuId = paramsObj.getLongValue(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) + { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) + { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} \ No newline at end of file diff --git a/src/main/java/com/evobms/project/tool/gen/service/IGenTableColumnService.java b/src/main/java/com/evobms/project/tool/gen/service/IGenTableColumnService.java new file mode 100644 index 0000000..ff23b6f --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/service/IGenTableColumnService.java @@ -0,0 +1,44 @@ +package com.evobms.project.tool.gen.service; + +import java.util.List; +import com.evobms.project.tool.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/src/main/java/com/evobms/project/tool/gen/service/IGenTableService.java b/src/main/java/com/evobms/project/tool/gen/service/IGenTableService.java new file mode 100644 index 0000000..4f46df8 --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/service/IGenTableService.java @@ -0,0 +1,130 @@ +package com.evobms.project.tool.gen.service; + +import java.util.List; +import java.util.Map; +import com.evobms.project.tool.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 需要删除的表数据ID + * @return 结果 + */ + public void deleteGenTableByIds(Long[] tableIds); + + /** + * 创建表 + * + * @param sql 创建表语句 + * @return 结果 + */ + public boolean createTable(String sql); + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + * @param operName 操作人员 + */ + public void importGenTable(List tableList, String operName); + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + public Map previewCode(Long tableId); + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + public byte[] downloadCode(String tableName); + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + * @return 数据 + */ + public void generatorCode(String tableName); + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + public void synchDb(String tableName); + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + public byte[] downloadCode(String[] tableNames); + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + public void validateEdit(GenTable genTable); +} diff --git a/src/main/java/com/evobms/project/tool/gen/util/GenUtils.java b/src/main/java/com/evobms/project/tool/gen/util/GenUtils.java new file mode 100644 index 0000000..1cc4132 --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/util/GenUtils.java @@ -0,0 +1,257 @@ +package com.evobms.project.tool.gen.util; + +import java.util.Arrays; +import org.apache.commons.lang3.RegExUtils; +import com.evobms.common.constant.GenConstants; +import com.evobms.common.utils.StringUtils; +import com.evobms.framework.config.GenConfig; +import com.evobms.project.tool.gen.domain.GenTable; +import com.evobms.project.tool.gen.domain.GenTableColumn; + +/** + * 代码生成器 工具类 + * + * @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); + column.setQueryType(GenConstants.QUERY_EQ); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) + { + // 字符串长度超过500设置为文本域 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } + else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) + { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } + else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) + { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) + { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) + { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else + { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // 插入字段(默认所有字段都需要插入) + column.setIsInsert(GenConstants.REQUIRE); + + // 编辑字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) + { + column.setIsEdit(GenConstants.REQUIRE); + } + // 列表字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) + { + column.setIsList(GenConstants.REQUIRE); + } + // 查询字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) + { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) + { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) + { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) + { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 图片字段设置图片上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) + { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 文件字段设置文件上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) + { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 内容字段设置富文本控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) + { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 校验数组是否包含指定值 + * + * @param arr 数组 + * @param targetValue 值 + * @return 是否包含 + */ + public static boolean arraysContains(String[] arr, String targetValue) + { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取模块名 + * + * @param packageName 包名 + * @return 模块名 + */ + public static String getModuleName(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + return StringUtils.substring(packageName, lastIndex + 1, nameLength); + } + + /** + * 获取业务名 + * + * @param tableName 表名 + * @return 业务名 + */ + public static String getBusinessName(String tableName) + { + int lastIndex = tableName.lastIndexOf("_"); + int nameLength = tableName.length(); + return StringUtils.substring(tableName, lastIndex + 1, nameLength); + } + + /** + * 表名转换成Java类名 + * + * @param tableName 表名称 + * @return 类名 + */ + public static String convertClassName(String tableName) + { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) + { + String[] searchList = StringUtils.split(tablePrefix, ","); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @param replacementm 替换值 + * @param searchList 替换列表 + * @return + */ + public static String replaceFirst(String replacementm, String[] searchList) + { + String text = replacementm; + for (String searchString : searchList) + { + if (replacementm.startsWith(searchString)) + { + text = replacementm.replaceFirst(searchString, ""); + break; + } + } + return text; + } + + /** + * 关键字替换 + * + * @param text 需要被替换的名字 + * @return 替换后的名字 + */ + public static String replaceText(String text) + { + return RegExUtils.replaceAll(text, "(?:表|若依)", ""); + } + + /** + * 获取数据库类型字段 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getDbType(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + return StringUtils.substringBefore(columnType, "("); + } + else + { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static Integer getColumnLength(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } + else + { + return 0; + } + } +} diff --git a/src/main/java/com/evobms/project/tool/gen/util/VelocityInitializer.java b/src/main/java/com/evobms/project/tool/gen/util/VelocityInitializer.java new file mode 100644 index 0000000..22fc04a --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/util/VelocityInitializer.java @@ -0,0 +1,34 @@ +package com.evobms.project.tool.gen.util; + +import java.util.Properties; +import org.apache.velocity.app.Velocity; +import com.evobms.common.constant.Constants; + +/** + * VelocityEngine工厂 + * + * @author ruoyi + */ +public class VelocityInitializer +{ + /** + * 初始化vm方法 + */ + public static void initVelocity() + { + Properties p = new Properties(); + try + { + // 加载classpath目录下的vm文件 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/evobms/project/tool/gen/util/VelocityUtils.java b/src/main/java/com/evobms/project/tool/gen/util/VelocityUtils.java new file mode 100644 index 0000000..4281710 --- /dev/null +++ b/src/main/java/com/evobms/project/tool/gen/util/VelocityUtils.java @@ -0,0 +1,408 @@ +package com.evobms.project.tool.gen.util; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.velocity.VelocityContext; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.evobms.common.constant.GenConstants; +import com.evobms.common.utils.DateUtils; +import com.evobms.common.utils.StringUtils; +import com.evobms.project.tool.gen.domain.GenTable; +import com.evobms.project.tool.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/mybatis"; + + /** 默认上级菜单,系统工具 */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) + { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) + { + setTreeVelocityContext(velocityContext, genTable); + } + if (GenConstants.TPL_SUB.equals(tplCategory)) + { + setSubVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); + } + } + + public static void setSubVelocityContext(VelocityContext context, GenTable genTable) + { + GenTable subTable = genTable.getSubTable(); + String subTableName = genTable.getSubTableName(); + String subTableFkName = genTable.getSubTableFkName(); + String subClassName = genTable.getSubTable().getClassName(); + String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); + + context.put("subTable", subTable); + context.put("subTableName", subTableName); + context.put("subTableFkName", subTableFkName); + context.put("subTableFkClassName", subTableFkClassName); + context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); + context.put("subClassName", subClassName); + context.put("subclassName", StringUtils.uncapitalize(subClassName)); + context.put("subImportList", getImportList(genTable.getSubTable())); + } + + /** + * 获取模板信息 + * @param tplCategory 生成的模板 + * @param tplWebType 前端类型 + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory, String tplWebType) + { + String useWebType = "vm/vue"; + if ("element-plus".equals(tplWebType)) + { + useWebType = "vm/vue/v3"; + } + 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(useWebType + "/index.vue.vm"); + } + else if (GenConstants.TPL_TREE.equals(tplCategory)) + { + templates.add(useWebType + "/index-tree.vue.vm"); + } + else if (GenConstants.TPL_SUB.equals(tplCategory)) + { + templates.add(useWebType + "/index.vue.vm"); + templates.add("vm/java/sub-domain.java.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) + { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); + } + else if (template.contains("mapper.java.vm")) + { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } + else if (template.contains("service.java.vm")) + { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } + else if (template.contains("serviceImpl.java.vm")) + { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } + else if (template.contains("controller.java.vm")) + { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } + else if (template.contains("mapper.xml.vm")) + { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } + else if (template.contains("sql.vm")) + { + fileName = businessName + "Menu.sql"; + } + else if (template.contains("api.js.vm")) + { + fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); + } + else if (template.contains("index.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + else if (template.contains("index-tree.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet 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 genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) + { + List columns = genTable.getColumns(); + Set dicts = new HashSet(); + addDicts(dicts, columns); + if (StringUtils.isNotNull(genTable.getSubTable())) + { + List subColumns = genTable.getSubTable().getColumns(); + addDicts(dicts, subColumns); + } + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) + { + for (GenTableColumn column : columns) + { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) + { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) + { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(JSONObject paramsObj) + { + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) + { + return paramsObj.getString(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) + { + if (column.isList()) + { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) + { + break; + } + } + } + return num; + } +} diff --git a/src/main/java/com/evobms/project/tool/swagger/TestController.java b/src/main/java/com/evobms/project/tool/swagger/TestController.java new file mode 100644 index 0000000..99a6e90 --- /dev/null +++ b/src/main/java/com/evobms/project/tool/swagger/TestController.java @@ -0,0 +1,183 @@ +package com.evobms.project.tool.swagger; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +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.evobms.common.utils.StringUtils; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.R; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; + +/** + * swagger 用户测试方法 + * + * @author ruoyi + */ +@Api("用户信息管理") +@RestController +@RequestMapping("/test/user") +public class TestController extends BaseController +{ + private final static Map users = new LinkedHashMap(); + { + users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); + users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); + } + + @ApiOperation("获取用户列表") + @GetMapping("/list") + public R> userList() + { + List userList = new ArrayList(users.values()); + return R.ok(userList); + } + + @ApiOperation("获取用户详细") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @GetMapping("/{userId}") + public R getUser(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + return R.ok(users.get(userId)); + } + else + { + return R.fail("用户不存在"); + } + } + + @ApiOperation("新增用户") + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class) + }) + @PostMapping("/save") + public R save(UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("更新用户") + @PutMapping("/update") + public R update(@RequestBody UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + if (users.isEmpty() || !users.containsKey(user.getUserId())) + { + return R.fail("用户不存在"); + } + users.remove(user.getUserId()); + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("删除用户信息") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @DeleteMapping("/{userId}") + public R delete(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + users.remove(userId); + return R.ok(); + } + else + { + return R.fail("用户不存在"); + } + } +} + +@ApiModel(value = "UserEntity", description = "用户实体") +class UserEntity +{ + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("用户名称") + private String username; + + @ApiModelProperty("用户密码") + private String password; + + @ApiModelProperty("用户手机") + private String mobile; + + public UserEntity() + { + + } + + public UserEntity(Integer userId, String username, String password, String mobile) + { + this.userId = userId; + this.username = username; + this.password = password; + this.mobile = mobile; + } + + public Integer getUserId() + { + return userId; + } + + public void setUserId(Integer userId) + { + this.userId = userId; + } + + 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; + } + + public String getMobile() + { + return mobile; + } + + public void setMobile(String mobile) + { + this.mobile = mobile; + } +} diff --git a/src/main/resources/META-INF/spring-devtools.properties b/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..37e7b58 --- /dev/null +++ b/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.json=/com.alibaba.fastjson2.*.jar \ No newline at end of file diff --git a/src/main/resources/application-druid.yml b/src/main/resources/application-druid.yml new file mode 100644 index 0000000..3edbf21 --- /dev/null +++ b/src/main/resources/application-druid.yml @@ -0,0 +1,61 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://localhost:3306/evo_bms1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: root + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..9bcccf9 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,218 @@ +# 项目相关配置 +ruoyi: + # 名称 + name: RuoYi + # 版本 + version: 3.9.0 + # 版权年份 + copyrightYear: 2025 + # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) + profile: D:/ruoyi/uploadPath + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数字计算 char 字符验证 + captchaType: math + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8080 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + # 临时允许非法头部进入应用层以便调试抓取(排查完成后请改回true) + reject-illegal-header: false + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# 日志配置 +logging: + level: + com.evobms: debug + org.springframework: warn + pattern: + console: "%clr(%d{HH:mm:ss.SSS}){faint} %clr([%thread]){magenta} %clr(%-5level){cyan} %clr(%logger{36}){green} - %msg%n" + # 开启ANSI彩色输出(Spring Boot 2.x/3.x) + ansi: + enabled: always + +# 用户配置 +user: + password: + # 密码最大错误次数 + maxRetryCount: 5 + # 密码锁定时间(默认10分钟) + lockTime: 10 + +# Spring配置 +spring: + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: druid + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 30 + +# MyBatis配置 +mybatis: + # 搜索指定包别名 + typeAliasesPackage: com.evobms.project.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mybatis/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# MyBatis-Plus配置 +mybatis-plus: + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapper-locations: classpath*:mybatis/**/*Mapper.xml + # 实体扫描,多个package用逗号或者分号分隔 + type-aliases-package: com.evobms.project.**.domain + # 全局配置 + global-config: + # 数据库相关配置 + db-config: + # 主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID"; + id-type: AUTO + # 字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断" + field-strategy: NOT_NULL + # 驼峰下划线转换 + column-underline: true + # 数据库大写下划线转换 + capital-mode: true + # 逻辑删除配置 + logic-delete-field: delFlag + logic-delete-value: 2 + logic-not-delete-value: 0 + banner: false + # 原生配置 + configuration: + map-underscore-to-camel-case: true + cache-enabled: false + call-setters-on-nulls: true + jdbc-type-for-null: 'null' + +# PageHelper分页插件 +pagehelper: + helperDialect: mysql + supportMethodsArguments: true + params: count=countSql + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 防盗链配置 +referer: + # 防盗链开关 + enabled: false + # 允许的域名列表 + allowed-domains: localhost,127.0.0.1,ruoyi.vip,www.ruoyi.vip + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* + +# 代码生成 +gen: + # 作者 + author: ruoyi + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: com.evobms.project.system + # 自动去除表前缀,默认是true + autoRemovePre: false + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: sys_ + # 是否允许生成文件覆盖到本地(自定义路径),默认不允许 + allowOverwrite: false + +# MQTT配置 +mqtt: + # 是否启用MQTT功能(设置为false可在没有MQTT服务器时正常启动) + enabled: true + # MQTT服务器地址 + host: tcp://61.182.73.218:1883 + # 客户端ID + clientId: evobms-client + # 用户名 + username: + # 密码 + password: + # 连接超时时间(秒) + connectionTimeout: 30 + # 心跳间隔(秒) + keepAliveInterval: 60 + # 是否自动重连 + automaticReconnect: true + # 是否清除会话 + cleanSession: true + # 默认QoS等级 + defaultQos: 1 + # 订阅主题 + subscribeTopic: /bbox/EVO0002/# + # 发布主题 + publishTopic: evobms/command + +# 调试:开启HTTP请求打印 +debug: + httpdump: + enabled: true diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt new file mode 100644 index 0000000..0931cb8 --- /dev/null +++ b/src/main/resources/banner.txt @@ -0,0 +1,24 @@ +Application Version: ${ruoyi.version} +Spring Boot Version: ${spring-boot.version} +//////////////////////////////////////////////////////////////////// +// _ooOoo_ // +// o8888888o // +// 88" . "88 // +// (| ^_^ |) // +// O\ = /O // +// ____/`---'\____ // +// .' \\| |// `. // +// / \\||| : |||// \ // +// / _||||| -:- |||||- \ // +// | | \\\ - /// | | // +// | \_| ''\---/'' | | // +// \ .-\__ `-` ___/-. / // +// ___`. .' /--.--\ `. . ___ // +// ."" '< `.___\_<|>_/___.' >'"". // +// | | : `- \`.;`\ _ /`;.`/ - ` : | | // +// \ \ `-. \_ __\ /__ _/ .-` / / // +// ========`-.____`-.___\_____/___.-`____.-'======== // +// `=---=' // +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// 佛祖保佑 永不宕机 永无BUG // +//////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000..93de005 --- /dev/null +++ b/src/main/resources/i18n/messages.properties @@ -0,0 +1,38 @@ +#错误消息 +not.null=* 必须填写 +user.jcaptcha.error=验证码错误 +user.jcaptcha.expire=验证码已失效 +user.not.exists=用户不存在/密码错误 +user.password.not.match=用户不存在/密码错误 +user.password.retry.limit.count=密码输入错误{0}次 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 +user.password.delete=对不起,您的账号已被删除 +user.blocked=用户已封禁,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +login.blocked=很遗憾,访问IP已被列入系统黑名单 +user.logout.success=退出成功 + +length.not.valid=长度必须在{min}到{max}个字符之间 + +user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.password.not.valid=* 5-50个字符 + +user.email.not.valid=邮箱格式错误 +user.mobile.phone.number.not.valid=手机号格式错误 +user.login.success=登录成功 +user.register.success=注册成功 +user.notfound=请重新登录 +user.forcelogout=管理员强制退出,请重新登录 +user.unknown.error=未知错误,请重新登录 + +##文件上传消息 +upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! +upload.filename.exceed.length=上传的文件名最长{0}个字符 + +##权限 +no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] +no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] +no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] +no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] +no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] +no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..a163c3f --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + UTF-8 + + + + + + logs/evobms.log + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg TOPIC:%X{topic} DEVICE:%X{deviceCode}%n + UTF-8 + + + logs/evobms.%d{yyyy-MM-dd}.%i.log.gz + + 50MB + + 14 + 2GB + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..ce68db6 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/BatteryData/ExtremeValuesMapper.xml b/src/main/resources/mybatis/BatteryData/ExtremeValuesMapper.xml new file mode 100644 index 0000000..22b0063 --- /dev/null +++ b/src/main/resources/mybatis/BatteryData/ExtremeValuesMapper.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, device_id, timestamp, max_voltage_subsystem_no, max_voltage_battery_no, max_voltage_value, min_voltage_subsystem_no, min_voltage_battery_no, min_voltage_value, max_temp_subsystem_no, max_temp_probe_no, max_temp_value, min_temp_subsystem_no, min_temp_probe_no, min_temp_value, create_time, update_time, create_by, update_by from extreme_values + + + + + + + + insert into extreme_values + + device_id, + timestamp, + max_voltage_subsystem_no, + max_voltage_battery_no, + max_voltage_value, + min_voltage_subsystem_no, + min_voltage_battery_no, + min_voltage_value, + max_temp_subsystem_no, + max_temp_probe_no, + max_temp_value, + min_temp_subsystem_no, + min_temp_probe_no, + min_temp_value, + create_time, + update_time, + create_by, + update_by, + + + #{deviceId}, + #{timestamp}, + #{maxVoltageSubsystemNo}, + #{maxVoltageBatteryNo}, + #{maxVoltageValue}, + #{minVoltageSubsystemNo}, + #{minVoltageBatteryNo}, + #{minVoltageValue}, + #{maxTempSubsystemNo}, + #{maxTempProbeNo}, + #{maxTempValue}, + #{minTempSubsystemNo}, + #{minTempProbeNo}, + #{minTempValue}, + #{createTime}, + #{updateTime}, + #{createBy}, + #{updateBy}, + + + + + update extreme_values + + device_id = #{deviceId}, + timestamp = #{timestamp}, + max_voltage_subsystem_no = #{maxVoltageSubsystemNo}, + max_voltage_battery_no = #{maxVoltageBatteryNo}, + max_voltage_value = #{maxVoltageValue}, + min_voltage_subsystem_no = #{minVoltageSubsystemNo}, + min_voltage_battery_no = #{minVoltageBatteryNo}, + min_voltage_value = #{minVoltageValue}, + max_temp_subsystem_no = #{maxTempSubsystemNo}, + max_temp_probe_no = #{maxTempProbeNo}, + max_temp_value = #{maxTempValue}, + min_temp_subsystem_no = #{minTempSubsystemNo}, + min_temp_probe_no = #{minTempProbeNo}, + min_temp_value = #{minTempValue}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_by = #{createBy}, + update_by = #{updateBy}, + + where id = #{id} + + + + delete from extreme_values where id = #{id} + + + + delete from extreme_values where id in + + #{id} + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/OTA/OtaTasksMapper.xml b/src/main/resources/mybatis/OTA/OtaTasksMapper.xml new file mode 100644 index 0000000..b4f9d04 --- /dev/null +++ b/src/main/resources/mybatis/OTA/OtaTasksMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + select id, device_id, task_name, firmware_version, status, progress, start_time, end_time, error_message, create_time, update_time, update_by, create_by from ota_tasks + + + + + + + + insert into ota_tasks + + id, + device_id, + task_name, + firmware_version, + status, + progress, + start_time, + end_time, + error_message, + create_time, + update_time, + update_by, + create_by, + + + + COALESCE(#{id}, UUID()), + #{deviceId}, + #{taskName}, + #{firmwareVersion}, + #{status}, + #{progress}, + #{startTime}, + #{endTime}, + #{errorMessage}, + + #{createTime}, + #{updateTime}, + #{updateBy}, + #{createBy}, + + + + + update ota_tasks + + device_id = #{deviceId}, + task_name = #{taskName}, + firmware_version = #{firmwareVersion}, + status = #{status}, + progress = #{progress}, + start_time = #{startTime}, + end_time = #{endTime}, + error_message = #{errorMessage}, + create_time = #{createTime}, + update_time = #{updateTime}, + update_by = #{updateBy}, + create_by = #{createBy}, + + where id = #{id} + + + + delete from ota_tasks where id = #{id} + + + + delete from ota_tasks where id in + + #{id} + + + diff --git a/src/main/resources/mybatis/bms/BmsDeviceMapper.xml b/src/main/resources/mybatis/bms/BmsDeviceMapper.xml new file mode 100644 index 0000000..23e81da --- /dev/null +++ b/src/main/resources/mybatis/bms/BmsDeviceMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select device_id, device_code, device_name, device_type, status, battery_capacity, + rated_voltage, current_voltage, current_current, remaining_capacity, temperature, + last_comm_time, del_flag, version, create_by, create_time, update_by, update_time, remark + from bms_device + + + + + + + + update bms_device set status = #{status} where device_id in + + #{deviceId} + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/monitor/SysLogininforMapper.xml b/src/main/resources/mybatis/monitor/SysLogininforMapper.xml new file mode 100644 index 0000000..51ecd24 --- /dev/null +++ b/src/main/resources/mybatis/monitor/SysLogininforMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + insert into sys_logininfor (user_name, status, ipaddr, login_location, browser, os, msg, login_time) + values (#{userName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, sysdate()) + + + + + + delete from sys_logininfor where info_id in + + #{infoId} + + + + + truncate table sys_logininfor + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/monitor/SysOperLogMapper.xml b/src/main/resources/mybatis/monitor/SysOperLogMapper.xml new file mode 100644 index 0000000..0eaba81 --- /dev/null +++ b/src/main/resources/mybatis/monitor/SysOperLogMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time, cost_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_location, oper_param, json_result, status, error_msg, cost_time, oper_time) + values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, #{costTime}, sysdate()) + + + + + + delete from sys_oper_log where oper_id in + + #{operId} + + + + + + + truncate table sys_oper_log + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/mybatis-config.xml b/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 0000000..ac47c03 --- /dev/null +++ b/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mybatis/system/BmsDevicesMapper.xml b/src/main/resources/mybatis/system/BmsDevicesMapper.xml new file mode 100644 index 0000000..4ff3a58 --- /dev/null +++ b/src/main/resources/mybatis/system/BmsDevicesMapper.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + select id, device_id,device_sn, device_name, device_type, status, ip_address, firmware_version, last_online, update_time, update_by, create_time, create_by from bms_devices + + + + + + + + insert into bms_devices + + id, + device_id, + device_sn, + device_name, + device_type, + status, + ip_address, + firmware_version, + last_online, + update_time, + update_by, + create_time, + create_by, + + + #{id}, + #{deviceId}, + device_sn, + #{deviceName}, + #{deviceType}, + #{status}, + #{ipAddress}, + #{firmwareVersion}, + #{lastOnline}, + #{updateTime}, + #{updateBy}, + #{createTime}, + #{createBy}, + + + + + update bms_devices + + device_id = #{deviceId}, + device_sn = #{deviceSn}, + device_name = #{deviceName}, + device_type = #{deviceType}, + status = #{status}, + ip_address = #{ipAddress}, + firmware_version = #{firmwareVersion}, + last_online = #{lastOnline}, + update_time = #{updateTime}, + update_by = #{updateBy}, + create_time = #{createTime}, + create_by = #{createBy}, + + where id = #{id} + + + + delete from bms_devices where id = #{id} + + + + delete from bms_devices where id in + + #{id} + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysConfigMapper.xml b/src/main/resources/mybatis/system/SysConfigMapper.xml new file mode 100644 index 0000000..b297c72 --- /dev/null +++ b/src/main/resources/mybatis/system/SysConfigMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + 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} + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysDeptMapper.xml b/src/main/resources/mybatis/system/SysDeptMapper.xml new file mode 100644 index 0000000..0c5c608 --- /dev/null +++ b/src/main/resources/mybatis/system/SysDeptMapper.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + 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 set status = '0' where dept_id in + + #{deptId} + + + + + update sys_dept set del_flag = '2' where dept_id = #{deptId} + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysDictDataMapper.xml b/src/main/resources/mybatis/system/SysDictDataMapper.xml new file mode 100644 index 0000000..0ea7292 --- /dev/null +++ b/src/main/resources/mybatis/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() + ) + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysDictTypeMapper.xml b/src/main/resources/mybatis/system/SysDictTypeMapper.xml new file mode 100644 index 0000000..22715d2 --- /dev/null +++ b/src/main/resources/mybatis/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() + ) + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysJobLogMapper.xml b/src/main/resources/mybatis/system/SysJobLogMapper.xml new file mode 100644 index 0000000..d594f24 --- /dev/null +++ b/src/main/resources/mybatis/system/SysJobLogMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + 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() + ) + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysJobMapper.xml b/src/main/resources/mybatis/system/SysJobMapper.xml new file mode 100644 index 0000000..4620ea5 --- /dev/null +++ b/src/main/resources/mybatis/system/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() + ) + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysMenuMapper.xml b/src/main/resources/mybatis/system/SysMenuMapper.xml new file mode 100644 index 0000000..2cf7ab2 --- /dev/null +++ b/src/main/resources/mybatis/system/SysMenuMapper.xml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select menu_id, menu_name, parent_id, order_num, path, component, `query`, route_name, 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}, + `query` = #{query}, + route_name = #{routeName}, + 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, + `query`, + route_name, + is_frame, + is_cache, + menu_type, + visible, + status, + perms, + icon, + remark, + create_by, + create_time + )values( + #{menuId}, + #{parentId}, + #{menuName}, + #{orderNum}, + #{path}, + #{component}, + #{query}, + #{routeName}, + #{isFrame}, + #{isCache}, + #{menuType}, + #{visible}, + #{status}, + #{perms}, + #{icon}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_menu where menu_id = #{menuId} + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysNoticeMapper.xml b/src/main/resources/mybatis/system/SysNoticeMapper.xml new file mode 100644 index 0000000..959d1e1 --- /dev/null +++ b/src/main/resources/mybatis/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} + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysPostMapper.xml b/src/main/resources/mybatis/system/SysPostMapper.xml new file mode 100644 index 0000000..0dbcd3d --- /dev/null +++ b/src/main/resources/mybatis/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} + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysRoleDeptMapper.xml b/src/main/resources/mybatis/system/SysRoleDeptMapper.xml new file mode 100644 index 0000000..4864632 --- /dev/null +++ b/src/main/resources/mybatis/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}) + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysRoleMapper.xml b/src/main/resources/mybatis/system/SysRoleMapper.xml new file mode 100644 index 0000000..a5a4145 --- /dev/null +++ b/src/main/resources/mybatis/system/SysRoleMapper.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + 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_role set del_flag = '2' where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id in + + #{roleId} + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysRoleMenuMapper.xml b/src/main/resources/mybatis/system/SysRoleMenuMapper.xml new file mode 100644 index 0000000..ca7a33a --- /dev/null +++ b/src/main/resources/mybatis/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}) + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysUserMapper.xml b/src/main/resources/mybatis/system/SysUserMapper.xml new file mode 100644 index 0000000..fe8e9b8 --- /dev/null +++ b/src/main/resources/mybatis/system/SysUserMapper.xml @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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.pwd_update_date, u.create_by, u.create_time, u.remark, + d.dept_id, d.parent_id, d.ancestors, 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, + pwd_update_date, + create_by, + remark, + create_time + )values( + #{userId}, + #{deptId}, + #{userName}, + #{nickName}, + #{email}, + #{avatar}, + #{phonenumber}, + #{sex}, + #{password}, + #{status}, + #{pwdUpdateDate}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_user + + dept_id = #{deptId}, + 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}, update_time = sysdate() where user_id = #{userId} + + + + update sys_user set avatar = #{avatar}, update_time = sysdate() where user_id = #{userId} + + + + update sys_user set login_ip = #{loginIp}, login_date = #{loginDate} where user_id = #{userId} + + + + update sys_user set pwd_update_date = sysdate(), password = #{password}, update_time = sysdate() where user_id = #{userId} + + + + update sys_user set del_flag = '2' where user_id = #{userId} + + + + update sys_user set del_flag = '2' where user_id in + + #{userId} + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysUserPostMapper.xml b/src/main/resources/mybatis/system/SysUserPostMapper.xml new file mode 100644 index 0000000..60c0ad0 --- /dev/null +++ b/src/main/resources/mybatis/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}) + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SysUserRoleMapper.xml b/src/main/resources/mybatis/system/SysUserRoleMapper.xml new file mode 100644 index 0000000..7d68d84 --- /dev/null +++ b/src/main/resources/mybatis/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} + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/tool/GenTableColumnMapper.xml b/src/main/resources/mybatis/tool/GenTableColumnMapper.xml new file mode 100644 index 0000000..9c9e4d7 --- /dev/null +++ b/src/main/resources/mybatis/tool/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} + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/tool/GenTableMapper.xml b/src/main/resources/mybatis/tool/GenTableMapper.xml new file mode 100644 index 0000000..b9f21db --- /dev/null +++ b/src/main/resources/mybatis/tool/GenTableMapper.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, tpl_web_type, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + tpl_web_type, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{tplWebType}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + ${sql} + + + + 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}, + tpl_web_type = #{tplWebType}, + 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} + + + + \ No newline at end of file diff --git a/src/main/resources/ota/0.0.1.bin b/src/main/resources/ota/0.0.1.bin new file mode 100644 index 0000000000000000000000000000000000000000..ab25ad75d2b6cddd038c076afbf4b9e131a5c1b5 GIT binary patch literal 124828 zcmeFad3ck@)i-==@h-drvTWd%#V!^bvsw`31z}4BvnSXjm@N^z4H#^TMK&RrtOQ61 zb~duKP1}@233(D69_MNDG-;FewL;Q>9a@pJArTFgS!!D{*84l>mSmAYzwf!O@B03D zuh-XgG&ASSdS>R#%$YN{g$hBG?GuExw*cWsf5%75IUb=ejFAh)W935jV=`eT;7&jp zU@c$=U?1Qx;5gs};56V9z&XH0z;%G)ahZ?=xK-Id#vT4W@&cRy{FoLDuQ1-87K{^g zoik-ZRD{%?AnyN9*K$%OECt*Tr~>Q-1j~N{{^tYX*TV2bZ$|j{0o<2Aq6O3cU-#DI z`Tz3eX1@4;^w+z`@6XE0`q8ZaKRdYP?Gle51IPgifD#Y^hy+BvV|v$g%G7Ln&lFo6 zXI`L@uZZD+GmO?vd<=1`F5Nqy0`Zt_+|GG5g=Cyo|q*QMww)S zzq7Zc&LiZ>T|&!Vk5G_xvc#RIEO8e^9C1e^M7JDt%M*sQEOHB~#csK3k9+m9J?=Hj z1kcy@68EA-pI=(M_??!G`Kt3{3hi#Wyw0sq)Vl>?uUjSyh9{40XvsRA*;}tn`+$lNo)&=>iE)^)KWWn=u`^z0NT6OOY`DguXKnJ@rWfG4SdhYmN_1|ifHev=U@7!Qsxn6MSTID z#edZysCHixgiV)ZvNx{Vhoql*j6k*fR;)o^|!Jm z&6J3APq-BcgIffxAX3X0EsJm(h2p%CEqNFWY_IUS*MBDvpl_ddDkjv zu?kASbymt0CB_4%* zx%(@Xxv#-#f3w{iktnb=*)jw7hrSwR!N_{|t`*_~7`jIE_+FCd_W5TP~n>vbQcR zQ~tK)^Gm9TJhyUw#c8S=Y7j4*E?oVUJ+)(U!e3gjlLL1vFhT{TIDHbva(ZwqM+lgy z(s+)zLU|%)z80|)FP*8t$o*ITrAXPm?t*yCDEFBP%7aHa(kYQHf<}5U9j77raC3Z- z%D6JuEssYzS7q=QxaA6(6;vy@S45O6puF&OG+Pp!h+#5f=1Vg@x?scxa(RJG1?=S5QQ6+}9n#5XD%d=e^7 z6D6`G(UfK)Y8vLDDnafOae!xTeG{439@$pT*pHD!;Jf zhEj=9B>$`|y2L#}{0aQl6CKpQ*0X z&$QmtrHreXEwns<^C;grO;TJ|0wNU=D(|2}7|KRVu=2x}IL_xf# zE7~WtNI18D;!kic|B;{I{&Wl6hc~4~UFFHwh2;L9C4I5^TJ_d9FRfgVe6Ga(U%CS9 zUJBgv7D7&!=pb*^SQ*eZnq#xkA6XGjP>j(noADdO3oQ%ZHNPv2if$1`W`MW;Y(SRa z+5PTo9nq?d-z)zlcp|&bcPU-xznANjuUE_-`@Ls&^s`FSVK%pBL$izWQ)} z?70j`mdFnO1iNQM-NX6DD?{t#cdRJJm%%a#zrO@He zv3ug{UYKRP5?3dmy1LNljx@e}DOxEE-}Oe1QP7PkUtgYWI{lqz|HJt)=Y+9>C$&x( zzVADQkY$qaZ+iFsOBiSL9JD{2FF#YCFI>4{e?YV15~Pxdc8$H%y6?M0qZC*3E{(YN zd{=tj^FGq~^XB81R0^~ypIRdu{-*CruT~}Z4bI7PEApa!@n}^vw<^BFpC$k7VdU+! zKWO^B<|VY~ibswX6`(~J8E6s3lv*VJ?1fpvmH)7-P1F*slE$Ymf}aW*IH&?QMXa6Y zj8yJiw=y0%{j0=1xIpe3kVN%Bjs@Uo$FY3kIPpoL09Ui@o=5D*z|{kG`5mhY%QQp0 zk9DBNR12;z_!_D&_bvQjeCmqAPc-1F>G6xd>ky+dy-{6n8fD(dYem@Iil|MA zJ7sRSagJN5dc)V-jan7P`_fR8y(RblmZs_^hsJbBNGU868XYy3c7#(3efI5^^qVMKEM-h-wpUu3 z8oUjS`GV)q_D%2$dcotgueX#ntT(^tQ|Q{Gn;dP9`z)G@`z)mm_gP-@$y3fn$C;Xh zIFxZlL)7J#(u(CsyF4sKsim<3&`^5I6bmeE6;U3QcVSVKXI8huq%kc(3G-1)LBGmr zu?U%s_PGej^+wM__B$~_Zq2A?SfPD z2ZzzJx67!Fcin+_c}O`ukTSxVODVNeLC@1p;at*8<55z&T;muEuB1Cs3ep{ojx39= zD@h#3G1R8v;4H-$3XV!KjyXn{g^rPm%&wHgVS!kKEXNu$ft|xz7lPf>5HA^7I~%yy(W#oJ>B;Pe6`)n0=}wlK}`1i*(YSi zY40xT@A<(iWX5Wj!1o<|(b`4uedCpZx&Xevz!$BZ2j4lbAP)4@cA@{Q&E)^SS3EoOy5~^fIT? zv#)0+(~KTl-3<6>ly0w^%JGbz%DTxM)9BeyM}3-?J;_|1GodR5W2L5b0%Nj^6&>^B z*)N@MDJ6;-nqtQ2`xP%DjNK1NyET_>i+@i4$<+75TTFyg69@SDF zxlcGUPzL3Zfzhh5&vK=4`W&Yk>6QBNXHz*%N?*B1lMpC(9QGSU=rfwrG{FjS7p`6y##IS+?$a_2+D zA;25vh}H)KynX<@t_$Gm12{WyyWvlll{##om0@O>o?}BoKWJ*w$JPLl&+VLLTXz=|-xGw{U&$Mp5jB;r0d@)dR zg!2U|S^FH%{AalqX{KjTPg)rp!`9BHcKODJ6Ceetd=;`Pw;%wdq2mF zXuU7chpW+tr2!n)TJG0!;O+|Gu+B1W8E|)7G}UD&eJ4}xz+UDpF z{tgJ#JlUezmJ+CWf~9m@BG&LNUEp6LW;DIcs%@K=s#=sw;m!FH`HL}|p zSv1gNy5aBCH&Z!OHkC_q@7D;^nMA;uVAu6W-}6)t$h&8`>}SG$BV5MZ@L~uC{iEcd<3psFFPyq4Cs0Y zekEq}0ZS~#!Rkyw+kg>L?0vuz!E>GVqqGN5=#@^v6Wg=fq6}bS^~$q$P^RmRS011} z0rFhex{K>u#iiHqZnlakrOs-e`x?{sfaFSP-O8BKj4ij3nd@0*#=F)c9?87>Lo#m- zrPQusnYWU2Ni$(yv&<_GlX+z<^OkZ9wP|TU=G_%0^A?0;-n>Apd60Q`hGgC>ivsPP z#jPsj-(vp7ss;RPZl}qT3jY-LlT=97N1mnCi$>EF^pxC%*^3y`%9U`IR=5;>oRemq zOdkae@Sl8R0`Y0jOFM>Sz2Yop8~7g8Iu33s`b~;2L;Nc~tX|c$f~CV9f!U}-oOBt@ z%*KjT;4(4(wNz^5K!k=sst|S%WD0i1hySKa4@i>PH@dB97^h$Q-ugBbV|qGZ8GzO# z+6zZv-qD)$KGu5L^V0ks+FzRMn2w^E!kF_k&x88~k_EF7wg70Z2Iu!%Ve_EmTJ2U} zxzaPFherJZ?<=Uk9AoSy=9J(W?>i2ROdsofo=4GhsP%J}=L5C=N6)iFH7NALmAC3- zFD~fPd4!e=ICrPLC+(G(iU-=rzve$YqMJ z%o2m~w*;};9CMIvG5d-!R*EQx%GuzqTQ@tv-5EV*F0FP?+Bp-^D=b{YLd#dEVS;Nm zhw?ad2h&M=YyeCHOaV-C|4wGUN^98|lukS2Hpgg`KFZ=p=_9!Gk%7{CeL2N) zG1e2?Me{(ePjY5)E~{~V?ez}fvd1z;8bdOa_XgmE3%fYTvXrxfi9_finiIq+Ey_&e z6cH}01KdMN=%I9uFI+ifm-?s*V`eYl0O0R{9{^JW;}^HsYTED8dO*>`FFFW}OAc?o!)3+Ru{-YjkfIOgg0O?8b0ZjE;=M(5aKwJE}r z)C(?ELlSHSkE%yn8n=$LXliis-8RgUomsj=&^4FGxH55u$9|()ZBly1d7G`WoaXXo z>k$2w^CG0U2D+^K{IM<#^}jdLl?FG*n{0_fZwf7H7c^qRM$ z>l=xdU^oHcyL*#7_5N7Ty@3Ic`%~VeN)xLiD{@ABaH!P70X4LaTobx}p{({j8zaY3~3dYBctKpZ{^?a5Z zYEL`%rM7Ybl0)U1VbNH9;C@=Q!Ax$fNmJoN5BSQxR-3gk|8hHIeZyqd9F@g1Iwsvh zW7O`*!r0Vf4Vx@NvNwzg=$RTFqi!2pMC>Wz5Xd9(ws8g`&QviCBPbQVd~qPgP%?al zB36K!1o%v%G=fxNBdA}uG=ffX{X5!iR*gx}Dlv)*dWDum)`5N)=xZA5G`2~%Mg1=E z31=zRo6Zj7lP<(3?QQs!fqH5zZCf>#(rPtEICgN=1F%OMU};1B8@ExNld(HXwv^T+ zS~OLOmc|U|GPl_X^%f5RG5Gpc>kNZGh@L)DciK6LkdC%&;_8 z0cs4EHq_a$BE~h%Y(TEkyj{>`K+c90xtw!H`@}$fUJ2BP#@hH04@cjIhuE1{>nx>P zhoK%?@Dg0F!HU0aFxIxV?Sn}2?MTOO=?-YjGxv6l7K!ULP9|ZTl=3*492zH6FizU4 zX`D>`$v9DXy8SnExo@0|2cOkEPCQ|J{s;UtMy5k1NaIBA(e@gzB^XHG7j4By{-O0LCMPArP>+{3!SY^qNtPWjwl{loYJSs9p%x8u(+ zi9g%GBk-qj8vr|^wrv3Hh%{AznsoFRpe7Cd1*jRw{Y7%Ne`uB{JheY+z46L4ZCsJU zbKEcSAr>|NRZnodl}8HV>u5inn6YyIzH~3d$IqMFZ_By-mL_ zM!OcG-vQP0u}T1{OVIy->N_!)05ukj13(Sd`fY%k*=TnW(#^7HwwsWyz*4%s5b5$P zjoWc1t)6LV+ipZUNVpw$Af3Tdx??)hO|vxa$hEZ9;4Hdh8q!Zfe+(6;Acq|IhKUoA zM;3g;#RjFBKEpA8nsz8YHj`D%N7S%8f_%qCeWz0CBl~z7`6Sv`t7;i z+l|`KaepjH2ce}k&@T;G&*;1v4OhCuNi-+ob|}KLtXt68FeX%HTVU-~cq)2rko>mt zr~ppT|I;}VvPXfj@CtI5?vH4Vq_ZrYYo$EtoQgXutoLbN$~D$yvyRP4Ev~i37A93E znVpNId~Md5`i}FE9bB#}fP>!xZel%v~C#cRP*PheSX&a*nXC(6F<1B(R5PU}L?`Z98 zb3n^i0Zl1<2Ix6(X8_++oJeqI0N-SsNusng(;K>SFtRYZDzY)IFt#ejV^mE-K4USa za*&H2BPtttjKX*tj~qr|G(pE#Np+Eff7A~)>neTs`JyX{1?kmobYDx|5!6yyK}KnaKdL;^@IkX#I&jifO_ccIX? z@U9h7ydv7O2fLd*XwImvX(nF{_PkpT`L13)mLJ)!;XSPaWhD2Gc13&EBJL7>f-^M` z*P9uPnHY+B<3@kPT!fg=dpcu7xq4Ry<3@zyzInqBYc;7Y@9^18IB^HnPA_kj>tkED zxu!$*McB5)$TXr~(x@_ijRSqLrrUKfO8fY$*3 z1!xDPI|N}JICy`LHBcA2(f!D^2Dp2ARt0b?fIID40o=kKob$NOSQ{$dbln47anI5K z?k?a;nfE_)-OaVW%Tl&8%g`RWdv0?qv^4EZ!OcjPq0NESVoQmo$(CgZznwN)+HFm^ zoo+&$M%;sF>P(jQ+MDC#S<=JeV8yUwCjThTR7+WHUp|=Q_KB9Vnw#^1#V(>Ut87az^t(Aq&^W-Jzw1zQjC7^WcAYT$s6fhMwSNEzu;S|T9;qf? zTm^jpwjeYXH(@PK?dmG`S?O->hq|=Pqs33*M7-Po?S-d`4}%&JqPjpmRQwpIoBii5 z94vkW+OdE6gK5vyJ<47f9=B;D7 zvYq*5XK86?|1U4tI8PggUb>*v+03@$O{hUbZ=SB!TwA;z{`y{-uEtzbY=wU(&R7C+ zK3KP%^O5pwK*|l~jm4z%S>G$yRhqXHFN1##Qm!+vFJ21&a!wiHv~pdnTq50;WFxor zb*nhHm8|QVD=a9$uG}s6Y z^dtm&$mr>^Pl7GbKu=_-7yoHbgdTXLn1wmm557^bHYu&3d(+W4r8ibY!>1QVL3WJd zJV|4&Kn{=gI$g9b%)x*reGkcoMex%au?#NBh;q1A0O?UH;F8W1>Jo7x_Gb+U(?0DW z+^KM%hD$nB(iu%h_yvR?fcp!$v~PGFF6o=ZnEr= ztU5HNtdORDETzidT@^(oL$B?A%x@c;QISoV1@H-6D2@*bQR5RYX8SO1i~(N!vvCFwh}Kw#K{sopIfSL9Po(-#T_hR!OO!-vARfkZgf40jG_o~0ZwFmA${WD#=;a>6^ zT)W_2^iOf^g!_#@$7O^2SO0idE!=khM%0ru@#~qxLva&CT1(Nj4b)Hl8Lq8xKlZC# zTi|}^Pjywoeczwxs(|~RU**~i_Z|PeoceA~dl&nKmbJ_&qvt~1LgoeTLA#+ipT%{b@qXu!!CCmm@t;GEMycL6v_ z+v&zfiJX5Ox~q5s{r5cJ6~Hv~V;;bS{8#vMn2&d1oDAz;*HUal&FRT%)o48M=c{hT$>%sH& z;OtuPdM*0kerRCsv+T-j+$QNNSB3Nua?g^0KBC#04Bn=Iw`Jh%W4ZRBqLux-p7a&r>L346&Za1nrKdhV(o|7%`*?85`0cU_Rdn zp1@1cs(EPDaI{M2(=zu)x_Ue7{li=%(Xz`ov^u;1Jm$T79NN+r4y zEGeL=Tp6H!ftv}siPf-;M+{ShmMF;bAItWjbQfA^?F^1ZvE<+1Shx-VG zV)<;Fa+b~?8dD^G(@YV8v#kQDM6{6VLFY|c=U?D>F9c4y&vNLQz)ANQho0sAv_;wpwX(JPg`HwCV!afK@l8u+8xxc0Sm{)(~zl zPF94g!yd?vlNI51TiO}76T2ZBPFRGi!Rd%%Yex;M2lJkt}vJ+omCu$#}AP)iHh|bg(%H4P|^b ze8U(&4mw%d9}Q=`9=;Kbhh}u!2!uv5p6r-MF+LNzYO)O+&3Lj6)H6PVb=QZx#xOn& z__2(~X}79BLgN^p0^fMX<0My=fKV3WX_uSLcv!w{Cp)$YjE{mZhw)12h!qG;1fF(L z!LiupcpKPB9Oq5wkID9RGN*kVzA21<4f^C?BQ%xqzl3iZ<9`nQ^3M>;WjtB685n;Y z`ew3do6h*>;G4ntCg`6V5xRr%Ps2Bp@lQe@%{Fa}KLmUp;~$5N62-?5&Swf)v=uPr z04Q21!cH+Kf-gFvKqb;rmO^IgjkO7Jf_?W-+ZQ&fihAoMR);I z?t*V2Qx=0VN?eHWBBsoTZ!uHmf-+jX6X7LHF~fHkQ;I;*i)8tFH&Y7XTgsF?P{u$* zak#6LDKxsvn1a1O^zt;mmobIL_dQIZ-Tyd|M)C|}amRVMYc*2_!MBDfbPF&6y8pvn_c3JveD^bjZaQ;BvVFBO zh0btmnbHrGiJ}VObxfi0y`CvipiB}Y5Z=HP8sQt6LZ<|hwf}(_lSLZin>fas@NMQ8 zZ-6pIJb`cpQ(l9wk}1CgWvcip!dsX^V|*)9UIt~F_#(pFm_nnxiYd>6k}E!g@OGvg zgKq~@j)GzkpG3HtDTm>!Vah>Jri+gwT+5V4;IlF1Ay8(B4G8aK%7gIjV#;1n?hwgt zb2n4=z_*7fyFi&K+7Pxgr3St_rfdhrD3aY~JyW*8x0fjupyY|05PpCu8{pf=l(nGb zi)7*bAXCU%Yd=%SVyi%0fp7y;mcw^|Da$}96w45Ph$(l&_b^kIfHF%Y`|d}WvH-qE znNk9ZNt}!DV@$EY_c&9EL76SiM))98X2JIaQ}RJ667vu~#1wjqa+oR8K`9pLCCU+| zOoi`BrqErN88=*qyPjeSN${gg84rpDw_At1o@NTk@MBCF3CbLC1j3C>846z$Q!+uh z6Zcz(yPjdnVECS8N;)WWMGeBwF@@~ApJxi)b(M%I2*1FTB>0XqB_5P{Vn2jmWJ)Z2 zFEJ$=l=)&L!Y?yL3EwMBAzS1HqRb_Y@xxs|WBN(Zf6jCV=nKU+5dH;IegogDO!+k^ zi$s#*zhufU;QJL*UIAsX_%g!3X3BB+USrDhpezx|GWj=5p*IXCnDR6zcZo+4ew`^K z$KPPeAyDoX4D%Y-)9QR@&97Vy`Yqf^n&5HOd&b`0aNY*Wrer|;SZUz5WfFr%6w2(iX{mDjwyG- z_YqUfpsW&$5&oDdCis5OltNHei}?uufhi=%KVixYP}Yc~$N7{gB**{AlqsOxhaLXm zu0Js)2fqKs6x!$Ck2B)ou2!ay9CtEhG$>Zw;2!S!j48w6JHr$mC~HO1<9yB(lH*@6 zWe_OqaEE)i>(5LfIsPS6U^CyfUhI$XS*DO2KgX0rP&SD12)8kXu>H~oKhrsvTsD|Qq8Hj-&J^8eTljh zb4qbM{D1I8>XOaL#dN>_p)W?4WKJrMhW|f(Njka@j)4CiUjm=Z=yph2Gw7a|?)K;o zxdLYhy6@cym+pQafZKz0E9{1sHj`?o5C-*i^v7PiElvr26W zd%r2z-@+{z?4(K8V1rG0s`<>a^hk}#XH6+!jH(@Pv4B&C;bPkzv4oTN;o2RMzy!lS zScIg8UWsPRhaQ1#d#cN)p(NXiVJ_R+CLtGhEVXM72}vfpUr(-1ilmTiLbX+nP_i7Y z(%YEM{7Ipr(2FwbaC zrQoF(f`y40&IS*zgz($lB(!8eQXRxvakp6z@tuc)heI_pl&?1pHf0sRWA%4Fcf(+%w~GSa z78NoMe^h$U-Rd?n$7m}2*W8ho21TEd(cX1NzseJ*@5s6Dz} zciQ%;hU z@YPDRy8<~$`OXXFB;{Nb%1O%EcvDV6*&)#;1agw{)rWGDa@K`%l5$QD%PBZ7_jDHj zM4pf|`5&)g3*^GOf?-D_JXGuT$z)(QH*eig(%5la7zpK$MDUimvWLHj+( zgs?K<(~;$C%YRvZsT^c%dWd@RzCt*mm2TK9qPetuFn$}$2U+H2YPP0Zj8`sBXsb)JXv~c( zV5x0xTS0FKNXwRr+f34_B_mw=K$2x~X5$0U-J2U%##@rjZ7WqAFH4N&c-h#s&&@1- zFberLJ{Vz%GdHeMT4K#@tHNzXR^N&H9Z_B=2qXUskoV5u#l|7~EJi{2I1jCEk?uzQ zov-+R0SlmHPp9wa79H*fUcql^#mgwEvEoH&>)R@hlRy}8#mf2QCH=&aC zeG|0aPvff^ZH}j*>wc17U_J#6_hCyraEGDShQ9m&YtAblgGK7&&|p7?)-+Z=f|o08 z_|;TD1kLmTgi5#U$8Y172Z^%f0sLyV?j`)zI>K+Y6MpL+yk(H#ErXKZG6diM`RaTJ zq?e%Ep+oke#BI4v-GR3dw@-r`Cr)!ebf>s=vaNxhcr}$=wTeovT4`xN z&{x8}(Ed^hup!%CMzOXprC8hV#%*5P_9b+~v4h^gE<$cgaL2d+n%70R|Ct9(E4~m? zOj|( zj`u)v>>-EKF&gnE+I6|;5Xi(-1Gau^GCT1cGE5e3|9Ig2favzNFVB{Wm z+uYL;J2I4eGUDUTzaffqPe3RYEh*%d;5~vJR)lB?X3 zdjjprPCSS(-f^ORkD3pmj7JbYfN(_40i;d1DeXSc9>Dz?X+Z0F4o(v7>`oT z)e5A6{ZOEe$xBxHM_ICY3JCE_NYUi^1 zOYIzv|0^x-Zb1LFw#Z_K8V338~7k0u6+9&bl8C}m|v#%zl;t2Y^&2bQN_7G+Zz2`m1 zRzf8A!r#%;O-)`lEXY7jg2slv{XshHyzB>V^HmGFr^(CS^>4mvu@y3%bl7>>TLa(z zkfiNKNchc+-x&HPh!r=N>lkM>OW&)J;;w}3U(NWH0eqX|9^77%4m(dT<->*wPp@-E!GhPQVi-@sBU=i&Y}XgPPzaVKtJfBM}3+~#jJ zg}xgA`;V;!ylUZV0b9v3WGe0^VPA@}CSxUmok%s^K9YQGbHMIn8@;7$+cqA*nksrl zSz1MJai*B3;L8~P&bPbiEly7HB=p-*pE`3WEc5z%hTw%xd}TKJ_-GfMR7vX{J$gJW z1=Obgo)VwJWZ+Yw%7r(Jfj287fAVI9b}pCOVZVzvIHh=lQ;Ih@jd+98h&MQG+W^&g z-+?zcni^Q_;tftI-rzJ=0c!A;pWk~;ge)aFiWkiMZH(tIj>%4ozDE-LrU2RD()S1G z+XD3c0sg)~yrh#WkA+Gmhg3)$mm6! z0{l4T_0_0Nk_{Q@`zTNQ$;Yt6g9VYbd1dpum#$wZu&ul^z@h)d3ns%#oTXN&T(GFN z+Sb$Sve{;G`E}WPyjxgRyPnTd?fKx45gY9u4KU@cyu=m$l0(emvioD&(s;V;iX}PAJ zRE^Qus_0T?^|QS|{x%4}rH>H>}O8n%6ULS7CuL1iZ6Ee8rP~12bHH0bwHdqxRHJ9A05y0ORRyTQtEehK4PHgj%e~bx zu9;>7a+P>n)nh=;hSj;8b4NQYysW;J;P7_T1<(wx`L_F*Ylae-zugva-<%!fQ z=##FnKKU5y#rwQwkly+wOPTd0ShowFiU{0*8;)KL@wy?6Vv?RNn+wJWIcV z=S1BxxT>>Hb7<7wqwMz7KgDiR-P7MZ$-cSuN7&t3f0*6Qx`)4cf_>}iABU?tOTU6= zRsCb^F0X%--Lm=}-#pB|CG`)nyP*C6yL0Q;ebd0c;`#^Sif8w6D8GI$T-90n6+DLe zdUmJO*Rh*ZU-Hc!_KmCG&F<*>UF;68&;Mp8`?U47a8+k(IHaksW_LjS4tA64$9=P% zef{dI*o~>*#%@Ht_M0v26Y4AA7M-PEybZ701Xnz}kwaJN*27hurC-5wscs#+7wgut z`%Rty>-*XFm%97dZL3?u?w{+fe7%}|&bpOwRcBXl=nr+}?EbE9IlI5D`^(q&vhQ@= zJ?y?)w~XDBbz2S(on6eK7wZKeYD zg&m-#0#@K`V{fmI^u%@V{Q6_O<-R({uf94RFcE+~_SLa~@qjS^?0c@}0I=u2Iu$S( zFa>x^X?HZS_D_0WL$<0o1wZfNbT@d9Dt1;WH^0!+W zAAr@EEnU9Tdu=MJ`z)mou7>s5 zNJFsJE0Ak^?Q*oOuhwL9kd2c^dZ5<$F3c^tf)ntA^U$`w+~y*;gjy4NK>_`w=)I$_(r^v#8-i^ zC)c`gV~5+1c88!>IqCe1QyFaUyfv~3ql=+SuN{Z8RGbT6k?Eu4>XmAbeVsKhE5_GLgn9eb0=}By=8Gz&x7IJPMv4 zZ+=^1v1sax(F>Z$*)+P8n!;Jk{glE2=0ClRl=~D{H74wwR#f9FqtXmW(B}qjI^u08p?M3QLao&FYpSyw1VyjU)jLB zQuKR(&J`kB6Napkgd-A9*)*A7H~%W7dOin)+t{_GYpp8p{cr|OSt`yr;hHWn|Q zVV}1(n&0Qq*pGzOr1ZWw#e8rh;H0EJjEZuBMDNhGeHuz{?{#7Uy z+LwzlnTvNoQ!P!_X>h0TY54gcrq*5q|2i&Xk9dB9g}x4=DbHrw^~>)we$aW?G(ayf zhOzfw9#Q+(AN1??U;bGw-qiuW1DKKEzfg-;b@&ZvI7Sb(XvzoUn}CFS z^y!>FBa~jl>D4!-AAt1IOOhlf#(-6l0{3%Y3$;mMm{?BT*C#Z8-U7S_5bT-IkFJX0HR@0elLuzvaXp%`iw^ZZM_cl=e|qMs~LAOZ?KEr(sY!-)w3kC5$X* z+MpQRK*KgzsVR_f@;;nAg>YKBeWQ4EkDgMH2A#J`LHL5M%tT5fgSI*&n|uklxlTlx z>g>BvraHTEFvVSny={qmYd&F)1u$A*t`?LUZ^kvnN|}!WFi+$;9Kk6DI#e;986c4_kQat#?Z0dv5>>BW6Og8G7EV);8)KbE1 zT}3`In`$}+EgPAg#+0+*{m^WMk=k%?@t4SBK28R7Q$V#(Oamce5yayjau|&SC;lmltHn^ zAT$x!EVxtQPJ}xh?o_ymh^69K(-BH#o~E*IroN7Os=-aibhMJVs=???w<>dTP03c} zgd|X=YGVr}Y&2t|89OnARWVk@*sKsXk+F%49TUQ)GB%a5BSTm<+w{n_SC z3eQZ%N3f(iwdqUzex~tlI)>4@4gLMOi2ECSHw_{5^XC``c3nyZ`KI8TW8{`*P|T;* z!ih|B{sh(xtFTbBWQ5WBgGqZ2iQP^eghs7S_RD6yGE(^HVBwTDW^cKFAM{%y) z5BoiiC$KI9I1#uLjMK!QT61b+zFV1jYK<=5x8`Wq-JreBGV| z_ru1I@&SHiky{Bnq0~{!y$!%SvW~(6Y(Fghz#H7(Z42DrJ$qw2`1a!#%?z~YYWK~t zAH?n5HpNufL=lJn)*Wc?3bbQ|VRu+-fw8SH>b`d7uF2(g z=AxZ8v~ymlof_4t)u%Rq2l=N~>r}qgM`0@-Y^x?V7n%alR_3nO#o9nKf_A(14!c34 z#g#Q1t#)OxZ3@PVE(+y8hpzM&Odxh30>1gzWi4QGS(X?1V~C#!)}PivQS z3+cmG%KmZQU^V7I3yFPF@cS#zz#h*2R?t=>g|x|dsVZ-6#;?pN=mxmZKUMKA-!3m! zElss=*Sow{HRj7&1zi;I*yUDvcll}>^Z#*1rc;~9+Cuv80rZAb$c)g+ixTi11<78I zzDG)USpYvf9M3jVq|rv1Tk*1#_C0KW)ZLnZeb2)C;<2kL!*|nViiOw%#WG#a`y%X- zHv6_ln(>YYbUElZTOSGU%TaEh&7Xj8jtF8u&l5e^nc+6GpC`8mFPq>t^dJ|;WTS4< zmpFu$W#IYe%b@!V@!l{9oGfp&Q<_aZFPmTCGy{83_qqs|U-Wk#_4^KhJGf^o(f{il z*`yII!Sy8O33d{mfzaODw%Tm?wg))vs{=O!@s0oL-EuhJea?5l_%AMHxz&;wLLg z19CYO%0<>{vpwhXqoqP+A}ISp6v6Yj-DW%JB7PY?2kg|=Z*d}mX0($0F815l-^TuC z_J7WPU!}kEgID4y*OPuv+g4t94DN)>f`{Wv>CJQ6pO?#o_EjR_h8^ z4Bzfc+&tJDNoOTU&!C<>IA&Y1Cl&DK+J5p8tf1B9esDbob^8*x2>bCq=_r8aJh_Um zqdGDavP?;1jQ?$hZyv~6WxCD_lqwdf-n&Jr?=H}eD46P7d<&3L$#q{{FzjiHf!&)` zQvqM1WcftlQiREFll+YpwR>#Vwu)2u)l_=%TUtpg9rO*dM$p^rHfwuBqvI%cTatz& zr9i?HhI9**i)PDF>~Y(c_S#2XdJOX4_bzlfit zr6O9eC&+5yD755KPm$#Ug~I!aY#0a^-dkkPK)CS!q8DA9mU%C=fZlQuE;zR61=mr$ z*(-}CF4C(ln^pQApUp~d!IaSLP;Zf~b6@Wc6E%gwP@59taW!nKuL)ZkSLfO&mocI( zpufWC+y{O<+URH|&44s6_xWt;u(3uCtI(J0b9W}=WETw8?o5{Vg--31{NA0E??f?o z7rB!}+b$`GM&!`6{?slh2Px#;CFLN6a(7b>HSGo?ous$xkt9Ma9V)o1Ia zy~5B4m(C>1dB*Y9b?@eXo}pib)8850Bhw9W2}9#tnc&E?YLdaRNZ0PrS4i<~4KL+; z&Jw=YN54Lw4PPKow)#8W9KH&RElH-4RhRVL?`h@qGKcz4-fFX!$!+CAW{ouo@@WI4 z57kMMTm4|2Pix6ktG}}m`aSF`AjedQcXv1K5Q6(4l9AyytMo!h${jl^xevK_Ta%G$ z2IXGm+a={b4DIUgS|vY)y%E+5ltUU9vJS@nqBU5OuG`n{G5dl&CG5F!hIpRG@$Wz_n(v>!QZ)=>rss_ z6ykqkfk&?gcqEN|g=t#3WT#Kxif<3vLEdF030 zgZyUrCEqM>Gw#*V|0u0_tJL!bs&}yGZO}w-ZMFq_-rp&5?M8X~X3wqam4ebsFtXFrpRIlr>hYr^3pMjapBl1V}3ad@vrA0ueNiP}d(EkVMJps-y zHhRU-jD2=<-Khh%2Iw`<+@37NOtzv~9^`XuVpF(X)@oezQp~n-Uk*Kz&c!oo-AmPiwe;afK zhE;Q1hV^vrO2=tf+NX`fw+3zNF$P!B`jS$JJ)4NV726z4LTs`<2&T!>4{{Pl$|1`T zqwjyVFFa0v(b><{mlw1`>z8IsTZJzk@(C{mxyI|`z6$0h;Qzn`{p0jsBjTo| zd^gRv!nU4ls%Z~NE%bF$3p3C{5uuaN8c6tm0#BA0QY+=5dMov*$dRNezIUa++Is8y zHHYe_r*E#%|jOdFiv}B3*D?1YZJqt<4w{9*hZTl?kTDu1H^k zRg1o}V}XnRV1XQH6!{pJ&`K_8QkJ0%LGN)=I8*-*#*ff{*GlEz37X76^=(FaNN7WI z`6=lA8}k#+H3!m952U9sr6-rtQ@k@8S&qikZKb@fb_Fq^_Cv}C)<(4ZXQ6TItAMqM z&}^M!wrf*7N4gLKKf92};O>vQjtF1kB`=*N$=bONHV}!-`OYr6i72GOJd&k^j^zmJ z-i~CEkNBW$m3+BqZ4f8ra&K7dTcu16q$GZQh}A&Q|09q?rv74pHbVb3v=txWWpX@n zI|w};{37qrpyN4`wG`naiRslT6~5}y!4#u0UwuAUkCZ?znfmxpelY>xm{84k>76L| zU{;WW)!1?18$CL;>1p0a2`%687@}`rlT3iF#h$Ar&MoMwUSY#qwbWMWjSGFVIu1CR?!LSx%3U@Kmcb_GlhG9?|{zG|`XCCa~)uw>XA~0Sd%kA{t zK)m9@ntTy^6THwwI03gd_&SO;p1*9^6hos=hcgTPS2|xg&hb{YpqwhS^f-O^|4cr+ zuR+jX3*8(kah{|*#o*g9y6Kdm1k4B8d$~vx)b|1|xI##=Vw}C5_XNKFMmi=rVoNE4 z^MrUrFNX}}(n=)Lr#lT+8UBCAyBM$j&K|GCF-o0))cst!R*5pm*GG}^#mdX8s2zL9 z|EGKl!&2Xz?};$VPxF=ZO1W5<%u<@Lj!Pfc{?4#kg=IxuMa4ke&EQ_mR|IX#~)|N*W)s z%$VX>*b=&Ew}ko$_(Ga2Q;GMqa?hU`7u0llFh)0&P&%@$t1ge~h*s2KOyL_}&^hhL z7e-$czHtj}nNG%W)h5aMjBE#` z(Gi>zvDn!SM!o)kdTC7bRnc_Vo6zc`2KJsC^yQ!7E^os?%e&T8VAf-AsWIXI4dI(` zQoMLzi*L}Ef0A8s@E4%wWG^oLk0Ht_64p2?AbT~Y;FoSGUJS4|dSVbS+C??!#3@LF zFAr%d{!JZl*Ges+|69-xma}oNA|yXrQyC3gLh?t!N;U!(h2&S#mzl%9{~7#7s&t<` z5q7ISJ8T&^ZZ`58AIJ}1F|8aE$WM>_Mg{W2f5NErHH-|%2>SnjR0=FgxA^cMKIy-o z9EyPzK&ABmPe@7(=D1}s!MJKz`R01Q-WJW8y%oYX(Voq;C3~IIDl^m-IiN}e#EVT|3hxY z{~K<>M&TxIk=^c3c*T1f+GCUCPIviir)+zR>A!jcc!9Im| z--IV=Fa4J2UFU-NP+o(P*F2=FC>}YXFTahP-+bWL1@KOX^|m>l|4EK7AZ1zcys#XX za*oG=UmUA#Ppz&A$=EAHwf`0msuhwRts>pXL{_#zst(_`T;(UN8>3g29S z-XD^ZZeN=5&bv=0(ztmU^DOvof#%#b-pjmpUA_yJ4tVj0JhswpXR_z-J_Cieq?ukr zj`!eRZGTtf1p1Ad@HS+BBXW(6VHCl7sxR2~$n=%aR?j1<8&l9LLS{-wcEC z=1mBXIsc}ZPhswb$9>_ZxW{jb`!M7{cwEm-aXW5`YsXuIVBB41>A&Zip(Tu*P#c)- z0#0ER-X4%H0{){Ig|`G=DG2%rSoI<&Y(jkLzsOQ(9b)%|?nhiHw1!>=RIH|#0TnB0 zm8@8S-!}YDV!ZpX-(wj89csR|3^@9t>r!@&T6`C=cl-s)SC&H@1}E7U^&?-2e$T%O z(MR|ySGFdS+=6VfG$CJMHY}kEa!rRY4pRy~>Jlb=35bH-6#hd{t�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%0ASSl4C^INpVQCG(jV*S0km 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 hmX*!|^-L{{v3u=t}?q literal 0 HcmV?d00001 diff --git a/src/main/resources/vm/java/controller.java.vm b/src/main/resources/vm/java/controller.java.vm new file mode 100644 index 0000000..15bc263 --- /dev/null +++ b/src/main/resources/vm/java/controller.java.vm @@ -0,0 +1,115 @@ +package ${packageName}.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.evobms.framework.aspectj.lang.annotation.Log; +import com.evobms.framework.aspectj.lang.enums.BusinessType; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.evobms.framework.web.controller.BaseController; +import com.evobms.framework.web.domain.AjaxResult; +import com.evobms.common.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import com.evobms.framework.web.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController +{ + @Autowired + private I${ClassName}Service ${className}Service; + + /** + * 查询${functionName}列表 + */ + @PreAuthorize("@ss.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 success(list); + } +#end + + /** + * 导出${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + util.exportExcel(response, list, "${functionName}数据"); + } + + /** + * 获取${functionName}详细信息 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + { + return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + + /** + * 新增${functionName} + */ + @PreAuthorize("@ss.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("@ss.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("@ss.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}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); + } +} diff --git a/src/main/resources/vm/java/domain.java.vm b/src/main/resources/vm/java/domain.java.vm new file mode 100644 index 0000000..42e3659 --- /dev/null +++ b/src/main/resources/vm/java/domain.java.vm @@ -0,0 +1,105 @@ +package ${packageName}.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.framework.aspectj.lang.annotation.Excel; +#if($table.crud || $table.sub) +import com.evobms.framework.web.domain.BaseEntity; +#elseif($table.tree) +import com.evobms.framework.web.domain.TreeEntity; +#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/src/main/resources/vm/java/mapper.java.vm b/src/main/resources/vm/java/mapper.java.vm new file mode 100644 index 0000000..7e7d7c2 --- /dev/null +++ b/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}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${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}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 批量删除${subTable.functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @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}主键删除${subTable.functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/src/main/resources/vm/java/service.java.vm b/src/main/resources/vm/java/service.java.vm new file mode 100644 index 0000000..264882b --- /dev/null +++ b/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}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${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}主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); +} diff --git a/src/main/resources/vm/java/serviceImpl.java.vm b/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..52f702b --- /dev/null +++ b/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,169 @@ +package ${packageName}.service.impl; + +import java.util.List; +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +import com.evobms.common.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.evobms.common.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}主键 + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${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}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); + } + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } +#if($table.sub) + + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public void insert${subClassName}(${ClassName} ${className}) + { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${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/src/main/resources/vm/java/sub-domain.java.vm b/src/main/resources/vm/java/sub-domain.java.vm new file mode 100644 index 0000000..cd39b1e --- /dev/null +++ b/src/main/resources/vm/java/sub-domain.java.vm @@ -0,0 +1,76 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.evobms.framework.aspectj.lang.annotation.Excel; +import com.evobms.framework.web.domain.BaseEntity; + +/** + * ${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/src/main/resources/vm/js/api.js.vm b/src/main/resources/vm/js/api.js.vm new file mode 100644 index 0000000..9295524 --- /dev/null +++ b/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/src/main/resources/vm/sql/sql.vm b/src/main/resources/vm/sql/sql.vm new file mode 100644 index 0000000..0575583 --- /dev/null +++ b/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', sysdate(), '', null, '${functionName}菜单'); + +-- 按钮父菜单ID +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', sysdate(), '', null, ''); + +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', sysdate(), '', null, ''); + +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', sysdate(), '', null, ''); + +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', sysdate(), '', null, ''); + +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', sysdate(), '', null, ''); \ No newline at end of file diff --git a/src/main/resources/vm/vue/index-tree.vue.vm b/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..4e35fc9 --- /dev/null +++ b/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,505 @@ + + + diff --git a/src/main/resources/vm/vue/index.vue.vm b/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..04ebe16 --- /dev/null +++ b/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,602 @@ + + + diff --git a/src/main/resources/vm/vue/v3/index-tree.vue.vm b/src/main/resources/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 0000000..765a5e3 --- /dev/null +++ b/src/main/resources/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,474 @@ + + + diff --git a/src/main/resources/vm/vue/v3/index.vue.vm b/src/main/resources/vm/vue/v3/index.vue.vm new file mode 100644 index 0000000..936b465 --- /dev/null +++ b/src/main/resources/vm/vue/v3/index.vue.vm @@ -0,0 +1,590 @@ + + + diff --git a/src/main/resources/vm/xml/mapper.xml.vm b/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..456755b --- /dev/null +++ b/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,140 @@ + + + + + +#foreach ($column in $columns) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} + + + + + +#if($table.sub) + + +#end + + + 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($foreach.count != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end) + + +#end + \ No newline at end of file diff --git a/羿动新能源-BBOX接口规范 v1.1.pdf b/羿动新能源-BBOX接口规范 v1.1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..12e97269cbc5c0588e3f82b218b068541a528017 GIT binary patch literal 1858997 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 z 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%0D>3XyVY>v&o5MG+#zuNyQxe=Sropc4gMa} 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𝔤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

DQ}9lxaEpr*>&fyQe9wgFvi+3U-Q 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≠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%0A2X-|3P61|)Z5 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 z zsH>0A<8RoZMm{2qBi2IwaWOz}gj)HCHjYH`T`-H}kEg*iias$jiTbO@v<~5Qn^)oA zeUQ|VA7%6r&KkbwcdWrBLixa}qdw~B!=BxIPv~ezDSiDcSc!j|`N{&Imcpl`MxN@o zV#kw&FL>1ngGug?mV;S zhS7zp2oUlWfiSybwcw)$&vl?ba;BiHdcq#Bm=FhSEmk>WDo11V#{q;pz^CVBfx3MkEPbTK{%tr*8Y_9RJHsx2VrQE|ZUK zF3`i)IwEg9D*uOdubNBkJ#n7p55WZ6wz-7X@!gU3U>t3x1t9Ik2~lBMX7SR0O_h z++PrR-5m^N9e~y)b4Cir6GU$4kXTo}{jdy2;ve1Z_vak{%T71BJI3EH(~UpD)4KQz zoVDS)_+P~YIxW9h>FHGjA|lc_3Pc6Z4-3yI$}5|ICvelC|N6xbdDi)t~J@XGBjSf2&~!&H57fT_ga< z1QKZcMGV%gHJu|l5?8hDU&GM0{XSg(z>Oc}`wha)O)UF;t~>M$jvHb14Rv?gIwm)k ztUp)x{uwqm^k_iMx+ORKXyCq_s|N zOXrDc?H}FQXV4i*zub?w(%Ug!88F>> z>gqtsRy5UI^)8B-vfBQ9y?9a>htl|pYM4+>cyuyHN7}NsAjtYELD*f{K&Upp zZ0ldRkw$|Y*0s6ORuOl*VQopZVQ{*a)-hc9v=L9g53Q%$^0Xk8e|PClI3orlt|F;* zKde95qG%(Ld_UC3-pPWJG5th0Gcy1tINrYC$}~ zuNVWu*T1?FXuq}zmWB}7;@`0$Xn@`GI|0Ps_MPV&>mamlhBI_9mLOt7XW#l}<@%q_68JCaFPCV4uLhVU z`rG~a4jdCr@Ru+O22R%^T<3P=B!3O_-+h1P9SB;54>(OI(p75xQW!2j>n0R0dcpxdmALs?_~MU1j~lK*(*>*Ws}e+~2B zHiOP%`thCSco3>%HoTX*C;9(j2@vT|XZf`Eujn+Qng8f^z{vbdPUTmISgs0MBaDGA z>Jd3iaZPQ8-$@6bQ|J&)4m2T>S9S0iNsWOQL9{Ukttks5(fnuXS0vod2^eEvlrIm2 zYQg+${1@}SCex4F*YnAfjez5(+r{q`Ev(kww>%EY#;z9*#cQL(qseOx=21h-_e|+? z8c`&-GS-_WgbQDjV@p?5TB`5JQzq=&`!EG+TJO$=O&cBdCr06k1$v%%=TKErNe;Yc z=FS<~o3FDjcuDSCpnZZo$JE0i4CQ7lIlXlZ;On#d@CQ+9>y{Q>E zoo0qmq-IW2R9Ht_q-KFv)G)3orNb#vG-pwkx0*%7c;&o^t|+9)r+GkB8>M)f=M;O- zvdE$+q{^py&}Y{7xwXc*eR|H+BCkzVi|z`(_Ro$8sVQ8w-MfXAXOdWz|J>*~_v#HF zi*e7~YYZbkCTP_>=+4c}7o>9cpQaWol=9MaY@5ar#gX(fxHKzzA-hK^5>lcPpbc`1 z&q=6bA}RT~y*b!N<9>HL_)&pwPOV(+au6k<{l`69LVN7}wV{QWO#NpmJxU?D9W0Lg zye+Hz+Dr7XR6$m+l$=8NJa|bjefO+s_w=UI#OC^MjL_0F=iUdDx1n8JQ)#*9TDdKON39{FGA&s->opPfm55Cj8~YOm3EA&eJ)}H zMHWLgN)}r-R2E@POrzSWx~wJK`E#S(d4FE1)WG$?brH5V-;bHd<>zI zjM8%@1tlUSCFlfG5yPfU!bJSUm%8}6FK+Q}UrrOaUnWGxM}BEyv`|#yP~;%ykmn#= zPHLC;_BwG~6_rhc4EiNpJUx_OX4X&8r}uxw;wG4;Xc;Os{#;j9{ttsifsC)LG8x0> zZzg^Q{>L;5Vy_o77TFf#7wHziFS0HsFEaUyTs0qoHwe44nL!->LM(0!R|+TOt964` zp$iEMp(BjhgkstLhL;~suva4oNkcgqjQ|HS2hTg>{Uv8p?TI>*{S_~zPViQTH5Mk?CLr z4K`_bgiPw4digDAG$r^RA0nwW0um<|PG|gL*Q?GvD-Kw*GX~(>2*V|V-9E^OpRET$ z3F)nvQ`N4aD(6kWGSBA4Ps>&KwrCZ~|F6WMbQYfro+xbt0Y@{L2;LP z$}uPx6;J7545Cp8qb$isNM_ zspKTyJ@N)I2A=1ag#-HyMQzXzEslBlm0uQ>w;s&zF|%+Q@bApmK-2Rosl;TjoEN7O zn2Vnjya%6MsoXX~Ye)^eee^aHhd2(FGe#Wo-0BHA+GV`nT?f+z;n6& zYQrD(szRaXmabK1-M$}eDkz6awXE&pS(EB>Gd%_^9Fq7_&c)>esio;$*$OBN-SPE8 zJ36CX^=HR7zc)gU;Y-pQrJZHc`Rc%Mpuq$+tvNfdHj#=YKe;4 zWnM9-2(VSw+taYrYzQFC*0f}x&ozN>NHZ&9}3GIV2*5>M$o>{TK&I%~5yYZ4vxDC%s893(F zA$GS6RIv0&E4R398^KT5mW4h|PEIP()y#@2f6ZI#ISKu)!)a$0QXb;4QQpX%J3naa zo?re3VZpxh3TR!_ZF>b;#lLNWsHqDox2Rr$xz)*;*hTFzb-JrfHI}!L`i0LvJz@<> zqydH`4JFY+iBEJ|T<2)TG%UjtaClx0l^d zzpUAGgQlcxL-|w04Q^Dg7B*=#UK2}eo>io(9eek=5m)g>@|M|5cj{bN27Je}<*S`b zw8TxXux;dwQ>s@ylgY>?iziFqBGdznFnBT}HGZ+$u`Xz3>C9ERYHspf1(bTZ7N?$O zZOoKN?5<6osB@f4pc38TXU%6k8iS=a8j)qN-JK~KzQb`edh6r&5!=r4tJbab@8VPF zzAfQ&P-@Ar`^d9F7&J8vkw&1)py%%Jrnql_L`|2?zNR#E!Bj62!TwTj-?65ONmEU2 zqO;IXG5h;_UV6L2Nw#twjrD2!vN^*E?YcHgqap2~@5u-~Pp7$}&75Rdn$* z#~}yyrY3v)mbT5#d2I(phwJ%+h5%cfshILi)wWM;0~Je}Z5@p@o?eK~R&4`CgX`7< zkAU4rQ_Q&foHqKAm`j!3CY|}&7edV2eTkrH|d9=vn zQ_nyc3mz_oCT}y|!plbfw|x7Kvok`|t%V-f(@T06HloGn1Ji1{oc0~14GX?{dx#1O zy+cb9qT9ica>oj!Y}>PCKjDW)I?TV&*|s%jw=)tsfm^215S(V2E|103*;$AS z8%!TXS|ACM1V!Jc<-$}+SceidphA5bd@KuzMTrP#q+DLD+FXS{nIYB9L?acZN8}BR zq6h8&211GJc1dMOO}ypMhnDk3C)IU}FvFBXuhLBe&(FBR`;7v)VMfGm>ntW&BwI%d zd|~~d89^BRf5qvZ`TSjBiE zfLmUb&)hE2hmB88+qn)|w=R6cTg<;enksg_-W1O&ad8XNm`=J(_cxf}L(Z3vN-n|< z-JE9c+(p*65}ft@xnINNd(if&aJDVwGJ-7S?68?YltLZguzc!WkV%7#M=KtYtb4EhmBeC?tjFld!~mtT<90dn%~uU#E)( zn{xO;Qh^boWxRWYTWhcxfHJAuW~r$X3H(bkYm6}a((|pg=Bd(`ku9yw-PXUgNZkqr z4jM>4Mz%1KY^|Y3bqzIO4O1o@!z11BEasV5wk^%f9<<~eej+W_igUE7quM?*qFN!< zi^Of=Xq(cIl2*5Et$ixSnqq6Mw33S45Tt(D5yM*9tb1Ke6N8^!_fax68@LsN8`+{Z z3+n#@KTJKktQm^DYVPV=Y%xf^c$?NVf1I8U(?j%jC@w6~-Ce`a@PY@7!X}jhnP7dq8o~v?yS6i2EmI?b;hwg^Zn>tH4W`Fbi5#oj20bFIu+?jk zhUOa^QC9o_gIFiG%VocEJU4-1WuVg%^w4;NZ+y<2j^wl<_ zoUS*Bt}^SY(3a#eS@IFrrJgndL)WA;s)*VreIi_xn2=%4Et>E=KW7)liLfXeQ@N8t z;=XfO;+I=?!5g48lV!*)v{^T15aF|$)|Zj#`jc11W~fe!(m7UINj!(WpXSc%z+Lp1 z67j%y)d~}FHCV`0B6>CTA4F4#au@oxi4!xEe80236Ol-U2EM{37^DFy{kY5N#MunA2`vHGvrZ zOlya3!gAbPlb7Bb5cfM4C(n1{fwkX|;y%NpFYA?imY?Fizh=|tL59*>8C9l=6G&fg zyLD4m&Ka?qP!nxc$oZgyimpmK^F=QSa#64RVn(=e(RO!&G-%Rw%u^C3(Cuaj2T%2anm*N)|tL3JFEO!Ts zLG1LG7N^vra37!4B`#7>!l)Vj-F{_0yX-C;A&2{pQvc}h$tEWNS?UPs)7Z*owRqQy z!AQe=WK*-Bxs9oxomA66dzd-1ectkC4Nt1Fxhta>DL*KA6evm(G0V7`)SOcXQ&m*Tb|Os<@{tik8)eg1Kj+Mcsk2 ziW@SKOl?0kpsy`*xfRp$*ff)YWl0%p!1Sd4q@twl#OfI}tx!S#ypn1fwZ6F@MRq-u zNDU#h<&K8QGWAwRpFVNtROu1=Z=lc=CEPl4&XY; zJ|@c~Th3AD-G|9fK%SPWscvXk$aYcIlfzLue^fGf1KwV8joWvq^5Nhn~f8T&EadCLx*|CY!(|YP8)*4rH!=t@R3O| z|5!w}P_JO$xw5#BKY_HDz-2~WPp6oWzn65CNUvae4`pRA6&+6Y#1Dhi9*>-!#E%(u z+<&cBn2?bjvdVI*wlJSRw8KxdR%7;h7QMf^b-x&8@vl@OrSVrPa<=zs6^AXP3q&sO zgcKqOV;oHJP(j3s3m-Wg=Q~{uCy>h1d=3N@D&xyz^`hvWLWG@PVm&{vgVBY}1hRNl zaUn0(ex6#m-o_8TTZq{6dYeg+fJ&~zfC#veCf8 ze9ZfaQ&O#zdSwj`f+E^q4%kRzb1li2yV zkOg^PJ_op1<<7bMOmaOU9{DRC*%*(U5Sa10FhcoHAgRt75$_oh4U7m;#Y0HByzF&i zJW_`dfh#{B@_l})woGn*Aw3JUUBmd-C%Bu9mKhQ8*`V#9cw~~|Op~zmTZbz9nX`bZ zmp;zdLAMQCE6BS6(D6uUe520zvi^8rYko&wen(k;N0ZI9VMTr>hfNcU4UOLTfzEhm zb$)<_te?KDpOmbhjjW%8te=_e^_ml44)Kkp|uZ^Y|R#R0ULNvw}$v+-iL$-aA0 zbH2eiO<8|peNjq1E<{gbK;h3Th@v(0ep<*Wk>pSYt?nt_4*MtLRG?gPE|rR!Uj&Y1l5H4D%AwFga%9rO9{*TOo>g2%{*LfLT#eK zNtH*Hr{3RI(>A#>e=C3MkFBktZB}K$R?*g;udRvg4{BLzDPETrfNZRVzrW+>sikvqubDvA>KIz~)H{X@*;5b*` zW$6$*ci+|WEt@CSJE7U8{+hH!uRunJul6O*e zno*V$PYF~y%nB5{D;&6@LeFqfEIXtVoV!JZMskq+3z4 zRe{ljvN9wt@S`|A#uBB7ft?MXDPg2{nkJm~tO~peymqXL;EIs43#CJ)!|4%ONOqvn zVZzNT%;!KyUuECeWqyna>LaH8OnN8w?6izd;{_(TR9iy>}pTRLUKDbFli`dq6SyDRro+;N5&Yw&ddDz5qH5H_q&Gn zw9vG)C-9^}RT4QJ4hxFSr4YG~TRkLlzbmWv1#|X+iOHnYwa;u@kZt3$CkQ8bgpLWh z$5(CxXa;HtCowi6l%BERCS5b_P%faSMzvKHMO8Yfs&zu-A59Uh?Zy1>h+ zjIxyIaJezpp{e@ps*@;CZUGn9zAo>%borjZc3W-k`tBhVRc)VK+p)f-G?C9HVtMjL zUdWL|Nvv_d*?jwvTyyt+objGJ=r3pvsR* z>iLsi>6{iCO^dQ^5e0r58;GKqy|I>lJJBNfG`O90m3~!`(rvEx@aV8ih6-p)f~9WQ z|Dc@D>Y|{1R`18zAJLkNgKB?<3hEB8?1_?5p`r;v(UBb%AM@;O)V{FSBsP#k+r@| zWqstPc_Nno#(QXGSv8E{MrJsjv0uRT>MA4);=i}4Y%qspE(`N$ww&ShtDNJ%NqUmW zbV-lvI|wr;T*!mbCqEi|x5 zm>rMPQTvEQ*>GFQ7;J*&mmfKG169vXZ~It+5Xp}-YlBWp2U53VA~s&($pJrmb% zs1MOBWZE0fJ%FclN7Vi)J(PE0zrv|=a@fhR6H<#X!+hHtX|fx|D%fGIwO+j_s1{?> zy$WEdd=@%YZwWVPsPGz!SiH$lI#G-$bDpx$Nx+v)tcuqF?u^$SRlm7a++CkK>rMH3$(dsX4`(B$Xz*&P^=}^pt5eNKW{I)m|ss6*i&FeO=+wq2z^x3)*TR}%i z3gsvK19AV&AXT!RK7Nci5C?vhExrWNjKJt0CBee2E)ZT8htz4v)R@FNBQ}3mPk8Xs zsBaBC$y@n2m8hmr2V0Fb5NbGCr~PzBzdF}gEwrxhix6?(qvgqxCRb$S<-p2ed%-75 zyq6-*dpTX$RzG-wZ_`Z!lD$U=LzSQ6t2I}C!^Q63iN+gjq0H1U){`90(l{y#`;lVE z>kO=%D$?#P+enbFV)Z7eV0_R-qM3Vi_qGjh$aGdqu_p6ZECO&JX$jOBo58Q=3gm}( zWI<=I&w5vu`vL{pIN?%RO_v!M#RGls2rRVwfgU#@fp0cWOz<#XUvh3q(#iF_OGNJ3 zr{PaREaLIwk}dCA6a+tmhC0JtTewwsN}^PgS+{{hiRaMsy9$unxUVkM0D5{?c>3U@ z=%YNy3Q|>rhS&ldlE#Z0Rbtfwiwuhm8L|y?@ju;^kb(}c()Nku$TQ&)vw?&9~e7CeCD4S@I zt~V-)Y`C3#ImJ6~H!r;V2oZqb+%=nr*T+s~-!-NinaZ{^vb~-%vh^`gY1;cXnc4g)wh3kVX^#;DWe z8s!C+#7^`N#b)IzPvxSX1%yp2WEYH#15m6O!wOY+zSFoWN;9A=d75T|W}@^gdlxcU zdQN%{x2ZTcKpEBNod@_D3ey6j85$<&(qwQD88THeoDMSPuI6!`lIF4-DhSlTdR$RG zZya1Auq-W(D(>Pf^GP5>73Qt(i;B@3;qPCW>Z!)u>vjDEQLbkm6>m_MXAX#pKf+^P z^#)^0V@vbGV;6a#>E-AfMpRs*a4UbS)&e1h4b_62`I9on*$|t1op;?3n+J-OZ0M-* zW-CF&7MR%>#A@{G{)y9eD33NI5f<^x&5Fn*5|(u$6&CcY43yZ9pMBS%x6fSTgR-f) zstH9+)hw7c?a`Zh{W_Seid-Vr`w<(lMA#-xL)gaOs7XUH)aQ!AdjquGNibD{-F2pO z_$r#K9ODovS~3!ak=`c{2(*aUTbY_~>#MzEf@o_8L*X0|?Y7P~&NUU%m2 zujKE@05Bqhhyo(vy-gniolj|qea5->X`01VQD?h$ot}QEHOV6~idDFwT-w}SXQb9JuEru@ zXgD^Cv#ol+d!V;Aa)<-G_{mde?&m8h07!b9{P6{AtY1)sh<)kYcN^<3OHS)<90qCevbH++fClB39QomMC zDx%+mrl&N0-GJ^v_vkcz%1*+*8Y~yKEB012mz&D;mNl2Il@5F)re~Fs;M0mKC8P3b zHns1Y9iS&(2Qo=CYATeclFezpDKM4WsEODio}iD_f)%GyUD@>IMnuPDYl#>f>u+R6 zXaSd__Dg1Ujtw^^A~@5hq&powCF(ZE_0LN4l5FMQB;B*R5n9m6_=Mx`x-&cde#(#I%D@Tp2CmX}Bg1xP2ikejM5B zR)Y)RWbo|ekZ+IoX5?cSOZ8^=lw6DMr7`_T2vYDTqKLa>IF__`T`TLIso4QLu_n#J zCSLat&fob8xzbG(MXd5`obKmnd%=O>#n=CUICjP{xb}%FtU`klfB|zuyyA zxAD_(*wZfn1-vm_@yJlY`e$7aacUu@}VG(Q!zDC5=i6y`1RWC_d?;kuiaYcIz24*al zl`WQq=p&9re&;tzW;I2N(cj_*Sc(Bh{Bm!UmPg?lF%xjL)?HA%8E6<%2>NvC^|+^K zsX!v%Gj(!)V8Z^Ja7VdaC z4^fMV-U2sCz~lfPMoZbn(n*$6MiLpeL~Vu|?KM6yBcMs1E$Omk{JrNUK9p4TR*J4_ zvLxaQ>zJ~jWQTe#q}KxQfI$kFQoN9qd=eeL6Ox#PB9{9=!}LZeEoUUzNk~iZ14P4y zaBvGmJSa;B5Ke3z7y?wuw6l)AJ{AVgFc_wIe_Xo&ILWmaOiE5%&Ez_5gNQMa0PsN^ z%7{@6ddo_pp%mef=%4HAUEa3gay4VR&d4OA&*`FeQ!z{QWG6lKOi=;F#AomU#f1Fk zDraBUYX-;$7WE3Vu&?*aJX70U(~^Cb()`{uzV|o4jbTephNdq?evvUQi7OHR7%%>o z_4r4xG=N5aKj~8c1FCxeCHMtkMs6{`o=q!J4ay@Y|LY)}yAoK8(OE{3%HfhXj0_bA z7)mX?;GXCBHpZtcweXzWp~t-bJYj5FYdBE%*N_hC6**9RxGKek=hLs>rY$|@m=ZJw zCCoj%tj2n_bagv=%Z9H>W(A6`^8{+Ze@Fa~8+mXbu5bX#TLk4S-b%Y7kB*i{pc)+; z%YrQzVMl?O#0@O3l5cGpY+h-vymnZ;cF2dp37agp3|_4Y2kt401=)+M;+KW7DrHH2 zX#Im@w-#v}5AB;LEy~I*Bi1b=*sj^MuGwO{f6(|XTFM?CH!3YBR<01+7WnTIbAG7k z-sYfVa$Ciy*QR)Kk)I~W$Z|T{0v7OmcozD=a^J;urgC+k6E>^032idpGDrly`{h)( z_EhcC>1OkECh0m+@6<2x3V_Q%BF7f5&E}Hc3ji-LCd-Lr!>iCKy|@5KoVUta6M$0| z-PDT@PGK~R^VV471vj0*UkfwdygF{|rD61xZBGEn`e?0*f;+C@EZG~k#r~|vX}x0L z5ys8|NU1-I8wv=<0F30(25S^P$^L<{r833k5pCzRSFvZn)9bSz@m0{n$o+vsa68*^ zL~j`&8URV~R$TJ{^D_i;9vAlN0S>n>q;J@cKld6jAZ5@RYahW7S$~G(nqEV&GJ{ys zH!H9|eO$_&p(uzY&@vE&rUaida(rtRxb45ZH~4@tY~UEk5O#Mo(lS>o&A4@-SgUJf*Qcuhx!1N=6@eD4ziT!hKTMsp@W_b8~*^ zSyfyg$XZb_{+%Tc&5LQ0TZM<}F`ZU6MZu)V)1vRZ_bkl$pab@aadWTf>r|vH^ZuT2 zMJkcoTwCNLQsNqoq~-(v@j#_sS_&pc{^r`ecR%4popRu^)5dm3#jS*8_Y|P#^l)cp z1D>EV@j9bn#QLs&I zYhNj?&S@|Mqp-Da#cd^?Ab6byn;S6~R~*a;FxcAPG;5F=kZmA21GDr zunAFawsg?tXqT??@=HyRqy_c1^=M(sPC zb88uQF^IQ4BOOU}Yv=aGg_FyW= z0Qoa&A4EQP%UyeGv7v}JeA~dayD1D^B$3x+D!X_$*Y;@B3tHMK6~mc)aa>I4VFB}+ z@{%#IEVwD%Hw*Q;6c)T@7u@63DM{J1lHIdxL3*?_9_@T}ra?#R`(@}~=jzW$g9p

)Z(9*Q*8_i4J3GcW8Qo9S3*H58yyAgoeh(tE>u{7M(L-; z0eM_4q$*(pN#rfu^jel1e;3=JN#gOqzjzIrsGk-ORCBeEt5g_FVrk)K)GFNgOMF_@ z{;Iup<+auT1qIV->1e;Q@lzvNCqz8;0khv#0RY3ukwBJ{7}=HdPo$9EIE;Tib8gV* zk@CI#;NN}}v#epLBD?`t5teh07m!-h2Cp*+$y0KUNv=HvR|1&j+!F+3bK80c0Yx$y ztYaV7-h#6L9Slk-0w32Dz%;TMj4q85PGC0%luQP2OlwW#?~~xCH9Bx4BS&1bI7Hrn zzDCnDQ$mxD*+eE4ko<*xRi+t`^@a0=OnJ)es~VNH_h3Z;fvkP9x3+0yFFinyk@`1? zPPA4YBYDGqP7XGb69FCr!HAP9&=$qiHbWr$aeFUFw*8gZF$I{EF%Wp_`88_s$5jeF z1PTJoaU5p@Mr6^tYd+xHc<=XX{IwMAua6h}&FWbp!0&?)LI+wE`Z3j9&0LOKrF|vv z^+}uQI8KenmFOG(TUl7b5#xREIY4jo)JQH+b4^PX!~!St(-|gp0wabXgie`oVkdf+ zR0%zB&uMn=f-EJiOMb5k0AaB$pqm>~u1CcvH0aYWlksXyW1bmWGhyDe!_oq}N#JI` zRZ8P{5%*QDmthTH0oVi(1Aa3A07(E@aH526u3WBeZi@sHq^vwtB3eQotP2(b`+_wA zcz_eM#Xk`)U!NfGVNC{{$1p#{<3a2spt7bucjYUS!IYiJGA6yI4>mbD4U?y4>90&U zm6DB0CZl&rSTrl_WdqLv+%^`4H{IliFE;$eZ#8vZAzGAey&2Ue(s0dG>HNUpzZqc=;N7eJjp$*GG9jZu7D9bHRr%>eVI7Dx@nKlNy&D8iKTR-{Y>SgvzMD z!bq(;fvrG3)K(S zzE8iO^+>IY$M|I`zGcw%*R;By_DA=C_~gCkmPyoj!s)g=B5W)g8^DhyIY;1>n`FA5G# zsRrmyjD8AzlRSe26?e?N?{#~AOerCP^J3(`4r^ql1q>fV-gT12J90W=(!PK5AUXK{ zr^m}!hrt%cg5Cr~pD((eRs+fj1Eueklit)PcV{NEaF5RiHRe!R6VytCxdoTIh)EKC z@4azHT0y^_>a2R^KFHO935L53toei8U~_{RnXoz8M9)s9vdl=VQx9&VTz%LT2?D+~ zt2#`2Z)?xIQ)z3*JWB$Sdirs`e05RR5cF{R^F3_>xi4@X=&ZW8603-nU_al`BRUJ% z)f>0GQa7n)Pl9U|U5-r9C_uMH5f=kP7mnUx2gmEb&xH_zy@5Xn=>%LpGn+ntr2^up+_^n zVF=CPrC%N(oRF^P?+W(ls@#`wq__`WbG;OixIT^wA0aF;tK6}-8lS0K5#+*cR{&K7 zX$eB^ZMd<$Zwt`(`^1-ztCLyz#H%%O055#Uv5{SHS@#mWRpYK%aOO#AM^J07=!-Kt z)=6*U=f#@xGFD5owB7z{b=^!*Ols+UjT@VM{thHzhFojbtMJQ0XIa58Mne2!*m+%7 z3wN$jFVf33;l}Ukb0B&1hvZSUZ&7p#QZGC&5@?!nf?W2+@qdLd|4cBx@BLKaVZu*y zE^HCJ!eFbPZ@H*o_jtPgw#l$ZBO#ac`b%eHI}{W-;}28yCuU&`ec}-kzp` zg0Gm*PR+mFu~8irr`I3l0jk~#j^1*Pdh|~WGr9XMxjv5Ly`}-G16t$Pch=f?VV_;N zKifYsmw%;qe-1E^{I2m~E#o)#|GspDet&SJ|A+%eD+t)7v102Sz4&?miMw~@VpLdg z>v$fU`URa3y`Pxt_TJ3Uhk#ej528}~oIlxX(GO(B?qB_#45Rk@2L4G0FKS0KajEYS zgh*S^p0ZjR_QA?heTaFgOt&;(?Gb5OHO*vr8#$jTw@9QO2*RqcaBHhyMfwE76j;+_ z3tSw`L{HC)O4F80Yzw`1sZE~m)mC#v&S`MB$ysU*?z5&DFxHhx@CaHn;r!mnNuzw5 z5Mt>%s(}A}@csW-G|mA$Vm0~CG^P-9$;)Qm^MS8bn*ew2k6Fi!@EF$4HGKf6{#>ne zrlsU1s(iB5*VooSR8)i1DzEJPkF98{Zfxarj}&P34*>YvtpHz|RIG+ij+wu7soz?CW1PWBc#dU+wRrI%e z1GhpakQg-MfKl*2sar%YRr<;4YZGclSl$<(M6OuCmP&Bdv#=fdb%TmO6-FURNcw3! zreQqVUrYF5!NL}4t!^%_r=uAxqmpU7slS#^#Y3@9Y#MlQtkY+Hf_9(8 zi>PmUM@#IN2PFPpxSegGEzGHY!T+1I@TM$#@#(^QG7b^SI(u+qgqTcX|J724(>n^; z`Zx&++4(?)1s-cZtgJPu@htBM3L8IDY2~>Z8a&3aPXLzFZ`=g`tJFL4je&Hj{3HL~ zSywJQN+S{vStPk-qGOn!g?h^58aprXKY*Jo(qf0{WP54U{AHDXzv67a! z#{I97_(2i+a$Bb61rXn|swS4^f2cObSaf;@s? zL9kPTJ6F6`E{tEfKD*x(yzmp=Wz6+(@vmRf&&(ALXZ}l^W}HRbu+OWna29c-g7lps z`s|e2!}!|eL4CFXts-C9qm!~tna|g3>%YCj1zRSo|B4_q>jRI`JsNtlG(7GY_eL|7 z45$!A%=GIip;;)nEAT#&usS;k^KhTpSRCv6$*l6ve^Xl1W4|PTt#dmIHs8N%(|=zp z#O~)i)c@~WxW`|e9<=mupUIdXtL@3G;!nr>o`l`lZ3{I=3?$T3(k4A-l1%nm-JXp0 zdTWjX9Kq{!Y@!N7_w>V8h05WvMKKbDdCji%i;Bkw{9~#Qi^$h&d;9Eh)iVWcYsHN8}o<-|@E&?*YUAkL=z~LRBT%Z#Q&yXSj^C<3%L--$9{`H&CjS(eynr5|9c|1%bF|VQJyu|=T6)))BC?2B;8!zTKy2j z{jFm?JPi^)gAgGk#|+i)>e&yexko!fRdq2yZ&4tHZh)UzkNQQp39DDZA8| zDbfEL#fK)d)tmod#AVm99{eCrqFX!qUr4G%?2=>uHxcWWevsF&E_uqX@uPsXUOhCq zbX4`<5*dfz$;;L!sxJ#@UXBHalI)Itpn55ji`C{>8nPrbTk%g)>~;irCRC??Sz_2{ zGU0#HCOiA@N=j7wlU@Irz-r)UcoJcca*sHs-I{I~R24oUd-mtD@hx3%bmoHkc~@NU zy!9VY&-_bxZwAkK>3>9Pht39AGsG|fXcXd-xC@ug`~5@Cudi;f4P9Y3d~nGjNG^Sdg+Ki+1gs ze0KoR0Vv}u_w#?wjX}e4Zz7^p%%kYch{*E>$RvNg=9Y?kvs>d}A~1k;fwhnKm&(}x z`+Y8_KT||M^Vg=vB4%*OpwsCK*9%J5{hHZhv)R3bedSkL-zCmP4e9|}-TKeAOj&_6 zPo&0d*%pp_G0gWoXgY1GhDo%}Rp$_I@BYK-l2!J#u4{Wy?!}lbxs(gXc=VfyJvx1p z8r$XnY|D&`Cgh3?)^Gf8N@3@HHJt*}r2VKhZ6nIPNV5Q!a?Th_+c5?9?w!PqKLhA#1wL?BNTpXQa{~m+A31pb<Rk{rY+iKaC-UHSxgGckoY;_^x_;E*qij=QW&m%zQAgvw@C6LBE$RTY=6H$>pmgY zd5jlpe-;+cY`<@N-44AnQ%BYKt(|er;(7p8dshwU)R#ri{3O}g{=w{HzEh#cVkRJ9 zagIUs;z7lObJsRbHO;HPDhxb-?zg)6e`Q08!o*Hbq7$Y%i#Dj?Z;#kgrGK4-6O{>% zj=k4jdRBH<59!+7u5KmPq_1uz*R(V7;3;foqmNue8qD#YR?V3=3w#Eo4iL=usys%;h2uEqSdVX~OzcO(iv=`%dC3N}b12qfME5i*J z)2CAKF(y7OH8G^RyEm4)`|J~wzuY*nxe^VuPv3<^Yu~uNLSG|70;k0lN6SOWfOw-6 zu_nRBI;`=Atps1bv?l^-Ecv9o_f?+?jiRxQ|=hbAPuw$o8#f^shDRvKTTW##V}5@pG;~vb4RkTdwc|v{Sa`#S+$OlyaTmyh9Z~huSUv; z7Gk0tUBP_2D&<{x+?$U>c&CgNd9~G|9bKcws4}8r{7za)|0o7}@cBZ%Vj?Yq=g?Vm zXzFa-o&&5|(V&q~lgpqB$G9B~&MUQ$(70usSsE7R?p}%1)UWVR6F(aJ!w^KkvTQ~+ zw8rY^GsBUGBd$yKDBsTrh_T~~*NJBBz`4M`DqXYp#U9ZPJ6N?nP=~$|qlI4-4Ekpi zrse>v{DNpt?!8R?dKfykB?fnY%l!cMaOCs0g&5E^uC`b1Z2*f(QC#ta%%qLP9^_XK z#qp7pNc#&XMQ!`#&y-oMKL{UH5@d^?LFHJ9#rWi%}0T$mXQC-d7X(%yRzvp&JSlOdYN{`G46AU z`3kMs(YI&i<^r1BltA)>fYj62p#CoJqlc-l=6$p86LvAoE3ePGbA`;@mB7w;B4;?O z160J;GjZ>#UoE58@fkg=$=e1$_x!7$qver3WvH6kO_R^K)jzQ}uyJ*kPTHNIAitEL zChMj|v(S^Lhr;_1++-Jj#u*d6<*Bo_Ff+R@X-Yku`#E1a`GTTz5|QaP6c6|+3M$&T4_6n&88Ld7zbpNB5NW@w-`!4^6d#!wi98dGy*c&9 z08$AIlg-qbj=gewA>gNd=70t8<3qp`v99(0^|_0+xhrqPhxW#==X{_0JEQv#x`F)b z(ZJ*GKJQhj_Ja%W=~p5))YPX8)Td4&mNyb+dw;TLE&r+~4m0Jw%0$=9iy2FRwj z+8vsHw{kIei)u|UaZPZAB{onfgMQ=4_e(|!lz3}B`}BC^s@%A&W0GoFx+}prSpU7c z(H(xchL>c39>G@56^_^fV1;nfSrVvL&9zp|saDMn*PiUxbA~TVVLECbW^Dx;d^;ix zI{yNDSWSb$>^z6P18F1iug31#DUN;H6y2rP1X;ccXUW+~f6eBpa!O!ztX54d7qUkF znN^bZowfT@KkXRy_Jk>aT{uNvl%)1qIcNnjr%dKFFaG?DQcL6b=?G5 zSF&t@C0WeO%*@PWF*7qWvs%n7wJl~@%w#b$qXjKy=A*rLd~?2;m^t^}xN#z$$XxYS z_OI@)%B=NPE}V!D)IQLTkpB-tMT>>=l!>M-ArviP|DrU$L`9NyMVM7fj&&u(O*(?M zP&8GkUL`0@I)Z)`@B!f}0KHHYmWMeR8A}=fS7>2HlDQI5#Ey*ChypG>JtxlEfHcV< zrcCDXM$PMohTruyPCs<8`uC3dpUY4WZ=#LPFZP>3P4+#ju$Omq9&M+4IG0yS?d_-x z4E>`rrNQMx(Wlu@Hp_&5VQFL+B{sZP*!XPlaZiYR`+wMO4_x`Za^m#%cj%CAutlmL z4_FCuKs!hbGp<-Ge6SaE5cD4} zlH=GGdsX>$`nRaVR2O^I;bf}9fsYp~1b(1i1vu-f!OY`77W}y5;Xt1Xj=)>_UZ>*( zPk!dA_&CFw=lCr)y?Lg4->WY+ER@`Yn%U~w@ish(wi30BN|i+4MB{DX6Dtkf+*}*O zmOpw&v!*c3{tU%zEL(H&)r@I3GZb@nN3*(|WgByL>vXYfO&g3HtWx=TGAZ$LD0mY9 zFo^;-r9&fHZN%cvN_EhpaXgt>3on1UTnSHSj>+n;#tDza-f)*Ly8R3N5oSm1^f9I{ zY`(qWjgok^@eSP^^y;n+seattG1jtCA7jl4P;_nlgTDHGK(lpdlG?D!t4U#J&D`n% zMJpiJ!}Bvk+>{Xyof}?Rm1PT_RH7tu_o(g0CrM<%NHBcF9tdJd6v0HWMA8IO0IC!( zVGxw)MF8~QCnQulPc58@2fwLyuP>d`LufenRk_uGpcim^GD$R?MGx;#%o_C%*<;ij zj&eu9rvynIS2o3o%eliVj&PlB37JJr;rH|Up0JI~;cJ{R{$e&ZhOMt3dwYxCYqjXa zEa_K)#DwsEX^`SDFLj0pnen;d3175rTw97`6Z4tc!0L#HHdc9};|Wt^ zxz)%_W7*gp{xE5Tz<_gVa7UKhXW_{(0 zTm^4Xio}!!*rS^9DUt~su`wc6umzi77$&(0ToU{WjSILeMz;&N8iCL#cs*{w?I#Te z!Ml0Jck-K_S#vl>GZP_$lV813C;~a=K9;1g`CHtlOo7Q-Y z5ptC5m(HjE-Sm=0qXz#$UZM+J|EGDe2Kr#zvHzA}Lm!9?5XhOxd}V3T$J~`Zo?CAK z4%_C@RNs}hrLIRfuJ>frrn7*MaN%^pRq2~o-HJz&DWfr5wVmR<5ie`a9WObXo7t^X2PBkT6ngVOIMCL|0e#M z#^M6ab#XzA-U#c%&C}E>(5$>({eY#ePva-^a!iVQQ=@$A*vf0M=`N;qBk?S~auyIO zOZt>iq3%O#%s{^K%iQ-+-gpdC5agY-7TCu`8q3zkg2^+I)1z_yRnNtc^x4h!y-0oOmMdApuVp;V zpG2<0E*w76I}8cE^Z&q9+>}16&8Vt?k3kU^HQTDTe%uyujZtp@NEi4>*7t|L&+z$r z4#}y8vqdA@vqNkGjbcAC$+>^HWqVh{(W!#-+B52fTHa1|Fnfb|5|FgtH|)H<%jsyy zoW+63_4ABz1-m^xp*lq@T8*^T(G9BI);Lx>V@FME#eGg7w9D$DJnXL~pv&u-9}U+o zxYvubBD~j%vm&h5)%su z!v+gj>s3Qro(kLWQbgI%^m{cBUP$RFBXUpzqD_ba$!8p*CFmY;Xm(*nq#(fQFT|iw zMA{GoB2sQbb2Mf(BI6XJ9TzYDB(xR;PS_V*e@)qJFTD2QH{|b>;Ftq4j0h795S!7~X!McpM~An;F9M`iv2%9~jj`wzas$vDLJtG==f$McA0Ft~VzjK$!rT~cSrAqceg4RC63ZkF;r8c;FeM9b&uB&S4~v_g7_U!83; z0VwfZtwZ{{6`S-6_GwTafe0pG0tRyKHAQV2v$~Z%47<{co?B*j_NLE>t7*%fpYDcd zT%M%u>C_`}#As-%*oHpa3TjV%`>>D%>20YvU^m0*e5(Re4=V4T-@?9-xS(*rJ3xRO z3Dr0grgbMueGb7Ck72~!4S4Q`{>Wg2urd73#4sF>`UMh;r7-EfBuxjq_&O-c2qO!r z+&ybR?E$&P6nnTOR+R+-8WFSbHC!>nlI(4p5jNl{+44xY{Vd9*4{_&o;*90M4er^% zg4ZnM9sflhk`IiR^AGs3#x8HxDVNQp`6|X5wB09;U>imi`aUOgBQDsQ>`;vfln>;0 zU5Odc>xW#^#$(cjIc|DYr^PJ#@!4r`KDnRW8W8&D*fU_AP z8Vn(5u$wcWE5pI$cLIzAIqn~Y(Q*IUapPy~Rbem$a^Ca{gWnLHji2?kgR1Fz7E`yZ z3m>#f0kY)Gf1F1zTgb?Lw%kV>fM21OCI5DEguDXzxnVdiz@EF%o&+H|6>iY?g9Dw= z+4*5{fT1yyzX$dWcAS4*axFdJ+W5o{p;i96u3382IPsx%<45Nq@P_Lmo0mWh$Z_Jv z&WRN-&Y$-ASRBXDi{y_^9Wb-D%AR1*O&^KYb0byCiLy7E>?Ao|vFOCilub#2mnejwRn{ghy04{KF zM2i%^e(Xv%Dn?;ktYdeweQP&83tg`7dSK==;ud$o69$lv{f{h}fCm^aw0MxBLH!e6 zWldkyUkpC+XlXo)R`?Px@F!@n$oNuprDV%TV`Vi;)Dw4({Y|tS4<$Dje1I*NcHqJf zoCC5!ZUs|sa!#2W@}g+h+|jr1Tu~29|Ap`era=H5*E!VE%%Ah8w2_f&AN$QW`nMD( ztXy_Hg{;_OIo=l@op8V4(YMn|EL{7i*GhhmSFN1&+w<_D-L6wya$K_n#LGa;X7eQu zhu_YC{n|s!GZiC}?58B~t5)FuHdbY9X*)qI<#)KFMlISru!1ch5hEfQi==pqsnhs4KIJ{-ah{g+16nJO=nGTbS zcG^)4sEBr%=I@2)&Es3%_G&jMenLySJxWvHKDyGLy+-+OLP$hn2mLk#CN}wm#2g5nAs8Y{C`^t>gc1=CBl;h*q7&xd zq(AVaEc|=M^ttY6i(m`ip?d6fCBm!gM27YB-*82dTNhR4n4Xhk{V!ofo8iJbXcPldD7&Rm4ah#6ZeKJ2pZ-6~R)9}dfW0~7(NeNhWf|JyR1JAL zMZtgLhcD^c3O6FyacGw6*d%po4>jnc=`3pX2l`LdE)U0{V7#JrVTNAwXyj{#Ty zV_DJWPrvm-2AWkwwZ_g0o4ab#4zrKDJo{J8{!|#CBIzL3@t%V0e>QT}GSHaot4(yy>3;c#iaa|tMUL{4EY-Pj>LW8W z*Sg47O|kWVljU+P6U?=CGtfPY#Qvv{>u$J&1m>v6&jE}zAb5)L z#JeYwt0+Pou{mSM_yHO+DM-XD2Qp?`?zugWEX%oMt%|N8Lx@j_L=UCB!YcSg)NzO@ z5)mULqI*ch&Y0pL#^^Ca%#2<}3dcDqTvud?ocka{gXS@^tRcQ^IYg0C^I#KXaArWj z^_M>%mdM)dsGh8ouJJpFMzY!fT9Pf%w7CwU;@7BbiV-j@iGXMl!2zTn==6W1Cr{U& z4M!@-*PiXw+|8@sTnd0Kfu%kA6xG_DNB^q?_O}U@OzGc(jp^6r5!7o)EH?Yk9K%d= zP^nzWzCI)EC~IHNAm4vXdV@JB@`RM)(ON-8t@IH0Iwt*TE+wM1f*$n=x>G3AXRjaf zTAM>bzYP)NGgMU2FcC5y3R*J}S}&oYW&X)zB5Y>`8@2K~uklw29qr#Cu}G$H7;7k; zeR72*)$$BxZ6TG3jLdNAKs;Sb>22`blaSRb zVS``1mVjg>LBRro(lONkQLe25(^LFC6MN;~nEc*Q5?5tALfmH`h8 z+9bOjzD6;p;!FOH>Uaj`CmnHqixahc{r-bGto88&8O#oq=4dcF>2#Eo_L_v2v=Jj? zl)({AB#znNqiYMyO%3&9W~XpdUi6g&#jZG7`?F8n3)6c#Op!DL5mk5RGR&)76(9k_ zTl@qNX^TQmH<6vg0YkZ=(IEf4Q0(yK>;$yP=o^ zfFqq>I29oK9u1;#8UE{}fKjoNB6WmAEYL@JcGw?o3(T?`<|8?J*bUFy4W$LPAXSNG z0UtqzT_Z}8YSD)rqmhRs!)g>Relit-hg~B=;%3qJEoSK_5>Gw;7OF!7?R*uu|L2Fs zFneo~p1%yfpYb8%0+O%MFd;9BlE5x-# z8V@wp^|g{X;me{RRa7Cxl?C zEip#*PD@Z-W!jEz@sQG@Wrd@FsW;^6he7z{KCQn>n^WM!r?Hf8O+E)@X29eB zIC;fd|JUSo_%c^uC}96@D;i<>KD7f|GbAtJz8C)I|NbZRk%aO`1iop`Bc{#=Ek)dHpKfy~@b21WO<5+0Gc z93nmiwc5OKbF%W8q+0RnG`6EGIkCB%W6c<8lL#~$em0%|AQ_up8s2K>{dA- zb2!hewj_hriahF{FyX2+_^MR-s#NN#l;{ImtIy9EqI5?Al&*qvysBYivvbvfD_x(h z_OHONPQY4R19UhAzu^+THw^jHUFk=?EE4~}4Cg5yt&)A_i6t8Rf3k?;TO|aG5A)Dn z$wm3FWad(d?4~m$7x`1i zRUV$s$>VtZZF+>?`05*GRhwGmz3huwDoJ1Xs>B8|nutM$+_~M=C|y_bs4oxI{?{xS z4&Aq8V@<{0Z4Xo=?VRM;b{T)0hqB=q_#|htAOf0lDL^SV4aw)zq`TInlTqcDWSbb` z84fAy??1}TTW>^g{`F2EoQ}ou>R0=uYRN-UyUC&0C9tSq#~9Wlhs5sk^TOFypd~?F z+wzsZWy{-%pqko~E%|sO3Cg2EF`F3oCKoch`!l`aJAz{w(iXVh76ewbN2P@&Ts#3b zN8rz28kD1lmOOkZoM8a||87ZqAVRkpp4oxG=1pLA!#{W6TQdCo-T(gQ-I++oxXzpo z?9k!YKS#PPy&AC?9TZKBMnucDaLeI<*;@Zc!8_S$X&NL7E1bUJ(#b-2X2_|s z!?a9=I{(sT%(BkehJ_)bt{i$VEEd7Q3h`NrgyHr-522j%j=7vzja3*}Ite|T#rflg z7F)Vl#sv*lqy!`xn9v2y z`msDybUHe%6BOHi`8-OlbDYnE*c(ofu0TE8(a+jH$?= zI{nqU4c-{bVa(E4NN4^wYDg}8EV~475F=N=`RU4iT@jeU{b77qd}XgbDhsGpa0#Jv z?{!aFa^^7RO!%c#Z#}YDvk1LX(^afWr(W{DYkW*AO2Z*>#}p^hg_!o_679&q?nLmW zAIhiF+r@I5b%#_%)JP&%`b=^1bVKA>&n6=Thu>3UXs!tqo({bU&=<%i0)t3!e`G{Fb~A&&-n)}hh5~i#Nws}e&HLjoERwi zX5ClF8hQX-bb~YugS0ek*k6m%W{oJzb2b{q#0M49VZVl*YlfZiFh+jth)u6DL5-nx z%xXo*%u+9jFE0di3uoQq#L`fS-MK2lw`?N{+S3l9E}L&74uy&g_MD@s=zWrpX2J;Dyw6=yYL4&9Epas(&W{7mmz+!;~rD%=rV>KHH1 z)yX@smjtq6QUq+^&TNbm2OpjReag4up}Zz(FB$F`&Alv4A-{yPi{bSfp8zgC)9TEa zlp70YL?&!aXIV1;zCXrY#i(Wd*3u;KWvWSPGpaP&EI5YuGEc-n$wNSSmzY3Vo~8*WbLi-FnBFREQ$7S|pf$JCE8rxllAGK4 zjP$N8IEia9*tvK~voN2|H@kb8-bSI3%faL-GP7qomK|?SQ|5Lau#>ZVKH}#-zf${* zBtPHUf$a*ka!kZF1zPmC&v4?n*6&I3OzF88`T1#yAJ(B<=j%^pEb4M@qGk78p4D?@ z81pR&gfcN7kp0%Ng_*_GjNTB!EY&+HCmGvJWgMT5abD+IbaBnJ=)qmn(ak5dRp`RA zaQ$@Ry6Z9fVCPk$2$$XWc!tZ9am~kR7Z-zivl&)ryQe3?qpe0OKMt;oZabQ}ue^M%u|I`*T{KK`R`cd3XlCNM8pvj7on>oS#kX zxLoo)f2^u49(`>?^;TApUm5R$$gh&|<3`PrMLUffa0b>C*t2Zb1Zhv?`WzAGCs?tu z(~#!n89%1oLN|}0(@P%lB@4e37McT>ma;5%3CnU0CGB;@Rd{;-Sn3FwJcafyevAl1 zV7CiQ_{O*$j0DX0-Lb;7+&P%SG*eqQ><6c5%||)qo~?qlZ4FAYSd4L7w{&Md^_n_E ztsu{l9#@EQEj4_{_=!ecK1n)yDylX;*lDlOm{$0fq!{Ry#Hl}uo@V8breNi7>xbNVw3PMrtC80b~1iM5{ z!>4&1$3Nn6I`3YDxD@HP8K@*Kj?B0u>62xa%2mv1hRs6P60EXbM&|F9BkCWXw{<}3 zTKzps_Bn?;TeoJ_!8aQN_DaouFr~mvXmkFzS!L1zx!*ji_eAojQ-x_;hkJ63etexR z)t-YxVY?_l?O;vQ>%}AAc;U-T1JoZc9Ak`Og!m0%Wy?|)?an!;l!w%C*@)!A;o+m@ zL`N?LO+yy5Zw;GJ#tlwgwE61<$@TlaK31t$%8yi&^QDc?T~4mJ6Tcf{3SNk*xJzsg z|DY>g=HTmV6nnXP*S)&;x%>bS2_%$SF|5Y;a8>)wW~H@zN&~mJ-|-BS0Pk*0lny7Gn3xV=S1jA z5C?DL&kGx6Vs}>d=dY=?-v}NYH=5Xfc{bisBOuBc4=z1()Opc2tHsphAGRDaxZWMB z4eGtPf~wW8gPl6P^fqtq;njhU4eH_Z&M~rxZO9T?)cYqTccm|VcOuW3MVK4)Af!{Z z5w@$|e7$uW)s!7Eb>b_uZR$IHRS9X$;*FnPd@J+g3v`dH$AYO3l?V3T@!VH1oxiT4 z4t(lsPSH?#YODFR*Srpzb*MMZV)(3do`@HU@%e4t+cOG%Cjm@ z828kV<2%Z9s$wflZa!%`%+yg-}Ef%f#ktGgaUbJdeC9TFqu(UQy zMI)gsWl@qZ1Ch{SL)B@K?W1z@zSE-k_IbbLkf=p`q|Kt1=;%?9?_x zA`PEzpKggI2ucu;?+-<8ctor4=Yow2-T<9)(K9r+Ion7b($&buw+gp>+lqWu=V&`O z1$qnv$56My+fusN!m^Am!7o#c@NwxjOI?Iay!m)RGu`>vfhXkPDG5+xvrv<+mKNUX*MTRnKZ?@IM zTsFuV-3j%U~>YYZ-MYw0zZ} zPt$JO*mE_t;Aqim)w1??ZE$Rug>2<+=C*2T;cjWQ5YbuJp|Eyu_B(8qY+H4WvW|C) zv(7$tv~50?T1;B;trDveTY@UU|)h;!SE$%)QOkI>oYwwf8<1*a+PS z)k<(LcCWtcd=+?TKz{bWu-?0S-&$;3dJooLwR%VJqcizvDu2HbysX&$bz1SShV8F0 zcPk%b%A4N1IvY3N-k(;$pWlzIW3Udf@YjbdlBVU|%}ypQre4}MH+lx}Ws`BLLqLTXj-dX_=+s@OvtVU^cDY|YdZkCj7H`Hx6 zMrk5qu&>`LX3Hz;&=#6w-@X z2MdR-NO8F2dPcBoR1Wi7VVuUe&~hqkIzZ7rKsweslDMrw@JyJ!S8F&Un2zJsfa0fc zS8>}y&!BmTe;<}O^@R)~xs&z*Vtr#t8>~8ZSjuiEYo5$z>bUQJZC;)^U|_!hGdX|lt7vW=-pC3HHRwH(g_$>Rn3@u?HFsM>c;x8$Hzf~ zH+O&*T^Dwmu^flm(F&sqt83-y`88v4!`gvpfSuV|G|RSLT`CvF*k`)?jAza))+F3& zj^m7BziY5pj&%4NpDA9+Nni#LumIWz?MH7|usc<<7G5klin`SAKu`7|^t{$Z1 zf#l&7+K2*SLS6)<|RvMrAGQVA0JRXu`V~#=Rtd3DPKw}Gy+OoTl@W) zhqQq3z%N5OtZ%FL_P{TK-+6>Ng)!P>dtwt-PnZ@n!5yl@!&;|iZdEb4DYaPAiaWZi z_E|;xRTvpic{6!CDHay#>(^_@DJqkf8|B;d2c0e&d;rWb$g#t*gHuuLqd3cvE3+N5 z-S)%yz&LIbiGc(fI1iRTiyac)H;L{D#t2^+L*!e2ltbzb(^8McftQp=nwM+jYh=Tc zW;5hz`km!i)38WWOX}1HmTKne?FhV4xN8Lv(BrMnlaB6`azR|I#s#gvHo|E6;cj!R z>(VF66P6AtBiN&JygkO8Coh9KudtYSh0z&PA`E4EMunDTT!%$ntp3^3UV=3#f<5!K zNaHSoE6n%rp;#ZIvrxuhbZ(Qm5=h)!SX5oE3-VTHL9@TVGfk*4(aVT&^!nsBn-y%Y z;5vVMb{=o}ZTU9)LP2*bXXfc|p9t!3Aw`L=Pb}n4O3eMc?gNGhtys5*-R3O*u=s=x5$dJ?F5VWCL1WNDq0*|cmxxsB zbnA4huQ3+2-UM`_aBXB@PDf%+r{JGpPAm08cSR!6sYF{yMSJA(>)&(?sb2eBTL2|o zEK2i&>2Ee(Pueof*>xCGBX=ja-+RL=Qc~FGI$d{jvU+V3o$fg{@_Ds3@9>swe`s{9 zxE-YHb}Y@qvze-_+t;2KsW3kwxiiM;Arwv6%i7wby_+L=c4SvJHf)x<7Q!vfZ@72F zxy||INt~_TYa(pYlouYAClh7KwLChMGt{TGI#+Twb+s)^J)ABaX(+v6kA{1Y@ z(~dOy(;66z^*c60Z!41eYu`Lo$AO;sy36Z8zy! z)rm5@(k)A|$|oG_%d~Rq`4#+Y)GuN-JYk&zHRt+8Mw`V)c!W{VMqM1(ouE_!Jqp+KG37<&wX1Cb7ycwSa-Z}P}XPYd4&h*lY)5gTN&;K@2z_Q= z$+?U#oqCNqAo6-NYXc&|I@aQ{g>xcY7t80;&YRlFPKC*$WrYI0tXXr;zs;yp$AV!*FouBR#}D0ooQEjF~5M(>Y$?! zq^RcjANR(rh3z>%$pR}N!x5*WiQU59DA4=iTp)8l{?6N}c0lj8>oSsI?_OYHC*q!M zp69q0l*Pi-e-)=)2mtvQ3AmlT0@m)wZv!Kl2AL-FyWV}^d|yglhA?(DxD-JpuhM1H zk5|ic86|54jclUZnGDQLJJ@^3k3kQ52ri9TOEWGMW@)r(1Z>Z686)MT9t)$by+8ua zPQ{?jos}H7v++hGA5p(tE%>>8_>;-IlIV8};PTTYzUZlq<@+a7@7p7Oy-k_IJZkeS zaL@0Zbj3s08X}+iF1QAZxww>VTLI^nl83HhN2+C!wyh|HnX1a0?~ZW5V{R=3Z?s@H z+$wT?y7$a$f>qT`1l@Aniw6?OL3J@6*~bB1b(=YPfnBS z0s>xe9WUzVfrZQ?l-6o5&+Gd<8{SZN&nTNUd)7y@1Kxf2-Y#eYGr??c-fPE6%6%}4>jkSxX&VQ67z7IX>rPZ?>9ToeszHRq-sAH9@u50>T{~e*X%!fNP89z5%zBK$viW^mszHeW-h)$7zuWI8LbHM1YX@W;X z_5ASra#g%vJ6R<0tpsl*n@yJdqv!LJv8enHBc*z!=g21P&l^28H|_Wv3k2Bx8_JwF zx)CBfIo0CaM*QP?G0%BTs2~p8EWVR--fT;IQ=!>?wphp9>lQmdEB(__?@hV;ibaCl zo(%oWeILg)gt8p?LC5)2P~s||&+U3zK7Z`7JcQO)fcT&txycr6tUrX6XP%{+;T`%jQN1Y&~bIVd!llb;4 zPBWHdy=v*xa=zP+KUhux9|id&j?t76;@UZ$RU8CWm8);h>72`c?vfic=SqW#4xPFa zLaAgk!_PsLiO!yS@gov$BOJRbv3RXKDfFEsFImI} z?w11Z4@?^gifZ#Wo}sVX68^YPyX#DPs&tv_fl`{AP4~0N^~h;uuV=fr>wQvJzSJ=Imy9CTS4-fwMMGH!@}G{;|yWMG+jq z9@T2NTv~c0@8I}o6vNl5Nh&_-o86t?^@#10IBM^!;6WS`^zr>ibsTc}u1I{MklMHF zPPF{`xYr{6n;%cA&r~OFwz_e@F(odlo)bV!)vLgW;`YtKM}+AR-6Tx(D%GRDJKpnZ;WY4o z2U;*{VOI8;i+{X0UogFJ@B=2l+%YlL%!Q-Xy2vqdTE-d69NU*Q&N0?87Q`~aGO@@U z4I86xMHj7))itAq)y3qO-@p!uxoDj+AU80srTyH7q2)cuILKKUyaO|c{83}332(F> zJk~Y#c4c#B&C<^HdnU(t`FiF8ab=;Kwif8!_V0?8Y*=Tqh~5;t64YW~vx(y6y% zPez*4zy)9`n{Vj`{qd9ZtLO5Z{*-=v@6AW4g5f_;=)P?>i<>j=#d8!X7?>e3A@=$Q2#w=k>ZeWC zh?}sQumzISu$pk1Mkld%qJcxF1Fr)LduRhH#$_+o`TZ6N>R1Rk2&0oYbFp$x%#>OiSf~WM@%{w6a84uM!S?X@ zMCY*hc)VKts4p59UXQO^IX%z2)xqzmJ~~J}6hZH0m_3^}H8h64VRtPumsk2ul()W( zH_JcaSZ&Sp_taQcPl}^i{Y_%k@mbH=C}`p`mB&g)P|WJMA$axhk}InJe_M=L^W+2GiXva)62(HN64KU9`mkvu1%fmuEHKOAH%L1AB!G~Y6pEr zePoucJ8jRD?=qmqdPj)rdQZOdv&N-Mq~wE`u2J?TKgyF)?ajt#5V53mh43O@mCRr< zbL>j()y0bub*a1|UAahRIWg^K#G5C}{B$b$>4Rn!7Dl}&LL!`>Y%hW$jH1eQb39e8 zT3LNSQ`#C|*hD29sziE3^E*V;+q(I?g?kK{ZMNi(p<_g>0{7`SIg>~m!wB3+3n7*K zpu0|KMKNzHHZcyA>2XmP*q;aN(N^o?0=`rO>q4CpfVPr>CBgPA;Zt5g0ac^2baLYU z$wLb1`Uosyt+4_NOp)m+)EcD-RO;=EMZ-%a%zg=;{z2K9X0oQClv+}R!@5G7L}yC7 z0b)Cl;#zyC1EbiaR%9-Tls{DeluzGZe2V-zEA{^CCY>@FB<(!Bzk{l}LsiC4);=SA zXsJlrpcpbP@-GUZpS2Sg6|=_+IiF)KlJ6wFMN8||z0{MXpeV0WNv=jvJ$*y^QT<)} zHoy1jV_kBfUUGc8Y{I_efVx}^f5;NNyl?tVRh_g56aJF-k|>$V@m*A2=x_2O+H)@C zB1Zucqm~h)-y%o-NqHrwxd3_BM8EH;#3_jXqF5=K{c)47NHQl-G6x`enkR`zQJd^R zrssj$W`x0p+aOg`Lbrz6zyh-_jXs~ZL|4n@rcBqhO;Pck`oJnhNlc?sB?-RYQ8;p^ z;7?aw`QYX<+m`+D(Pfh>{DXHZcjO^UsD4f%KRIdS39MK|tE4ST|B;ew2DCa*Q9T0r zmg{zrSWCCClhkM){-~TdHt*e46jDo>d&DeDSRY!b-$)OaR)N*+4v4sZuxtWR2zLK@}? zKj`IwTF#!Hi0E7~Uoj_+zKfd-Ey$UDlef)Td?WhZ0K4)9X`JV4!)?l4O2jn1b(&bq zUBeyQ?NQ`MS(>YuJNRMshH_H<*(#VWH<31>+%^}@kmJazuU%D#nei3`wJ=|IT8W+x zguH%1Pd^{{hU8_nQW@PK@`)xN|Ma3Q6Qa^ zUzc)KzCr!1!k5BZaA;`)tSV0O4Lc)$rsb0nJ;q-bd9vZtF7b-ZC6VP*pCoyI^x~hV zn}QwE{;4O)uD34Z8g)aAH1Oe>saVu>e9AgWbDI*Bzo~H5_S9zLEa)F+^X)Lago5CJ;CnUqjew#++<`=h z?)&%m@2H0oxA`hj&7YQmQws4-3O5QvZ}v}{Lz7sqw9Ecg{_=PF2l@%)rmxK7-HT6) zb3mFWSENxNVN^sQG!fSvI{jB$q((_3`>5Lfuhn!DAVjf7QSI6xlEwt85gR-0REv5~ zo8`Q@RO3-1xhgvSUv_^^sY#~lWu@6f+K9Q#n_nkv*k3Etpf!H2t*BQ`>>N=O ztGw8Zmmbp+<*!2*HlhpZ(}D&xAR=26kuC^JR)ofDL`4`c5N~Jvr6IYQ(UGE9Bbj~- zr>#S;rC1PVu0d~={(IO3vo(@fpVmOat3os|!fBiSJ_^ye_ENc)2vWoq&=a4F38y*1 zZ1(XzMoUQM+K!R))nFaL)L_;6k9bIzJS0V;!{gs5oB)>}TXUeI zqmsAxc@v9iepmUPObH$NEfRgNFK}DTFrIIS{zM2y2!@m=2zNJJBY~1s&7~X~9v_=m z<)B9Z?u}@;Hz+*8NBhE-6afLBh&Y`k0aUX!FZ|7q$b)aVFI$ovB+A~GJp{_)PmF&a z@;%ARd`!B~^oJRJks2BULIVVl-iBTh9MVa~6Nrb~d)q~B*d#LYLuOxU9*q;MV%a64 zP_N~$<$tCdkF`nRo5zwo1JebFvMxa$wJnS7X}bWBFY$P`i9B)E^Z2j{OMkYoIss#G zr0BK@LZV+LSIkY{7<6&gEDQm=dBkVuA}$%ythn^L;VTRf!;n+#BV_~UqE8U(_4t?F zj3u0g+9e&?2N`FW<@yYn(#g>=)7^b6XRhJN%*jOGwq^ON>M{LpY=;b* z@s!`=*$O7e``UE8A6YWkya65Kx71x%5O=NTv`<1+r%k79^R$nc$w$3yIhR{^kXh?f zW{avxMs?PzH3D^>+#bwYbktqT) zyprNgd?8?pL-e!2C(AMh0S}KHuQ?wdmw1J)C_of>@eg~&yQj&X(#`3nk)lQ!bz;Ip z48ov@yNLQ7I8w6%!T| zG^8=n&@tKM`1BI6zYoOt9rJJ*ry&^?v2f>%ve6e$W}`I2B32J6K4;ewaPG-K6ya%&zkt`v14GYc3+M@h?}p^oV1m%l=pK{1)s zX-scEQBoA6ZPZmk@n4sHD7z^uNobU`pH>A`HwASqd=S{RfZ|VwNc~X$6|{merb-5q zc8^Fuz85X2{~U5B5fQjZ9I81Ws?jvLd!13PfI}l3XEte+Nucu{7CX>yj=?%0wP|u zAmC>Q?WFSTbtQuAuQs6{X|qMMp%SRyb@>&TfnO8o{fYERGbY0vh8K5_KTKdq@+~rN zYNXrQ5hh|vCW(*r5iVlNtcj0f5hmGK31v5mPw_*-vT zDBjMc;D}^D@x^{Zoi{Rk7dModYI{oTw+wD;@-B0s>@MYAUx9N^0c^6g(M*eUjFQM( zhSYwL$U7LW7c}P$Lif+`06q>xdpnYi_T*+K&SodLW+&ceCqQdxvlEx&-g=&}uLK{V zRd@QaSB}ZgKcuiI6q+G_NTY(-VA0;x5n8S&2TWCp_^;rb-2Wj=ePk- zz=bz)Y|!BJ)*#32_8`;NpyLYJDKZhu79^vAHUs1u7$og6HD?XU`@3H>l@d+u!lX!8OGxFFE+Kpn-%s&T4PkcTggp`#cR^8`V?kZ z2xgj}%rt+#>ut*6Z%l6zJ$F3m)tdiH2RG9!CRjj7f&!(@Z>8~HjDEcsrM?*Tx{zsm zt9fJ6H8oovr<(jP98Iu3oV*0L;O_2j!QGv(xVuYm4-SjFyGxMZ?#=?i-4}P4 z<>TJ_o!@kyIn&+M)qUp7A2nT1J#~yDGceikZL$Gr@&>z0{u15aNluv89NKwYD=|Y+ zGe}W$P0bFk5GK0;CHqFxXgGN#@_#*3+=JX9I$(7GXLh^E?tBV_*NqCPtQM)if}#HN5xcC` ziq}nYpn?HkNuSO6L{96EIzZu5bbB5PqpWstcODD5tTz2qT6B_jC7>MTCJ`jBF4jRb+odQ#1UG z!rxlmx=%576uQZ{d{VVnXnPp)3B955(44UTp-(Ue3u(HmL;59GMPfY zW;N1I*)ZnKRp9lPg_n$L4pmzLD*>6z@R*GGfN6~Jc!I$_Mg|i0Z$0(BS|X!fVuCl{ zdanP9UVruajfy80dYyeuXr0TGTeirjTQ1)0RCTRuO0=+>UC{42<{4>cz|D>B0#Py5 zV`ol)ohBIv+75H6hQ94!@1rh^lDvsZ#gqAtl8pcU9sFAsrQofP1d|w3=^8gwOuTnS!2PxhVp?TQfJekEF^W%wa@el%WVn*V6dLUu!PRLn@} zU4WO5vPVhua<52dw@|7pmUemAY`jkBxRyi+=J+dOlFSJ)dgK$G1Z{(Yhu=)vvxSRE zT}MkNcl;A+vV^H%w(Pi*!d$~RZ^>@S<^=4fDY-#jVlX!$cKh(!$uyG`Qy9riW@Ngf zoO$edroUtSkuc_tIPMTOcDJ4=uYedt3qpluY1B$Mcll znUjx1hK48B?KLMLd+w5}5+OhadW)9TL$oCJa*EAd6R^#tK+X$Dw#(&ViJvSZE!o2? zHp~9K-$y4i#tS_b={k=-MR15LCWJO->TipVG0-McArT)Lx$}#XW?Dmj5Kk7KOe#W@ zJuf*qHYrhnS9^*G9e*zE&eulGTgFU=()#I)5@%Y;C2TNs`ItU0f4>i2?wD6}EEFSI zP5dal_J;4XDNTn5rY#9m_zW6;Mzxf{OGXnUCrn10^@j6e+-FOW#hdk=bH(15g#43u z2K}RK31!519{t@(HX)vxGzn%a*%K)JmOZlH=cT}$J(BE@vna(EMVE?EmMbnGQ!23Y z`!4kR9AM6zOde2TE0)roLRB!4SshI(*RD7#jgmAV89~T2@}0kB0-jt?Ddk^8PR9Ww z8q4M=Wo5z#y(O;(@VpM8d9Yy~tz% z(kaxeoc3HpwK?CGoL`BRY$4-_qH!)e0i7m3*}H^`%%ePmqAuo@S>6?Xd z$>R6?_w^0pBxTA8Ns$E8@viqH_s}jC-71c0Rd?V!t{V}5aaz<_o}(a8PYjrfb~d$B;y)4cYxv4z?V#Y@@?Ra;8BMw&p{sAEKDgs1x7w```xRBB;m zy$Y>OtExuDWRF$iI;K?6N^Y}Y4J)D*K+FoTl`nB4n;=(x&b6jFWV~kKqw9R5RNHEW zDqQ(wH)2&K;~55d;0nD$7cP}> zAq;CTniCDH92zN=$kXR!j2v1ulOI^9W6**>s*+VI{+ihUl&VpWV86+!=OdM{{~ouZ z-z!%@T2>0`lF61bhe_enI8@b+@Yim(ufvEu*U(hemN$n=nbK&6UR{&DA*P2dCoFYI z9*3vT2|BfeI{5FHS-p*!vP@y<2oDh&hF(?UOe3+PwR~UYTIcqHu}F>R$?oia#a?(u z2kL1ZzZ`t(=Es_1tRba_CvGl~BKz^S{|e5QD=Aq5Gt$>|34ztM*Kg_g)1Y6v`th?| zxl-ITxFJ2S`%U*Od4IcebgTXI4L2Utd(@lNSFoPeiM5J87#mzkj#1T)>n>t$aZ{4I zgpM;@bJYhhN~!-+PRdy+rlaa1=}EPc8*}Znhs1>FqBmn)$Sq5IvK9o#+Y-t1W;p%W z(d!=yVSv|1SwK63a~2>&NOB>IdrA>bIOnod=z>uaftWcDzQY#1;(|i^~{i z6@W58ieJ>FG~Vcl=r!5}Ly=hvUBU zY5i%x>ELM;FdJAFYz^iEOMLnV~FWmQ|;z`oq zW0i>01lYXfZvGNyCkTW)8Qk>mH}5~}|Lkq*MGnbIYC*eD*cA69eP-R6-Ny*Y8MB0M zTMXTw7+X@`$E2X*q@o|nP0Zev8Q}4Ez7V*3vsrd z<|NAeB~Q|NBFiAdAX}wSrA!dNn9ThbR=PNb+U&jci;_ZCA~%!0)GFb2C$X2Y4uP@H zDt&*GH31w?nLWjNMsxU;$m-7DB5RttAOEIH^<_G;-39fPc;;#wTkd88sp&U1W2$A9 zl{`wo#XkRzH`z)7kE7L&3MA=5=_4sZjEdpexkBuINMn2dXiAh79cA;N?amXxWh~Ts zsolSw++Ke4#~kazwUk|wuc!IP$Dg_vlgJBa`2TpbIB5)P^~2*Oab$9oT28`DpC{m$ zF_P)!)+ahC4tw`2;_1SBn4MAY>%4NHm=lii<~q~wDGWaYvNntF)6P>AdPg=Cb{;k4#X7Z3 zwaB$owf40+wSu)!wF9+9AvAh9A(r|$a4a3Q9Vlkw8DX|o7PPGN|8g_3kH;s+?krNx zHK7QCpy2g0g5kr>V<`!f_;Q`p4mFNk*>%}1&6^Vigk7Bv8z!+bsyLR+9VXYsS_NHk zcDg5nGl()q;FK+Lrv;>Mh9()zwmuyzT^B|kxMS7U#=l0i02?SCm22nIuCIFH8~z^l zs1F{fx!bvC4(`expwCy-2Yo>mGO@t`ztp;f;o#y(wZ5~d*t+F6 z>Nn`O?lWme~AZU^rQ4+m6MepC=LE1 zn(B)))o9v9jl(4D4h3UgBbfYLB1dpP(uhd2mxdRY7fz#L>3?r)D>7G zG8OC)c!fjt{!vY|?h1Sq1<8JTi}@_0!G++c#!wG(Wk7Q#(PW33yOx@(yMl{sGX+1_ zT8>^uPTIMA?LL@lEl)pdL%1ko$^Ie#jBI6qh`&MFJdP?mUT{UnbY;pnps~ynG=1pv zgUlzWBLht4Bl~c3mLfp2Vyh=!lVI@&v?GxL$m(pvg?v<{f~EgzZmT4g1~#YpIoebAd{$`p`OP< zI*{`(nS*m6CS@y;gWU3$j_h=6b|jy=OX0yJM|N|zyR_DHWp-06gpa_5 z8*E3Bm1EXO0~VRy$u8ofK^Nr9;j`2y2a8P~WS_RV)b8*m6J!#k{GwjU&B{Io@#HCD)_VBrGgq@{r; zZovzO_aK5~9!f{g&GOEAFN~W{KowXKl$FE7;}|q#jd6OLN~x){K4wDaHF2wXSaWb7~&N#yl)J92=LH<_0xJhhT2Oc8*x)A<%U z?fPv0d>&GDvqa4Wb{ySOXk`kpgyarJyg@};Kz81Wo@qW^lAuzFYovX{(Vpyp4V^W- zSH%7Q23FL*>wHhq(>7v}VRpjW$Mi%TN2ts&#^%IEV#L*Btu`|2`$T^r4C5%!r)SO# z>2>8p^H$|I8Fdf!B4R_OeFc00xH3SWGBPe})eY4b8Ts@vj}-j&gNDVJ`W-9LwXM}R z_WR%0XTmFTVMAyDLc1q*1}aWvuhC&wsBtJ;Xly_0XoZM}u|Wao^ALxnno3Bay0tD~ zC%>Nz8rv;d+$!@v6M}8M=EFec9u==?Jtf=9#+$Yk3TQrmQ*gSE_p8{E-^1TFOlXZ$)*HY zHk=)^S~fbyI~F_oI#xQSIyf2!I!1hYeU^RZefrmAUm7O-X15ECB`KnZF=JRVH8`8fORO|i8C(M=8w#KQ z@@RJ;?KU?_<1jJnq&jDNtQBHOR(Z8B=>Yz+H3k=H&SF1i7M@G$M!931GyKq+SN+B4 zsy{nc_)n6e#&6}E1dJ>r#ITdzE?~exZJ%PFg?9y2v`uI@R6Q?Jv4zdaSvtsVA?ot#Ryf z#CTpgDdIg|J72rx-{;@uzu^CgdBDHNf7!9$p~Dz;Z_>zH$XmOtojrZ4d1fp;1f4+; zEziD$1;AdSG2F&A5FqV!hl~ES6MeK4Wv}73t+si$B`(CTF}MHj;tjd#t@-LkgWFIr zSEy`Sm+#B49v%dY=a0qS!g#WRa-n=ueo!LEpUeTgM8BY%y@7}Xoa#jCS9&o zw-0wQhH@M{u2*&u2WcY!n1;;V2IRVoWfC0$wW zSN#W6xANFNW}74OsVUX8+UM7))eI{~*X`4(b_E+=YGdxJ(bm)Q?q46T1(I>8VC8=_ zl%^0e@Es?}E2U+-64hy0jSVF-REW#9%Pq`p&(+PPt4UkiRCI9unFpM()G(bJ{wV(? zb9^vv0=R7rQxf&qO9e3SZWL{ zfxS7b`QA8n>9M)`cxlQMErIl#aF?CZN@qi;xxM*$XH{wqy{_%`RRgklR?r%pN9s8p zzlwY7nbk^U!*oNVInFq9nm$X~M9j_1O}UGYmrGlfK-s#kfrWW~#lS?Bdbn0bY>Ij^ zPbw-SiJiIE!N9mQdMq7Do_Fr!%Z;qH?L=9s@;I*ArkYSyXOpl0O61MZ!NfRoadz-Q z)Xl=d={QfSBi)w6f%e$>K}X`+_+ttQB{N%9Cq+rgo7VGKGPcd*uao#2*8`jmU6vlT zO-VnI)P2BvUou;PFoZP#sbC=QgvRBxtaI-2_Vv990)dFe5(z*-$RIlqRcwIl$^pq~ zUOe}d@XA*9&V%wJ=mB)ka>a7Z(sCpEA@_m*;r&7Vq4|Mw$OqYgyhFs3)zvM|h5r+{ z5Izt#J(z&p0z>;ob3kIQk-FE0=GEWvisV-Xt3$q#->>V+n`7>oxn%rOXHL4R%g zrZwhUQMj2YJ8i%K^ChblfF;f#r2(wPMerhYG8syavbLte;-EiNd646?8|sV-#j@8N z)|o}ogVxI;{#j3U?mcuEWxp}XXYufBI4TFrhaN@C%Y0}jstAi_t_v#%%MxBzITH~p zt%k7Cgw~1BiM+8j>J*s5K2wfV11y|OxEYc2F?T76W|tl(XKlY5w$sE)1omDP|v%TZNDMTqF^vasK?x+<4053L3(7p=i}lg>L%-E?&fzNcv5;&us~5M4T!7C z)e;Bcg)I!v|FBVaMO|#Sy|wXcf~>BtLYjhY z!sk)`5dGwDb{BJWY)Z1tvMs}yuFcWy$aj}LzgbObvb9-Sa;V(U=_qpdIESo?H%Z&X zE#+1Us{3?5sGTqTP%T@^a6@x*cAIX$`=P8asxPZgW$d>R*k0OR;6`yGwG>m8rS+M# zUT65a9na16IgP>YplIEkn&E14I2SE#W$Ur}w&-gnQGIktOBIJe{pw zA$8%Z?k0c#gVdLyi^CW5`_CW$r9V|$T0JHHK57B|`XR3;sEZ!+Bvr!N0qqdI_n~>B zd%#Ht{(RVWSY22;jI_8-a0l6+zNKx)a{Hsa3wzvo)?#DNf%33=Z7O68eCj1VYb%HJ zP1X)$hk@U3g2?jtsp?xZas%UGT*#*c++23{%L&ev#vTLy0MP+5fcZc|*dB7(dTba6 zGI+xaISs$I{T822*>Rp=Y8bA+bvS}ixu}t?YxbX3{M-)Siq@Rgiq;lyetm_r)n3H# zY|I`$4Y!hY_9AbQv(m=SuotI%NDN|4bx(aweV6mkz13mln5>L0P6yM}xzfU&Te8;6bf z^3B?ony#2FnMSu{^j5dT=*Oa9!2?IXV);FxPsi8i;jAkGf)^h$9PM(=q8eCI)WFR| zaZ(GADydS$O4#bev0?t zat~cuFXV`)qcS2*ivOr1sUvI}E);(JVu+I{psGtsd7ypKC~&<74{Vm`-(sue0*({R zDEu9p8D%_O(zc*%gK~kjV>e3r`iwH)6?{;umS}19SL{yBo^!&gDwAv6e{pnSMxb(b zvixAxER_k_+l6FCLYa8Mu`UMUn!3`sKIuQ-u~UZElxf_9@lbDdfTb5Rw4epF6}q}i zMUInv=9j{pFePh)O2w-i3xvSDigwgn0fNAW{f+;Dq?-=rFLdk?CT8p;lyfB+2-t*| zcFt*~oQXDL`*j(%5byccqc!L4B{wq4Uu|>o&aI`MmwbOBSo**}Dj~FR+R+Ijzi#w~ z=fjWa^AFR8ngTC55+_a9r)0R-tH8Lj%6>`hfjgb;#ZGrlj2F|cM*~`aTeDwD%bZ9g za5(?XURdYjP{{R1bmAtYb&VN#VrcpB>{a&u4B}_UbPIKl+6Umt9_swpw9d%DQJ;D- zq>~xhUiFuzyrzXuZLEqB`E_=8#~v##$1FGe=T)P&PwLsD%U}}EfIr8Xu2B!(15@4B z=Rtmx(I)q;Uc&mdIlz2ifGQQ9;qfpXjkn=kU~sgR@tBm(u3STJ1p{vPM<$V_=S%tF>DS}VLWPx z8vS5(e7`bn_A${jXq(EN;H|H~s0=Qnb z20cU-hq|o9HmK)gL^ozLD}oG|hGmd1vVOr^h-#K9*!TzBy-bB+s{J~y1#mQGWUnP20CvGo zNteG;-#PX}&|jXZ$#({Tb6Lx>|LQF?O>_UT(RdiAMs0(c<%6|#poKlIab*v$H$!u` z!ud@`h}uve9{V7w+t%~#s7*>mi+%zels=@e;wWLh{QGNUs1(nLQqMy6m}7<<Q?#f9dgjKpVa8_ztTsGX&OkrhVF>TA5Rz#Cp(#mNy>M(j z>cH{_?klT*p{&8T4DgQNhYd-*FQU{h{uY@` zE=to-+S8haP}MzRx*qAge{53gM2XKCL`H&sbt@rNKG)eOy{<1Y-oh87?~DU$Jnf{4 z99QB}#{@M==2D4|qMNYK=A$g)-6+pL1TY80*(S6~uFnh|MRc#z!J_yZTnBs>^Eae_ zeI#=vG9kb@EcsxeNhy-puOO&DR^cmZMS2RWA=(RUfPmRelZ;av`FqMlj=vL}s6T-& zFsnaj!rOoi|9$A$+2hPnhi?EEWewveOox_Kpg7Fm?^Ry_pg?78Cx+e32Wox&Uc9JQ z3+wF<-r*b8I^@>qOQMzARtvVo$vtmif*J7=1@J#4Q9X6k21_aJT}{l%Hb!H{0xJ)! z7KTtA{N+3VYy%J*P)L(!iusQ%3dF{dXWL^r*y%Ujbfk?NA#|nwMr(+*WJke^&ykpW z!(XCvT3F?G{cHZZ>)-UA(Be+6g~(=*PiBx8vlt1x=e!MCQFf4<3lT>ELTX-NEutHL zzOy#Ir%I5=Kpdj~MHmT==IBPc?Eilk*ow*cWxT-D>-VbyEbAYr>hAWQu=>K58!BA5 zL1HQq(BM7IA?w#I@$kEm_<%wn1>=(uBC+0tNaRjkC#(wA*$vOa6R&nNs%nq*gk2y@ zceaInSt0O^zq%KbDQO?}=XeFx8ID@irow|gFtJIRaW0At%J(kCG;HNYD#sdIbz;jUiqMZeWw4YRDwG4DxXdmyy= zoIYA2cma=UFQQgFzi1Qz=k*q=d7VnNMHWMgQoo6@vqt#h*Mik$c^TS36}K+)278|kxV?gqxjo#a!dTn-B>6NXf$Gj1utAUYVauaTjJDKGuWS_OWy?RE@146V zi7dN*;nxIK&7f#~eTEu6GZwTI)cNL;=dv$4!H9Qy?lWo=ZmY^Dj`8O`%zJr^HlP%> zu-)wkxD8R|5o-P&U1$w2G#A0_xi2GPx1z$paTc3)$2hb zNnIkVQMcL8E$Wad#;FeYRPrfEG=br(Pos~fg zyW+H2lZx4v?l#k;iSy{Rfr$G9{LKoj**NzTFa(xB_XOZ&i6mBQ869lFBs??>HyA@@ z^j~Cpmm?pK#z#blD~s^ns(xoc#Q~w)z4G$#1NYhyXh0cbZTY1!#(|Xm1JCPDbK3o0 ztrKSz!Evdc|4|z9lzl%OX!$dGq$62a^pCFBL5oL{a!MZN9)8?tX<-f3iR?vV`|nGB zfyo`34eVIohp*L1j=1L10QxOaU5s5Rj6xNm`+XRSvFqPkZ9^20{m&{M8%`LfHJFJ7 zq-;Eh?wzV8%X^OBBWn~2z5QA}9Q7hULsoFm5eQbXg3^G~r8TB6U+QT(&Vv4?dy~oj#(x|vFF<1o(t;Yy) zif`E+JD!EF!zSdZ28C~2Ibn8n#cnqD54c{+A)2-kSxIHNnN>U20jKlEMnZg!^E z_to7MN`BQgTIfOmk>}I+Ks!R;4|wXbC+W^#9$=?rls6&xc@p?(nOm!PU@iR|(Q*9D z=0jtwKG5LH!02c$Ux5J#7zLClNh~R?RcWb)G7|K~>#~8@HE|j1v%W(xNB3+lPf*RC zQ99Kdj6d3;I9y@Z7#LQ9nZCXoMn3v5%qD%kA`B*eVfA4#dMKRX>EurlYIKfmOjUhB zstE{7@JG!)q2A5`x(MylcIr-#$X!*DBph;|^HsXRpK{}*(iyR|7=P55#0U{KRsJ`5 zi}5f)0bTNt0}|v%}n+W`nlEd~%RocJx-PC&3_Do)rXsd1SQZ$barS$b0`z z@X3W5!?(;2oYUv2WxM(LOj76dP48W_?i!H3M(e6!!T*O8Cil?ON_Vbrrc5%3&xGO+`TFq6xvVPS%GV{j2fpy(@%*zDT_ws*96A7VIO!b63k42# zEJ#ghVme2l_*Rsf*Z9(l25KgJ7nnSYy%`B`n#L7j0GW8ne@V!yV+29B<5n;sK1b%l zP3V1EG_uMKyfk)eKW$Bh0?`Mu_b3Xi z`v=yi1>?Jr0~D!UF_z#DCr!6p%XD`9VWz7vet9p1tu4G60o>LsUzSW>p9K_`+T!i= zR2M|{(1KA+hd!dV-|HWU`w+nQf2jq+@(Ic{V%Y8^nj4;fU#E}{HN5oSh)uueLK7(` zIgCY^x(mdSX%dQK;+qnP-0%SD8;rcDeJz~ar8pi0{ps6KY|2^`x zh^-LzeDw#alH$|4E$7e#E-V?d2!VWcD;jaB4_#q#Jz>_WJWQD0;rVVPCcS9(Nhq2b zgAYkLCuT0#-_u3|U&OkPpCO*}0UEqx`lFL33yoQ+!jY%KB+Pz6D3$DfeFQ)IhI1N5dw*Xw9G)H#29%9$qI zCS!`bBe)7fxNO>2v7#@452e=Wi1hWZSgf-<5PGYry-~ksN;T$CCm7|==gu>?atO-1 z>;rMc|Jk-*1_0*_7HKh@?uly>YK5vV%24Q~4w#i=^Paky}?x`^VfIiU3;+p*3E$5>g zyrp)B@mO6Cl&QdPG|BClUHx)`uZu6#FCVxs0Vt_sb-xNP%>20*Tu&GnbuVF>*r&PX zr$Q)Zz{-r>Q7zF!y(yk+&EFf_;c}IK?=9S9@eG9W`0N#|AR}*%9zXf3ykkA8_#imK zU4|aoLNsMw(G{?^2(9x>m165+V6baIUp=}=6c%0%e?e{Dr`%-8p38PtjSyJ3K|8`( z>RjfL0kj=G&{{}B&9m;qu5>N>o7MvcLR*@oGnVkOdR67GhF#b;jZs3ueQz;sFJUh* zx%vM4mO9(~2_4@8w)&o2wtYf6;@_`5TsxpHH?{qdJV_|-LsU+FA8h55z`XCx^aOWk zPSSP-YkPmU--r~d79qJn@}Gyl`?~858_Y79VBkwMnbugZ` z@Y{nD;tL625hJP!Z3LFTmP$D*-#18kV`N&^on&79nm1CKbI2z9l|O`MH5>GFC~|f$ z7Vw`p%iTMg7X-nVr1Qc+k0`u*N@6Q>2CQ+ErBVg&=uI+6a9mo8PwK<^{a>Q-o+zd_ z2HLUW`T@xA!UX+^N+--Y$4L{wCdf(`P&K4~R=v=>m}z{brnQ;E2N z(l5D&rZI0GlUKG@?_4<#eh2V5TV0(Nwqd?#UAyfVDjvAISFCpdoHMa{5aZ6EmSCy} zQ=cw0!A|J+gq1*vEj- zy9GgDF6#}(fODLy+D3|I#H-$Rw(<|e#xUZWOhk(o*#1H!g1YG2{eWvC37(-8bN!C5{Tk(jqB8994d&MDp6s4b`@+PbbiSVF-9c&>=0JovA+G0L!*SRn z{}`9Q`&kXYFArqokI$Bhn!i#5i7>Z9349Ltf)enh$OnhQ4@xi(clo%r#qo<{7=+@g zD)Q>g2ouZ~o-)@y2M1e(nr9jYTa?lk-}B$v`fxdQpeu7Q36JM-()QoW-T|VSPLwIU z#R!jH>!tr*`z_db?YTIqIiz+!{_ah%aL6eafjxr$p^OkI47P^p^5eYJ1*<9zFF;x| zfjT+qJ6oc`JRhsDGj=dZ!Z1EWw@ye8mL09A^3HJo`Rq6->qTxYQ5$u=1CN7X}mJ-E#TiPL<0=I zJnF`#@O^W=;p-;Z8kTuWx|~G-nwR$TLl8W*B54XSl=Z$^+Uu|hN516olBg!I9S4N0 zkG;?9wXTliPu(*Ka*eAw1^2M>s9d3BJW%Wxrw2Vg`_p|G5uB4PzXj)c--~uv`jsl0 z;&G#zaCIYueUQGreaTdg$9pHef=S#;0*<`0`Fc?M#dt6RuA9$Kd)K%f{E&R8o0Y3{ zV&FzQiOJcZKv#_{(uFCM-L|U&)gVf%U9X{&tr5A{K!|B|D%{_vdhcvbX}prSS(Abn zSep{mB0adQnDYBCivv&S ze4zc?hq01d(43pJOztt752e~WnOd#-x$FJf<+wG3$;l??>To5%jOgLRjM7e z1E!@zbR)XFDa~9@KdfG_SLP3SY0U5SC>?PX#2z;(G@zfq%@p@A7w+ROYvCYEfiTd2 zGqMV=)tknG5&7DcS<9ALSagm!hT=>2UOe_L-7ANt&_z=_@|IcGSG+CI9Kuf3DJe_8 zOqqBvP^&$bSZI99fNu8fJmrSE``>eL3UURi%R?n3!+a3L-Ff}MDrX;rHHtUo0DMFg zh-*2PoUbbJbbUe}#tORUBf3%kd9g+cd?}kz2rR|Ugr7lb=#E42WtpsJhIJ8^2z$rv zh=u$T3;6b6%juu#KuV4!zSYO3(%oN`$=fTw{HW~@y#?xq%JO)66idmP39t&G%MM9$ zn){>JPU=Uc{|PG|5StLMdfKXw2i*3QkUAzCCT#7iTO2&@KOUg&qdb?tMZVGH5ixuO zgF=5&N~&^70u+QcQb4Xh*WWIQXj9~x)a0LEqYwXFU;d|9%pN-aS0rPWqGOP^{YPjq zo=I#v4R#dwEVE{0lS%M0V{>GVNgOXJN_5d~$PuRH5VW(lUYglhyjThC7&DbTGoAFO z|Ec(3%caR*y+e7srH(0^{)vDOvbiUJ%8%WN=8K(hqfHQC81Bd&VO(D-@{w&(_1%T~ zY1`4s?R&Sf%wFgCcwkAF(Z7L&ER>}H+W)jmL)PVA2=V11YI}NR34heG58FSz5ZXp$ z-H7+%54KxTy)9FJxr1i3wytZ3+ohN)CSJJH6D};jSzAfTr2eKxSHh`;qp{C+njy4| zB1~X;D^$~nmYP*wXLP`5iAFO?#$_0eh8@(ncAX`+h%%gcV?md9Ui_q!B;N>L8Y0+L zy!NTrJ;RYcV)msJ!VW+Sz`z+w+l_jX`Ze37Liux!QoljAPc32|fROZLNGetN0LajGy!dpt5{Wewz1YM0KW-C+4dI;Rq+TF7veXwOm1*;V|^WDsN)B%4aZmYXO6 zlrYWN&S_d_{Z;qYU8Oirfsl4F5X~5J>b=qMgpG`HARzzQ;dqm3QXK)S;}^y7$8>YpnvnKyFmP}sEdm`VypMX$|UXfU5fKSRLD_#N2hX9MZJ&Wn)I8Vk1t%;j9sGH=g ziks$OtT}YH#63lRFcOv6N|#`$mHkT1O`n)^(@sU^(};aZBk9Oy?ARw2Ef#~qm7weL^b6F%)~$iho2QY2CB;??eW2d2GJ3)5_JqQz>la|_P# zSp_81fgD7+2E>q*k)}+0n{!;Pw1{2C`)H1FVD}E=?}{08gcCO;(@2L zJnDmR+So3+@u8Tj`0eo~ryl_bJ0AcgvNMX}x(cz7CY21yk`#pVGvnxESG*J~4NY}z z>Gl{K&*k+xXk&SZym8inF~h)ONDb;5W;2)FhzG){d-ypjzr=yevU9S!v1R}CM_NC3 zT7PX=w3Fca+0UmQivGR+9F4gF!5!!ws-2XNk~&4dr@*VytAZVhav%yxI6IrK+!H4~ zM?Y937pI%Glc`hC_vh2<74lBjK+8S-+ZO-8V+aYHFroilPcp_%&XqIw+kfK+SEpz$ zA!um$w2ab{%M^(|SP(~mgi=Ua6obk*c_jt@M|i(G6a|blQZz0e+abTX?_hC61sW4t zW4F2v#i2Cg#m`j9>ZiQ%lL$970*Yn{ySU|hl8Nq!U|J%y5fvq=Y)IaCTSPP(fV>^@ z2facHMmkJ#_)U2TEd&2Jc2fLW@)Mfuc^of=_~6;$`9e<`OCse>xrDt^$VNm%eSW4K?W6vxX;yWwkXlMHNPx*^_(S7R zV(L}d7FGyb%{tm9P6w;$A%LEskXzb5dUZwpL4xRr&i9=)rAU>A)I%yKrv1Ac---8M zU~{*6Va$<=uaxB4hplX^yChh`=cB}5``3L>^6*j6hbD|PYBVvPAhoyeUGY)HEYnjq z*2YWT%WXi)(erF{QJUnRrdgWE!EazEW-)6k@JWYR(~F6J>J zy^RgglO<9cy-~ozd@?iro-NCydH5`1g{V>ZP-PNr&>i1(@;Y6e&C+Dr)i<^c)0Ine z@TA_t?%Rk-?6Ck&y>q=%Y)<`g{S|@kcU^Q{JY5og(q=k$tFwsZ+4?;bnqj5L9Blqz zFplddRfQ`qKaHLFS?6+SXWUTpECeGRy!@c0d{(*KbOyD=J?Id-f!&ex_!-FG{3wX< z6tZ<8NL7d9)Z^(0+`#Z5eQ-LPUB;--*?7cz_;vZTIg%UG_1%Z>!8@DKaxipQvYvTb z$>%9kWar)c(PNy>)-YDS)Gy=FWHY$qaW_Jw;6AwC&m%6!DuoyDq{F;S(($+;5;+0i z(_3O0w?Eg#^RUU_bD6O5YL-9fWlgf*75^x-in=#WPVL;+e&AQTK<~WZ9Mj3X2Q!Qu zOMuOTev{sM?VPk*YBHtv7GWEig|&pwL$ZWD!ZZMmYF%(X-Q~VIWJ~Y?*&l$`+J){r(G4l=_)Q>#fZ5_JzG1>OWtGN^c1U=2Y z+x5W?O?h&a@(J+@0biH(NgnPxheihZch&bcuD!0iJp+90eLtQ=*Bu8b@x|ZbpLVW` zc1H>~1ENKP{D+k5c0J?#jajlp^1P})u;V&Rc}8|FZUTndKPYmCl~H`T)!zs|KsS!g z4Ib6|Ps>CUK11Top(M=(wgRx%|B6NiL9uxgkG%e(Z|KC9Z#PdV*S5P$BaTs92~^bn+{Z$p2dZm-jpOS3Qr4Vw@<9C*AwTBMiv zco$c49)3O8J}x7+UUAs4)B{#e&!Nr~9|{P=&neD|&iBqR_`+N||0>rji*MjP@Co`x z@+k)v^#Xcf4I4p?EPq>8*4hjOJDGct$$f^5k{wVmwu#RWg)~=|R(Y0riVX6F)`A_c z0{;0Lqj=h_o$(i#ZZ7M$dzoC`2s?@1)nxs*IGU1=bxBN+y(zQX&Iy)!N{xaRh{n)ev>*!AR+y2`Sm zi(wR^pTUp8*M?+&a}?7SQsxnNYunVqQs#uD~NTsTNQU(!# zVd1Ns|KrXJm?|?QIrHB{|A8KRKkAF%{wTYw@w9R(ghr5O9GiY&IkV$byenasH?Vd4 zHtRZ6X5zv?R!CdDYy~JXTGg*WPh$NPjnQuynA1mo5u5mfK&? z@2s~s-WS|y6EBLsfMl$R{Siu^WvtiYhQtO1|0&1yevMRbF>Da zPVB^C9kBVWzzxHq<2!F;alC3zaDs9o>6DaSOz3NiM*Ja@Em}{{hFto zWQF?XvZG$=QIvxSP$pg*qGvs3S8;C~vlz~$Lt=$qAZr$L!;_lQqs?ykb5XpJ_~E(^ z*kU%%RlxRHtOHAfxLoKbTq>zH093TWOL@%-e2sG&1`NViPKT7N)i(p_nz=H0ixu->7Hf56?v zX|caFq6)5r8=MCpvU8>tv>|~Gu2fJQ4{(nOu5Mv$?V1?ZY?$x>BYP*Fe|N*qn$4a* zzCeTnKTwSVFzg(Df0WHEs@JgucO#`<7A|(ou>AH%Gh2to@(>l(hjvTZi4PwrCE`Ah z-wJ!Hw@$ zL#8l2q>tO}0OC9PJNgp{n%f85v;3%Ge>dENWZfs4fM?*)eR&<_o%rZc#2@`8Dc(Nb zK7F9=v!;@)zwF+`x@e81+Cs@NeJJ`VxnN#GV*K-p!Vk!xVY#`pHa*%_f6= zVFU%Bp5gAKw_y_`L@8&l2CWw{9?|buL^n~rgw3j9hjdW2!Vwk=E+m9=;!Vj$`e_!M z!D3a41eKG4}0 zBW-Guga~PrlKYd^FItlKE4R-ZC0$Qcn}=g5Pnv(L5!6s8dGBq>{*z{)i9qL z<=$nQUYbLRfo$5#f|^It%io=d{!;xQnNbh%ZUXMSfkW3L@d8xy72dvg&Z~92h;W$Q zg4|H|#+eI0t4E<^`UkBo?qh=4;wOK=hw8^l6`M~jSz0H(pAC6JJze@90r zL*EIDh>(!jkBjhpMk8ZE`@GQ6`EOryFa0b$+_irp-y<7>{inUA*FPTDT|r%-Nx?^I zTrixiOGt@tgtf3lz~Z2VV)b72v-8ViegNuAKrm!0KOi0=`r;~~J2*$<_= z%fY7rH5UcB*h}Zb58h)M8R0(O>}y5AJy*>J;zga<1A{5m=9JbDfqj`4zPWP- zSwq>(oBt1ZK!?9zYk6S)HuHBrPyT$K{=4YEi)GDaS#w#|c-CP&>o$vZn?;(d7avzI z)&$0%K$@#BORv6OVVQ`cSJ_)GF3Jb0b=B`0qpCvT$v5c&@x-HUWD=Chmm>?VDX^g*V* zi)rs7&G@E{{}IOd2x+coEUsrv&bcP%T>B~J{}k!Zkp2wo&$WufwTkm3=_g6gBR!A# zus2Qirb$kkEDoEMS2zMb`|S(75!hO|EtWWKlABN`U|ALz&KptTU_D$n7@zt`?%)uam`b7 zD<$ey=1-}1DAf+@@38(puD5+$Z`-Gt|7p^k$8FBz)?ZoHU+K?&vDq)q{mkcn#^K7= z;>y-$p0-}YbEI1w=_d8ONj+~JqW>ZKb6sI_UE%zgdH$IBEN4E;Npob`dfoLc(%)iy zu9F?EldWf&=d+}#uPn}?7Uk2@@;QxZr!nn+GwpxVKS2KgdGayxS4&i#w*6TgK&6)abj_*^p zexKr+%Hoa9MfK3`|Q)}3mks%-SGtzW1eYG<9jTSwKO z)Sv6@;IeCWZ8fXeuXWo6`?S7x!TzjgYj$Vtu&3MqX+LJqv)9|t+ArB#?W6Xe>{snG z^0u#zpp{3|ag=!$<=I9MrKOA}Mswg+Mq8u3cIr5xlhM`a;kn*MKVzUV#299bG)AK) z6OAdxL&i*F4(hPTSZ1s=))?!Jjh-7#*kWuqUiRD`W5038IBJ|QP8;V;W%|sJ83UCz zo0=`m)}Y#%9n8*VH?wDrQ)VBtzd6XPFo%1t(i~%sN4!a_C+fv`2w|xx2d(^-Wht>C z7W{rKg$CX!^I1 zRMt_UePbABIB`$re}cK4uH9EJls0P{fA~N%;cUX*;mz{`>nQe_fvb) z?X90k4ve1@e@t|uW-LrIdeEG*y_i$-MK@mllT~Mdx7wQsZ!iy)rxTz5)WiP zdh|_DvP;e|uav!V7=1B}ypLeim2=d|n9Gl}k?Jmtu7@$QmSI#q%~2&|DnF9`q>f?q zxEMEmIbtd}Vn%bsL}CGxM`>3ZQ_*R^%_yI#2C)vVq1%Jfr>X2dOxHo$Tv zc)2)bWJl-ZM4`Sp*=@WbC%gRyN)MPX3ys)94`OI{($A6J%a{{|HnPm2B|~3is&kC< ze;B6){l8ED4y0Q%)JOUb(%)pvPR#AU81ooI$CKVeI;QJJpF`Qj^pUjfh=1$O zt>;aX{dU!Rd)xlk>}|uy@wc{1{H-r=?ff15o&DYXJw4Y4-}=)Hy1-TVhx;o%H^x66 zZj#(kU(ZeTPnSF9_6r| zS>xvV&(yelzH={d=L2TIABfbrM4-%b%`R{){Z)ZBo+}S@gzJKO)^maGfnI^WfdPTR za6{=v1V#am4Ron-69SX#JMg6gQcpu2W_WJ4=jH_#!i@k#8gNSkD*~%)+~B~vyz}?; z^4<{GT+eL_>_p1lHEv(vAl-@vT74vNJaDSUNvs)xv-Mmya5iWM^~Z%vY5!o8U~}MB zUhZ(gw!!wnP7S!O!5+ch!G4sNS;2v9F^|9;!ts{I9=S--?_L&;9zlU|AFFm#U1>W#hr`0 z75DVdE$)N*O)u_WJgB&$czAJT@tETA#gmGs7Nai3vx?^yFDPDIyu5f-@!I05;!UXW zaMbcZ@m7wpxy3t*cNOm~K2W?IIUX)PhP-6VvPFzJo#O;8Dn98SUwo$ce8}{-4*B7K z2JyOKEbRzIKy?l!LS?|sLM=mWLgk^3p)MTD~YX7m&I{(Sg297R_ywK**HcwJ_hjxZ` zhxUaI2HnsRe`V-+zzp^XEDW6roduWYhq7Ti91OdV*R#P+frH^xxJkHq;8f5Jw}NXM z42IiN0yn_1uOwculSqv8Ranw=4fhE54r~bbL&(hV!0?dpu<*$6=)msqxR4p17@iV- zC=dzH49{VT`Qb(3WpFDg;|C!F;=3liKD-g7ZV7J>zYMo0yg%4V9KsHTkA_b`R(tqo zg-?gi1r|n>$Z5nE2}NR&bfjsdMWl74U0`;kgMWFXGvrYua(<*+q-Ug0a5N-zW?)04 zKjh?$e@AdMMqF8B5ah5^U{s_cGCa^GQi%~iG%z?a26|$0WPEYA$Rx;E#D69-6?$Zp zjO)ns$gIG+$lS<+$l~Hv!LE_z;B^(px=HOcII;?Ey2J>y@t=&Wg{DG(XbJXWiiSb2 zM5YHiMydiUBAfhkBU|CW4)G$W!NSN6Q2xlS$X?X(K;&@bSmb2nOyoSZV8^H_8ZhdQ zMgoJQiOAk)8C^5zxv^T;h03BWDKC)V$brD@XdBUHzzZ3(JlZkZCEDG8EV9efT%x-s z2M+}gA@)M}peErS(O%KMa08-)qeBA+qa&iD;6{Y9p=@+)bb{z4f4Au5;=R#n2%Qm~ z9Xb-77dRVT7+o4&5nUZ@6&`voKj!V? z=3cSDsM>woZmW`R{vCnA!RE3%8@NAY)dfsM&uuQww)&2YZw(aHn|twucw&)t24ZHM_9GcmvD!lU1wTTULyA@9dL!0~n;&y-H3Z zJ4<>W@fRi3+$#Q7ly4_(#K&k(dNgxrtK_r`u4(NL2sS$76fv5I+y7}}4u>LWDX_*8xcZtc$E-Njx_pXF@J z8q)2=-<(6A<+`O=zWp%OO1y92EsgX#me@;bg|fs->AdNSvp5~@}(Ra$6gE=x}e4Q_}<&1AM^Jj)75 z>x@YDQU2})TCHW;S>)UMq*nTk!`MuGwe+kpU$;6-8y>I6C7)^JRV97O*%vLdn^;>p zFKLa?<_6L&iT%Xw1fvccNN-|pPtd|sY|+y^(|nRJu)|YM7EqEC*(EG%G-X(B zKIp;PD%SA*S+Oo1p8Kcdz&5UCs{n`7N&bJ1F{LeivcDyMg(bG8oJ&3rX1~LS zp|@sVB`ubCHo3i-aaJ+@QjN)z`5YIIG4xU9a2;FpEtYkiK9Nvzu-L!G8pi(#^S_;S z_Ir9s^k*lImyHs~q9i*js87lnX98`u$C0=CcZ?>KcK&`+w9lI_WMoA=J-m+X+D`2) zoSehbPt(7br@ghT?q+)h4`G~5+4)M&wHZzM6n@^w9QrWMa@Ju4eOfa94iArJ?~f+O zc2l2>rVd$0U9_0>7fZsMDSOKW8?z`6J5)c^-=&V#zX-LX|75{x8?|UGJCi!|QPD7* zxw=vhY-T=7N$(-v!T2YnL}w9kIVHA?GhKzmhm48j`&i08k3Ubc$LDZne3IHsYBG>I zd7Ahr-glz*6R%}US5eQmImRCB;%V>BOBY!%ub-S~_;%v2@lJ--! zT~0CUFW5QBJ8af5hdCU}mGtRCzC9$lL2ErtUP=ERC7wxHnn-__8fG#jVS>==A6zZ$ zq|ZdkK;F_dCYG+@&Ec2SdzP;MdwvbXs@ol?40i~g!|)twm&iL#qhKUpG+^9CV4??8 zJb0*)FcUDR0hsT>BEYgn!b-pz57v9I(St4Cb35Q=z#hQ<2H+6jXd~c+m&a)j&bh-% zR6X!D0HJyidlQfbG;IJ{09rQy?dm~?MnY#mH$cyeKpzkKdoZYxPyrbJI#3B1(?}Q( znB>7!52kxC%X`iREC4J9EN=i-0oFDGssNh+TRqqT*i{eqHUJ0e!QnRn#{efAfHQ#e z4M06!$IM289}oc~E&>u(259EdEgK1K+y-Tbc?gsPIyMrz0J;mrdhyw}0P=ALc+bIr zp@0zuWfj6G?>V*+Faa>RUixYEU`7Kl8!!*B5U|vHuDD2jE(WUs>l%O!fXxlSwtBF$ zKzA4F+q|yy^jK`STcclM``kMEqeeyw`!&z+JdX|*)cHu=I@RctLfOoZUvF&1j@Qb3 z>{MNuW;tg8S$A061_S}Fo?qfA?awx0j)*tWb4k28pcSAkpgo`ypsT0b(cX9uKyR1& zIo=O25C9&DE*70Ge25QosW0Orb-r=TdvVNham;UVDH~X?_*H4m{%#Cr(b8(ar-&m0TsO~%Y9><&)$9xyZ zd>7y2#Ti`y6B~f~^YZ)#U|GTZS~$n%VNU_npI^QC@{;Dsv|D#BY~j|DQIAF+$4`6m3jGnsyq!?`d&1{EQC=dZ$8935$CI=xfwB@PCy^f;`Eiifi_oQs zcAlQ=TRTP)7z3iWBz=tztUtEukE^_X@x~VOh-mpwbk=pONk3MPw*=)en&&clcTxL8?lq)!*tgZg^1P*-knYjtFy zK8$#2*Lh*W1L){PrS9Xz7~ReU))fh?DH2n)zv!$4))EO>Q&ecVleh_4TgVzi;>j9g zxz=Zi#hz?>Yk~y)6SB_0{GV8>^<1LL%XgCo8KViTD-u{&B#=(@a6-}^@bssY=jq6V ztPAq%rKz=glzDl1NLT`Eg~S=JUiI~GJsn)LhRK()$;$&eIB9xm^6A%l`niMV7kPks zCjFjYw*u(X05oPTIL57A(-p4k^02r7>aXeYYqU#Qn;moOuD{N>wd=0Jxoo(X_GB$j z@?$IM$!8L4sAQR2yXNu6RTAr|WJ?b)#*zq2V!R}=)=75vpckNTU3pIq@L;eWUrDTW zk{DY_tZR~E8y;_>8;ih82MaaG*h^yll3d|ESJ#fgB*sw^ z<1D$kVElnjZu9E1Q|qkcZaw$pLDrN>$anIf*Ji94lE<~~68(`prRS7<{3Pc8BUFopR)g}FJ^T(1jKt#m%ZzZB;F6y|=>$I|~PtN~J8J?No%F1$-&9gxBr zAcZwRYKYd|sbOAx%&{rVktxjkvIb0HZp`cE6xIOwc`1dtGKINP-bYfHFXf#gg*h^X zxjuz?GPP3kF@?EW-bZBaPOaB@q&Dh)PHoZSDg`}|!d#s~yHl9EQkb_=NA>*9uoHUB zk(PR69!p{VDpk7frI^1;L%PpPF@Ke&b-PM2@03CYN?U84P@{9vf2H1BS&F_Y#k^A5 zP3yZ-lvCPA%dYTC=+ge4JVO>rA^)WnnvcrJosqlNRZuYKp`?MejjB@IEllfF&n}hw z)jcazTAq3~r?j*4EKIdkDQ#i24XL&p)fS`LO4PFty_cB#hqWE3wgB~PKefH5w)E8Y zR5>VR!9wnyTpSJkZwtk+KpSJJQd>{`! zYd+fXc@})yc28U9X^TAFFIpb7<(=jLEd{ilowl%Z*cNS7=h@R~d7urQww}{=bJ}9g zvz4QjoM#_L%Q$Tlr>)`q>?v&lr)}S~)thJUMoTws-KK5Xv=y7SU(=Rr+Gb5#t7$tm zZK0-Z)3jBZXKO|)Gi_g{Ez7h`nYJd=c4XRuOxuoWt1)darY*&^jhMC$({^Fn7EIfJ zY0EEd^QEo5JUcIK7o*3i9v9kfOIvJdTP!mJ!`8d)Z5yTSp*%|{O1rjx(soat#S?9v zw3U-*-$Y9#&!&miOr9N+_Sd#c)DqfW$+J|Vjgn`br0tSuk>uGTv4-0INLwCxHb>g7 zP1_l13nSVVc~(W*o`}{Q+J;D54|#S&v>4L1LY|cn^@g?#@@#^%U7oht(H1})q1x(4 z+xuusA8q5Kt$VaxkGAO1wmjO3N89gsmOEPW&{{{^>39}8+BQe?llC~;5=YzMXzLr# z?nYbO=vvXrM%&kD%NlJ{qpfMQ9gVi2@oZk>2jWfzL&Kdty zwvjV2Nt%x7Q+~7945^^$nk6b^Ce4(Jm}TbslxsFOKcr%2EAtAKFdsJ`S1GHf^%+&_ zjB)N$nMkw9)#`nbYa-p%Rgv2xBh)7%m63bZry^q`52(*ZCPlugZiq~cd_&zBc{uV@ zbyMWI$VN3evMuswH6?N)at8JL_pRBFl(L%wS^!!D+5tKMIu|^7u z7lfYzoCRbdIyN8(aBH8!A72X4q~O^c(5m3s7SO)-DRuUB0(1rR0Q7!yPwBHdPsoX{ zpDv&E$;VICgMok{-gBVW_XXe^1{kUN?HdgkSMZz&n4*4UZMR;w_E`I^L)KBkIO~LU z+B#<|+h>RDn4PwpS|jZic5Azx-NEi`ce8uK^|AZggX{`>xLs+FvB%q!?5Xy2dlq4? zy@1~r+so}$_F6)fy~*Bc??8^bklSASfPI*7%sy$KvCliE<98xX!YQ+-I?bGxP8+A( z>F9KEx;wp`zRmz=urt&dVXt*YIb)p(&SYnrGsBtf%ySkxOPv+YYQQ?C+2Cw;wmCbU z-OfJepmW4I?wlf=b+SHNz!&tngp{udp}DV>uPxT+?LF72h7!7yudC;J!1Z=I`uf4Y ziRT9Th5!cohQW=58|@qCn~3l!gootjUhmZULC(mUv+IMT+mmij`Wo*v`#yp(LcEjh zv*pfXHD}$IGv?Lym83t*RBeFUdb!=m+$KpV;}5o533mGNWS$A26Jp_&O*mf$Uc)#~ zNZM-B)z2}XDfGWf*UGC~7v_8)>7Ml0beQz@q(4sjcI5Ml)Uf)X+?R#gc43Qj{3{vf zR@U~T%=32A*O9)HHNT#%8^N?fUv1^+a~0`Vm_so`d(!`I=FB?Ct%;zcq(8wpZCUzY zmJ($tpCElbX&t`<;|~XJN4g#9a(P<>?!X-ALwpVWuO*kRb?#y*oft>xYpi)pwUsf) zGUvsl7m?mcdIsqYQip6;#_vL(*$n+CbJMA&0{;i`HSD`<>`xJ2$N0lohdYU%6-jgU zilq5o6-gr(9e>?Zy3j> zbp2Ma@2tpJk>r!`NevT4b4AAF_W0}*MaxCTgsy&0=LbpQ+|qmK)M_05h7{M&qUI68-0f*zCR{(QIIjuv$oeTpD!{_8AB;KMIDJ> zW2pD?Y+Njr_D z{@~$3@%KkaQ;IzQa@L`O^mU}~U=Eajf0XqhW_`+aeSC9RpUol3r6!4W!59ia)3z4Rg^2nzmJtCip^oo2o z(mV3GNZ-f}k$#aIBmE;cMFvD}jtq?45*ZY^H8MDITcjfL#mLaeosp4|yCP#E_eCZ| z9*j(kd?hj^^7Y7u$n%loZ)46^%4R_iLV%bDX%Ctf&;nRF8m&EA;F^Hxymn8#Y?k z+_ItX*l23>HwJ;KP^S@BZrT`AaMQ+kW0v%54kK1sxu28%p-2gFdG1NlR}eoWc zs5`tmoMM~)|%RZ8P?mv#kTxaogu~wT@fIot{`5^>l{eU1kE@ z6km7iIMyfqe1m+0oUTq+NhMEbjE;-YK}df<(rO1^$wS;QXF^T-el@v_K~1_^H(3L% zTdZ5H+pICxV{U)mJIVc;JH`FFJJtP$`%U*D z_gn6C_dnflyEENc?rirF_fdDQ`?$N%eZpPj{=i+~KIN`-f9S4qf8?%qpK;f^KXIRR ztK6Tu8{FsIjqdaACU>)H;ttF0%~wR;!w=-iKUKX&iW9m*YY$LFeYRqj`E zkL4b7ze@kf#8YysbF1C26VGIvSP<6W>XEH}NRqdx^&o zk0XA7cmna)h^G>NgZN?MImC|=&n14GWi2HB9(@)Q|A2S}@l(WWh}RN7OZ+_XCc)}j zcWCb0xo@NH(%NCtx;iZwp+2NObn9ndga_Yc%@+_q&iXGTeu8Ni5f}1i8QbzC>wh7iRucb^_~`=9JyXEH9}};; z2ro_RCKXjt>#^Kk=qlU#oYVla(Jj}_8bdklPw8ookfy3BLXgTDNPG+P>CYPGd*Mv( z40=KE2>RSf`flP;#P_f*_mUn%d>?(r5|5+LcokGZa9-#M#1ArbBJtPgGnM!o#4{N` z&wufm&6smYKT158xGtZ?XEE_I`uu?O3gV}TS2CX;5_dE!mP zo26Fro1OG9o?~)ba$A&z?;~>~@oiad8Mt>X9D0GHzQ4-QTI?qBTvFbbyH7R46FmX0 zFUTzb*9DKs9nT#{{Dew?>r(!3;yXP_7d*=2wBRuwcLhH{Ji+6o;HkvlAb!~6oZv@^ z=MsO9c(Esmf>#hf<#9#uT8|TgpC{fV80{P5$x2hX6Atb9oy?D3dre<&nPGej{Xvyf zarJh79L{BRKDpO&uf6GfVsMfcy}&j!@L^bEJ{W&BbTOQy1=kAGi_XsdA@>K;GE!B; z_0BzvwTV|Bkr_JZTWPn9>6$Q^1LXPV+@EU_i_A6D4k;V*T*vRu+?}eiAM`nOjhBC& zyvpI~#l4^|_3H(hXFeVuYU;Enx2J~2Xv&wB`(y5pq`fvb^m)C$qO3ONBcr{3TKSyF zov8Vay424vcRqK%hCY`&$0x?Px(ZHs_e(fv4(Ug>NA7mK2@ZOfd{v&j#B;DICiZU;4hDUrktJ<;t)8e2RQsq;KowTW_rL(@?sL z)T_Zfz45`kMJ`__PJ?0f#_C1mc|4K4YTVh}S^9~*ywS&0VZ0&Ss+2Xvx=q<`g?oqc zxp%sEstDc^#;B!CmTpUwsnq0jt&ZSp9EOpLI85 z2EPS4c9wSz6|x3dgOK~J$UTDGhk(8fWkgWM7crL&b%!bo?<2RXBD|9fL)l+)hbzB( z2Wk*!4dSRlCFX0qt043q_Z}6%8_Q^{T<%59;;7k|fycSy;D5h+Kk7OjDJ-jh_!{i-_|Ie*Rl8uGy#j&kK4N0qqK+-b-G?>Z<2Z#!uDf1;fUwDa4*GqFxG z-S4>HL2YMYwPd>wyALCu+3swV_=x)mYBI;2gB%`pA4TX~aHj;^nUDD2br+y@cw0j2 z@V#jx3f9$S9&41$l1T|mpu1Bh8-DeTM z%H4>X7@@Y*4-OUUbz zi}1RLy!MmV0q}Y*eCqSpSHRyQcNtcuG51OLNwj6TyBs+SuZzfQKY1N+pLU-Hy~bSw zf8l$Wd@my3{p7n#z6Z$nBJw>#z886X&!1V=UdjF>!Q`P%0vL3>_zvzn(xbxkm>I(GC3*c7-DrbW-3qZab^+5cs0uaBx=0oO8 zbB;ORTx2dYSDI_g_2x!%i@Du=+1z99HxHRd%@gKn^PHu4_i@ZhTTQJNR%@%B)xqj) zb+dX}eXRZ%DHYamtI`@%6F%OWWKFfETeGaW)&gs>wcJ`|t+lGGP1aUxhqcSvYaOr- zTgR-E)*0)(ZCZzIza6m?cA4GGZfUo%%k7SK7rVRN%kFCrum{^i?Gg4Ud#pXdo@`CG zr`a>?+4ekpp}o{zVXsE)b@m2(Grn)LciOw{efB~7h<)7LW1q6m+F8fG=+i652|BKm zvO-Q1r@7P0Y3sCiI@!&v9ZpxLhtu2X=L~d)IK!Ng&S+);Q~(jWztM&&PWF%s-t@&K768c{|ovd~^;uN1YSS>3sj>!<}AqRMx!|=E)Z7DDj=d zPZIN#lpHOFbNXZyo|2-zMxQ?sQVG={n5wms14~TjCi&{kdLHc}?^iP=sPi@JrrT>qJd6tY? zM*IL-gnEsqA70v2?ciSPc66_EJGmcsZ**_1GavWy=HsB3M>~Wjcsh{c`rzWZpk(Co z={o5;zKL|QlIe9xse9I}jK-;n^y&SMtSY3I%hBul%+}iTTIICX9rz|Ew(eCYL7!3Q z@!YHS>T_EWc0kT<^;|QfC4BaJ@i!R>$j=NKkdMVicckiqnBoo_z0@(I zFC>F!!b;w1S3YmV8z6u(63Ek=K|GE9E8IF@sIWKriE)W+V-#S@isYjWp-e^MjQG3r8T#h1O_ z6e*YF3!X>zB0TEhuTp z1wC9?&U`PlCwr-nyqmmX3614qFR$OWu;6TJje4)RMQT zrlJPi@Gh{kGQSe*6x+= zf4En>?cI;LUEEK&-Q2M(p0Cf%H`9hq=&31i3%%Lt@@z#P zN^5^lTJLW}>c-AXm6YW6YK$6C!=Fp3bz{pN0^{Y?-;rF?!$LnM?Zf?V7o2bzK>>-P>1&&VSfjBpdbh=^b84gD49k z2^DJiTiz>m%NneTxFe?%K>jrz{I-@hz#G@^%(@`oTW@Dcg9^rN1+7)yzOvqK?k#!8 zxVPjTw3zK{a(+IIW#_fDWKKJKda~P9H#j zz#yl>8SYd9#()~{Ome0=(*d(U&2<(yi=E|wRiM_^OIPJ=a<&3?fZFBkbq+X(0mq!Z z_BrRIbH+LEGktzv#Fua;`O19F04*g?UmIV!uOpxfsP1+1^!4)f^$h?F1~t?-!Z*q{ z7BB(SWW=84n*o?D>3s8i3w=ugD?qLGt@Ca0Z3b)uHQ2Wkup6+?x6?V`JLo&&I}SJn z>Z~v8oGG#aL0`7Wb$mrBXDeU_xwODHpr{F;xwO`o@Rb#{0<`rdirPCpi#io`1@r*b zyYb(O`sHg~)URk@(U78HMI!;DL5)M{6N{z*9%AW}ie?tg0n8`o_ZBTGS_W9@@$*>G z8lPFTUh}hPW6>7CcEyA&-pvsbLz?xZ-MLM@9DIb+uxi?{t90+0Q;7=MUC-SIvxDu zosfSLZ+V;Qp9PrfU%V4zA zZioFRFO)(58M(jBf8IGJcevG+NV&yH|LfFyAuPSSU<^Zl&rtpcYCO(R?q@Lj z(?|b1`2gu|^yhz?-aRnfEu;6P=)EfzZ+kF#Z;8R3Gy1<&ll$Ln{-;#!p?BBl ze_HkK9i?|}@ZWsJ{VfLf7?`ZHq3iqwhVnmI^JeB;&Ybm50PfP!|J9oGx4FN<()SMO z{R!NMWAKI_tBf&==tHjRe|YuY4~x4d^zB1ga?<2Z4~x4L^sPtcl?*+_wEVZ%=~n+2X-bsIU6=OL z%z^u13@zd0m`$EopQaDfI{Ka~?o=_!Py5@9LrJqKs}^O(WPdr_^ZVUZ) z(w{qFFq$L>?kh8|r_U9nuMvM+?^Ze}w9>oOxM#p*{qJA|H&elBV36)HXTt1fxUhoZk^~GQV>vx5kJd=Iuvn-c8qfCx6 zQ}cu}>}dJt{UJW?d2{sW{t5Z;6V~Uq44utTw$$b*&^Li7?i0gUmJ)SZ*4(_BakR_` z&n>KJr|@4Wy(>-O`OfURv9R{;?0!-e{t`4!<@Y>2@DA0&lv;SD&q0~vy?^B1net!% z-KVf_bMc%2m-@G?o%C6mSF?PG^y`2Ic7#39sC)}k=l`ee^e?7Q7f2QS!|m$Tz5{p2 zB5Hz1d}gSBr`7u-x~i z46UZ7D4aDW{#(nC)Y`!tWEpyI64$>gFPnP%)LN_xC(|`ic}s%Jq2{LHqpTjLyh@$F z@($Jc-*1PeMOzUWF-HIs|5tNER`dNJK_Ve7geQjBxF30!a^ThyYcJnu&1xT?^ZG4yYUTy1yez&zxTej}uf0_&NeTv$z zHoePwa5s9bwg(TrYkIJ*7PTp<`)WqwyS1H;C$alInKjknca6l>@6p0`%Gi9jwp808 z%85yG&dehCOjSqJ=67XVP4655S$8f~EB>ukZ4KEHT~75~LVdqTEvs1<%b8sNjx{cn zi9Dw-&zdixjBF@a!EaXEE}N0tki<(HHq@-xFZb5y75c`Sb-@<3{W9;J+SUktxwl8J zz&91l@^XIQ<=mook2YBHuF?ie-euZg$-7J&EP2;y1KmR#(JQq*Bxj>uZtZDkwPsWD zw$zNI_uBRE-mWP;o40mk?Nqzp6)iJ)nu%C?Sa=Tf&NTVTTTo)*s_VT`d^xqt@#c}O zHNTR*TcrKnJdPK5yQmGdSp9qc&N836V4+&-{U#)PmjAtfrI=67RhHtj@d#LW}aq?x~q6^oJvc9^U+axEpwL!kKIDR6o+$D3>1-Hp` zb@g31@5n85#zcbQJzozBwdvsTx9-K`#0 zZ>yg*kacIhtszoxYnU~Xbq5Gd7;TM{wpbG_y(?1XPmr?onMV4Y72f`2@LU|L6KQ=8 z%~izu?lPXzWa`t8Zlt~2Ul>#0n#I#x^vzl(Z)&o5SD3z;%F=h{93ibwjpA7{<{Z+r z-Zbwe9>6%fd&fJoiuYFK^odYBC&p;U(22x6pT=51f1Wv{@8dFXedWv0c_P2PfK^Uf}77ipfnW%9HeTc3f%vxqF7N@en%H+{#QJ|jopgQsuA zGI>^z#S@PVw%XFC_2_#3kUl)^#^6nHHt!wM=N{=(ku09|WwJMIeG(5(z_NI5mcFBm zryuE)F=STO=Wa|=wf9h&)FV1Zvzi!R1$Nw??q}Ry?q}WG>cwkX6HoR#+irLFQ*IBp zPfaX+d#2nJG*C5sTUS1&oPX3F(5V3Ad)Io0EyguWM$CkJJDidI(N7Z^gh zHe$=!I^i1a*^usR=w8pT5<7GO%d<(>u$E7gbQRxbEZVCJY=VxQrRHKrU5ux`SF7P? zKD_D;o}0Yq)(f6Hym}%e@oxeqpqdQ9(&gv7$c&B2PvXT9C?YJ|WlI9I~ zHcx}oHy?tJX|%T|Pw2HpS|AU-K&RY>Za2H$lY&pzNKGI2R&Z2KA*&=99;A2{YNZ-O zs8Hh}k5kojw6GFS&Bf*P7rr$H#*z`SV`nJg&HHN-9vzoWv zW_jCTmM7|EDLK`gYqGriG0U4Ivo}zO$f-v9WE_1u&ez_c-T8BD-fXHB|5B=_ls;Ra zBhxCTnxfw5F21YWu1tMB-^Qk>d38<&n4;dPGr6Q57t@pm)|Hpiwof;Z`s_qwFipS`5iw>6M@YNJzkzogWkx}?-SE-7^%rf$Mh2oeRU8zZ9?~YOiD^|`TV8X#1vhufn_q9urjTPvBJ@>J;)h~K_UUaV9cGie=Bc*!1 zCHcwk$s*%&-d69oB*!wg)%I?B>vPF@O5Y`zZwro`n_an4K~A}p*)~EjIBv9jEb!z& zuP%Mo4c5)pKV0w@;TGf; zc=ggCH~sn&;Y3?yB(FHEBCGjk|k5XAP?1T!)x$tlA zM{1fq?zt{-qv8Gnhfgk?3uj-;zLsl}Ymz+*C!bAlgR_IH&sLw!t%jSEo0B~aw;S#h z+|2CE+@##3!n|{dT%sm#i6eRY;gEk}-uXH)@2|t%le>p`OPP{xU3OhQ@0$9z&9%Lt zO#^ZR3cuIXdn#P(Z0kB6Q&jCdTv>P%ZJNz5uD_^5^iyJabdXdOn6ZvZFzp5(T?dPO){6f7{Bv_3ZZq5txIe%x^_=*5eObM= zdTZ|6aMN?sv$No~!$C$w&L}6Q3dXO222j)hE;YahsR5c(1C(Q=&r;ozvy+Qezw~B| z_uDzr@8(FqN3=H5V{VRrH2zWLi+6~B40PxC$3b_Ae*$#ZcvsM$jDHezH8vwfPWb~pu(}=$4;tZ=+RQN>V5I|0lz=q z3|RQ;#&3>Sg8q7ZCh<i-DhtuThcsGw~|Wzla}Dq4?k9|9~bw8$Yi?iK0YE6;TgH z6E`OYg1$BJMHNU4O^g72e_|5wHxu81&#c5O(6bYBfFDbsR*9z)D^)PDDzO@PO=1o3 zPZQ4r3x7)ze@vj1#A}Jy5VJZ_4GguTijr3*uT%l*+(fc-vNL?TB)b52O?CzDmPDT= zyC>0S$sWlbz`c^afIpY~9Pkav877APx6fNr#_bYgeppP zOQ8;_?kUtE)jQQ2`17gH1K*Ik5qLoAX5d>=w*Y@3^#$PDQnvvwNNqq4GK)k@KT_IB zB}+eFIu!W+(y74TEnT3j(kDuPr2M6?l)j>hOaE5-cSu-O`Z*PYw7m%YQu-y}ZRu^m z+tXO#rC(0JtcugS(z`(KPVWZZlimZoH@z2F=Bjx5cj@1$RQhoGunMG)q>sS=Pw77a z|0Vqw70bApm@3Ki$@Ec0nZB96!2L4)fct0qt59Y@W`GK024>Ljob#fYJ2H2GzB6+t zLhs7lh0wb*cf&{K!f0kgW+UhqGA{tjsBkmeGrvI0otd48`K!#YK<~=z0{!dEuMuZY zW)JB9m-&D2-=8_4{Fy&yj>7-1nZGH2S*ENEYX;L?eRFUnLECR^Y;0>|+t?Vp!N#_& z6MM6yk&h9^;OFD#yIlEdz>8EDbwcHOSQ*(Doj-_Y$OgFbzZcp6RqggH zp6d5wo35^845*(}U9h!<%#U5iqD}8Dy0i%W?yuNYf|0>szh^dWs$*)P@zmy~ZXk$f zI+$K9Ffz5I!>|cu$k@1@$6S)2J}*qI65Bo$>O_PQ;3nq)*F2TG$n8zVKCr<3FnA%E zGuJRza2XdD0tsknDCi+2L3|EOwQdy2J``k``H(%H;MU2@f!4UM2T3l^tHoKVOY1I5 zVoWgaA+_on1=Ec0{y=e)ffpN{&RY6cL6^Oc|PR)h*s&m09YFrE@NF}J& zs$TmZ;nt$&*yc;2=9QVvrX6KQmc(A2=%m@!CR19jZ*@$Ur z4Q?g)(;7k^l;ZzAcNaJ4TWxj%o6-xxaNj?S;c-?)Q=U$!bEZpKHh-F{^QZ=Z`HgIB z>FF70#Ye3mgwfY zO`CfM)5YEsYV-H4POd6z#qv(G9A`(FV}|9CWurf1)d0>`b5=L5Deo}FX1#W?9f!x3g36FK1i^~vm&rQ4~^iZ9M51f zim%8?)+K}*P{3CP!2G8UlQKYrZ@Wh}TjJJVilK`rz^I9!4Z(@%>j|IdZn#8BJ^LJ+Kust362~ zszcBAX>#sGshd8^sAE0KXs{h8Yod9G;34M9r-gR2Eg^$P)N|9)o_$XC3pz^LgWuu4 z>#J7TS26pGMf0YowTpR*+UWY~R;rZ(g5Nz(77F~z0HN>7C)@>or2wiWYmNMfgqrD` zMWA{<>?VUJ>~Uaa;1742?{=zHK~>_f&Wf9G00}#&SLfmNDFt+8^l%7krDTD#3VI}j zKwWxABdH4N-RvahiXy9>4E!5+8C1Djxm$249|!m5f8skB#Cb=3rBs<7+*j>KKj%CNhL`gW@>3weU~lZU;g>#EYH1%tAE7$~JA&s&n&W?$W?c{q zP}#g=X}!cs_lIp39l)Ic;ED-wrg*;a28A8B(13ah5}u2kpUuCBac~Q8(`tllwc#*d zb#OmeT}=4v21c3Z-qQxgJS++xs1x~a$bgK!dhW=}MO2^mS@$UFMp!jUWAS@cv?hdJ z6$hPs6P)V@_?4zKZKdzSroW-u30PP8OcJ2(ZPMb#Ffn|`j;Vz5$sC;2CuY{zU41d9 z(4=d?9MY@6_4%h>YOXz0_dRo!w;`dbtij%#YzfhvBF6JO#ZS-Z0I2|hdytOWUDB$x zdDjwNgIL2%HM9Afne>uYW>e;El@h)FQN`&O@j>j%yX8|w-*p@G4XKuIk*)lP`n>+! zW|%W!vjIbu?CuRK!VA_Jcd(v}L1aP};hWfYiRT!4{lpAi-Vv@`^FKjO~ zr$>N|D?C5iJR$I^CqYMsypha7Z>YyEqwh$U`N?yH(B@`7^>J}AaoVQuY@j0EG^WTb zwgZg5BL3GX+lG^2$ghJxclcw~$&M-73=>KejJX=mHlPi#@j{RiMD)$>nF6#j4^h@G zZz7^Gx5`oe_Tf8X^^<#7nFnWvmb*05<0v5W!!FlCEWcDL(x@G<7Md~eXZ(p?a< zy#;aOL_eP_ae1m*Ai(Cee0}_Wl6>@{?m}Zz)K8PK&9NEa>m^m^ebHc`Ri{-)64aCB z(Ewh9B^a)`FzR9#W*4Ti|E?yds_#bQuAlgFeD>{$m#vkU1D~@)VX`K3^Mjd?LDCrG zKH`q*Hd4*pblVveKz9Tae4q;&A~kxuiQv?NDLu}JZ2#G)O{_LDv3HpeMENeM3q7bm zERNkny+yypw^e85fhNDj(vw1$PTQ03-w1XtEmwpX0ouV!^W3FCrD~<7(l!sg;r>Xl zJ17nWT*#hhzY0=#lAD&eNR&(sPJ>hQ755kW1cACj+@}avi}6vKrHBrK1LIvY2mc!^ zh5qQap|wq>Rf%ey0{U5+L7DR-j*=tr+$HTkx7^^t2r~aKn1?=?mH3P5z#hbEEQGjJ)m?J2kic zeKA}ok*UQQTm6BsMa0j*YVNJmgSk*&|8g%iR50WmSwTBhEK@99EPvXvCN}qa>8v1B z(WOnm6c5 z_2Umey4!YW_@YQ+I|~w?H1P*ybV82jtqtM_%i zI8eVSXg`s_s1)Kn3b~}5iM(xtnsK7^w}3W8SpED0*ug)zKOqzI)L0rTJlVSgLRh8F zQ*~wEeaFbCjdq3rx+@V1bz-8zcgO+ zKYr4wg<%4A|&``)M$p%`d%<6g3U zkp_t4;y&j-FI*GPdivb#AEk_Fb8FANB6aCK>7n^0^OS3)Qoao5gh3c#8^XSP8Ierz zHDRUNlGC2ZjCCNQh2`nX7&`}$$6y8Nl$fc)UUP-_wqbJQZ#5^}rgi20^5;ysE50Q> z=0>%V$jXG$DGzH;rFNy~@4O7|e^~04KX)n@3AKicUteDw9Oh-=8HVntKXIGb9`trK{*)X4Y{mQF!BF8)4hmBM1%}*u2 z?V4tfAUbL;$YqM@x4{U%7$zy6&;x%orbzl}Mq4vI_N(0Ga3o`iXBASwJ@Y{4fCAEV zBpguhD=N76k-~IW1&z7x)tQO45UVa!)ASlC#= z6|kG&ny`S7ukuMV={^2RTOhny!5&dvK#34g`P5x578e`TVnC2)sl& zhCU`cAGw4rmZn}i{(USTOh$%Ih?s#yh@T7N^I0ebOe%pHJ`+6+eE1S<8Jsr9``Rtm zj^*nR?ZnWDwhFs?89*SQDbYhJIxe7(vLhq8zA)!r2lH42EGpmpM0xZKWgF;x@<&34 z{Db$_Mz-_esWWvBx_5nnMSuph;|1?Jeem9T61*991((7=!MYa)kL*w^Ug;gx8!f?1 zz4X0q-X91I6M}rdU2iBCLYLUx>Wz=t48FbT8f3Zds8*z=i%#Z};FeI5C@DcNAe~K` zVY@oTIEFu-xRM!z>NV;88b}ec#`cZtkA+mRsoPj{GEwjv-K_*W94kk?1>@^?sPC}< zCBT`N_I#j0cC)dZ8BC4F#2(4uNTEp)b6|2<$M}fZ)LS#iP=^hI$&`k&5}h#G@!tLc z-p>^lAVp6eKRx5_puqQeZ)ULO(oh4P);+88B652#@`3dfK^_hU4%8+;AN-L%qzMoy zO>dK&uuO>Zna%C53@}%bGARCG|0DMk{Db&Ae@42Y*e4Gv2f-mBH>Ub8J2}i?r#0~` z?ko(YY3=?wF+AB`?*1l}=zf62L-YgiLGl_!EDDxscZETWUQA33nS)o13=Do`3Ct%k z{_nDUR7t4+S?`FeImAEI3gZRk1zol0w~yG_PKrPZODfUE(B(D*H4UpeT+T2VE{+9F z3uOt#J;yS~HAnvq;~2>%^Eml<+PYq5d+=i-FLjZmNv=qs3BLdwI^E4+Ot?%O%=F9< z@|(JVJdrDL+zHzRfZv*V(I3c;XwL%vL0NiwD0)~vT0RD=tF|dWCo7*#0pX{BLPVv* z%vJQ&bREQJlRf!8fgRi(lRXD&=9!XQG8$ z(rXRW4Uw&bHCPO1cA>5sV`7eP} z1i)oNY=U6IXOc(YYzms6$1AN?TKNxy)33RguUEC#saLF5Qo^_wtJk%ck$r1z-eFx8 zaluI_%?ZW^!v_90vg5+Js9wKNX$K6T#4qeZ4iW;Q`mrFg$tUtz6wSU`v8Ji&_eE9z z2SDw#MRKbbrJmex_yl5IB$@Fa9mUe+}*Pb;@R zVHmK;jSNIr35SqA<>loYg>!)20lEN7fC?Z0Kx2YxB5Xpmdk7{^*ct^Y_6N>Jbza(k z0)CcQ_k#&6UjTBU>`a7nH7E-$;5JLdxM-E}78sU@EI`i^nZj&xiE;;Uy>W+0F>r}|fXJ$KP>jnc@WXXP&8#_JbzW292wcdytb=i$USn913V2mfW z3F`3Hj}N6m!=LV4A7j~{agPN+Z_{Es+Kre<=P5W7-*E%vrJ8!mXLR>U2e%o-hMEs2 zfqc)8L_tiTl*!$Fu%K-I2SbNxK*R>3L$u7_SR3Ib8+wuQQa3C1{K&G09j)=Ek34lz zHiLM4Yd=r#{x?$WgUX2rT0nl>atIc~{50Xr^x`O3=^gY3@syIG`FtiI8!WqrvZoch zZ*GJ9fe=o}2OG>&nStuxmaLD(bHreOL?x&6P`zo*2U&p}LGBCz$`J2tMz zY}@#~kvO@fF}bED?SPs2qiIYrnVw3Rd2Hk5#eZwYy`FRUBW1OH85p$fXOus4+m?TO z=`IFzpLWmtDC90*X&RmjNJ7OZ9)Z1{pS&?_7PZfiUB04nrmpyW0(27yxfVqID*!SS zbSb<13gasrSSbYZ?kt8~N?vVCpb!MVlRd)r+4ck2m|=kkJ9FU+VBhe1wh8NX9Zdh& z20`-2z{aS7?n`x-Q8TTO?hG~B7&5cTyCRfWOv3ED5Q<1=(nk!J_ONc8#}On5$t*ui zf|N|V zj935({T0`8Bbtl2w;o1~9z7M%ZG|xh>(i|=9nEf%HSs0G<1>U@7|I_<;9OAo3@}UE zLkcqu?sGhSzue~RX~gR_R@Q>8M4~~w8Ny9Ua+FL z0;t`veV0rn?#^CzDi$>A0IHPYXB_Yz2Nh$*HrRfcaJe;DP zq>scqUwR!feV_R@gzI458OuL0!)(Gm8truSmFKC5l|d5kNP~Xan&X%^VemlU1cG4V zVS``;mHNLtizZrsS{O!+eKL{&EAN>18vINL&&+1u?Z2RIryZDo{LWrzrFsZoem!oKel<%AWzx0)3VUPy9=mB$Oyg#9Xn=m9&M0F{mOMD*AL z4RkeO`y!A5Z%oi~2_+8W03(hOD;(b)<=RPLKO=&fLA%oUh*521=119%N9&9@<{XtH zxkCZ1kyTas&M(H8RBIUNNt|!P4rr;@_?H?0#@K)zi7%qK_~G~Yl;dpsIv@JTkX9HL ze$v_y3-Q6`R(od~BT!7;K7R49XJ^3zl8Wf~KG73Q6vL!rNxf`g^ zDeN}=RTpOW!tM*DzjNUt7Z_hY%NyQ@ni^&8BrN}`^IOJsv5k>*4e z5yb>wS){dna7VzM6I`;V>_@G|B$UhO6OnO5Og=#px#ARKl=DZ#qfNeqv2S8#1m>}i9 zpZI>2t4Y@E{#e3T4@5FW33f)bCfY4WbH@GIKsO=#m*i@Sa0&x1H;ltENqBfb1e<2t zIM`_Nrh*;mflYtf_GF`;oJoJO&Bj=Inv$c%vLSC^ROAj%U?7+RE}lA9`gi`z-2R=Z zUQk9$;V&tY$)`*&nDe3A0CMatj18QdGiZ9p(N<5eIkD@(qQE~>a`C&-PJsk;FL!6< zRT7ACtPW3IigcG)pAM8UST$4){4jd6wR*5zSsO#Iw%V72F* z(5`pCe#DOr93tA#Bt&ZV=+x2Vn*BXMdBTF6N*QpuW3j%-TTZT`Z7yjpYKfv)xX8G2 zrNKyOHcBeg^!-jV(UzvVbmG=xJ;QFE$T&VvlWlSlWw%T_%Ub22lFh)f(T^jh;O_^c?ngM1~wurqr)ab%hMsyZgUhT`r4@bC1z z3j2PUxzhXZ)*OK0giPfdTwiK4ZZ>7cUK!6IFGDGjBnMsk`)!M-Vn=E`qc7a1I-mrs z2ukNlEa0%z8J7>`WZc)F$5N)tQ01Vv#Fymkg9#mCocPh2Y=YhgcuY`Rllh%yg7|)^ zx+b>*%P6NFk2RMse3efgtOfSY zq3@Mp>QN;a41}pdKTTNr!WYNDLBxHri)(PVuc!Tsbd?jx-%IOMHWS+gJ@rqf7eyKS z7T*{*)iKL{m65Bls^GjYDJv;7A>}k9R5l?WJ*`C8#%ZME)F|3#0YqwT^-v*pWi5*K zO0!h8?t0px7q+4c&-0#8eI}uWwluvIDz9_4`}6eJqVQj3UR|NsJAwS%ju?i1*s;Aq zm`6M7WV;#S6cB<^)>7snrEeaF&|7w)p146YhOM6*7*@ZyX7r>#`Z4+=&qX1}C!B?l&_U01}U%u9Rqq6a~n~zDjYWmiz;;Ne+N>z*Zhp zbT%rpY+W>uzJoJLm%p~cj*Z~n<`J=bNP1B(pYX~si|sKad ziusD#@%*_a_>!*Aq2M9V#JqM{y@IjY?+g>1zVEZbKYD}%D2`!4axS8>pNfA^%o9X` z!D&>Yn*5&Rb5x26uhN-?XJE_1c91=i%OUuIlpF552H||x)?X#;hx~akRmzAh{;dLK7?se0a7+x zbqh#V;m;a5ud@y}`D9rHdh+1pS+~b}lv=tTUzwTP`Y?$EDPmGD*thN2-~XiSLG3v{ zUC7VwLObke=ivH@q%$oFMh?%Sam9T$cH0=wzSg7BT85DL2Q!J zRWtt+y7-e{PamNx76M6ne7H`O1f{=o`|OJLNL5Xcn1)uwt2Xba<1HnISlthwItp_a-Z$KLnyNQLbXNUiA3&3p?hG}yX@=2$)v zvAuo?eWmZch5c0xof{XTrsDiDq>`0^lP|L~J-?zt(ymaDBSXk-;zl=6Jbz z66$XI*JSvqNAC;SUhhA3Z3CY?{s#QTkt7K94}}Tcf_pZ0!ttO!mP%CnDlwZ~ zARYn~XASUo$PGdOZ$UHyYPQ$v^LM;@yF5kxE-T;wlfXDe=%pJAIuiN zmah1I$L7}6f9HnxMjeA<4iqhFGMco63Nfo#{PP^iIJWp>an13~F&-rlUm5Qh@DK1$ za12^3u59ENS^6h)>V2A&&!lmJz77QI(htF+wy@L-m6+So0oQrWtTO2`R;3+qZAp7z z@+5fB1QJFGPzHZL&!5)Q$U?Uw*hI<#|N59by+{g`26et28%NeSE-SLs%M;RZwG(`QGfMDyNdkGwl8{xXeg5gm_ z-kkA}aL$?UwgWzNNiOD-hVqk!XC^hZ!z?Ii+HXRUx&*n_wOyIJ(jwJ0TZcqwQ?cS7 zlAgmddFOLRLoBnb;oAcz15`$ZS4Z6kH;oB9|KPwJv$aV#>EV!xRWxNlO8&7(^;L93 z;uWGS+flsoZoS4=J9~kEpkdJW15b2;jFmkih9ciUkm#g9R}@kC1IG%O+^TnLAa=no z!xezZt;*VP;$eJ-W0Hq#8?9A-YbLTEK=D0Q&usd(oA7&xE^N_g_O}rxmms6sPy9D0 z**X**^0Zd#UAj(_OfhYiJp}LT6=><_c<-c*857JIgHPIS^opt1cHfNay%4GhQxSL@6QZa;wC<344lm5tlf=@UfRudHd)mS1+vyVJGpUOjqKg%^#>IPW@LWr0}2i#vQj^+3UJC^Z0{OCL5Z}+q%Q~1%m+sqSI z(Fb}QR;z>2<*L)aP2a0Noz6w*xU$6}N+5=41iuuQ$VomxT_C=GzT)lGksB5v# zuMW^mpL_+AfylcvP&jYsXMNcb`x*y0)mJ1Ts3G}ZGH$A`oP+mk`^^!h=&G;0gTu%N zjD3M?qq!k{y;QDlM>q{Whe;gYC*Lw>ekER6hRbws#3!G^Yr~l5OAuKt?h}M^W96V1 za9ZpCL1y%)0K1jk(g_ei8KX=~&1NJVE~{XhVFo|po1Mc4q{vTe-7t|{_wDL>?Cms% z6FyLFwGVGVo$&8O>}D=;)DL}Fzfv+@%QMDNepKuCQ|k6IydLdJ>?iY+lT`98f8^1PBIn$1 zqeuL#OY`%w3a6#m{*qkZfU0Cc$4SEpv8vC4O`CErF*|ALLC{U;1Zi(5gxpW7N(-?c zk5E_;!>(Mg_wZjJ2=n<7`Oob>c|Ne+k}QF(1CbCMov`x)%XS&<-G|u}=)-5^7yqy9 z4+~$oiqW8`_XuxVog~sIfnQz#&1qgWNpcUwJ!Tn0}#DsQy(96S;ohP`Z6eIO0b)0nZ() z<$y1I&!m}cbYP@yO$qz{w{SLJTuJcPqK+%QTE6%d>z239?@BzEl-{nU(nI^2o1P!zk#omeqWcMnUk)e#;BvDi*MI1#KZRsQQjr%)G7j zQxb(-Ad9+dq)b*5brwy{amBIw-rVucF~yLxtJDK(r>w?91|}!f323VYW)$H0-yevs zuS=lC2^Kl)d^C;vZxJpkOjAwtH<|=>Tx(q-l^CZjEDt?XWATTuS!cyEk=&tgqOrTb;wpc zSXJDcW%amg)0T}U7TWE*T0+*pI;Qd&Wfx7&{%rZO?&cWx=i9%s^JT?mb=EROPo^`D&&k$VCF;V5U&bpl(Izn-;Z5!Kgy5Pjjkb|ZE%5Q>543`Dx2I~l$3$qC$3i}2d z5rP%c5TX!L)O*$&+B@G{)%)E0tJkOyW-UY(_mAMW@4d)8=sfgH470Ijt*Xy|aK~BD zn~|DPn(3;-U-c2)qJP5cA*{~|WCUb4_RI(!(u(Kw}z2_)}N$g7? zii@%)N_FDz@X`e(!&m-cSnGhhi4LoB^xy0(=_e!j8Ssg|awe^7X`gRU&oF`g@<}_pu~vyWfqMTjpf>((eW2phf>zIsbqxl{;0RvVk3I&uepHJ zj=&JTLKqVvTG`w}GRiV~WN4-Xi6pZPf(8t&EeETOhCy=b>xueCyi93g4~~s=YTRGe zRsP?>^V6orRWJJ?4j~?4UcFKqlO}wk9hC(*4id}cG~?)eXw4i-(c>6=D14ksKkP^y zh)4Onanf)c@F#g&v6e`?Nh(=c_|h|(r+8&*i^wC_iN2jq;`J%JV@)_*?05}xWg|}6 z9-*-%`L5>Js8WsdB*0^2?YDI<(wy_kHSkqrA3 zs8o${B1IU8%8hX!Zm~!unXHrFWzI2=t>V{WE4mh6EVJWQ`6?Kil@ags)9u93TbzkF zHKH8<%2v9P{z-C7C5$rFMvvVb7Aqn~aEo;uRxMgq-{ziK-D`n2|22K?jjlKFeTJU# z4qe9afhDFQfR;cPzeH%1%D+SJ=XbAQmYB1!iHScr%GW2OF%vB_??!I`K7~M0QTwRN zj9#B@Z`gmd4g=`FFWS6J&nt}WAQi^h|HQuu>825^P@fW#6Go&a0J>0gm!MDF5!}cc zrr-h6Okmv~6N2SWPe%+6$uAw@hVTmeeF%NS8%j7!iRw-$*)>Y)yx}TBC2{j6urnu< zheu2w^%rn#?B65KRob*DhjPthqjoOVRhjn2!bvI&S}ca+ps!^LmrC{9*EtP*!7TAT z8F7M4XO}TUplHR{96fl^(uR7c{s)yUzdARLri=ko@R94Jwkd_B_|fS15Ec=3t{_w| zOI3?N7pR#LIEuq2rYXkG>{xXMJwN^{C~*?g%T@!4b95cm#%EG3|r?)?PcX&w`OmxgStbe&Fsp6n+3l?-@s?8 zyy_3}j(RuM&M3EQqq&?$(%I@qU7SP1pE#nSIgNbr`D4w{K3xAoyUxP`-kGkDPt&EV zNPb(3DESd{^ML)GCzmVZWBL1>i+zP7Zu|IqgEC6UO1Jxjb~jI-(dB_o;gG!i=@g_O zQFR+cRpFy6mLKiQKpq*P*Vupg8XWYde8=wRIA?l?z)Ra2oB)hVyHwbgm|nGA!=iPH z&;DHkGkv(Xb<&=mYn*$Sun>kx{;X3R#sL426f;H_FAl^zqZ(d#2(?XKe>VFFWU`qL z5j-I8i>NLpe@D28h}BK~u|bfL{~~WJ$%UD4 z{lt4qdx^wmrblKbJePO%WU-_dkPEEp2oA)?*GdSu>$$B-crT>5fi3FU0|wHJlNOVJ zeVJ#*Kry;{Z`gx+HMbqYx4w|Sd>@`Kt_Ce|?t*tz(#~N(0AdIPVau9HdK7slb~jVI zmg=YnaSVd}N{MyoNvR? zpC?`n*!q=w3f^#@+%|%2IvJkXJ0FZ+uzEnHtlW>aHGbe02f@y1bNnXOv1@~#8@fL! zIK@0C`l_jJO0kZI_iS*j4><8fd3@c``pr5stk2;zN`kcY`^bI%Yq3vzmQElylva;# zgN_D8bmP1mbz0D^_KK{CZCB&!jHls`m^4$EiS#`aEy@4>KF9tOnBxyVdgyI;JEgZZ zhVP1Z2YRvATdVrx=odWx(Dyj=beg-)-0psqLC@XEp zi})oJ^tiuKw4c!Q{R`XCyxW@g#%RuC^~TRHK~5i7MRU;~)J_v6&_{A@tSKTrG6q{o z0XhG;(w^Z{iL324gbs*nX22saI211W_~M6Y3Mc~sH+QS$6vJX~_HEso(EX@RD|!g! z6gkt(+@6oPk|#ta4HSr-?8i4GeC;JkKfYp!enr_eIKIls#g*np;U?e7>~^yjh71yi zUgo?miXZx>wro5XxAX%xg+YQf5qG~saBQD&^&m19IgcXLuiQD0ugZUs7{q!A^Ad3K zx6$g+A#|Obud0ttE((vgSKJpd7I*@t3-O0-cL!G;nu6HW6u?I2Y}W#6jQa=;(kyA9sEXg>J@O zb`6lUuPMU~LS$O8!O}XG>z1&=jybOGYtT@n9EwZ9Lcw%H8j1iH7tp>3DHHo`zbnlg z`bW&;s*qc9#ckzcNn!>iF_E20+t@gMkQe$R$M~{RcxV!iSsXwJge~V!GC`5V>QfFC zgu4w81GfAyv28p3iSoN0rbM%7CH(BvfAx3(pF$w_ygN|n#d7V?_^r7D!?)x(cfrfD zv;L|FiM1{^_tX1Bws8vk?@%q(?eYB$Uchw7dMp6BrX8-oGMtTmf&mumDS=?tWDBMjmvVhhjp?0R||9e zH$5lusyCutM6;ZX&ty~><&lLRq?>J5rDIN3v94RU7$h+irNRCD7PHA?8n)+G3T zsaT?}DgH?#v#?&%@=6!AG!~S=_$7UaB&Zjkf^&$gOKUwY=+1Vs$x(1)+PzNB>pIjF+yoxG2}K-!%F3a) z9$gzGQWIO#KWawA1P;xm&RbZai#~sb-tM14RS*>{j%12Jwf#QY+H)4FlNn1$NR)K^lhrqOQ$M4G94uh_p=+xmMy6m|@hCmv&6<@eTJZ+;!h*X$WJ{%)hZmf{`hkl(k;~6uJMcYF=6+; z=@+#P`z~SDZObPN{oQwB5K$Y=JhPj13BO(^F8$pn0-?Cvm>g1|nK4&gF>kj;CrxpK zr7qS)i{6#DV9mc8m{YIna?hxxiS~sP$Ge7SJ@G%!g0`xWDIgyAb-@)O!`$o~r|Bux zZugjl&9)`b?#2f@g^lNwar;jpv@USVPA$DqXYHVMy^m&6alnQPD zSr&Qd^40d$>!fnm!%+&4qm3Bi4!saAsSOK`rR_2E&6*Ra7dB8ME=9ir_3;ps>@E}| z4?lrrLK(#jHAC`13+_lqFJS7>Qn9X3lNPmln$_b4eWX7NpMQe7;ON949DUzBLv2-j zMOcrctcBuw>0RC+=q;qRnQB10+7_<@Av<(rV8}(;9p%OcZA(vFT%?@)E3@)JDf)tJ zD7iGp7AChsc9qHlNLR1nPj5K^4$Cbl4bI*lAlgTtzoqzlpxhhhYyl%!Ov+^vIHKuo z`0xlYOel})yei;EZbT-2f@B|0-Te~Vly$E6hFSVD!(af_-nx~4Rgm&@BK>-mGwl+f zNzEQmBL)q&SRxahl>+3E(vs6T%vUH52hpP-^N*04RUVzgdMp~UU>WmThRq*}_ z%2|6S^Y){bU z%d#%avP>$vBuCWCvcJXb2R4S=NOE;ZWEoV&ui)%y9ue8<-_h*{Y+^Pg)7{p_ycr(- z9znUc=uQ$B=~5{HI+(*^%dn=ZO_-;Bt0Mr)GZ0nO@TVSgQ9>Gl5+B{=LJz%0KD2CW zt2-{>+;ftHxtFE~3?_>?55P$+E)zwh)@H8=i&j!zs zB0%4OY!hpfs;+NgkjI*FQ^lzG1?lp)=G?`cpKBDElDEzlfpD_{V0-WN#FWleP2LeUvzlObC(shcfwPG<^B)7xyr`}=a%=#l6H5w%>rM8=@DZr%7v)pnY> zDD#$SEr=l2$61zn=aK{2m05QY%p|F`Z;WTdi^3mMkYNJdw`Vt?)N&SEpuOwO)=SBe z0@0>_!n3SVdUH}bA&UAjW}!eb7})6X-mQ*7$vnD?&y}ICf-h+FEhSZLCPMF?ZoSt>cnOjw<{5I@6Z{1%7#fUqHy1Bg>{>hT_x`jT|1yrwoudp4A(z&O`q zu`!41&9keJN@DECNxyBB({%iSq@l}EDtugzcWrUxn7gP*1J(K->h}o0GkW22zX>E< zye92dFFwdGDet=n;_r$Ui_E3ysaWOAsGW{5eva!Aur4$0@?r=I8(yt6lzXLaA!*9; zr`F&mhg5{QigA}S*LP1ych2OPiAG-$P`z61#RBmp-4Q0tF%IzT_d4OH(|4}?6){JB zxh=eW37WfM9$ORn5=wc=MsKkWo<`HHu@vW057bN*K2N4x-MQt%Z=>ZYg`&+!N51GH z+^`}5m0ThzEtGmjX20AXaNktFzk$naQjY1UDMS$x7E7Cw01A>1i|a7D#V*CjHXqKs z*vgfXKEx@bnOeO$cCRz=lLW+dG2_?2us=*)5g(aM)a;;P2Th2j;|qRq)gjcHzGdd8 z9JB4uz4_*5X=}&Lga}_deKM~(a2MkBh zOK9A+PfF{g$`jSU#TMSsy)5zZouLn{g%d{dLXFFlCB%LQL|h@{+gg!U!o+Ls2eDDo zE4OpWi#f9N@mHQ_7cPwZP{n}|6AdQ|ucz3~g6&iS-Z@UP2_{r-f~%^tDpad_h^wut zwd~4;>IC(eYdiQfvx`{g`RwQbUuWioQA#lvQSVHj<^OU%`vfG5;ekB@XrBN%MlKrB z{7UQyT@sgHy5Bx^kZov+i!G#py$&WIB=ouITpAGo>1}PgT;Rl_hoSG2oga?sjJfgG zwsj-+x<72Yoqr3;>`!0+-r}gLEjV@|9v83s-;~bV;o!upU&wYV-_6q}JF|D?^9k%$ zc(ehij`7w_Zq5t67u)Gc)h`gL(wEcxg-?9-VoI3jt&-U_id*mx{^>cF>mrwz+cJM< zEhDzWf8twk*Rt)mWfkD5z^F>~cL!V9>Gx9|8hpK7;=A!|DYk3VtK+w*;gzr{Q~p9@ zwz>SLn#eBlf@|4l!GKu9t|yBs^^cOaT`F-YB2l#{?TTqxbM#MZl2&^^E$5}|d4`&0 zyQmh{M{%9IqrdAmOLquQ24;)#-iQS7!1v;xa~D zx_|l9wW2-7rb+}0IQr3*e4ULY~ zy5V1Ej_=M9$(kxKq>pjh@l{YJOmmUmc?r|4wmYzaz1ibR0yHM9&M^ zQ?dta&jGG6NZ-B%iW_a0LfBmEIj4c&ctGLX9_+)mxy%juv}ES3xRaW9aofs1&{olr z(E|Oqx@q>0EDGm_lQ6PL>m0 z5@dPCv_iQqG=Y9w1`%oO`sl;izBqk7aIU_5*XDtUNfv%^w)j_yq+5wEWL_`0SDooc z=f44|+rhMP*Cbc=S55}z8w)Gc2a@sC0mFXI;MQw6-AUp^jYa=0;4p*5X|XP!BJkVR z%u!Tf^2tnSP?BrTRRTu}0Lu&E{f8WqtmxU)>BMc&GqT7K-$Cb(8Rz}n9gb)HRdHX~ z1d2t)N3Xt4(6_U&MqdWJwA`nu2AWgK)4t<=bp?Hm4;RLa8Bj`H5DM#c=HLsKJ^jCA z&J^pPUB$5o)ShsMe|7G*+>-=2~a1pEinm^TpZ*y7R|$ zhwjB)^Z|5tpP?_+H|hHgWn>$zjBdstW1KO|SZ-{gahx)C8GCvEKDndD30&dGXTNdK zC^fc`J8lYG;mGHJal}~ZyJJaeCHZh#b9{F=NzoI7vD4UNOz_?QBsGD2wi-K(Lf>sl zQgjC~))^a(?!H@^q{t$Tg~k%2jqhe8sW#*@%P2M)`ffpzq7jr)WK1+n-_1-?CizS- zChG@0XG}{_I%{W)UZQXDoG~&%>08KWurX9$?m1&bg3@UOVe~f!(YO!J=$)YSS>)40 zpQ(@2#~Hl{`Z47>^69FN)d%T=jP3-TnerU@G}4dIn5&!7grGT7o+BSu->$dPTNw=r zY^FR%J}G)g&o=m7x@^N?>^bt$wWGQ+>S7oXJ2{@DanDhGskWbbsQrZZGWHz#?AK># zoAiU)Cc+ySdyaf|&}eU|?+zy^dQQ{V=^M2fp3@sAD2+x?`f_bd!s)9{(&V#%#yq~$ zi%-(zQ>1lCIDO(tnnnV-`dBU3bNYk?rSS;DIq7J`nxutNv6D`3dy*!fEm-T^tM=;c z)nUGRj>nrc*2`5J)CRpZjWahS9L3qK_Nm3bJCLLnlTQhyQRKU$Ns6AXssAp;_>tYt zBsI!Ut)K4>B&mMnvzOBA?7PEBsx$fQq$ii=zT1|hnv>6ZwMp5&+nS_k1f^E1b@I69 z)QSWpkCWcI)5veP+^zMLyVWYDJV!pAZKupFW3a)cbAhB5XW`Sg|fvbQ=cdlT--*mEdpNOn|v zWJkj78GDX=Hp!#1soE-=63$`lIr3>GH^`9hx+JL(`7}~Z5@Sd?rrd~9k%o3AoN`an zeiSL+?W4 zFY&lc{fTD-Nm~9o$ZOuWB6tj?Vu%}HUoFG97c`%@zFYf(=mL~|FizaKg3qNQjV&Vj z_xewGtZn>&clYxckV<_8(OLXshAkJn~X&$v=sLvB6YNw;b{ zK(EnuYy7;v1+y>PwOurhD*=7jn~Tx*Xp_n9*A8l>+Ht0Jp_>}@B$UoDa+|ax+A&In z>3!M(Z5a9N)q28}5Uc}rm~!CnaPQRG!|fp$3u-^5$#W4~wH&w|1iL|TYB`wUNP*i$ zFai|Im_k0=)Dd>tPJ)G?mT1e>5tfbas^qjy1RX&w)|RR5JgcErvC~!)GzGOzo2gcj z&k|M4PMb#%0<};ZtBT2I7C$?xiCQt?qo5XOidvA;iqsHxl)@0YQ!q70>#By3&t%nu zoi>di1Zswst$L8pc-5AjHi__jP*XKmwdL6hZ5+?PXcGzV1T{tN$6U-Pk|d~t+7QCS zKn3CRXY zH<7WHDNo1-do^pWpCgODuHwEj`K`L*?cZ+H-i_cFffL1dFN#oKDUiH~)A!yIqcSq*5uSZ1`=|H* z7EAJVFD^TU_ukWj4td@s-WuVLqu!76ybDRykZq5!Mm)9w-a|DLcJwTtk(As8lr9V_ z!?Hvj%eEq-o|R>}BGo$2xT2C2zGvlI{luj-f_Oxe~>t zMmVxtvXsV|N{Q0s|Boq+5?SAo99+BYP`lTncH5(N2SBEQkm>%@bj!VyL)2`UEi?az z*}4+p??w*f-41zQ=WEE@iI-R#&Pi%aiDJQL95`j-9)5dSH% zOHmA+E3x2zsMZNb8LQ}==zQ48KEbD+azEsV9sm3K=2J^6drMxgXiM~3;mZ8~>!r_4 zFI_>){9d3GF41#nwD0_1e_d67eTwe5_gnd&*ZZAP1|9R2tHg5HfHy|{Pb-CYUa2OU z2|l$t;0$txIS)~rc$``UpW4eaXg_ftaDMJg5Inoq&WDav(sl&=j(11Oqn$A5d9O9O zcI9wuerJ_%H_;>UG)dUg6W6_vUx?&>X30-EkK??g{=8luA0+uZkGc5vUy85@^Qov@ zD&A+WInOxHImL*dMkPq2=L1(Ho=2ncPQbqe_U>7I{d-nNk(mq^u|ihZ%CzcR*;XU# zA}iNwWnE>pv97V&TR*h&tRGq3tedU7to~6xojL_?77nroTlZUqc0cyLtKgvLCib*`w_#_Eh_6`&oOs{kpx<{*%4R{I%s!d%ERiL%v@9blkQL0TlT|k>B`Y;6Eh|0CioOwj zH~QD;r_ueqqw#e8Kr_8XhjNBXSk;7<5V=GtW8?)4IpHhwA+S>j5E= zpF(~%^1BH6@oDge{g6Gv{+T_}dB?Z)zUA_L?yPG))!J=+WbLs&w)R;i*1_;A;ichM z!>@&xhyPf;#hud5W}Q=8*TUDMg>R!4ZbjdwwtZoxE$q9ygPO3cRgC)O?ZQjXM-Y6ij(eGPL|_14V(*{=1#72h11Hp%4zGgcYfe>bZ&4uJ3XB{ z+RPUk`rlt>CH9}vQscZ^v@A{J+1<(ywEQ(WMYCo^?;zluA6q`i(Wqnq$3Sy=*PE zUa?-Ik`z%1o+p{Vu}|1Bl2=Cbh!F`yf+TfHB$cGjh**(GBs1bfq9k|A$Q6-RB=Z`` zN>5#3Eljo-elxs*o?XgI+7*({KWj;K>lteSY4^D*Q}2h=Upnj5({Ogmz{JxH&QBR? z4YP(@4_W-yP#x!x^R@Gh6N}2I5e-Cx(Yk15?eR_#f0cfo*B75vt}{*qTq6^*ifT{~or_I%plS{%Mt3$HF4qFML;cVEEqfpzwX+`@@CdpN5Bp9}Eu;M6pJWcn{AuPR znPW1?X8t^LLgvKG$uzP_jA&A`!ddmRva`<1YLIn7*2P)h&uWo%Sypb=6-wxtSwGCWDeJbZf~?!KdS>03bywDXS%b6g&nnD%fV3WJA zez}#}*EahTk&C-#2i!IJ4PY5Pue^=Ok+6{k|5sbzNo{f4IqV#FPB`(Xh-y(YTIbaI z;I~Ept@^0zkJ-we8R+Dodwx8p_lT&Ks(n#~jWs%%UdI5TV zp=Xv`goxZ4xlO3Z?ezR&;Q7Tw50QyJiRWB8e&@MMoczTl_r9jX?}Y?;E{;!`azai9 zpCm;*WnJd*v$LK!VH0tAJ}J$gpVCR%J7|o_bLq-{&0b9*gxB+7-0aP6of68r%DDpb zgxQ$6V%_JGyxF1+!t*x-Wd_@aNfO;o@j@hx7cftUtj);lfF#mSOLd;e*^e>mwIsqg375Vhm^FM%El zlc99``_x{q&bkX@BL0>V&-6{L5chb#W7yMrQALzfo(Ur$TjX;Z&81{InU`j^@q6K$(C_xnywC4@$Dp_URp!jhKV!YmCvcAqb?({j$I$llcG{YKD@%-G#ReWkK-3Q-v z);e!F>kykQHd`c~a+g6XnT~~PeJ2aGQ%3iUJ2NMjYvcGzrg#mlHG}HuE6$}^TS zSYAKLp7hk%e>$Uf0~Gro;XO1aDI<#)mBd|j#+(g`c`}}&@SaXR%l&he8cicxZcKJe zR_vcecvS^EKDBIbO4J@!qJsRw280jy2*| zQtmaCN=i=~5ze(8^-SC=o!TRDk2e5)-UEqVk9sHWo49A%fu3nE^-MAJMcfZ@AH+S- zlE~5uz0fs&?^BrUb^esOg?k?KE)~nUrqXf_fvi=vpNge^v&vHIi9WZI8d`fs`_jp( zKMsGBw612=#8Q548jWciWc92hueZ*aR{*VOJGUZgLpPmOT%FnhwF0!figLbHxqcDv z%yO<1|4yG)F_r&1W2>*&XWVpFu><9M48PQ^(M}U_*H;qv^gI*y3?*7s8@pnjUR+)| z<-28joT8>v9FD>7sG60Gn%{AD)3d`KXOD25z0Q77pT-q5Bs&Ef(m1xW=qkFOc7{mB z)2dfc-?C0@6kEi0u}ka~CE~C+Do#+|eDane-_=QsvwkSfQo@VKeOGu6Ipx21R8#El zaQ45!C)A$5KJ)}K|ud+PIZyxJyfV<%(4TmlU8=B&AeBo-VBUL=9cRTn^qIot0U7J zL(}*_(ck2rV%wF)EI(#vt=v=N9NCUEj$P@P{kID+rv z@z(};J@TUOXty1oF5AutI`zbLBv+caf#(m!51p`+DQx#$R6gQ0bp7rDjvyae|+@sFZ!oeOtp0RYI-J`cgdqi)G-X6Up+ADfzv|seD z=-tr)(R-tVqW47yM+>7vq7OueMjwifz{&GGD^@B>Wk`6lDF3I!Aaut%V_kVV62678 zMQ-{3KtpU5-G*&bV9Q&?a#SYUHlU<+8_4`6|vV1aqCz%H=B zuCTy-Sm152z}sPgJz;@;V1fN$f&F2D17LvzVS$5SfrDXzg|NU!VS(ddflvK^(8hjE zk2TYLm_abxzn&|Y=U*3=<1HyiFF(imC14f7+H(Ill)G-O0Eu$Xu4Ns}ID-zh{Wq4o zrm*whkmaNvi{vOdmfQq6Sx)o5!zJetZwA3axkN6PtK?duX2=c1-weNP#P`0{w>P@Pp*`p@59;kWNOc3(AsWSC5x z!IT11{3Vvr3P`0~m`RitK;?;JH>Zc~fYP~tCDD~Ri;DHOIy6_FhC2rr@3 zR+EIY36@Y9kCQy5YMt6hG9=C;D&c?hf1}*5HmbvNA@Pr@6PnV3BrnOQT4-rR4b{%{ zP3N=vjz(H_IL1Rr=7E{XG*_W`FPB!Qz zpoarv|B%93I^L1So6o&fzBuETPX#0z?_ThUGq6?WzW^F<^7Ge< z2~TFsUlb)ALKq7e@2Gq7@Yykh@s$-hh4Ydn$k8iHd*DUDYk*4-cMQwym%1NI%le^M z(1!B9c8WJNw3fhldrf-|zVG9mf1WeW)qadO*xy3RAHero_Eo%NAXoh!zR--i2Vq{p zU3C!QHQ2LsX%%7r*C!tuAOngrBsfT3Sd>jJ6muF8k~c4%BR$h|^mI@CW$a^b2aMOZ@z|I+lM;Pl zY#H|rv9I{u_SnaG!yUa&Y#Fyy;UJGa~tgyQ>o4^{ueF%)Pzir-`|wjK_F4PsXPiae6YkKKdgOjlLFrO*9gTUHq;O zLj0|o@QT9Ozt<150Unrh_fkUAH``K?MQK!MVI+$mk+%Qq5IY_^gj^#$5n(rwYGLwE6b_j zKdM%mQ^W76MxKh+@NqTrR1Ckj8hI*)|D;;|RJ68z)oQ3>j8Ci8QN({psZZ`_O*#|KePGvimrA3H5re;=y; zRUbl}Nv8P9)62*us3xsVH3@}~t!omZW;#AS$N1mke=8rmTA8}lBp*KS^t9jAr*W=0 za{^>vE6Kj*pTaCUWAI-HJ}csiGo?k(MEqP-?pFi*nptIzGYES5IaVDikDsc~`1@If z|GA=?A8P2#_S&%=UA0_2#0AOpPWe^R14z--t?!=iUf?!zFLWEb7r8lZGq<^$>t60& z>9%&;xNY5Q+-u$I+>UN1x3in)-spC5f8=&`Z*p&T^W9tATix5;JKWxGAGfdD&%N8d z*B$KgF8NC+-TE|!J>NZFC`$hVp-~=1ZA2=`)Ryoy?lmHfWV=?RlYG~S5Xsn4WRRSlghjG; zrj$uuiq*yKBElr~kAzK->#6))s#Ld^ z+l$J4r+X)rnI#KBrVMw4JA%gY>ilB9qcm*YD4(q0`{FzK#kZYR=v6fi+Mn(M+u}v> zc@&G`Kzvht6;piw0iK!okAECy?OCQi&r6-$0qQX~3Dm5AHnwc%-A8~Y=_>H_D(eQ3h^z} zV{DJV!2UFL+!rsZQ4V|K!{W~-?fuW5RiCWiQ$|vrz0Vc3_KP2=anK@BL>BpY{3$=? z8{!=PFcPn|U&YkRwaU3?Y%|xLRSuuWr3(lbbROSwHm&LOp5SC3m89-Xay}>cn!gh7_0rX*KB)R9kJIApJL?#GYwPZJw!ip> zvkJ|YumU!?0yeYF@9jOCc{kbq*VBD~Le{MQ5o6G47Jqw^+Uyg_v3Yzc`hm8D={_5O zz1q~PxObf02(8i-W>(b~l-IziEhs*=MyXe6k>y7;@%zu@Q*9ofpYm@n^$njV=yLi` z_^%P)$uB-U{(StIDno4g7OB4(|4Eera>cj!#p$^_-n7aP-$wQ=@gAbqe%v2d`TKU7 z`D-=)o5Z*J#qSce_9MMNU8|}8yvhLIPVXOyTKvU7s!lWCs$QE^(^kLbFW#>f6Hkv9 z)?VUdGY{8d>PzE2;&0Ys`fF=1ZE;O?0lt+*Hb*~GSJcXnYITCBwO{-pQJcT!xHp|q zGvB&@Unpwt*F3&l)LyN=SpJq zdV<;<&n&G?&BXs&@yX#Fr(flr?_2jX?P@P|vdG)Scktt}cKp4wm@zy1)YsQ)>VK}C z)cNij@9Wc8cRx8Vea`Zz#rqV`?)ub$+Dp4OewZ(M`{ZoqIZl0hZOYHOj(<>V_Wo(@ z*?YNMPMv4%|LvYBtNVT1KDf%XXVzNMqbr+_JZHaO)~;Uuy*cc&O276ruY}`{avv4K zeawAa=aGx%x+~pvqNV$` zyGdN@zUTf;T<`91cZe?TE_avsk-OL3C%U>{xL=5y-6QT1k?)qdW#X3lT75%wub)~! zRoqrTtA3U!sDDBI3&id9FRXu|=vlu>{U+iLlIeDmX_S!eBkm(Yxuf0DLUSJ_DRq+a zF=4o4-Lb-SA18?eB=Hj>=#F>Ci#qPl-JgrP?gV#&sOLUOB}t)@OcJT?FWp~?G5$Z(&ca#~c*XGGX7a*KrRKI=X!BJOl|y2x~YP36y`^8bc(G}E0a zqV99=)Nc#x%1um z;zIW&_a)KTUEnSd7rDQ4eh3-OevHN@X_o9ir$Xz5ZabI>{7ERs7?qcyh_YdwL z$ae{8ycubHDQWyw_f^r{UFI$m-*;bgms6U5bpI$?xGShWa;QF5ip$(TxqlM5?kabc zxZM4-`)8`5)$VF>h5Ls4hG^xkao30|-8bDgMQeAhyH;G~zU96p+PLeeF0ZD#d|R}2 zH@F+bHSS;BjgTVU+x$nF0i;nI#cNKkMk-C!9v!!q(= z8MnYPy2CPVCCg~x?Pk#mv;wjWwh|3iqQgoISc&P5amSElu&o4PD|Os)?l`gxwv~FY zl@!=Vsyor0NS5&n_ZMUtY%3wyM+WS}f_;SDr`@N?GN!rH$THYUGGHZ@*#}#O>pt&3 zU%@`+xO2!p*hSlxpOPKyclVQ( zeCB>eR`R9$C0R+STS`{)mHQRh$1(SqxU_!V`gL(`MGAI+j>jofTIjmajY5RFhPsM6 zp+2ELg3p=_8Fh?0#O)jED`co&=x(7x_k;!sGc-7Kzo;AfN$3HQ68dTAry@P{VCZKe z6nZ%Hu!w{n2|X$@Lyv{VifCwDXq>1Y8XuYsY7t)DhfE7XQ*Bh_GS zj5eO!B+yf}>DnxPsd(riSK&v#+S4CtK2bN*X!ybJyXlkv-L*upx#7p zE=%>6dKV=SSVO=s0sSH{q>@vB*CPDu zNE6=@QNIVqn+CE7zId-D4o${9*@naS6Xb%p+H=4P_$Gu|1>71Oyd$JgBk~*2(6EAr zB{ZxRg7YCTN}-j3UIgsf0BT>A0(;><0`7)%HXzK+;LHI%6Sy8@y*c>*1ZO^Q7C27< zdo|bt>1>8Ca#TM7=QGebpq~MTHdF`D(15%a7}kg{!^!v+2=ilLXhseN?P&nEC-(yX z3$YF$mS}fMDAEZYAXvZ#3RXnKf(_{+ML;PwK*ff= zfEBP}MeK?lQB*94ikxQ`J1UBv74n~b8-Y{Q)9<|dzW?tszj=8(GdnxwwV6rw6%fg2 z3;r%aCB!`NBVR_O;;;g0UrlVlwR3fE#kD(PxRuz2pR)g>WZ}VFQXJ0!HBf2*CjkV$ zB3A$eilktasXQ2K;3dil-~fOin<(Hnj!QWjrQQKdM^#)$asDEJyC|SDelFm#&?*;z zK)Vz?ofiNQ{>8-uiAI4e;DKb}0Uhu%ApIu5w*UkjSxtEq$Ri$b5sxdM zprj#I{*Fdt+5dkCy8SH_#Lh}4P|tsNP*RV=@V{WBYU8uRz-h&p*9zdRqh%N`=6DY0 zT?fA70_HxPQmib080$S;A7O#^5psNGkJEM#j%X#}gzs{M_m$$hi7x07=1(`}J56!j zsPJRmxSS^&@iWBmpF0>S1lk9k0|-(b9Rdhi3<1p|;2s3J4*}mGpiKn2Nf8NnK0uI) zh@;aKfS}RPC4lp}+7t>5PXc}xAn+^v{+U3ozya}q1NS4COT{+D2Ml-Dm{&^}ZFXL9 ziogfYV<4WzQG(He<$@K0Rd_x!1@J})T!SW#X2=3ZGbG12>kHHgM|ssaw1TIA6oG$U z5b!SzLIE}jiUBxH`E=G_XB?V}aZ1og&_>YyZ=o!#{P4`Ok-*W7a3OjS9>f4*DB(|x zAR>quVmvX4m`= zyaz{e7#T>0l2K$F84u6G*HvYd?Ix4By2)g69vh*(AKR{MH?a)2{gZY>eW~P%kKfP_ zwq3Zcs+rG(cg|%J>>Ciy0e%kfEr4$U{1D)=fJXry1^7+CZvq|*xB~D|fOiM{7T~u4 z-v{_Uz~cblri7X-C$Tt&Y;HcJ=L5b0a9_X^08apX4ZytsQy@JB@Hv3b0sIo+mjIs+ z_fS*)CHsvhfX93p%{5=bact{xoI0F0^$XyS(A+&j$60#|~A$K>yy-}j3y@Pq> zzs%lYDsqL?jdQz_v*SduKJ4!5gr> z12zrRzMnWs+FGH5x5WJhKD%c`V0P#(cq_?&${LD_z`{1iy<1JD?tK-p$C*Gk#DvMSnQ zz;6vlTVK-yEKQg~{H87-4g&-`k=PE9TTOI?UT`C(jXt+9tp5uvjOsU<7u06UW6E|^ zhPof=8q?|zP&U-gQMMVTY%YRj z`7WAfcOAQceWNWf6Eqf>3z`a=39JM%fsLTGz){dv&_OUzFi4R6)t0ff_50!Y?H<9- z4goe90X8dfqPj<)r5Pp2+J8PHMGQ-ECn0tN8+04D;h2kEdMLj^(ovjJ{| zHpA{ExeIbReFFN5Y6=jfFU6IA{x2nc4<&IsX%xrbNic%kjvpr{xV>rES>WUo1v|Ff z?ioi(R7-%s@!Sp@b)yC)fqbH1PoG*?gOZk3QxZ3$e4A>Iz5!Q+>v zz*NvgU@5Q_v=G<{>;)|atppB#8+Ebo%DDJl@qb62adZIZNJ=fqog2VzFXaw6>`;?~ zAO%hsD6r}fr|-BklYQ0lgYp0>><;N&tLcmay+$lRRkBUN?RWnQa}VbyBzLw0J8%^2 z%qjQBxgGNwyX4A!a87P<``}>dDtECtY3BoVf-Obvg{O1pFrddN?i3F8)+y6!?xMKz zj}iK8HP&3v?ix)2xH+<@F>b)^oJ6ON0u(_CcXHL^=Z*{yD2)f_T0GF4Ja`j4 z59A<^lVaR?;9F%&*cC-8y!%f0iDfSrSc7%n<`4G$-yt>FbI8)aB>vB=i7Cz&g3~1B zsVmTvQWv$ZrfhCKO2HX71$)%WGgeL;fCN!W4X}whyOtUT5KdPq&TfITPVStYJIm%| z6Uo_WaNWq5EpKyeb2vy^CMYuVcDl)WqaY^SC3zo%ZGpL$iYzY-uRO~gk>D&x4I@Wf%? zH^QGO!-li}P#FGifbeJL;nO+$Z)y8qJ^#yU37?e3GNN9++4ZoD5&8*(5h)B2#-KVP ziKqjTh@32axqp!1?he;oA)N!H)A6 zkA~p!_d`6Pzc2{#g|WghxW}`EbC9a=jPM*DnH$1eNQ-?JG*V;V1dVh=eMS9{l=ZKR z>We0dCLvwczb>L#KlrEt>y;Mii8hKhA(Hh5jwsP-(P=!hmqeG4x~N=Kj`265H%MKq zDpo~x#SO#_kha)M?1k!yhlz(Fp*UI`jYQ%x;xR}po+6%tBx2TwoT_-Ecq7smXNj{g z%n|1x4e=rIAq?}x$5BJ^1Mvf70RHC<#BarKarp{yB~q2Nl(fXN*XfVpAf3S&F4I|tVYW^- zh6i*GU|6VAh@nD9fwXlS>o!IL-JZHVFCwe>F{0=z^c7s@ zDt#4c)7R*0NI>7DZ{m~^x&(>od-Oe|Pd}lbAR}oHX%D0#b(6XwsnlKSj&!9SQV&!| z>M8Zau%EOasw*8R9f;~l2TKPdiFBxRC^C=+NCWU)LDC>xCRiGbVTd#YmmDb_iAzRG zBXP-5(ox9Z=TJLAqc)h5IcoR7!2$;wM~>PLvUL81z?QNAj{cY0|E2c7p4#^SwU-iZ z7)ri}rYoq*rj-{f7guCfWLEA%NU;^Covw6ISSnH#<8fG~*s8E+|9kQwt>SoPc%^Nn z6E5kF)4M5_RRmO&RGw1Uuy2~f<+@c~Wd8&6vChhHocmdwsEwjnStp6qFxC5GO&ci0 zdRI6?7>;Q_LKubAg`=_7)dEc>!1OW#3Gqy>Ks0N?1E;WF_x%xt?__mg5Wb(n_m9AM zh%gl6VZt!*3mcB{2+)m@xLyj^i#4P$8rM!K^<)6+I~8k7d@nqM<;Dh*<`PSsCzHr= z>U`ZrNRxg>Kf@y6IsF`|(&cnHQlnqduaG+ZntqMy&~NFth@{`s?{S$5x&ra(O1cuy zA0Z_XA>~W?NJFYBRYN?fx>OxeQVppFQkQB;wU9`vE!9RssYoh9T2hHrf>U&*x=0|U zr8J)D22wqoVjwj@VyThT7->sQrKYGZZlxQ{dMIAK@{ro+bBjm06y8vIoBMy8VyI#& z4#n*MF5w+ykdME)d;)2)vw=qxk0u^VJdW7f2#^HhQDNsw{m+a$zJnXn0F1L7PQcyl zm}o>S0s3VP0ip7WvS6!csLdQL*mNogZ#Bc%E#`frJQ7zH#8 z|DCE_$xs*&r_H}$*BLy{&Uu&8M6G;dL#k~@K+1(b*Gf}A9#z!?HrEV$+eL9 zS{-;?LqDs7#Ja%;5#j(bc%8+g&IA8aB>fEc3iBquW>dQ2z^3!)N|pnpEZ=ez{h+ekk*s3d?LZ)W5A9?)$`hb4PEnj1ibf_ z^{k>otI{U4Dcy)RqZ@PSFgl;76N*^Gc}(1a5WSn;i;TE*A`PeO{7oMHSWl9U^aOey z>H}U>g20PPD0r1*y=Jj~W4nTXAIYEf%OtJf`d#VxBX@zPq3^%T;D_#-`2%+mKXexf zzL36u3|IbrcPYHS`z}l!ikaXi>bvhlk&2z{eSg-A7x)Ha?^^_(q`vPyc1*&5sCPSm zpm#q?StOQYKQi0le-oc^qra8CA3SaK7Y+aqTW)kOWu2^dFCMPX3(t(Zas&-P4sa_G zuDzUBDKlk_zR;4YYhrLk`5&&=R~)IjX1Q;8&0MT)C)TK)P4W6P1zUzrHEJL^9U^Q% z>mtsd7=e}{*0bNIzOxLqymHyju1O?yCEAj0k{x*M@mTU2uQzC&=6Jo~ zz^*WKf^|Z5X6ekv>x^u?z9`hWu2W7ALF^8AYOT=`P5KAJM?YpUynX+U-;a+UVZj&w zJAOYtekdQtkCh0=Y8g8=eOWE(tc36bkA$`54E3^lxB?)_)qF*gR*|!R*+e&jqOqUJQE&@ z;xFVxgGb8RatgrSswIc)rx1J>)!@}TeUxT@N5uBYsn*DcxuEeJvuhGlfDOT06%9KU zLe>ukE~8mv{*(WKr|R+BDD`cdTKSU%F0L(oNA2lgdDK>ZO6}>aU&~s{ht@hLPcc=f zQ|#Hu|95ZdBwo1^G@d8C`kRX9eg-`snZSzAg7vIJ?pMa6IOZ$A|EhRa`F*iQ+Lapk z&A;$j_i!w&as8sk_nS}R$G+zOFm&>IXZ2_B(N2nZb<^ax{&vC*8cBy5OQL_4Ar4(4!e4xt<2PV^%N6P)Mq zztkf+_~w32ngD#v`bQ=%V0f0p0iGp;0Otd~m-VMio?)S~E_odPL*HU(-v z3n}+mh*N?9o&g9c)IzxT5cvMiVC^0i@RdyUgfce(RsbvqSOU_F?R6Bv+5tbupEkF1 zwHG0&xwHw^D(o*~KKwDl%NIU;ew)@*?)_qYVjSy3G)JT1H#&)ED*m2@;{vn< zrK7cI6WWIM;CK)nL#NPrRD`MEHhO?H!vpjZy~8G#3ZV%n%tEYN-VqH6Q=%!s0KI(M zpSHF_A46$n9~K8_0#K~Pr$CvWP-ZTanG5NFEBZr84xa(|D=6~{%D;k?%aFoCse;{O zMDRqUSPw9og_U~&uLF2jfb9XYcgZW@cRH21P$mTM0>By0o~d-KV6DKa)pw=ihp{!T z`EOGymY^?r^Tk$I<(V($;=A9S`r*63S@-*juhgxHRNtFbT=_}~wr?dBbH3om67pZi zeROi$FGgp=Y)f{QZEVK4QF8)SIbb6C}}&BzWn)nO=-VjTF6=4deCT0H_V>iH4y_6oy71KNN+d zBO4f_8kO%))IW&u4rf`)rY4dBK!1~iI{rqg_=mcuXki%P-s9@Sg1_E)MXP@ zMXK(8z9C_uzOsgl9-E>rl5`L9i3p1f^N%v@7#0y87U3Nggzqq74A^{1L|5l~1cmrD z?;YhG5^m_$u|3mJS4-A{Y022h>}>6AYzN>=`x=)_!uFriGA%}f&DRj|y7zQ*mo;V@ zahDB4I|hXZ`b8Kz^>#LN?%ku6os-)0nBXHSkOH#OQuXp>hG3nzQUa`yC zmlf-x+MVui-AXuoX@ey?3mrCxpUhnKynU;zL#NV~uUyQ3*=)>dgEbjmrjG{rYet<3 zAgv}&-%ZaAZ0>&e?R$qVqK9j8i#*R4YYiA2(ksrh50}wObe~H;<3)e*k?Ozb_6CSD#~|GEN$?197$n5T9ruD!6U+F^zo4D*X8N(#B&eD zO}^QA$=oxKghL$~&(xSM>yZdFq;JBb8J&2siOri|-8+S=KWX=V^!x42w&vPy*JeD} z0tUS9OjpJ=y>q&AQpdoksPI-+Rz49UEJHrdlci5sh*fxS5SwZh9uej{$|ow)s%je9 zS%gW%RB4HeF#S~2Fk|xhsszF7#&ls^K3+3qQXAz1qNAg0dw^fWS89%8L~MH-@iZCr zk5y7?pD-lFQi+LAhGmLr#!0_@W(#f<4nqqvqx#Jr?sV0E`OR)StQH4enaQl#rrY$@ zjEIu(n=!}R-QRM*Ps~LEA6R+xl6-8)uRf<2=j}vW@_N5? ze$#zRTF0TkwFp^Dl)5*3X=69O#p_m&ctfX{i0h0sbylRz(dvI}XWGS?O)}9atBSQ| zODA2j+}$W9?_lS>{3Fvw_fH*L-2C#ojU}t~r**yjyJhj%IBosq9}F|nx7}dU4usgR z^WER|QHS>>zr8FQo3N-!z*H7Pr zQ=J~?Eq?u;r~hKIy23a#<3)f&USs;Mxxp*mg7!Y8clJq=pNN*&UbheT2y0!s*|`qm zdgS12X0hh!(I;O=F4T$sWk$||6KazUpES(0eLnK&%_!7$dg0Z%kBed|XTIA!bgILF zy#`x`r5wtels#ulQC71H9`9|hoEbUqUPDFc$l%ix)J8|$6!dbr_#EZCbX%ord$+$< z#n@%}_XgaV{Hkb)w!y5mC6jcI6rD=bCr(tjtP{<%PBC(kzd35U5^X!!`_#nHCSD28 z>_g+rb4o=Tk3UMIcswFwIdRj76*pCyxtkhM#i>*cado*3Y}SP0L|6&28k?_Ra0B zTgaRH+S|(fz2$OS8-Jfah(MQ6-@9)73yB+a?d*(qhGd=^MK1iZ2&`2?g@s3g6vX6$ z=@?TnCSaC+hp?bIW7nLq2NCF9Lj?9=u(eV{1Ui570UxE{R~`|?XtE6#5rl$AGUyX_ zrV>d4spuH|*7vAezDduOy<#puc~gviV~}M{v+hiD+O}=(Hm7adwrxz?wr$(CZB5&r zHg3=Ro$uhry%FcfjwobhX4R^Q{XA<`W!fF~6!uSVvs`=5aq^Y`KIdxZ3!8bVAJo|j zvO1sjy6TS)<5o&v-&sGB?o!ST>ehRSi@ZjXSf^)wLBosBP!`l&y+gB*>b)bULcKCO zwVCTvV_Dj>wXESfsrMB80E3}^f0~RmBJNDmtE5uw@@ut2yFZvjB!s@=+Q!a=p4<*| zHfglF!OD*&5g(nso<}WoC?J~@Z92x@aXbqS3q^TpXDO{>w+sT(LEUtHJzoe&qIld z1T9?~4!zbIUxa9QpR%Cs6x%tS^&bx3%O4`yn@1d+G`r{frurcxv%E|lB#Um=#%5h2 zwN_-Co7yuE?})-|w`D*iZ$7MqPHW%x=k+peaGEr)iC-TpB}GqcmnVY5g^%!L zIh9vm7L!Cd6Ron23eX(1Y1o*Bu7uuf^Ny;(AY#|)Trrxh7Nffu{+RVJEITQyU`^Vh zdv+}hnN@v!w5H`F;bh}bS!eYUnY4CzIY)AdR1S#$M4|d+l7T4uxCGJgeYN_r6oM0E zpwvCn&3OK>yXKmtfCITmI5lDRT|hsRQh(5JB_ck(XwiP2n;IHQMzW3XgO6uR&O7Kr zL>bEHtoP6D)ZN+T(e8b!I#6$_#_(>n80XWA(|3uEa?t zaP!qZ&85+9)AKoVTX5;ayw1}5oRtHzf$CN5DM@r7;xZ@<$HaOZM+`%|pC4WXyDW#4 z(yNn}w)tuUkpKKrkwQ|pD@KmVjo!q2=}YwGqiUkvK*3{a>Q%<{B0DeJ+1nCqN21Mg zR0^K$>YI7-mPY*4HuII?s;h$hG|y!kNy6akZ-+zrT!pb$!1#6~o%rfU54q7>I=@`& z+T|9(C1=J_L2C|e=KC45^=@{mygeUD?)X@9{L4C+$jh|ZxKEzL1O$QghNU|>dkIjI%06s zon?l7bL_FeyvAuK+5??h=I{Eo*W!4SJbdSRY2oC1=Ja-<2ai(9x_g5Sw!)n;UG9V} zhE6Z}bzU1Z6(f-yvbsEMWIqv@z@0uv{S0$*kk_l)&{c28ee?JD2YOr!zOnm_UkM7~ z7H}?>Q6CqUmerSnO-2i%)$mfYL-pXp6I%vuaxIMPhAUZJ`zN?Tgw2D?yK9@5>G6v; zp<6Uwgk}oT6X6&~5*kP{Hh3A8Q`6Ze_U#qT`|8t?cjA}R*xnQ$Bb}ghiWQ^^a7Qf6 z%&6N1wlc!wM&Bpz+!wu=EOj+97chdXY|59CyJ=#a zFlZc1QFCKI$v5~I)U+J;O4=SP>c%}B@g7qc2&S7>ca(y0ukeaz^(F?l5QJq?71$ZP zfjfU_IoWOYQSC0MSUtQvu5WFeeyop*fp&7?QN!ub>nn^~qxnR0H~fmiTH0S7E0nTS z%sYeQJei>%z^|3u3lN%Wjat9zqQPmtn>w8!U+3n&6;AsxDQwYTCxgqLqabqgak1X) z3^yWkmJ<@q9Hv8{_lD;P4_lSp-M4b=IUGERd)VPfQPZMI9eriIv@qy6;wzFhy`-(v z@upZ_0}K(FuXxIhW94XSwi`Qy+g=yUDLIaQ(MiN4(C{!5G-cFR6LxZouuf@nKPJP% ze&VCs`hlEFcQV6O{&~(#BJAQ~&3#Z$H01A7+gZ3?1gfz-V7ZaiWvckDb0mcj$=DQU zQWjX`LBh(B@L@Sek)JmVSistngBpbQ1OczmUFGcX9Cb}%=5_@Wz{Lcv^zTT+}!k~T7Z}hs+Y`u|FlwZ*0 zFdpm%>v0O0G&}M`HOZe(VI;9{nl3RFm-w}pJzUMT=UM?jr|li=j)MgGT++Shoc{pC z&t`JWuKT}RV?C6tEFZOArpJ`8UZ-hY+v(K`r@qe)Qfl03XcG?9!J-wJ4ZcWYbnBL! zgjAqZjpKsB(stA~JhC{2Z&c_kv#ukmke%J;eWfy5I^w;@d;fW9P1?}bEjM|w;at4w z9~P}9pU(o8lnqN^!%Q!5WK`_Mdf~+y__8)sA@w+G?VY>%#_Cd4Zmxxi-agbg>Q(7~ zl6UM6g`L&eJ#XpTlha=OJk}DD-lyEI1&+q+HfMJ^pfhZV6~C~fGJL+z2UqkbL-A86 zNa-_*!G-_IYrKI~LW(rg zyER%o?b%&))$LJW6sqW)*AjWr^oLbfc}{JsSN=khmU;$OI=4-D)@a+GkHRgmew);G zT0F)-&iQ<35p5i8cc;dW}4%K7_n$FAwN??1a%e2)wm0kWp;nt>IYwK2c30de% z7gC5XcRWI>;KWX+4RAhxin9_*OoWs`Yc9`e(3|YHTVbLZcx2f2F}@M-!QFCEK&oEw1srs+CMaO$ReQVbc?ErS4qR1u3A4g)qJg@JqN z8zDOUq{_IKuRq@v&jd1;t101LCXZrjFVYhDyyFie(q~62Woi#QY6JhYpC&e+(D%Q; zErsoHMwKN=C2cvF)*S9izaN9r*zn$SpX|dUnaI;(Hakl%45ZS@q{n8a;bzi~sC8yl zx895GwEr9rJds*wfw??7HIOAEcl>#p7Z*wgH%)uBaQ+g!bOg7;17+24V6D7Ic2u3X zJgIJ(6}Q$|KYX9P_rhQkhP37Fuq{v(4egAYw8l5S{DcjWzW8yk5h zGvdAaH0czs9K=_;{vrbf4WrS_N!g5}V?;B%u)$DUS<>D;^!s8{XETkPk4}39d#|v~GAv)bVT_J)H6MBa zytC6KNsD{S*X3IH70GEbTl=w|QtFx8U?)#sF=6)P=jUw#vr}8!57c3-3=yf@y5uUe zGwjWo2iM#aA?QFZ~#zmpHLxZQEXt}HST6lAQCA1gZDo!1{zLCe8$ zMpN1vu0*GCX{UlYGc-BYB)GRoS_oM#Mt;S_{3hEZ5>mIbHZctCsFWnMK@x+P?CbMU zw_EJOQT1Yr%d(9?;SndS5*TH&$m-ZpR@5;YIb~#aAc+wB6Ul{vYE=sQ!B^Tlb)}PD z$i2Bs-&v02COPo5)FPyCIOXlZeVvGfiyFU=lZ$@o8fkMvf;eU>?Yx0ppWpH&6KS@8Zm1GLG0Y@$#4OIo^iL7e zV<_l;z+RPzH^zCNLq&vg2>$;1tK?-UPi zsB^TtlZBG;LFti_IpD49Dx`TYU2u{a3x1ZxeDNg?>2_e1yKLa#ksP=!Q>P<>EP;I#pFY7WoBtyNPp{)Je$LQLl%>cxF<1c5gZxC%N9o()i=Muylar zF~+UyVUQ_}oAFOQIn~yR%;}SmDJhdmUZVsP8+w2QI!E(nfrnSJli}fGXKV4}xk?o$ zjrUi)_a=>|!MLeS{bKF24y!+-T6EfnQh;`X`5%8QPYN7}Pd~7ZDrq*>6Dz#X)IYrk zTD!bPb!vx^>!a zF{V%6P7Z*pU-nJ6LM=BWt1a4pRL^M(<8aBe2jl!0C0A}W{5aly1seAMFh7yX-n34e znP#>+!MP);Vi6%DGY^cSGisaAmg&NEH(`I_1+a&2LK;~cIyl-J=~?|P+31@?GSTDH zp2(++gLl|(+P+P{w+`m10d-HjT{WVr1h*F|28?`YvBL?WxvKLxH&i) zS&3O2+x#OZV{d3=Z)RapK{5AaV zr_1ow`R}LuHA_b$`!6>w^&E`^jsA{?q?0tVHgPn?XJlbz`aAAFHiv7*g~nvmUJF9k zE5#d7Wz66%o-TR~HAN2)yCq{Ye(|^VaNWb0&iy|MLSo7&BpyX3OzjW)Sf&EBV$`<= z?`T$O$1v|WQU(!St{U4Crs>c___&|%C)eBlX4sfmw?pf2*0bdr(=uq?AD*VX*b_JX z)xq7+44Xlig%z#;u?Z!P@N|}s+Vv-gg>Uch2>*Lcw6j0th3-x{S#wR!?y-w~V#mnHC5|Iyy9YoYZ$aDchr& zCw$Joy#quYb~?ExfG&(vq` z(~OriaIE7LxPd2+{;jMmg!2+Fql}HKM&g}e@y2cA)oHujCiIKcZn{0cC-*OSbTA~$ zt8h>XbgS_06Bw+A@UyausiFBI+~+>Vsb;7&CU$T^cdQW^K}Poh;uyO+3f5mDFmWGp zvks(Yx#N*Yk!`_%0Dv+ifno7WJvkQopbwYzT8j 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 z%0A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

7K7vtV)Nb3=0g-1t?Gx-+_fU677pA*eaawU> zb7^yCb2EE)b9-}#bsu?8^i*hn$rH>oL(I~jyg6{T>t~Q0mN3MCqyJ95kv~aT%=7zY@}E?1`->R1L6fD zI+8Tv5K;-^w$ETkKu3YFQx<0>eI-|=kS(_@!+4yuJx1d|W1SYyZ2Z9p##VrXLF17F z-;VRhQSu^9z4vj}Qg$PSL;qI9Sb7{El?yM7)bw52;Pfu_j)p@oeEX1QHj`*De5Y>c zC~A?XUc&lh$*U2`A#f|=FG)HdlZ*cG){s0S-?7Zs~>&)-O?VQf@7{|Uu73nms)UFh%bf}c5bg9&}{bl>pR@Bzf zR?Al3*4|db*4S3gR>xM)R?^nZ7FfxzMzHjL38xfu2E_&W2IU473pEls_55cBIWx~# z0?lsYd5fD*i>(er1xTmArQA*6;(qIDj3|za-NtYwspZTq_Pk(Ab}TiXi_6AqC8s6d zjs9F^w`@c+Q8m7vr-ItXL`MLYF-uY5qSM~u<0f)0z7;-7l*q+mW4}_n4iMsLaJne8maxajV$g|HQ#a;h}e862Lt>s&E zI3W(^LszG*pW~QrQah!$+jH^b`QzXt#$D=p$%Vy*%l660YNj{$i<%c8$q!?FtCEo+ zP+QN2`#ol$!TR-j#CrL9#=7A8^ZNJo?Dgn%mi03@M=R|*Y+Zf5as6&xY(0M+cYS)j zcHL>c_;kls*43mzaOu6^d%=%_q=M=l_(^CC$Uoprp-iW^uhG9CTcL-b^Wr+v?*Yf_ zv-}*fY|vB#ExMb#Jh~sc1H1dXWRdea6r!|#(MO?cA+Puf!zrg##@n(CzR&t*AcN5E z@!!#X()d>WOQ!SIR}vY3R)9ZDm!$cv{g-0rq%SUV3Hl6PDSZ*$oR$Kh5|Y)HmAxk1 z8ST4?Ohe(>gHt8?nwQ*J!ZZ38zwc495j!j#0pVha+y;!Wc2;`gHW5-4JDSOf7s(LM=ku>#Qo31hJx z@f`^~u>^4yQ5A_9@foq=FR2t9(dp6mKSj2Lw|;K9ZW)s6n$p$ap!u6;H;=1+VhF>j zV`N}DRGurVRMlJUis|a~??#uvjbKbuP}AV9wH04K?5gfU_76o*#4V>>M%VUV=@Qm! z_@*+~R%xI&+m+!DLVLi+q$AeguC|p~zwMIr2cQ+=kJ6=Sa<|(mu1|L1`j?>3;+4~v z(k*GJ0U98cZI#)l!t2ppoBlMpo>MrrqW(pMP7Ph!`WBL!3jeL$1RUL{TLI zB_zc9#c4#Pa{;+*IgnhV3FL|138RVl366=7z5Bhsy@b7MQxX{I5#bTR5%v)o2@VM% z2>}T<30XQ$`p0zAblh~JbTVxmZ9?r2+9cXU+W2K5))6zJF5(Bd7!ybn6cd{hv0|Rl z;J-?gIAF2kFS?4AUzMiniW-UliuE}A*?B~>q9fTBzaN2>0asdM0chuUHHzU!G%GnzO(_oeu;sF!GS)oYNRS< zZd46aO78sGnbMix`F!%Fe`Oi9H-6S_)h4Cz!t>OU)8T&nztQVtp_dmI*vdcimB7k$ zs&w&#tna#i^}LJKi_&|a93;~tb8Lwh9nN6PVhm}7un9a&L=m}!c4-5Lh zqA%Jr=W%s6JoQ}b^x`sWr0w+VhERlj0ouepp_-%nys zv$VLxx9qX>uq=D5;?n#O)V#R7OKOYNDBmQpWN`fU#_fjc26z+a(FcNp`axr@YdVh1 zjjBr)#~3aPv76ca$Qfm%W&LX`9+sqq{ky@gN*PBP+8M3I;x`yKRyW!=pc|1JgB$D{ zz)jObqr?$8f0{|C#QB~8b>#HssVhIZd>3Q{0)_NLR-s#P)?1GV*Cqi_2Etg>Zk|aG z+fMRn+Ktw^)|HH#F+Z1p3;zv2dWP6oj7cwKXZ|#=l}Be#b8UHl+8sj&GP~pC4q6G~ z+Fm|h-d;WsShKpWbAzY8w+gIy0dsf3Cd(H~CD$KyMw@%--L7Qj(ISBo-%XA71+{xXGdm6O8 zU3FWfS_Q7g+4Q+UUHVen>e0ys)@|S;%@f5l%ZuMj%S+5lvG<_RW;?8Xvwc_hl=(jKk^Y(E zB|wPe?^^{Q-;SBzoWI^AA=Uk6TSFH`1b19_ly|Ij_y{{>G1_vE6YRacL`6aBM=C_j z^*QU9@9^)~?lAnt`;DjpHwk?hmGm_!aspC`kBQGnmelkoQ!L`Qj;QyDNIu!{&CZ{{ z7`}brCTqZHAWT9Ver=6%{Q4Lf4>8myzeDO5W95gRs1Cl$m7g0piZBR$cd{7w-rf5~ z|DtOUXrOQ4a{W97^a>5Ssx`_$RFcD4pyGqvS+<#Z)?<>4ks!yHAiLEiPf=tS+5 z=-gg2KUKG7%R}4tPl|f~QKTt~#ZZw0MZ(vhGkEQ8Eq`r#P1%;(mCcpLmAT=));lI- zRbPwF@L#-f*f~Ftv&+b>{=%tZEXhs&;)nPtWglg0XSZe}W$!3x?%5WxO=0h2VFW}3 z%K5{AwzDDG=-ETr1LKaSoR0MD_$gQdZv@a7164%Eex&LFxtWLk{3}1r_=oFB&yhO& zBdx17khf5@Xik4hdAs~>`Ry_~qaU7#bawo>hABlH=B^*u_PeWv8WE@8h@R#g!L>id zy0WW>tE#Kbt#AX+5}qLO@w*$phweY?o9lq}iBs2GOL!W&y(=p}Ne0F$+L-@tH&$0< z*U+XwP5;*K8-dOlW3Xu)rkcxFL|L5C5Cp~PV|qL^a5U$mojfCjEq zEqE($3MqI#&?&v2C!7#}_rakD&raMk`X?psJSp5sA>w&&7EvRHDZxu25dHl37yO2) zY{JQKcV}?_!b>bbB7iMWXdY%AZk`)Z#A6=Ho7-ke znG#|hc^q;aP8!51v6vH>n?8|Y>h1W=o!^~~myjefBU~p)CqhoVFc&hRInlW1dHMZP z(UGT#5QMiJ2G)0Dp{DNXNn$b%Q`f&vqQ?vB)yJqJsamcARsE?-n9Ej^D5akv;v?k4 zdSvB^dk4-5hTcr80)j?-QBo2 zLp_r?+rBk_RQF`dmfE69@{4+p-Q>rjCpm{*F8cX{G&?2yenxXmg-NaPG4LZvaJi_> zhUtddhNwQb9j_g=9g`i49hDuUoq!#M9iJVSozU60Gww6WGxn+s*9>KvV9La$n7Ekx zJjv-K?)Xo#VKk%EOq5JC)Y#DA`JS>KEq%eW&u3q&($r-6r7fv}11*%XI5GN4iR{#j zk{*-s?BW6pj`o~x^gM}a z@`67FrI=_`W5;4rX@PXiy?K6dNt5|uw9A@D@127SI5!?)Z00)Bm!8G7P@YU3XyOV(8*t88easTS7 zz}=!XcLhLJEI(yavZ~%*=;aN6@L&P*c#6Ka1{#?2)TX#6ER?EF?@qH_{b*IIDB+sX z+&{W1zZV9Twq<)sJRRSIu22s&_pzp3rd+0PX2{BfRJ?P%8lD}WlJ6a^@DD2BkxT75 z-nq}tPs{fYS6ByRvqE5Rjdq=vmha2L?6w%1gn1~SKj6-VHPcgeKf;d~i-gXchh}rD z<5O^tXvH=!yE(f;FH5gz-LU&-w_3N~sp8$SA~(aT09wVMOXQD0&zr9;)c>R*xK#L0 zB8N-b=gYa{jPQyL+^9?QpF|IrK=8`xTX+Y1i6^AnH*6nP@KCmzCDs9O{kN}hgOk5- za~8P4rZw<_20N9|Hh^LH|_vj z75C3T7H+WRBAJ2L#st^TZo{pJ;8vg8ZO+3^W#NM*#lx@625t`@e~4@A#xi;pD%R!^ zw>m3!8}YfF>wfQ{Sebb)%o{sbMbDto_!xz$R3JO@Pje z6)GQsl#ChlCmA#3#PB}i7A7Oam@#~rcYBlk-0DgP1#Acz-eYap7Ibg?ETGufWqnHH zPJtD<@qyyRZAQ0CxWRsou4i-H$Aoxhj9t}M{d zjdr7Zn~iN5=Fpc6SbL}{YwH&;DriNJDqAa^7YDQ=BsN(t z0Bp>%KBaJ{!)k7?WZIc@#x9#~!)4mZM-6!?jN0laCGxwINfTIC^?a)HdAA&GgD(GSZX#)JkwI_CL23X z8DI2;!^U)F(o+js;ik!!br-ioGNQ0^LdEeSeUY=1KkU6qpCXbHX)0I@`}+tp0~){+ zGmT-@Vd@DC9&pO@DBL0QzYEc|d=|Phouvt-BI+dS+Ul+95|9X^^uL6oyy;HV2U;_| zrS$5v)#WD3f1A>sxDLE#x=Z`j<*PG{%S;4ROQ!u&05*!!=B*2Pb;Ts+k-T|wMfG5p z;+vwIlGLfPedntWPW4Ul@Xbo4Oy$U;e)!+Yi+$<+l6~5%u=|30xgGC;)i-3gIsmZW ztUnWwDdX<@h8bDSI895LzCXfx(!PkRd%w!M_PTcb*LUc-bm6udp8&8^nTU`4;kh_t z>tDOExd+b2CWRLQml-J)2BVD{bLPw(AXEbY7)MUaYn`_)AmuuoAtA6}s zF#Z|S>W8jq>O|sr;)Kd2ZVkrMH}^MBZx%AZ)zFu2xlr$D7eWy3k+80at_0r%*EmxR z5eOTEekArVE}!+Zx48G}p4Ra_2vr~eGduJ9s#xH}SPsSB?zrM5`@NgvI}(ZZ-*Q>H zqV0YeBFx#k;uTrC-`hjva!#@Vd$Z$amj`=Jmqc*)Le>%Q3C|triPIhX3DX_@say+o zGERLdRzm=K3nH)*)BV0Uj+GlY9+`ENOvm>mbmU0Lm)<8=SOqmZ{GVTqPk$ym`u>+M zye-5zt0KE1H+_%D6n`NcPPO8HodepV8TY!ha(wlK!yDB0hg2kRd@SoEr+d$2;=`rG z-dA_RCw|_5h+JJ^nsMeF-5+DwiQ~+6ZT0t3weBN*efYiO|Gw~puY^sx*g3P0e6sq5l85ZU>C{zFO6QcG|6xjF zXZOg#Qgg+8NWe7bRrn#&`~gqDgKQ(z&Es6<0`(1vUHsB_CdJlEmHRKT`lQwA#Qo{p zB9ETm9|F$>*{K`+_`IR#TrkFNZ;OXTB26qyZSQqgW1?x-x=ggOYc?>UZo_j|IKFke z?T!BfGr#Bh8M?fV>wVWf`j}Yl&!Dshu{hCI(~o62B9}qrEacYME+HO0Px`TQbakN; zJ=Rt7#P0)pVmE@gspW!pd!;vkc2a2{Y(iXmJT`nAzA^>VZ=^Jk7jW?H zPYTv0jEj&i%u_Ve;w>?ctNR&~mnahhwEsy;OG%Yy1!sMZtkE@((a3j(1x+ztNg_=~ zIVurG_vO8XwKz&P(aFMT{$ybhj`A8&c==RjVj8iWd5(H=0$RF% zTh~v$Vq1^(@~&2YRJ2s|MKmmYXS{2iYkW*RQf7W2w+6S4Yu)LO_3f^KE?C!mm!`i% zabK5$UXHEi`e>Jc{{wm|nkM=pdL)iB{xvQp4km5}12HWzecD%kU03j_`MUDD%=$8zO9OE+LFyb-dmf@7)TH)k7@$gEiW-S&&_uuhCMhhJFJ)44<@)ye&^A}6_ zvMgq5VVDQJP6AC{%UQ<_$8pxmT;+Tv%~{Q*sZ+8C#!mH)4oz;$NXrz<)z-ipnR@k7 zx>0)L5P$tDHC0Q7I-JE&?OvY^H9L_rOkl3H6jyFDxH-4EP;;DdKf#f{iDNl{NjnW7 zgNu)2!#IOS1b6%E;F*>c+)8P5D>^MDt~O^r8#^0y8{NI>y#l>Yy?=W9L*;QJ@gngv z8QT;*8(phin_TN|RnD}|JkS1YNc0Z%mh_H=a9z=XGBPI6-4!dKL|1sN+9#8!mn@(^ zUV&cqUYXBXZDQU(SF=x)IPjQpD{v}sZEy;&c-*CQvsQ~|_c7cdD+Mn5p!*=f{MGW+ z{M8bnESs5n7}f#bmB78%Q`U3CbDWp5P`OY^dscgC=9K(_$yNQO!@b)R(i6o~wHNS3 zrd>UUZh&4-%I{;9sH#3gRotAk7L`wonxx1;M9ebPgA`^$O&l>D>?@28#>k^#U%Dka zU^@VdVJq&7@r@~?TKFgu+}NYC!EhEYDy2lVDD517$jGBGsWqu$-;f8%E6i&*tlV-P z0LM(koW($>@THg%WfEi(hZC0QlIfF~-4xD?3>yt=x6}s;z8n2z`-al_na~j>w^P58 zNGsqsxv}ZD!*7S2hit^`HJ>mEc;9IU=yWS~vvj}hu3WEK4_i-L&sh&yPg!qT4_L1& zo>*fOeMj5v+|AUj(~Tek$sVzt8#miyxgz8f&8cZKl%OA^6_xu_{0pxRt5J)$7;tW$GS@um=??v_6P1n4CR;Pk4bTb(-~w$ zv!IDj6tNM8ayfEA(Y&Q%) zTs3SqY&M)LtUlZ&{3aYLJThE9Og{XeZ`Wv_H7AUIQHeSp1`O}p>;v>EZZ@2ip81|t z+f8y?rE#pVjuPyKV}(VA4fO#x**1-niy11yXt4)-ShbU@hLwz&9paG(^^Gu$_y(O5 zkLdZ-W|W+ZN^?s~O6w0z=c}r*jk=8rheqSl>6_J@^A9!Vud0cR>W7XKmYF@&;IR~v z^U&(6>RsyE;BR&XjMM{pT*)#jvE5rN{xWZ&oIrzl!+FPf%lWeE#_GFjRHMkjgdvro zjCiXQFoG7t;QRzyzzo&VIP`7(#_}aKYuft6=0T+G zs`G$zlI`Z9n|Lw?8(Jad6~z_cil$f1quO2Y`T99@+hlMoUYDU=$*b(q{Vx1`aoc6+ zBvFXLTkARR(d^Fs&H=I@lf-j@2Qi#Ul{GGz*Sk&<+3|Brbt`m>bZc)MSTeWfB4cq$ zeHcdCA-|Bk2y&B|HZ>mhRcAjK7Kij&ay1VlI1DfSTG3mvS}_qcwPqn>bxCR-Zr#b< zG1$T0(Yr9aAh_VU5WB#=;J9$Qz__rw(7pg&h+G(4U|#?(n(o~En|zDb=<1Yz;@+bH z{A;@u*THXqlyr5#!_qlGRXhAAxi+VDvN_J%% z?!Dn5i?}ZI$Ey6Lu3Be#8)m)ky$+!ZKh(H~@InnIG-dEgdiBoKekAxAr5Y6)MH;o| z4@{by)e~1aYTh#-C6EtE4h0zvv+D8KG#WOVCsz-vS!*1t9joIpgeFi8g&4_BoAQ{N zRS{P^sx>jRCgdg+9;_M+ z9=wQ8q^nSo1CA=Ml(qoeD(tiEtL(w{`SxY@xvW+rRZ2662P!2h(`s&|=c3!T+ps~l z_+2_?6&-Mkid*Zs`1a9YbNmfGnTlY!r_x=Ged~E6(2A-w%_$UEyA5DucQ@|=2jjngYL>UFAhYUR{TO1a8hN^eThXT%O- zoO+v#mn#e4Sh+>TzQtw01v-)V#zB?s(sQ6#u~M=40qz0EfztuTfz^Tb0q8*Fz~BJ; z0C3QB-4k~Vg(STINb-<(21wd_kF}S$4xOM+0&;_VFEj+C- zJy0B7TvZ%gd;v@>E?1ESjwmmeHUXR}%(Km_%)#dQ=4Ix&bXG%Eigk#KDycKZmC06| zsn8vWm?iC^^CHut&LV;)q-?}lZCdTBa^G$`wzv>@035S2C(_%r)U=F|wPBktBTELttIX@S3dhY`*r)>)9KR! z(@)cXru$3efsw_8CBf$9?$Wi&Wfh!2%@PuL?x})Pj=Sd7=)S=8LrH3}X31hnq_T_Z z4G>Ei3z%6-3MMVdC=%2Kf$z<)l;IJKBl~>QH^unH_$7(Os>QR#T*c69Vm>40N}F1X zBb4TOYY5+wphr(ewN3p=^+_#RCD-EOVc=2vHK|8CXxwYbYf#XftUj|=w^FxGexdLP zQY_xweOwiI`1XPGLGFR{!OJ7Ib$Z2GNdKhnW*+rWV+!aRq6Bz=whkOJz?C?5c4o1>Z6&6rxe2?X zpWmR*sl#c&sRu0jSo*PLOKdnhc{5p4({%VQIX8Ja`8=7Ldx_hd`!Tl!H@%Itb&oZj z^~j7qVuK$}O-^-S)t2&bb8=vEck<8V_~e@8$mDA3UNL@j5 zOouDhWM{S})oPGy^lWNsf^>l;CDS^4MUj)a)^#(7g-d##KWZClOU@naEbLV5d=EYx z93%b;vTHVKENs{&4NKFC(@N7ynl%Nr1&ywMoWDD8Jg`2fnpesjNZK|_^;dV=O_k2; zwsHlfKC)1pdhc0qZhfF}pm;DmFIaP7O=wMMlVGiFJ!8#l{cD7Tev{e3-q|`0C2!6O zD3B&%(Us(A?|SHX=uGCoBe;+noR&61X3+{9b6<2H;NK;2O?NhQFmzEC$V;ml(Hr64 zZaVcljRnp%?0Ri27OPKfPH{Mkr@hZB;+)pm-FGepy)`H<&9s+UIs|z;qweYMVigdj zVT?#^e+70oY%MzE?m6z}gZx1y&hr8iX$>P<+r_6-QoCx-3wth82PJ~4Gx{@HuJxr= zrFo^T_T`6eO9h~D&@rgWnQ)hNMrm4UW_Wt3Fr_G^%v1Fu-@d`V=1^xTS7CDi$ido9 z3vy!39$c?%)JK$gZ&^DWI2^bf07;!{>aiLG^bJZ4XWq?l%%IJb7mmkoWa%T9mavu# zuD)rsWz8Gh4y#uyJt#FOZ7zLW`cXS&ue|8j)W)tWCMc>=xk1`s17Q+I>0qhcOtsCl z^C0(jva7Izup>*OmcgigihaD`=rE!J8#3JxX&=6D=+f}`FtM?{xwCnpdDMGsXDcM)spJ#{vCOb)bzbd`(YQugKOwseB zaGek^-F@`&DD`Ni#nkCg)sCk7X;XyuQJ7)c45Y^Gz%YS#HPW59NwBH0`ML?UnPpjG z84Hk5H{&_!IpoL%jFB*S&WQE<`R0yaS?7 z?cQ;FTsMDN-dI*&eh00;D8BH&sC1nWJV-lRJ{fV}ZpLnkZW>(HgmOZ2RW=7tIYip& z;Z7piqw7`I`YoT?wrq|Ljt1)2%1fQCW~081B(W#@Q4Bdy(RS7$zPE4!|j!gn!+1y()IeGFjns-_=fb3 z)wk?E|32|Pz<1Vn-nYkh#CP1c+jrP^$+y#Y!FR@Y<$mmb_P*-h7Xv0Na=51$2_&g*nhT@jL{X2uTpB@$oeh>SGo^3BRbf+CO+5xDcNNQ?Zlqk@Dg35!Sz~$E_!* zC#%P)Cq-}jl>Ptjp#kL5O(1g$rucKG+vg};d^Ar}gZnCBS&vnQtQL90=#hpR2C?H?45 zRLiMn@%J&wFv&2|pJJh^ppHHnMP@@Ods2p6h6;EBK!u_}QOQxrQ8S)opv-(3mDqib zvo5YDt|m+VCa{=NrVkH25I55 zgIHT4N=YgM_9?YrBhF?c5*HM2l(-g0m0-z~$c$3e&gXUFa$^=LUHi*<%h3|!OKwY3~&_%#S za7stX+WAqegKIsT&~q~MjAzjSy&ZUKr)vspMQa5|ikBZRl`jq5D4Sjysv!;w555S* z4$|ug?jT(&bpTviUcSGSbmQ|9@S^i#_2TfN^yjPY)WniDOE zU@0Wml%Io9>-hrFubyWdz##%)k5^$2qyf?miHFoc&LEMH1IQBO7SajXfW$$5K|EmY zilo#g`nC#+VLPU|iQHQu?k1V=U{rL^s@c-k5-f!L+~EJjX!v}EXr>4A6L68hwa5EdRtSHE zYz2RXSoAqSi@WEr=dhQohpacfE4^phbaZ2v4`+K_Z(U8FoVUB=lguI>b~oO!-ErEn z@bT?&uA5Dhun)~LDKs3rD|nrLgZjAQQu4;@M(xJhi%|rx^;IigE1^*cTTj9|({atE zv`|`~oNB0l*K`1nv1}q@VvO%7Vs_sgj609YDP%7l0euRogYvmELtHsh-6>p3e6bq70)&L9C|4g~oQhH=+6@ z@`>RSH%EM;+@j*5+@b&;vGrz=#pp z80`w|>Cyu^7eQ`%z?vV(^oT}A3_^g2eZU$Y`j{WaJt)RO^j)SRWJWxwvUP(>?{v`35dSE2ML%6hQwF|26#|d{GdVs z!EXOxTHPjM%)^y>L z=V2b5WD%GM!XnuN1or>8VuTh^G0pGRDFZ*|OXl+g@~z*IsyXL_G@1*u3r!303XP|% zre00)Pf1PTPjOE;-Jp6k zMcv^ny}b{x&+?V7%l2&-rH^dAXa&nNGKl_S_9~XH8Yj7NFTJ@^GtAYoHbQJ1bk>A= zCVb}a@vb??@LgE}@8r&Ysx4z9g{Ms|&q9pdNUgbGmG@lizQ+0azQLSl6}B0#MV&eM z$l=go|KTXvkVv{WqbHZA(6#M(;QruT+}y9Zs=2z#?aJ*cax>8Z!x6(_pYP2{*#rH9 z#*P6b95M-}LlxjzpgzA}>U(90k*L%q{%c39t!gmIz)s)Jz|Js#GLU&&a>QX|CzX?b z+mUrkzrW!-P&M)r zbFAAu99oKN6s=>ZONf)%#0T3A|Jr(WGUQ$>WRcFs_BCN(A-#?X09f{G+G?t8>U2+Y z7k0mO|Ki?zs=OJw6}g=@+!*7^4|oF*0PsMymi3ptmcKN~xDUD)xsRUkoN8XVUn#c4 zux;&~L|%RO@@!!ejUgWd^sU6U3i=w|wcmWdk+>qgGPr8Kk~xju%;+N@5l!=@yVt+# zzG1qWIVsy->1$2%<-Pa0>%8f`QaQ=kD%%#NpL`-6Nl?AqBIO|tMi*6uWbt#GE|ge0 zplld3Mcv0c?;rQq{1nhaM^5^Q)_hnJCs`Y3iz?k|J>Xu=xE@HG9`2s7uEQ=Ik1KG2rhoj5~`aC<3UXk=1L%f!UZCH}S z(W=S4iG{;_a7o{a24ZDFfAo&2WJ^FS#x@|05O%nZ)00~gfv`L3Ki<#Y;R!_fJQDtL z$0^|FgCiX7gC-n&hv9*C`^Mwdt?Tb^>>1&jPPn(&FrxqKd;6@q@%yfZIJVmUQLcDV z0_;q3v4wZG{vo8#D;`t1ycO~{!IMOwO3y3MsCdM>=t5?n;G|Ie4~fS#@Cyh7j9m49 zE@A)k@2c0`VMgN^ko#~$$$QN1^pIIR98W3}70Lb35Mi7Oda85DuK#ah*BmyTNU#rf zbGQ$AbMW17X)?Yc%QC(JtUpAh$$yB7k!OiY5sqhMMvrA=M~@r*P=K(Fo5Qprc(54= zI-J-E|CR;*;+7N?bVueLboad;%76XG@Mk83onH z@cSS1nw1;ivIaD796MJfkeB77rAfub^)Zy?W1>mL#~ndOvj_~R z67SHVTq}-o(E1m-VEdLOep%deJUZJuEb;~MEqNVI`bO}-D+7RYJd|7@{5O-wFamBOi({qO<>06abHgSiw#qFX1W>J~%S$8GQ8j0ug37EsO-t2BC!wLd;<+ z<4h3ku_B1}xExG$%m(5Kc>(8kBDxjuAiYHq_~L_?Ce<3a{I)f6S+e!ZvUqFwvh=-r zsifBjY9t=2zX|a0T?axg#u_0PMWolyG$?oZDCMr?>p@ zm$%5EfID0RY2QE*G2h72AFX2A<11Mz<13jq5a_rCgnY~y77amx(>vkaa>7Y&F_NXt ziE+wt9{ojtd{*|(I%SM-{3DFE8u=e}GO7sAQ$|C}3kXmb??5=@_J8Sle|AWZh24+BW=m_1CX8ug*_M>Og@Gvn>`c-?q5 zgns-HOdUc2$MSe~%Ow!tgCZQ&5{{LfAtf_5nwbp|&B_}e%{GOIW^O!DcX{%u+2|E)BL)r0s}r2+TKFH&|kB;fA>Ah)5T znJW^|tQ8q(rs&)4aq_H-aq>(INc1==L}e@(qB1T8vw%>;wjri4LI^Hg!Rgg4KK#io zH^~1E#X!n8Ttvz@xHPj>CL`1L?aa7n7BM7aObIp$0m9fUiQ?@fJEUoB{~F-)f%RGzP`9sj5;v=cLu)*IIz<9YF~c=`JS{L=kDJgNU2FMof4=cHfM zz2M3EK#k6m^@5mz2hLQEgGoI8Hv#?he7Am)ma`#2e-H522iQ(&E?ddJ1o$EXtc}h8 zqX0|9lVwb;`;P$2QI7MN_-_GXy<9jE0oE__<=+JS{t>yNp_D48h9s zzXurD#=7<+)tQYA{Cj}ozc_t9=SJ*)pW(OrhX#mrbn>*{_Av6O&6 z8}cQR?{5OYr^(lC(j>NB?SBsdyX)E>gJ!ypL$fc&$bXzdu*a_<(PPN4UdUq@JwyVQ z2cd#=sImScAW|NC6VH{&mNg7fu*87BnGb96ug&~p$?IPW52G0WDP#T* zD`96%tv}0gP>Da4%kb{f=-yX!tiIek3oNWy_1pcEA}hjmYR%b-T1EocaMqtjU@2kRPzyc(DMT!vcl%$ z$CnXeS(iSo5<8M1S;!X5nfBpf_3!2{x|OGCG9wE#>H_7fWl~(^mOuwTrK)9rYRaKg zW=Z{o4|_Qc0yEOL8%D`5&Tj7N-LDdXh@I9ysh`H@4vua4o8 z==w`2I9Q@#ogxR9u8!f8fcz!29U$mf2JM+ld`|x&rcCk48&hM>%0A|qxLlC-U4Y#C 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%0DP9%r?Q^gDf>i5&L)K6B2Fy?jgT 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

V%;TbS$z7eMT~@z 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

C#{OA|2(|GgWc%Dc)YW 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

*7l6_A-!> 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%0A`RY#ZI)aoVxnV*r~)+ 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%0DL_H^vtK9~@`!BuQz#q*wE%Mo&<(rU#fc;5 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 y)uaT1G+ISN)Y}MmqPrW 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

_7VmSS_W96Q%g4*y8oqMdGwP4Ar_9vYLg1aV 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Ξ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

    ~N1JwK=PYGi^@{`>bC(I}7UQeOkLLg?5NL~UuN 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%0A|7XmzhM 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 M(p`7O+QgIo1Dn&HDF6Tf literal 0 HcmV?d00001

heNv2nym~&&gf>je@t0yt0g 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 z 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