From f2af977ea827592bad59e1fe9d2a59a4307633f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=86=8A=E6=AD=A3?= <1276292287@qq.com> Date: Tue, 20 Jun 2023 23:13:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...易借”-软件设计规格说明书.doc | Bin 1739776 -> 1832960 bytes model/UML.vsdx | Bin 186597 -> 0 bytes model/UML模型图.vsdx | Bin 719056 -> 203859 bytes .../arm-equipment-system-parent/.gitignore | 31 - .../arm-equipment-system-parent/README.md | 5 - .../arm-equipment-system-parent/admin/pom.xml | 99 --- .../system/admin/app/AdminApplication.java | 39 -- .../admin/app/AdminCorsConfiguration.java | 38 -- .../admin/app/InterceptorConfiguration.java | 80 --- .../admin/app/RedisListenerConfiguration.java | 17 - .../admin/app/SchedulerConfiguration.java | 29 - .../admin/controller/BaseController.java | 12 - .../admin/controller/ExceptionController.java | 131 ---- .../controller/common/DictController.java | 33 - .../controller/file/UploadController.java | 53 -- .../system/SysBaseParamController.java | 132 ---- .../controller/system/SysLogController.java | 98 --- .../system/SysResourceController.java | 97 --- .../controller/system/SysRoleController.java | 99 --- .../system/SysRoleResourceController.java | 48 -- .../controller/system/SysUserController.java | 157 ----- .../system/SysUserRoleController.java | 105 --- .../controller/user/AppUserController.java | 98 --- .../verifycode/VerifyCodeController.java | 65 -- .../weaponry/WeaponryController.java | 98 --- .../WeaponryLendRecordController.java | 98 --- .../WeaponryReturnRecordController.java | 98 --- .../BodyReaderHttpServletRequestWrapper.java | 91 --- .../admin/filter/LoginPermissionsFilter.java | 81 --- .../admin/filter/RequestBodyFilter.java | 37 -- .../system/admin/filter/SysLogFilter.java | 101 --- .../system/admin/util/CurrentUserUtils.java | 13 - .../src/main/resources/application-dev.yml | 34 - .../admin/src/main/resources/application.yml | 25 - .../src/main/resources/logback-spring.xml | 44 -- .../system/admin/AdminApplicationTests.java | 38 -- .../system/admin/SysResourceTests.java | 141 ---- .../arm-equipment-system-parent/api/pom.xml | 93 --- .../system/api/annotation/LoginCheck.java | 13 - .../system/api/app/ApiApplication.java | 35 - .../system/api/app/ApiCorsConfiguration.java | 38 -- .../api/app/InterceptorConfiguration.java | 77 --- .../system/api/controller/BaseController.java | 16 - .../api/controller/ExceptionController.java | 155 ----- .../controller/app/SysBaseParamAction.java | 41 -- .../api/controller/common/UploadAction.java | 54 -- .../api/controller/dict/DictAction.java | 30 - .../api/controller/user/AppUserAction.java | 75 --- .../controller/weaponry/WeaponryAction.java | 76 --- .../weaponry/WeaponryLendRecordAction.java | 58 -- .../weaponry/WeaponryReturnRecordAction.java | 34 - .../BodyReaderHttpServletRequestWrapper.java | 91 --- .../system/api/filter/LoginFilter.java | 93 --- .../system/api/filter/RequestBodyFilter.java | 37 -- .../equipment/system/api/util/LoginUtil.java | 121 ---- .../system/api/vo/user/RefreshTokenVO.java | 24 - .../system/api/vo/user/UpdateUserVO.java | 72 -- .../system/api/vo/user/UserCenterVO.java | 34 - .../system/api/vo/user/UserLoginVO.java | 110 --- .../src/main/resources/application-dev.yml | 31 - .../api/src/main/resources/application.yml | 21 - .../api/src/main/resources/logback-spring.xml | 41 -- .../system/api/ApiApplicationTests.java | 22 - .../arm-equipment-system-parent/data/pom.xml | 141 ---- .../system/data/app/AsyncConfiguration.java | 36 - .../system/data/app/BCryptConfiguration.java | 25 - .../system/data/app/DataApplication.java | 17 - .../system/data/app/MyBatisConfiguration.java | 52 -- .../system/data/app/RedisConfiguration.java | 174 ----- .../data/app/RestTemplateConfiguration.java | 47 -- .../system/data/constant/ConstantValues.java | 13 - .../system/data/constant/RedisKeys.java | 29 - .../system/data/domain/BaseDomain.java | 65 -- .../system/data/domain/BasePage.java | 49 -- .../system/data/domain/PageResult.java | 94 --- .../data/domain/system/SysBaseParam.java | 67 -- .../system/data/domain/system/SysLog.java | 111 ---- .../data/domain/system/SysResource.java | 166 ----- .../system/data/domain/system/SysRole.java | 69 -- .../data/domain/system/SysRoleResource.java | 70 -- .../system/data/domain/system/SysUser.java | 172 ----- .../data/domain/system/SysUserRole.java | 56 -- .../system/data/domain/user/AppUser.java | 89 --- .../system/data/domain/weaponry/Weaponry.java | 124 ---- .../domain/weaponry/WeaponryLendRecord.java | 92 --- .../domain/weaponry/WeaponryReturnRecord.java | 91 --- .../data/enums/dict/EnumFileResourceType.java | 37 -- .../system/data/enums/dict/EnumGender.java | 51 -- .../system/data/enums/dict/EnumSortType.java | 51 -- .../system/data/enums/dict/EnumStatus.java | 56 -- .../data/enums/dict/EnumSysLogType.java | 56 -- .../data/enums/dict/EnumSysResourceType.java | 41 -- .../EnumWeaponryLendRecordReturnStatus.java | 50 -- .../dict/EnumWeaponryLendRecordStatus.java | 51 -- .../system/data/enums/dict/EnumYesNo.java | 36 - .../system/data/enums/file/EnumUpload.java | 73 -- .../system/data/exception/AuthException.java | 62 -- .../data/exception/BusinessException.java | 48 -- .../mapper/system/ISysBaseParamMapper.java | 71 -- .../data/mapper/system/ISysLogMapper.java | 64 -- .../mapper/system/ISysResourceMapper.java | 63 -- .../data/mapper/system/ISysRoleMapper.java | 64 -- .../mapper/system/ISysRoleResourceMapper.java | 82 --- .../data/mapper/system/ISysUserMapper.java | 64 -- .../mapper/system/ISysUserRoleMapper.java | 80 --- .../data/mapper/user/IAppUserMapper.java | 64 -- .../weaponry/IWeaponryLendRecordMapper.java | 64 -- .../data/mapper/weaponry/IWeaponryMapper.java | 64 -- .../weaponry/IWeaponryReturnRecordMapper.java | 64 -- .../type/CustomLocalTimeTypeHandler.java | 62 -- .../data/service/common/IDictService.java | 20 - .../data/service/common/IIdWorkerService.java | 15 - .../service/common/IVerifyCodeService.java | 36 - .../service/common/impl/DictServiceImpl.java | 65 -- .../common/impl/IdWorkerServiceImpl.java | 159 ----- .../common/impl/VerifyCodeServiceImpl.java | 110 --- .../data/service/file/IFileService.java | 22 - .../service/file/impl/FileServiceImpl.java | 53 -- .../service/system/ISysBaseParamService.java | 96 --- .../data/service/system/ISysLogService.java | 88 --- .../service/system/ISysResourceService.java | 107 --- .../system/ISysRoleResourceService.java | 120 ---- .../data/service/system/ISysRoleService.java | 100 --- .../service/system/ISysUserRoleService.java | 86 --- .../data/service/system/ISysUserService.java | 115 ---- .../system/impl/SysBaseParamServiceImpl.java | 147 ---- .../system/impl/SysLogServiceImpl.java | 122 ---- .../system/impl/SysResourceServiceImpl.java | 201 ------ .../impl/SysRoleResourceServiceImpl.java | 311 --------- .../system/impl/SysRoleServiceImpl.java | 146 ---- .../system/impl/SysUserRoleServiceImpl.java | 123 ---- .../system/impl/SysUserServiceImpl.java | 254 ------- .../data/service/user/IAppUserService.java | 101 --- .../service/user/impl/AppUserServiceImpl.java | 172 ----- .../weaponry/IWeaponryLendRecordService.java | 107 --- .../IWeaponryReturnRecordService.java | 99 --- .../service/weaponry/IWeaponryService.java | 88 --- .../impl/WeaponryLendRecordServiceImpl.java | 181 ----- .../impl/WeaponryReturnRecordServiceImpl.java | 162 ----- .../weaponry/impl/WeaponryServiceImpl.java | 117 ---- .../equipment/system/data/util/AesUtil.java | 80 --- .../equipment/system/data/util/BeanUtil.java | 33 - .../equipment/system/data/util/DATAUtil.java | 67 -- .../equipment/system/data/util/DateUtils.java | 343 ---------- .../system/data/util/EasyExcelListener.java | 32 - .../equipment/system/data/util/EnvUtil.java | 60 -- .../equipment/system/data/util/FileUtils.java | 115 ---- .../equipment/system/data/util/IPUtil.java | 121 ---- .../system/data/util/LocalDateUtils.java | 267 -------- .../equipment/system/data/util/Md5Utils.java | 36 - .../system/data/util/PinYinUtil.java | 75 --- .../system/data/util/RandomUtils.java | 49 -- .../system/data/util/RequestUtil.java | 49 -- .../system/data/util/StreamUtil.java | 14 - .../system/data/util/StringUtils.java | 93 --- .../equipment/system/data/util/UuidUtils.java | 10 - .../system/data/util/ValidCodeUtil.java | 101 --- .../system/data/util/ValidateCode.java | 276 -------- .../equipment/system/data/util/WJAssert.java | 86 --- .../data/util/excel/EasyExcelListener.java | 32 - .../data/util/excel/EasyExcelUtils.java | 144 ---- .../data/util/passwordEncoder/BCrypt.java | 628 ------------------ .../BCryptPasswordEncoderUtils.java | 79 --- .../equipment/system/data/vo/RespJSON.java | 153 ----- .../equipment/system/data/vo/ReturnCode.java | 69 -- .../equipment/system/data/vo/dict/DictVO.java | 46 -- .../system/data/vo/file/FileResLibVO.java | 70 -- .../system/data/vo/file/UploadFileVO.java | 78 --- .../equipment/system/data/vo/res/VideoVO.java | 75 --- .../system/data/vo/system/AddRoleVO.java | 31 - .../system/data/vo/system/SysDeptUserVO.java | 36 - .../data/vo/system/SysRoleResourceVO.java | 35 - .../system/data/vo/system/VerifyCodeVO.java | 43 -- .../data/src/main/resources/application.yml | 0 .../main/resources/mybatis/appUserMapper.xml | 213 ------ .../mybatis/system/sysBaseParamMapper.xml | 192 ------ .../resources/mybatis/system/sysLogMapper.xml | 277 -------- .../mybatis/system/sysResourceMapper.xml | 290 -------- .../mybatis/system/sysRoleMapper.xml | 180 ----- .../mybatis/system/sysRoleResourceMapper.xml | 199 ------ .../mybatis/system/sysUserMapper.xml | 257 ------- .../mybatis/system/sysUserRoleMapper.xml | 193 ------ .../mybatis/weaponryLendRecordMapper.xml | 213 ------ .../main/resources/mybatis/weaponryMapper.xml | 247 ------- .../mybatis/weaponryReturnRecordMapper.xml | 213 ------ .../system/data/generator/Generator.java | 250 ------- .../data/generator/domain/ConnectInfo.java | 50 -- .../system/data/generator/domain/DoMain.java | 171 ----- .../data/generator/domain/DoMainProperty.java | 78 --- .../data/generator/domain/FileInfo.java | 29 - .../system/data/generator/util/JDBCUtil.java | 68 -- .../data/generator/util/StringUtil.java | 210 ------ .../src/test/resources/generator/BaseEsDao.vm | 14 - .../test/resources/generator/Controller.vm | 98 --- .../src/test/resources/generator/DoMain.vm | 36 - .../src/test/resources/generator/EsDao.vm | 157 ----- .../data/src/test/resources/generator/IDao.vm | 64 -- .../src/test/resources/generator/IService.vm | 88 --- .../test/resources/generator/IServiceImpl.vm | 130 ---- .../data/src/test/resources/generator/List.vm | 208 ------ .../src/test/resources/generator/Mapper.vm | 137 ---- .../arm-equipment-system-parent/pom.xml | 96 --- 202 files changed, 18431 deletions(-) delete mode 100644 model/UML.vsdx delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/.gitignore delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/README.md delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/pom.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/AdminApplication.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/AdminCorsConfiguration.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/InterceptorConfiguration.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/RedisListenerConfiguration.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/SchedulerConfiguration.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/BaseController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/ExceptionController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/common/DictController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/file/UploadController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysBaseParamController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysLogController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysResourceController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysRoleController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysRoleResourceController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysUserController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysUserRoleController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/user/AppUserController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/verifycode/VerifyCodeController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryLendRecordController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryReturnRecordController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/BodyReaderHttpServletRequestWrapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/LoginPermissionsFilter.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/RequestBodyFilter.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/SysLogFilter.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/util/CurrentUserUtils.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application-dev.yml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application.yml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/logback-spring.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/AdminApplicationTests.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/SysResourceTests.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/pom.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/annotation/LoginCheck.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiApplication.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiCorsConfiguration.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/InterceptorConfiguration.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/BaseController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/ExceptionController.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/app/SysBaseParamAction.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/common/UploadAction.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/dict/DictAction.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/user/AppUserAction.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryAction.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryLendRecordAction.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryReturnRecordAction.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/BodyReaderHttpServletRequestWrapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/LoginFilter.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/RequestBodyFilter.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/util/LoginUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/RefreshTokenVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UpdateUserVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserCenterVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserLoginVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application-dev.yml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application.yml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/logback-spring.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/test/java/com/arm/equipment/system/api/ApiApplicationTests.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/pom.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/AsyncConfiguration.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/BCryptConfiguration.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/DataApplication.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/MyBatisConfiguration.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RedisConfiguration.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RestTemplateConfiguration.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/ConstantValues.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/RedisKeys.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BaseDomain.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BasePage.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/PageResult.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysBaseParam.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysLog.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysResource.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRole.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRoleResource.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUser.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUserRole.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/user/AppUser.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/Weaponry.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryLendRecord.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryReturnRecord.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumFileResourceType.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumGender.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSortType.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumStatus.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysLogType.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysResourceType.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordReturnStatus.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordStatus.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumYesNo.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/file/EnumUpload.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/AuthException.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/BusinessException.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysBaseParamMapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysLogMapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysResourceMapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleMapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleResourceMapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserMapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserRoleMapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/user/IAppUserMapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryLendRecordMapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryMapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryReturnRecordMapper.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mybatis/type/CustomLocalTimeTypeHandler.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IDictService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IIdWorkerService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IVerifyCodeService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/DictServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/IdWorkerServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/VerifyCodeServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/IFileService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/impl/FileServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysBaseParamService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysLogService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysResourceService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleResourceService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserRoleService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysBaseParamServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysLogServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysResourceServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleResourceServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserRoleServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/IAppUserService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/impl/AppUserServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryLendRecordService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryReturnRecordService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryService.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryLendRecordServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryReturnRecordServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryServiceImpl.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/AesUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/BeanUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DATAUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DateUtils.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EasyExcelListener.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EnvUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/FileUtils.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/IPUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/LocalDateUtils.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/Md5Utils.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/PinYinUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/RandomUtils.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/RequestUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/StreamUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/StringUtils.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/UuidUtils.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/ValidCodeUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/ValidateCode.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/WJAssert.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/excel/EasyExcelListener.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/excel/EasyExcelUtils.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/passwordEncoder/BCrypt.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/passwordEncoder/BCryptPasswordEncoderUtils.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/RespJSON.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/ReturnCode.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/dict/DictVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/file/FileResLibVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/file/UploadFileVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/res/VideoVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/AddRoleVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/SysDeptUserVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/SysRoleResourceVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/VerifyCodeVO.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/application.yml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/appUserMapper.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysBaseParamMapper.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysLogMapper.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysResourceMapper.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysRoleMapper.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysRoleResourceMapper.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysUserMapper.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysUserRoleMapper.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryLendRecordMapper.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryMapper.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryReturnRecordMapper.xml delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/Generator.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/ConnectInfo.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/DoMain.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/DoMainProperty.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/FileInfo.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/util/JDBCUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/util/StringUtil.java delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/BaseEsDao.vm delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/Controller.vm delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/DoMain.vm delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/EsDao.vm delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IDao.vm delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IService.vm delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IServiceImpl.vm delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/List.vm delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/Mapper.vm delete mode 100644 src/arm-equipment-system-parent/arm-equipment-system-parent/pom.xml diff --git a/doc/“枪易借”-软件设计规格说明书.doc b/doc/“枪易借”-软件设计规格说明书.doc index 4053bc2fda91e7866ce2c2832227409feee856b1..4c0ca80f8c5414ed08571bc76966babce88f2341 100644 GIT binary patch delta 103532 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

QvJvn zJKcYLJdQa2Y0{9jHp=vAk;k((P1lI?aWRAQI>PC7l~C%u1;z2!*5rD(;OT6i{&0EG zx*4k3wq|b3sy54{v^2cez~%B6OfWRLd{f5<+*)MjmiDam3Pg+SN?TLhL!fKNC8=U& zuEojWb#3V8ghNN|^^BjJFI6m|&9pY-=Wf?dS09zuDZ`%abe|V!(2>ZtKelu{WWU}m zleE8#op;<9p1-_w0I%8W^1tK-S0EM#N>5Htjm{6P+NAv~aR&uuaUkDJIe=x?IDf&6qo#o=`K>y0fU1t=k z&{Kc8)CxRvKOJ@$4tRZvxA&h-7Z9u5+c>#^RQE8z6OD1b`6!uz|IyBEsxei>TBTJx zM(D!-$Hxo9Lt_^HLOnu$evg}tyKz&#%aBEKtz!PA&&8;w$HU6*%@gnKjP8vtN%pM1 zXpho)nm%QF1eF!OUfgW$Ua{&Vp;XA+?{A!4c4S(8y4L%eaSY69rDgY=oF0oW@x`^Z z(XlJ(KX9%3-qJl)%jTxG&&*kcNj>WGXEQi|+S+r8^Ko~mPG7e{>X;wh(lKy|F&!zT z4uQVa(^>bvdzXEutYEpjN#Q%b05eQs*YGjxbzpb~#$av8c*OY7kG|0pfm`S?4eM1^ z+pe?}j%Dp!0~6Rj?MzQCd}9vNx3gWzZVFCm>OQXGX>K`A{=txivN|vx&&Vk-p)+1vV{{{TWk0_62Up|dzSRkCu5fReezEERG?F29o@5AO%t(s}BmC#lcY4`agiB7P^l3nQP2udhDpD zpqOtz6}E_i1XB5ojb1RBT^WYL9*rVbabzaWS;{yqZEt#ekc<%FsTw(sx?31b{5^h_B|x3i>Fdz84Y{R zOAy-PccYHl67sS*<_h&2ylfN``6~M6H*lq6Oow(FNI?pkucUz1Bx65b)aby)otQI( zUX~Oa!JvtF;QF%dB?Nn|oohx&6I{@`O7dFCF>!cI0tGG$_&x3v>_J2g{Z`n2K@w#+qZrx z!Q3ld6|_S!<)9x3C>JG{TFrt|e3)M?m4H@2J3isU%pykf60(a>fC(7n0__?m2iF&d z4TLvY^ksmeTf;po76MU;=Dl`dw_l z)G>IYaU~{yB75N5MK9oheX5%({hZKjm_b1W%# zlTOhJ*Q9S?BMTDS*$@GY`M-V@x*qjnq14QUU9K&7fMYe79c5lJ&Zoa$o72Gj2<}@v zQar6K9e`hq4wl#w1r+?cmau@K8%tu_i<(7KNvAizkg!0Y1IexZ28#Jnumue{5MVR0 ziL*HWxDkKT-6-mzllDFwwHC9fP3K5hAcA6$*QB=nKR8l?+G`4s6TdaiMCvbjEDjW0 zeEkiilp}$U`&S7c7x=G>f3^RY_1{h~eUN1T@4SCnY_L=w+u!;{|I-L#TVOBz^?Uq( zwIC9xIE#N7p~1d&5twT$0_GJ3e=h#jj%WPt!f*C}vHs=!FY^B{QdfqCcIWXFFWAD_ zhgw4JDcA2S1NL9jd~H^8VOqg51L~c3b zFo`Qu406Hb>$H3&gRcSCD}j=It*$=)aTVy19Gv$Juy z!tpHeK6*d60<+J4L*()23se2^sl4B$0J&Cu{>&+yD_5*>4_RZN%^IyyGADp}4h} z`oq_Evll}12eR4*fp?P?W{VXnYb^L^aj0_I+GMaAah#!4Dm$VWVCaoJYO5!FgQ2Yi zvs7J@}(<2;v>7!|VsTzOd6TU6Gm%6Hl-YB0}T?Y~&QBDai^DK%uSZ|9f9q;B6n$sil$?J;;OOEllaIj#)U`B=OdoE&{F$~l`Sj@!U z%=empKKrzs7Z*Vx=O)Zo(H8{OYW%yNeB07DiA^Xo3B2moEzDc z4pf9$H)7Zs`GP2>u9Ool(1o9VA(Gbu*D&de3-!@VB&heC98UyOcPFze5COy++mihq zwzDPvhu;N(f8noP1>%Xh#vx+=k=%g*`F5hx;juAR#jCuiT4N6w{a4>_KzE&_DgI8G zZ~7-?D&Jp;jkF7q_;d19UPxUupzI4gcDxsE*Zg0jIuD5B00YJQJ7itF$^oQyrvpV` z+KK2N_C8l+%M~3d6Q1d<4{ld0C;|i{GycN5Hy8f;i?T((=`ALIqb>eMXZ!=r{=mJ# z6rDHBJ%s$H)?GM&Gi6KLGg5S5m7$k{PP*{dIR$dg3%G;5| zmH-Fi5=L*tn}Y>JZECm#8i%$nI+sG8FI6;7D+@8(v0cy&&-wi7x(w3@*BD~*iGgG} z6dMqH;3dk}{n!o1@KUX@L1C!IK*eK>db~?Fp3#M2KOZbW6$w-oQ~lW4KyUJ5@^cI# zv?TjfmPU^=czk5Df9>ec;}Ej5n4C*PH>8!~QKjy`q{zy&X!gceN3FaX+O98k4UTjK3H(ZB!)tRi zdY<>y&Ai~Mi+QBxSScS|@8i})f3X=y)D(t^Q)(?5d)DlKjFtgeENcpB2@=@lTCZ#i zv)AC#h@ugyb}&ay-`!wJBB@_-`x9-NLC6S5R#5(P%Mtqme|}T>kwaJy6__zrHxm zzdn^{P*PB6_2=KRMX+O^2h30#0Li!m(rH+WK&j;@;({1XwaBLj95E&kb$rL}MuXmu zznt4I5NQ+$oXBHUGhgJT_C*tPIqT85NK%F9yYh@N;0s0Fal^YvzFjnQ1$rlrbK$CZ zmvL>IJ~6IB?a2QgQ7O1KAFG8KtKAHwF=Sd6K8fP(U_{^~zuhfB^yP4Iq#Z!8jCUCB zvr3YR#+rX?e-gcFw6#DalU@T}UHp|ecY#PNy#^lKWkA_wG5ExMSYpR%4l|$_Wr-(z z<&aC>JFkWee6Zg^!dRvT_!hS1@~$3U{B&VDkzq)n*`T_p_Ckt^tw`3)6d5E#xj4e8 z70)lnO}sdhcsiK%%}R2fO=&cGw>du*l!js|iFyTk_+s@}(CGZF_j`2y zFFk+Im;^BriTX|!rvK_QWK%5sw(UAX@rtnUHh4wrOM)`SD}X{}FiYc>e)ICsfBiOo z`t`R>p7`%}3-}$p14{lc!QOxJUc!OQzsDX(IN2-jPj~;550n%w2GmzjEuisL`+0~a zdQpjzCv?#-nE5F63)lm0)ms-rrpTOq`RML9{U=qO8x44MivaT3VJF}Olf9e6&9!ex zLfAM18{$4E&hkYt^S$lHw^YSeGD%+)^r#ZbQ?REMiJu67UeV% zp0Z2CaXqLQePwU9k@y5?QLxr*AygVL)nrD30+wU-^Ogv3 zM-WRR2M0B6#3be&Ksk~L;^MsP;NM^s=VfE$Y+ymM)?^XDQv#mm6s&BTNILIm>+t%L z@nl(|aPr|WAZ^S*FzmoFKtvR2aMFwg0gPoMSRz6xH3XcKtsM{A5zkI^J3?tNSb&q} zLys@g7$Z~8lp&Un0Vx(pfE4kMK#($smET9BFOp4wMPVQW5)j2_kmy2%5t#x>+B0ti z10YS(0Fb6;WHpQl_rj|5V1X^%p9)32>S@ulXWHF-cfnz^qK(8P-kPbRvV`@!?-+ z0fImjQ@`c*!^y_(1vpOt_JvW+t(8l{-s#)v8xNPH5nA)_0Y{K ziITM!jI|R_gF#zv5Y}{8Bf1_fDs1Hpe0TAX#tt-PA@@<73+OI7&o)|GRkSPAkb=Tn zl%v<$n?WlBOeC#btqCb%=gI6B6L&C}dIi9B>9L$W_n409a6DS{L|bnJA$2%e^^nX1 zrQexeLeFPEG`)zBAJLex3$6*w@Hy2Xke&Xziz7@~Ki+kMx1YlxQ^a9)wK*i%!RTL*2BI`(n@b?~z+Z?>^(Er?d;-ah%xtOlr+kav#ub@yeW?_t6eOEp`j<-9&iH1wS zima1_{g+8U120(CU=u88cZdG5-J!X>ED{d>AGpjNTxG}m*?jb~L*BLO z`Sg#~;HWud!63^NHEpSV?MYf@{K)>=$~u^VtMNw6-xRuwCmF>o6JAU0P`X)3AQXMeKIiAyT*E{;|ScXEw0Y@;RPVeKGc)DI2IHD^51vx?-p+bhN+-SVyVu%bX@H#}u{M$GBIHCs0 zAwAlYm`ac=c{uLU#WG_@O=zg<@o=$-@m=Y%;2r_o=-Th#{CI~{g$LPq0nxDM@8jK? zjF;EfiixE|Sop;yPo`3IaRo<;SZN}*1!|*MnZ;lH74D0Nhv-g5? zv(FY(g+zQO31p{Sq+NbRhF-<-LzM?)FU7;t-~jc?90#_%0>*RxujajZA6%c~ z_}>PmJATEZ#fL?pdmi{bmF4Y3RR0Xt{E5uSZMR)( z6RBxi8yj|8MBl)T%R&=B)P>;5AXD%DJw9CIZIBbOwo_4 znU{%82c5QAy)4bdegq$#@(@BwOy`Piy~8c>(LJ8Lt^K1S{SIG31^c$2*(5c7W<9|Z zVo1B$mWkyfYlZ@_!BrpKH*gR4PAzEfH*7oZ&q!YEC&91#miu4vDX;A&>Dm=|HtLs+ zUTmoG(@d^iGpr<-zBEdCYB=)EIU9btrXA-+m7m7RF6PnR&Sq$!E8|winiv|_*q4oS zoP-=%kCQEM|HilQ3Jts3!mx4dRL&8gAurW;px zJbC-Fndv&QdwQO ziJjgihUuJ9n*&*tab20+OUEd6b=UWhB~m}M?bNbez~UDqp3d2Q#r9U<>>801)KE2; zBCipn+OCkYBgsLA2py* z!L)A4mu2~5d+x*mCA2qx_vD7WZO3RM)#K;J-Hw#u=tU`TkF!^zxT01&=k=)*=2jOV zl0}Fah7Jt*Q9E}6VNxPeIw#e-#QvqTL}jfwA457W4D@bCO=(ele_x6H&{RXPzgSvE7 zKZn5t9KaGr^an`5yvln+<~;`7jiuHDz!=?rYEQuDW^?VMJhs(b;DxE7AiUOH56556 z*wvDht5qQA@k;W+-R;ReZoBjjEY5kko4VM?wdv@-{G3s+F+IL{v~s>*jCBnLcx4V8 zOlZt^E|S4e*htBK$(;D@d~qZ}u_bMS|9s((MksJ8({w$4AwS4y+Fm=7h8yv8lcO`f zVny#G#(mx5bYt?exyz%|md>!3ay=H(Z~J<7yk5d>BLovi$%<#$NmwOIT+B$7gWF#$f>@elgw8T zc=3&Rz;%Cx;wk`)808I^)-?ul=6kjQVzO2~1lyp_7Um1$a3LdC7|;`sYbse*)ycRJ z4-?P);`kX-f!B7eqsJu$Kcsuo<8{OqGm1lFW5k&LFmfn4>%^%Xk=r&u0MmFHGL+4@jLFg^gW<4!V*E-}L<#RhhDoSgp za34>!aO_o5algB$C-i|E8mtl=Ht*(+=YFf}IDx#=CSD5+Fj|4&XW7Onjc9Q^$qR^1eLO3Pp!kHFEqZfh!QRq#Myux&SKjVXm8v)AyrENG zV^K;@;S@ObG~g}fbKX#{HU4Al9x?Mf+ddOy2$Qk3BXZE0)puDYfaCOa*|TogCY)Ft z7E>^Uu&dIY)t;HQE9m|_XNsURcV~b@mOgzF+KeBX%ityCh+q=@o!}hJ zzzIn)jCsT7E@5e26=8G&I;IH@(Ij;6HweGpm5AI#Ln##y6-T-)ODvJAbn#NDuvFhX zC3!*^6?swQHYvAJ0J|CAO&*55CmZ6Bg6NWK^ZVtpyoN5xoe!zhlmLS!M7YHP6 z%&i=%Iv(Wb(xJ&^u!fHrm#PKMm=bV1`~O7&3OgsFJMYYxazGg)SFP3LeP z5fojh*RS0~Ltf`LNl|Wx&XpiTS(Ts|QKP2{^G;si?@FHH*h^OI5N{lz*%Wn&9}!7g zUtQH+_wyo+BwC`-VKT+f>|bthg%Fr47Oc^v+BRAIIKnEtdbHkI1yIVlH-8}KoX_9B z;-=WgA!8vpxi+@$f!^>t8vlO7PYlEm4%h>n8?T#JTS*CaHXiK*n^QUWln`(GF66IP z6RKMY*2>!&Jr{L85k&0NG3F9a00G1LtQcF z-mjjndh$#Wup@on)UD=WFTVCYm^suht~?!F*m?V?YAgI$yE*Zy*JfI`YQ5gQ*}NLd zSai3)J46Z=K=Q&S)KxHzkiJ6Bd-G2m`! zvm{l4Q|RQu!ljl`@^R|H!~@VJl(YHN*R1ZXDSNic-=4mPb$q%Gt3c8{Oa;sI?ML5$ zWWwWq#_o~6fak|i(}+Bed$X&#^_Sh(mw|P!>k+-zvk~Cw==^2h_4Q_XsB5T&0Pok3 z#r-c6hYPRfH7p@#upU90z3Tv6$%K^JzQdi3g#55`N*}CXpCeQ0JaQn3DnWGnv+3@D z15;=>>1g+gfnsHEh*z3iShI2s6TyD{o(03w7UqhNtU7K~_$kbc#X_s6dnj|1(_wMd6$lIu39si9I$(zMS2^hZ34{XID@g1hDB_WW_#)6d0 z*jhx72R9SKCDxRWV}Q>!)2mZPuy_@OOb-OpxU!(ESJhjk*kJTzV6ul8x^&>-@Wjwj z)gtB!3u&)VgE+{C_yL^wWbumd&^a@tnq*I@WQ!)uTYYOge+ZcAOL~Dx_O6O7-6f>? z;el9!1U$>;2F<$U*|w%n&V-zI$|swAJ>S;Z?cYJ-cq^d$z~EBAA?>CUW3WkCPQ3vc z9udz^O(Nj&a**&iA#g`V{M6;pu8sUyG&0VgTG8l&g8JkD?<3@h*im%IBam$~w##g( zas9e^d_NEoVF;++hnx+P_%#-+bFY<|bkK09l{Rwlqo&yEO+@Trjx?qu(cp^-(sSrP z$+()tC|;c#vFo6fwsmC5;kNLFA7{8<-e2B>#*=|hd0Y}NjAOPOZi)g)@+@HQyx)cR zEK4U`{uP#YQfJRZDyC~i$;~Gws1VtpDoKkGNA;qv9%!LP6REG%*qlKlSQ(~c!Q=4q zL=C>tKkw=$(vdr7t%h97s8Nq+C9GsBX(ppS4)`pYC8V-B3M z1nPqdVqy_KjS|0NUU-feyKq>EKgL{;kP5CoCSy^dUlAizUNc(g5d@)<)RmkHE`*W} zoR~8i8ZZ~6sDdj3LgLP3SaZ-^9%zYc|F-;glPl?jg2*5}ss9Xc=7Q8!a1B8;kjj4m z7)m-)AOZBbATbr({{eu15cXVklKq^*Mce}H?l&|ZEv*2uA8tp}$$>jeHanEQ??0LI3r@rh{}!#qC@ zt$$EzcFW#MgOFKXrXdLGsmtry^kL$7ce$_6>E;YJ<%0JK+-U=csmPvqBD}A!bj#~| zGZ-Fa4$ko{n|}$aWa_Q(d{q@oj#{I^m%A!asV~1kFUD1tjRvGMjp_VDiTUM_blqZ% zAQ$G4(RzvTd> z&$0EAi98IdHI%8M`0S&s-JrN3FseJ2CK(YyR(y9mluS%&3Z{?%CHOgIu8QW0RZwcW zHzt2ULCBXG1y!J)p6z|q7Mk7c1+|?1bznik-dafC$yJFz5%8c}koaLk;aSwX3rkEW z9!8olh&0HzFIb0_Mf@fz+-V*0iEA9>59sjAp3=uU07GC#sN3I83NS-%kw!r!aXxm^ z>X?VtimN7YWnNZ#z=u5XatJOwQ8w`$;fLwb1T74vu(H~0qXhFGt|c10Hr(nj9G~#x zHOzXVN^Iu?O$xsKlGT!!su1`jec$9%kj=cXGB}jPb1s#vmc&&3`X%kn^DmW7ri`9J zgLv|e=GO;tXOOkp9CHr(ZwM|ZB!vTXO$-{?f5N8@LjN$LV*Wz7u)i?w|1oEoKw2Eu zK%UQEu^U7-fpEEuB0W%I?IjS;lTE2ZXghzQF6`lNo_`|#M}Q1LRE%K^)zROy|0#gc z8l=mg{zn(op=StCz|8*(0RENYYt)}l;@_40uZVwo`JXEJr*x|&Hy^)o$#oca^QDY8 zQCjKp@10z0n=6q%Mc%HcQT4-xR9B9k+v}xiy4lHIWCZ~Oz5|1Z3WiSw>dFJ{pDM6-cMDD$sV&uG|OztYLe@`9OEP1iOy_d7R%HnFj3 zk62}|oeF|7lZ`kV@w4WE;(LwHQx6w5RE#KC^1T*bz+KLd;XC;99pKxWD&fz|(jh z?!blB$s71pIascteizh(hwm}A<;daoJZ^0TB$4!1f+@4zFn(v zbMO`1o1t7W zE1@7nZR}X1NiV*jj@)jTl9o;xThG`Zh@AA=D#V5MWjU>sA94q{dxt7)XKRY-=QeEo zxkeL^UMxoquHmcV_$N?F-kc3m*T$CYPuA!HoQwrW_ik;0N47Pd{Q4^mmPadhzU);R z@<)Dnd*>LYGSlvOWik0ytLVX6QVv}cB*0EY?in?$=M0_6=o=FiP2A6YU z-Yf^9nUqTHiGj$SJXl8_n4!}xeFlIpm|8o8LmJ?rTutqy5m+=T;YgDI`t8T#@ zfP*etC_dlj*K$+2oLR8>srfNp3vnFn1#kKAO#hC{^t{W?x8+v9A;bSs+M_qeHBJ5D z_FLqK?kd_If~PjnLoSF>mA~N0Y$bO~9Qn@0P!POkAxtp62qU&n-fKy0&i9?m)(lk% zoKZDqHiwcbX~dU>y0||1r@s>l0Af8Qg&#p^ob(ogrjJ2GY60uKW+5EjYIBN+FL(K2 z|G3zA$U(3UG?Dxfnt}`aql-@g(z03tg}s=8W`;kuqkmNX4LPhqVZiSx1&8<29P?&|Yd!_fw#d2rw9aVNQ4iQA9>gpWep@l4&3?Bq!{ELGERA8>^6^hI55eAjW= zXCW3#;C>RtkehjD!x$8h3*Ji8WaUx_$3yPD2Q&Hxu|ul8;5V6X*NPuU*f+3R`eI-2{aZy^Eg?gIP-XW%nz9&;N_b^ zCYXyiOB`!d$Z222@>^ac)peljKk;>Q8jv;XpIql^6m~OPYY;b=@WjiTD8U5#< z_}}H)6e)f1AIMTCk)okj*UiQ0E@%!b2KwW{Z!*0}*uSrfzKlFp3b@^G?F4L><}J7# z#r%JCeFa=o-}^t^Fa)JbB~+xO8$?A~MM0%O327$HxP*d8eaz7z0wMw;-3=&tl!{aYGn-7GK0!0I<^Na zrg%6!#zPTvA-VXCm@0IRj(4ikkZSJ*iqkd1zBHl@OUyog=jPJlh3zo6d<#n_`O81X zRiRldvX(z4fycH8kFu_~-D)2z5v#GoR4rZ_?RRo~edY-@dsKeMm^3~Hd?#Gu#0T!j zA2A7mIq6sLbTGug_7VbpJWMb6fE3;1QrP85Fg&pr@A!79_90GzX4_$gn=FnD^Fk3a zz8yaV_{bl70#fR$XX&?M;;I~|eGkcjF_4I<{?X95`30Yb=qhv&d<;6f5NHF!=aZF> zPwB=+hb`W|`#f-9kf+Uwt$F3*ar3hmW-AsY>QLt$liZ|tc?9E@p=d@?A(xjLkv+%g z4F>OIC`P|EZW))|n$4)9ufF?MicvKulbv$Y5sBwaOXD+ed3{7A(ba6PnBq17Wf$jP z%6aS~VO6f_RTFO$Ib_Ebps%H@EE6Myynj>qrAA*6XCIQOe#i&@s zdPb)7z%$A@nY?4i6h}Dvkf5;#ZQGY(r{ddXWV*+TDMp&u_x=ez?(K2f$5*2JAXnp@ z9C14FPL9-87w-7#16qA!ym}eDL7>+XA1%iTAvdKzuk=|&m~w-iVnDC+yKr%p$6rVI zXq#caZb&=6N^AZ`8vIn$(ZAn{3~!;M)ptMHf9j*}>r7>Ln(R#Fta5K;s{Ff!BpDfp ztKM#v%266z)zWv28OHtbF3SB05qy0}J1(4V#U{V9r!hd19b7oH%WNVyDn5(eM3#rU z^qlg^IA@||1X{p50BV~gVaElU@#OkMLIfD~*~|X=2TJE>@&*;3q-t;K9g0ex6Cc|X z{>O#ur_KoxIaLRK2`cuz#}KWUlj($sORWU|HR9yB1_zA-S%NQluzm;uD)|5A@tO8n z1AR0Hy47d8esnNOIU=BZWvdqvy~S0i;f{$TU>gWH(*{q$JWsZaDpBr5rVWKp&61&K zy(b|xN=h^4yalyqqpZ)V$A-5?zE&tK3I4v0H-)GphewqAyOHf%-8+^}sLmFFk9{0x zg0<8Ex=AX%z5379mZPxuNq;`Dq2#+~>n+Ug9`YMTNfh+>%4)#>)jY zrl_ud!Sdq@bYE1$N5{$48BV}btD(12nZ~Zxo!!_f`Do6jf5S?8rCzGG!4%`V?K^S+G#QIbg8_v)c{6F0KEa1o>i$4YI2>-S3) zZUH6|Gu-5F(U`#Cw2PYWz6(aY6(290u>5l3rSrBc6Ibm0 z@0c8gr04SB7ma25;^bH7*6412?I_u;#Tx+hE8Ft5lb3j(!zrS^Ln(fhS$nu?asgY&P8Pp{qsIA%77^d~If#Nnh|iqF zo9MKHqJEaVW(MMQUCSp({4~Dp8_$@>prdLU!tE^qA0gH!;V#lt(r{*=M1oGzy!A4W zeIsxufMBhrOl*N-sI)j-PWD!8VW6 zoxUeJ+n#d^x8DC<`ukSfW<)^Uo#vMQ%?~iBvxwC(D11uf4%?^vP`S{nGI?ct0x{}r z>!DfJ(#E~ls#B7j`%jg#FCuM|jkM^gbRjeM!lN+WD-@HOO7G730ry<2lC;aoIb9VrFVIX%wfT4+=b^k5MQ7v7 z&>Ipa2zh$%sMH(%haM(01PK#bnXHTH&Bw!vql_=@M1+wH*=4DkCo!SgLVN_jCD{i_J5A z(Rv>*giFY8lXp|CzWdyt!pR1_DQQ@A&5ho^QAfXsVw2$(h1Pfs)D%x+G^q?Dd`wg! zZvl%cJBJs_J|=m&P}{gm?I*y%y-QI(nV5Qm)yAnQe8*aJASU$)A1yasDO3vm&)8cR zL}GOZD@h6EHHMaP{!eDqJpD8|@~4i~a#qL&J#yNze`RpwNUs#rFgFIc5uZt@|K1a! zJrv&V_(`bQPGNzaKHg3uj6&3ZTRc2Bdm)Cz{nnrAlhr}x<ZL z?E=OTcQFR8t(HsVgJ|8v^%J_1uPq_bxRdQoeX>s^?@!WvP@(xk zvh(yCT@bXB1^QvA-{SQKRX-++j?3rfEr+i1ipyw5=MSqIG7N%BNWhSz;495Zfwt>p z@~@UTIZd1LRL?xt_mIoDMsd&W)1#^YOq`!@J@bUqMPDV455g0xY4hC5c|F(XKH>B3 z(TR7-_gv4NCKJxzq_6By-Q!b9yimIuGkDjqLA1c>0`r;^((l~YSG9vzE1@@!D$5=L zh|A+12u{J0eAebv0P;z!UtW?C<<$jQ4$mDJIc~A+ExKbLnPKG-JvB}?9`*f4N!MN#q%ps{y25N8Z7PqLxM^;jG6KthOqFo#uWN#xg~8Ir*e z!8)(0(Hqoy@rG;9)Gi~$G`EopNsrR3_AraK(huha#T&64IvALbA zyAsAo@>=2JnrowTmEPH_E$qMsKj zH$g6y(wI%(p?mx}ONH?> zud~IcUR!Nu9La0E@WuFr z`&Z)|xk|0q0j^4 ziD%+3pZ%P$@baS5m2*NzcQiF`$%(Og9P2>JzVPk2#(Lx2?dS_--W7v)dhT~7r7V*( zXm{41(bCb+w#!rHzpm5dV=y}MX;j#@kTzQJIa(p@nHp{!fa=`*2!sElRU0QQv z>8$|9!3%zTsO+*M9>MdE%^^++FiD3+izm*nY(&qUwIoW1Epa)GDtYL%U$4{i>XC6Y z7?FX%bUiG_xz(J{)1e>nkkv zW}NOX*H%9J;luNX*%$eKY^y-G65Pi8x0HedDb~~U6~bk+++jF=cawJCKT>>XQ3Wyb zdOJRMgZBQGGSjgfHUa9wbf^odG~8f`u@BBPO@D&v&dhR0D7bxe6}a8=5fXUu5js|& z%ed2RRFb)teO`UO-B|FdJNMHtIiGPd*~LpbePm>GmvUTRv7G*=G<6>af10gefHa2G z(Tog#^Kwu~wp5cT^Uk;?)g=AEmHpOpQ`_zxIjz9Ds>}a)CpN&IO-R+VY2UTzkMV+a z3X%vV7j%u&Btp zr*l#ItM1!3Dp#JT&)-b9=Om+2txE1-du;!dClpV@mgJ~W%)RFs!YaYRlDYj+aeBQ%=aWB8&Ue`U64VUE;Vmog~tRfanH|Xj3Jhv*qN%tBJm_dyJ3sgPtlOrb{PZ z^Ojsqppeq{kMlmZL2Xba_5L$HLqZ|E`l)Y_nen&Th280rD@~1Kb)Kuo3-`+b9z}*m^osZuiCeFNBF7J8U7-s$U3skG9woYuW za~F{fyRz7%aMdT-ZF@qWLT<6@?CYTlMY%Xd>a^_GJMH%zD5(N&6nm=TRQ)W9PqkwN zb%ewJA;#Zp+h1z9-o2N6PoyPpU!DZcvc!0lwxIrr-)nHEaf1qTIywPTIOiH8_}T8L z+=#)Ei>gDy9g?V3UiC~!gbYo+?J83kDo7xv1y2i*w*QC%!7Eze}a$Osq zy~ZdA?!if7xN8b&?Rs+UljO~m1tdnwZ0&T_oAf&K2QZWa?AT}{fj$7(ThQZ?eG#zv znA~X~Y)~_TDM=P~Yx?sluus94vm(?;;oBJIX>c{I=yT_XS_Oc(`P?(>gmq6`y?Qf} zTSVoY;fV({Yh&OS$>nnCM7ZBz5+D_Rbr6G!yf1mquyn?oxpKr{sYX z#V1Fvi{>&)B`CN^9*crFIo5>uSf6j?xPF7!^)!b_CX#7&_Ig;#M7&5mzxuXwY3)Mb zZTd=qm?WHS<{M`X*E!}9$*tIt)Q8;F!h$(W+Z>d}?%_yyLB8pg7bPT>f`EX`Ma_qK z^4ScZBaSZ%@7z3kJ^5{1XJvf0u78Vlp`Oc4n{6%rH!_9CqJ_xigsxDhJhaw-;}G-h z<-XOm$l)lpt3_qxLPO_e*T^Ay@Bfjab*Bu~b~)QWP#|jy6;2Q>Q@Uy?U{@VA;JU1N zQR=q%HidxQHI4ib){3_Y9yXaTfwL8jFJqj;RIUY!EsVg<3iR46ignTETwBnwzV)=- zQb4dGLL2o@rqZpK5q%j831@E&8i&x$kx3UuZ@86Wk1z8=($euQEZO@)EV0AF{Uar# zMMoAwE72xWa7DMV6rYnXUiv@Dxp5&EE|9D=v2@Y{Gd(qx&ai0HCY(~4u(_1?* zxI?sKU6i82z02Bo9nylg&Ru6zFM64cFU+nvY?|n>AksN>@2RFH)ToSRGxmV#vK_^REp}ftgM#_F7VI&S+&9~U#b4i?g(Ei=_ zQ6qk#eKPnzSVlIw-=_so!{1{WuaeflPp#7P@%-4k9z6a>Ka_+7JkRH^7a292*%Lgt z^$NJ15IkZPJdrgQp1DeYmglcs#7MwnivD^D3BsEg=|tenYxG=XCr-gLtmygSdTaD& z$ka~5ukJF+@%-M32%Jp>{^BGdu{r}cVxl_--#g%S5{0ktGF~LBSB4iqWMqRgzh%t7zyo`Kw8TK@j=_=ZAg#0UVaphfQG)E4Is9rXBRAaeJ4hR8clgdf-|3I>{MjQ2 zJWcLjJ^SB-H+`oU;ra87;eRQVAHyj&=tbb!-|4xIU4IK6%Hjlda+mP1akvZp@lzTe zdW7yM&mW-iU+dm|I1jH*`z!h^HcS>Oid zwCp_0ec`X8vW7{2{r*b~$xANyvW)u$AeTjfcPCUgor6@C;iz3Yr7^4qg=# zWVF0mnHBGTt})mO6L0 zQ-=r8B|LY%_2JI2iCV}58u?Nk!AG5@&8Lqu(B@`e`B<7=n*H1`GFVbK!o_IxtL2B# zZ+4$)bW_B#(VLQq+l^_YeJ@WVCHuZ1U5%AuY(9Px*Yh=dxj?oeIf6R5v{m=z#%2;A z`26*h7awM?p&DC6+z3|rQWqd8tCqexlfmR@rfFwdfWQW*rLzkU?gTlrsG%AI5$c`j z{Pl4vOxo(ku7ja3VSIAqu0nlPJ9@7QT8a!1R7F$}T^iyk>a(p${&CYW$Z2QK;Uy^x z)eioYU7!3IS!E?r?v44N?>beRs038x%p@vVu@*U-rL6Cs>Sez+IhrKC{COnTK1g=1 z&fW?!c5W{4&ccv+VNvIfJxbzISipNGkD&^NE^=}Wo(Ck7qZOwDBw+XCSUVI2nC?R@ zgBqyH$<}#4cg-eDEp1$sCJbZa@38fh+a*$#tX$&@Eqi^&Ewl_!BtGm?j7kE^7&%cU zeWn3c{cl$s`1dd^>U%>@PTS75t<%1gS71uogEZGGtKW+{M^7*#cU{a3l2yzk<{HmQ z@~1%5NXtpLhC6}~UtwK?HyhmRGq$C@=SCL^$RjKgMuJEQr`CfgQ-wOq<`2@vC`+7Cw8TH7B z!a>iiqQJhLGvaX@Ez&EiY}*ev?%lgr-aFs*wQ^u&tetSK(2RC|yE$!q*-~3e>57fC zUBQxmah%=1jT#N+O=NNI~%O66!%FLFjvRg>^l^AfYcg?QE@~>%)z*!L1R|bW8bNSeMOUc{kcut~)(Wzk7fr zuv>H?ee;6#=VOa!Wh_>_ES%94(xwwyHGG?)Bz`ZR6`fcYDwQWMS%8(6c}@0@K%K1$ zV)q(uH_FPQid5_7q`h+ogYq$4%-EvSlVc;Y-lqNIQ|$Go`S^UG%(OpG1G^_SS?4yD zFyX8!Ioeh8ZR0Ieb6luCefL?tawB!qCxTw1*yQQyktF3tL}OTWt^$@V-9P?@c|P{b zWP}FG8;Mdj1QjM&(mB2bIxsIhm)knMV{R8&)Y}nOo<_4F*RuJgmX~UzhZ;>LZ5rQ> zeo$}sPH7G;Ic5iF<%U!DL+TN*O??>TE0)3O5>>(~Gx3dV-bya7gHu6GX3OK@9_vJh zF4@+HtGs$n3?#e~Y1%R+uJ{da^s(Es>Wdo<<(JM~^918Qs2wt=6sgbUXlJocm@kKNB5)f52#=m5nQOJ6lkc3PB!p7nn3TMu8Q^WjKMop(bVvjTH00 zC9JtS)eZxFZ$ zDC1!zXiv#ecATy>EL%Q4F@qYsmRAq|!B|7q4_#eH@r6K101PQk;70_GNh)4X_cAG3 zB^k?^QeYfh7*HjUPi7D3Zpl*VEsg4#i^=2IA3&KgnmB<+gwQ(8AAYCCb(Hxl%uOXh zG62m@iJN)#Lay0css;ztgH&j_%8FiU*Li-w>TU~AcxNcV)Ac#eRj-SqNcH!x3$DR{ zr4hZQz=xH$-8PGOdsaN$b0H(W>T9|+HK64$$?-EIGKybjbt|#}Yl}cIGMG~ZMRg?s zAT?`Gs>kYUh*GaQa$?~iDuWf-;bo{$s{0v~yz~5()mhhI%AmR8^H!!?WAj$*DK(Q5 z7y0jJ0@fGdpROX+={snNK0xK&sf35l<*ayeWhK#mU;eFxF-rVWdB3lYd`ivKgaQA3 zuxq=D0|qaX)rN78&L%19L34H-HD>AUb(GqoR24mr{cRdIp1w(u0?Q0zK2L1)KK?8# z17M4r=O4?NRG=KpbK8V0FBM)#>3y~HV&5$4FhQ-TdSF5WApi^+P6)M771q`yp5+nQ zr=FB!>~N|yj6|xhU3+s47F(CSwIWm~CpT{;krFsHp~t`Z3b1xB`t2SSo(+#~Yz9y_ zZ{?nid%1QOIcq}v>3?dpS|zrZ8g}4+#E%Rt zw)T5v0X7PeQ+zp)W{_TJ`A4E_5G&;j;$*76*la@H(VMjC&ThTo)Wxuvw&dM@@Acbs?tcI*JMOj%>Z?s{{J03ffbA*^pQB{5Oxt zD$3MV8w!BNXGCGfoc z5n^sPMTNP^r07?`WW8fHZu@HdrvhAI^bJHTp>2{UJTOM>Q6?~1o$x6W_q-$k7T@ej z7ia8|%B4YUtPj=Qs=M%Gv>hu-OI`&$6*{H>zFf%kJpa%!`Tt};2aekE@r}1dp6^TR z>wb7A+=K7Io&ZepAo;^Fp!nNNoAJ&Y9$hW6{MtmS-i9XKEis+v16Uc)GBDrBdT1*} z=EEs))MN2xF!j{ z31#XrR18^^E#MFcs5~43Cd7ivCZLCercxdRK2^I6X3)hihcgoJdrCS9dO-@DA`a&k z#LcC^G#t}4l;)!HWmiPFgYM!%h*#!Dcoe;6KMVD$dsuz>TJc$agGaqvjbeh5KsLW) zP}U<|#ATcF6pbCFga+jpC6+Wqr(E148G^*+qW6GZ;oy_p-v|mZB$w7ai6;%hFF*R>cB+ACin(Rqvg-fB_{^n zUrq^bk>0SXZW;uS{u(TCFTjg5otzx9+{?E7=dQ#hL|3UA)ZW70gd7&+eP*BPv)Cn@ zhB#FT{&JKy*VV7IpFBNBljK##t!&}q>T*^m&fww3eS>96|wSBV{uF0Yq07?Y*1 z>Ur1umnly)ti#$`>fI!aX^Li%(gJj-g}0wP}Xh(V{7KmauL~)@5CmbTL2X&f1A8n zqIRb3p_t{2v((CmxKJsrQ}E5dzJ=!u*usQ*y{Rit2y=SSc#49U2UAdb){~N z3fuufl5e|z6%0dBN(scO;|n7(Vxl>+Ipoh&bQ z=n86Z4$i^&cE@h5t}=gBld5}Sf420cX|F_Q$gODq`n6W&E?Q6=m`ft@tCR*>31W@dTl?E5`}{ub%c!*=UHN;(uqwm-5z%fkogv53Ldbepw1_|2;Qk zcoTndG>GX!n74Vd)q9S!)LE@rnnlEmTa|c;$F2l;@1z79APzBK><3gX4$ZsIwvWv4JG>sa!9cn*!H;QWr&_4IBc3$2@zK81v{Im65FtJA=L zI@q*VkZ-9=RCA2`y91w}RnqCd9n`+2>=E;D&xG7Q(fTA~2Dl27BkBoO{+y+q`Goiw z1Mm`WJ63*rN_~(HZBkkBg}UI#^kw9F!y7;?nJB~(bkxn*BPDF{d^>+?u;I}j1kw)TE1U~~9h}g!W*ZYa$j+%!Uy;!nqg=}CN2&U#j zhO*ty02+TXK$v=+xK}nNx(jy*8edI4n{5yQGOa{N$y!IbI9B9k_5PB4I6({iccaZCeO@}BP zWC#3yrf02Z25v-)NHwWKf+fXSlN?3^99}`ha5JVj#mYGlxg7Wmp|;5RE$s}+(b0X0 zc`Jq})Ai@1K#zlmK*=z)IDydL2L8(8B#nQ&LY@MB zyb{t&t@S5xz%PIYwjE{!@zu~Aph>(msX~T5g0lvZ+0S`q9wq4va4>RQqL27b%KyO? zjbP}(5lx8?H)D&tRcWsc=H8#dagHnKFHAvxFy?^6K?j}v_(T+bf!LUdmk3SbB0GxfoI>`2l={*8S~d=MGgbE z_l&}{8;k3<^?<-}6_14xG-0{7q75M0PMFQ)1v8M8$RcSHLhuhKjbrkA#IOxxt)AtI zdsb=#-c6#uP58O2?E)X|;H{(J{?Ch4=9G$(CfugUNr@T_X zkhFD|T9$9*e)kzd6&bcGeOFB<4l?y%mj{TqHHc!*8RIrSE$3X5Se7bS1WcH2wMM(v zr4JMk>~&Sw3P-Os#3U9)OG~H2ri~WE4B3(jw|kWw6r@X-7VRe{Pwm{*T^irdTpA!C z+zGgqTf{c(K!T$S*~Pe#y2LG_J>Grw9bl>rmyN%Jw=ya;ZMR0?$xKP?3zw4xUpm8QZ&Y1#Ns7s-9P+^)v318d*E>$lrtD#-bTMxw^-^Ge9nvWW- zULKIGPamrnhT`9rZU=eK>}52(kBhZz<3I#>P$Id|M^QD=uHCU0j?B*=Up@Xd*eWGl z#BkMa?vu)dqw%^b&_XD&e*UWdqa`}^i&C+5CCoNdk$Ab`Bv&EuMH)81L$Vi&Ey=kK zSImCTOTXdpZ4hv+Q$I^^Rm6Y#*qmU(ZPZthM4!{mlZfX7k9`17FTvkH&&RH5m3NkZ;}IHWYTG#Qonf%E zp$n&VdvCr@>oGgJ&lV3h#qWwV+-z+pVX| z!R7`-1>fenXKM2Yg(S)tCTGNh8*Ca`)gV_whB1K!3iuPAOu)he6Bfu0Lp}s6$q!#B zY(m^_DcDaXt$_T4thoVWX$oM1finKWAu65+Zq_1Bz6`fxDy$L*rT#7SxI*M4-z&&@ zu;%=xJY1IY&H@^NKiS8GUkZgn#scTV`M|P%=-f=eBROJ5#yt0+JOxaHfQ2=8=%BNJ zsWE!2B`$;ge_UHnjbFM*RQcNpY6{qDu4P%dha$sz50x^GF z5P!Hl$b0EOl%Y@x%n_VG*dNNG^fFXD)n*nY{y*Bj@`!6z)#bkc*3Dm`{Ru$;5QF@3 z7YISBtr+m!AsZxPAmRn_!yhjkt~wpXlUsrTAJ$gQs?H??hai|^RA`PdyG>1oLq~w{ zaj)Xnx*y{K-26SdnefpqicDAq7&C~FekB7yUE!o)*y62p0C<0oY=upC=ALj5{?`zy zzf|^g<%{#LoST_P34j>yuY44mObH1LQ@adycQ|D*f$Mgs6kp9g7Cxx|e^D|v`O{#u zHk+7#WiIeLbvMDbf2Hmbh4@C;12qoKKibN7jqqP0kLV2pA>uEuffGw6prar%mG&C) z^zS5l`OuE7aQH9({+NOg#y^%cVAOdl{$MbGUjr=;T-W#p^1qpmnwc7~$^dwm-O1(> zO&L47N+gp?_&8Oiy;ZZ6!v`Om-8D-2KCiey`ktT1sKLK>+g;)&uyG38+WQcSQ_bJs zJsFR!{IUT3CWS}XwGV@+BTH+m=3{os`&hh+2W%&?dZ{IL3&qa@-rxcNyVT5<2|@gv zuaWtJwA)}(F`+$AwuHq|daufF`hIGnbXWAS;s&-h19egD<8O2^a&p(=f^2JOTJln2 z*#P0$7$Y)Wy5Ab8-*b*$aG4U7Z-Gs*h_2S0ac;!ef?Bniw-*NsF}7xtlG@kGTJTzbB5PuJi~ARZoo-mLrn zu@>rmtPWa#b0fwVvo0pSYHnc@J1E68Vw=HdPTDn8TQf9Jt8=tzjdue3Sy5bxo4X9^sr^YA1PAecVu&U{IakqPE@t3+TWhBVHS{9((XH)2%NFK=ud$DA zcXnj?Vmjq5ci8;UOzXQE{7#}6`__Aw?5*|XMXr;B{SVqXV+>^f2P>8k|W#ET?LKjk6H_NWeH(Cn>YkUNj! za6$S0l;HZE&r7Kwm{geO2d#U2gcMw!Ag|MZR8qxc=wSk z93^6G3HIw5h(0=63w@TScYAV-49kYgxSQgq^34x@9Z2t1mQNdDtl;5+dUVSgu^8pl zPAG!)vj?o7Xkp`Y=Z8?yF|&p60nh36=QF8b30)oYTl|d>{>MoxqzcrNd>Ih3nbw)p z9m*i0n5bI+N?K{q;>lImSMYCo#ZBOEjBx1D|6qjQ5m5X$L_mWxm-4?MLJtTLd_jl+ zHvbI~4jun5i16D)0R3-_@Wa6WV1zm-h~QE|1lRL#i15QW#eYGB-@*JhL^ur0zaYX- zp}-HRe_@2*q<=8NpPc$PL;#I&IMC^Dh=2wmf-(pZQvVGR{_WYH5aGZHz+s?~4S!>V zpHBFN5e^{2Uxxh+5q`ShZ;0@da^=Zl{i#g}GBnND$xY3JyXc=fSgAWV@H5V9)8h{A zqJh6+c5#a5Vc>JMN3Xy#+5;kQU#4HT(I*e^#Gz?^Ga&^;an8Rm!f!YH!3bc)L5zUe zlRuCV-K0o`<$y6CpdZk(&$sY|m0$Tw4jf8O|K+r4kGK|9L;lu-vi~!~nhw|6;xa)n z@q2VL;kh4d2#irLglmE@<(CTP$&q$^g}Vwkd2p!>jO6dMp;Zu>Ov`|qds?CRju^MHkS1fI^aV1q#v%^ zu9IkBb^sH4@=)e@=toq^=XCY&en7maUb=dcT2XG6#9Y~30V8x8f?(h7%)RG7S&^$^ zj2$)RS{h6de*?26h}*U=73^Ew!Aw+raTtRpvby)9j{1cwW}z+;q@i=|!-~dARx&_W zkn&U1#nSB=4QDIFyRz+ciue$_z!k7ewil^5EU(}Kz2@rr;foz4l4j&UYzXa;70qmF zUzPS^YM|Qvrq|$N!)i)?cyzZ{LkzBl-ZAKWM#0ca!Vh%d>!uv5;Ou^K&!`0Tid|z@ zSfUg6A)E{13Wu6cRH=(8pbO6sgsP0;F9U7PwAowK;H3hH3RhA;7kMk00x5~<(b9kl zp%QRZa0V6G^PB_fWQDon!KY}FZ>=6+gPs8Sx@GVSX#ovU_m2cI**+o?MR!uBy6jR<{7lgNq7I;GSH`+?e(w9ck^W}TG`ezO-P2Q|q|5)p}aVBs^ z?f#b-c}ysz68x8LsV1(tmyLXDk}jjH2odkgJ_;mBN1dpoRG6*1(7zfBU29)}b*UtF zaJ!zV&)t_v&lXefW*=Uvl{lMzbFHx^E>7NXm%+5#3`X^EK1A5V1u%Vm#cDFry5RQc z;C`g^XpbvbKB6msG4J~>)j1`ry$&nC-Q#6lmabOo?pJ;9%(*f$-;0|s@fU|S#-z^~ zDN6#-PdpBB-4j~k=&g>>$5uT8l5_Qb7BkkhZraAlR#$2~k>>e(p}LAyE`|s)nL;jO z1I!H69D;HfOgwF|3gzs4yOe0i(EH+roV4X_)12<1p18f!Jj5d$ao;q(jj-9ykDjTPuXOj2 zAf|V?Q&5y)Q`eS;IS19_w#*TJ&Z^iFBZTLeQR~+JnD1OX-ui^K1%iEC?rEknY$Vy+ zWm}05c^g5`saJqj+jd~<@b*2MGSrQFQ{%63ML9*%&i_@gn(_>;qd1LSasccO*tUc6 z_)1e(EF*b0gO>{Z?G5JlQNV^hoBPWg<)IyjgU6$YS5>jMGxkMKE)aW#qL<~}!<{Dn}IFT?Ei)bclXqcQ2g#v=9L zfCCdS=Dk|?+>ran17SM80K!eHChaC{BKz6?JhAoOcsL(D_D=E}Lu?r5T0>()xD|On zZ_()B_m%;en7#OAh<-90;%v#ok3~f$v2Wn>1?m|bU6zKNM?IEQ7pU3A%*OYI@DGc{ zTCFfvc5xdpS2JyU!g9$`@lVNn#yOgqL|Ll)3&+z7V%P4`%m-ls`*y94(WcC_3P(c% z6Awvj%D&n5TVmRPx7ZlGY^*Q9GJixE)r%y|TqUn>QpGx34f#Cal5BWOHTE7S1*htg z@Mp^Rw@#+l-m8k~4dI)+NWbHYWO_{+7#`cSdWkz6<8L!k8`SI=A}uj@<7>zYK)_Nm zDi9k~EI3Bb$4~(YGtyj>Dn{9>af=(*3swg?rN^V?B|W(G3RcZtDU-=VWT@Puf{!iJ zBor%O9jw6gi|@>hYgg7o@SN(kOHq+MyX{L(EAeHB9p;Vc>vL^RL69K!z=GBB{klbC z(|69k2>QOcZ>;t(<&9V6)3{)idR-d zhD(}y9~>;VpSB=mzoJZn!9C=xw%8ESllpAr)HNl61U$kbO4Mz>phB4 zyP1G5ZET%vR%{(+*LK7_p!r>(L;cw|l^Ejga`d2zr*8D7xm~)+epHR+O}jY6yFE(x zh3bZX)@x$dYo6lk?0K{sM!1y=isj|1vqUb9#*9aOz#!roQ+xc5%9SDNzlRkwqJoOw zV+Nrz1~5JhKbubnbT@c{Rk86cPs~rarQM?4WLgZji3N*QQ^a2=#aJ>08|g z7x!jAA4_hA7Y>mOgch&85dAWh-*~EsGQ=zA(=9RWN5t}i^q-e{*>N6SSAdQ>l+9Rm zo}6^;dtUZdsu{S+rDfn5f5UN-oz*!*UiuUvO;4X6|h9Y@D)px zVeqCeqJiBgEh@hs+x#iH8Ie{?+K8VmUZWSuZIK`|PWKvFtXX+}f5)(LoVG)GDq!?< zaXmb2}UILA>emSX`ez;5je1GYpsgZO}=rRs?rjI zb_SWaAA^qpVa3Y^eGy*_rj+4sBpy~uZ1oOKN=}rI@Z>r5xgTxv z-PO_Ron-*x>C7#!6%n*?Ms59`w(gSI&6xatG`}V>qPM}O5|Rag*i&-rbZ$XCwE{8o z2nf0u!4;X0{_3F3Xb&ft#P=pK)psT+dM)q?7Mwf<_V}hd4cNy)9DPT@&+RIdr~E|B z-MKFj!Pp;0%zBj7|sg^kJxBdLSBKNfBm%h{}TkyK$v`cZ-WAkJu;979}TWD&R#JzgNaU+aJl7A zRdN-IPSx@}A7no}VCMy_#tkp+Ee++Yxk}A35RKADcYwWpSz>(p_#xNvoz0d4{y4k` zW0N9{J}m#S(ldL0mV2;z{;!j?TYEvcz5Nv)XEGUwhNUlK_v*2W!I3tbv@(cO;4{Rp zH}`!rI9YPQiOQt~7M~StM%9J?OyTN^g*mUES(imhK>?=jW>tg7RA0;#4CUG7(i{wq zrMs(M3#ymRMw^YH`0#<;myGQ!oTO*o;tT@$$ZMi*$~p({o3^{2-b;UPim#d3!}-N= zPVf>vhs?9Uxjx0~CUn-%k8mTHKWJFCY>b*nfcWsI0L#kp_|YEfv^TwY$r;agC~B0- zgkX@pFA*}~K!9=(h z(qMelj@J}oHQbP zrlsh*1tV26n<_sRXEueSQ~;=+5Bgp`7%-y%ejB&FiQ=lt2Sh>wiQ6C32rjduhpu0Z zM11q8;faH{Y~elXX`Tm7+~MTIeZRT2O@F=lDJT|KI=hfBj#t z|J3`QGk5Mi_uO;N_ui{lXS90#C@U&!n9MXcG!>ES&x@WaZ|~2@X(?C96uz_)a!;$gadK;P5# zM{N%`4jOdx$tUBwi#FD!XZ5e<&5sJY(8qX&*2EY@e?7_QFnMa{ocy7v(S2#VH1%mS zxBp?wF2%<1^DWiu(|P;%Fm?NDxBlF}_5UjrY(bbO?yD!e{s6LzauIkt29Znr*{`TAP?Cjru-P%+>Wj_1< zwZ7J*g^cT1y1-u4b{9V)e)PNDbu5&GQNZ^>({%>YZI@Sv|S(`;d^k4LOYTV zmF7!ZNY5rL@P8RzNOsR@4>8}nA|SYr;^vBg*N(*tE5FxA1{a#09~6}sIXnNavfqB5 zJ$X9LYUr-aMYd@jhJWg0f2^v|X)!LCCpqYFVno*J?td!Il!vNDW?Gc2^i{ccB3{w^ zgI+Sw)|0vV6JO_Vsad4i8*-zS(t1#>mjueQd*;)(=^o{B2pyDxLB^w|`yW z*YOnj@r?!1gP#=Vn%vEFw+VT9KU`Z7ndzNXTNJr^Y}Kft+GR~K%WF*sjBR^V+W2J4 z`pbIrs&?VqhbqQ}9v+w*B}tbXJY!z)$P>qHzK?>|%&)FI)Z6yTW-T6fz|nt9TJy(? zRfDWeT`xPG>7A0gW{+r_INa;wn3Be_$lJFHjczDL?io7#gmF#Gd*$*1_b=7S{{41; z^-62{U}`rcuv>k$*K*I#0V%cy>RDf`f0#zAp5hw~neR5`OUgm7o8!F1jq$%c4(O$f znxa!xJ89yf?&of2=(eg|9$0T++VXmw(}#*Z^XA4bsm{AUYSFYWdebvs-n)~#Be=)H z%QK>K@A-xnS}HBF~0tp1*`KT>6iA>=k@Y_ zgCv75FLW>q8Q1r!U~HdKrN2~uG<*K@yi{*v#}Ain$KH5*#%xSub=2FoBXt$YTb!=1 zv~70#X?nWK+-Z-Ot^&Rn`)E!1)I~fBn$>UKU(KKNbL{?(Zn{yE)$(|jS^22Z&uzlxc6u?T%WkzW{mNXl4v60sH1ypS z#w+@En#657`J2tuH%G)O(|5<-_c^J#-Z}TjoY$tqo0p$jR~S5Y#ix611|6{nTJw^A z+ZyIq(tTOQ?c~3c!g)Lma@|fiN-#}>&ft1?i&GgZ zbXFxwnbvrr0oJh4fft=!rv3tRyBcapi;Z@qx+i9D6>lSvvo+m>M%c*sKQ<)tbwX7h z=Ar3pMX8JNfjYyrbm%zp1YOhP$atRUf~pc_9ElZvR*gf3sPe@@s&oUgm@iHhT*JES zbiF`DEEl{&j?SwiVJhO3Ba3uWIk$1boMAb9(Ped>faD59qXZt#|C~dcKs0qEPm_2$ zh_VIcihtH>Ig0GHa}va=Jb@!tjRPWFi?U}U*I9PNTJa|Ci$XGzPqIQp-AISFz6O`+ zA@V;%u1*&FlA-o`Iz+NZUrHozL>lCSKy1!6H%qi-T$Yh|mrc$(iGU}#fzk?S*^>1V zxuCqO>{aU}8%X#`(Lge^P&A)=?IG?pj0~9|E+DlV#WJq6u3LtLTTa9Vd&m?Aku|w8 zOrjL9p_pt(du4)+MAal`gRYP#7>_xAPC%rIx^jUZa-DULPSj1{bmoW_Tavm;Jqf8) z*OzjOYGpePabewcU)bbq)RXW8h1mQi-PtfnPcEqJ+F6;TrzBR-C6mc19ho|}cdBl{ zFfOINTUZ(wW~PUoH|a}xf(fXMGZ2%_`f`Cka-By`*sLE-uH6x@<4ULL4IOqq#qf-f zJCm-L>7=2J+N;G$NmznfFJgCGCM4_2^%4XXdYIZsPfNc-Z^WvcWT_!fa0|s1(ZYLd zk;(;cy9(d1MY@VSxTVi>Q!a^y8xy6uo*q|mM`E5w>lf1}Cq-t$6S&|&u0Sld%H)DT zuj<~p{qIUD>}7Y^oNe8D@C3K9&mCGq-|gMx zg7;k|q-^gN#<|UsVWe%7NsWkSx!!Q%c3hSqIPjbfY@9>caalxmPO5CHanYBYUYXT8_4!K1e|Z#5>*Sf?_;!PA~zS!3A8w4e(ppnTaq7 zCW8k|0Z;IPso)LMU^@H(J}?7j!YuHG*)RwEKo0&80D(G~n;C@6T$m5^ycZx{2#X*X z7DEUuflvs8a99ee zj~vKMrD0#ekz;h)IC^NK(r|?=C*9EPt|AWm;5&qvcu0V?unyM421taBkOZ4xGbF`cW1-J;8;45^NAMV)Kp8xRXYd?ez)N@qub~_&ppp)OH}DqT!F#BJYWM(u!$s5$%_(>BZd~NkO(cE^8!S)?#|Jn_|Wr(o{=H}>)LEg`Jo%zbc zTj(ryOoi{9tWMJiENFTL$5YuJcWf-VYQbL6?T=M-HLh))sWF#m$*xr29#(KQXCS-I zSYVGE{xp9_VR^iTm437YgCKv>$kk=B7)^N0M1U_4d4qwGE)~gw2UL*zq zOo+mDA{qk-M#nJBKqW@w8hjRyFiyb8C+;q+yUhgDzy;i3B6z?Q@P_H&1G8Wb_<38y%@^>sYMfp{Y}*30GaQ~299z@X|CW7 zlVCD2#D^;R^%YVG{Jj5cwVK zKn2~<9n63>vA#}f2dQ&sGw8xXBW;uZXenRDB~4_LGz>Rl>`=S0qbt6#zyUkZ*NzFA z!?*x%)`h2=ijNC0q*73xC*6cxp2i;4EXGzP@PG@P&d%a1ZlX%JpeqPF0}$_d*xd|z zfE^?QEwT`vLIr$=dQim()&gxXgC1ZGmM{Wr!44*Z7lc9>tPuH~axUa1u_zS>WI*&~q<>+wcsY!$+tA3$*=E@X$q{PeJAnm<9e2 z1i=sragYFskOZ4xC!B-xPymI{1nnS0f0%+jIDiXG1TUBdz95Hih=A1!EbuLPOf9aIsMZH4uUcbO$r&3FE*8yucUc!g5f+CfE$SAp`z`V~`8?;3bs98~7+i|9?g1 zJG4OuXv%Pj0s}CIA@Do6fE!GLnGggEVHGG~Gi-rva0ISFDSQGojDKB_f&ugbD;U-d z{cnqmGfV;+C|)oXGGH&9f-~>{p1=!u3DxicYTz?4h(SK+fC%(K3NkQ*9$*2zp)d4< z0rbs47z{(e3anu?i~&19aC6zdtSgTUox}QYEwkAre32UNDgv;8K3Zg+ob9RT8ogbk zt!t2ML!a)1NoZc$XL6u@b_Y#!4=hpp{-BD3X~6%eA>RLA6|}`?|5T9CVAP0)KRblh zQ9vC1S#L7gA2+WZ$njp18h>`Ig5HDMfL<@?b%BQc9-v|WpCM1forbz9&`_sg9t1SZ zbHNCaMlYit5C$|#X=G|4Sm-5{p1(iPD5HTz+rdE}V~s`$jSLzUTj@$P!c>?B^MH;) zbu`FqSPUUR#}^$hHbA?bc6T#q|34e*zZ;0C`?Eu7`$Ul9K(@y;dWWFTRf}=DAwVyS z6m6ESrlHM4Pjxb6;8gYiy;Jl6dRp{MXiex(;g;Y)bc0wUo+_sw#BMT_Y2tB$J{{o4 zOQs6wt0y@Z%@RJ>jkw0JNBH9+xY`(Y9*=K3jd&{9cD`Z-nWSXbsCAA4?y-_J;F+pO zc>h&RS_Th)Xthy1Qlhzr9biXqT2s_I4@Faq%g*=osfWJDeWEi(|8=G~k>oTn2}ocUY4Le#n(93IB4r8e+o=u$r6JRB zh*#vffL4aNci_!JVNqHAf4vo$7P@O60GQ;rP~^1IeEI*#PjdiGD+>I|8= rf%WaB%UChi%m`*UmZQL$8HsoHOgR1wW&)W|CItU(A|v-Vu+jel72yr! delta 118725 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

uclgpt4Fky_ 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 s(GL=nqZ{!jqe|$9HynUW9HR~=X`xyCcmmV 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

?|B5eHY3fRVN;*L99^zbX>KXw=Ke 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 S0S_?rfkyzQ!$55W`F{X#eWdyT diff --git a/model/UML模型图.vsdx b/model/UML模型图.vsdx index 4c4fc17816ba4479df4ab4d50249ddec862de86d..8c987de3797383be9de31c67419dd604c24e9956 100644 GIT binary patch literal 203859 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

)El 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 literal 719056 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

tP4a9N4+Phy3%_Ue5OydA~_d{m4 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

}GA-0vz|@;ZZ9MjXrysbC{b`=|{*&JP z*iX)R^$VW1jQu?ruI;QgtM!o?c%d2n1gYwb>8a%_;K$HT(2lD08cebQLk6G2`b4!h zIXZme=CLDS)|;(zZK6C?uYtGc?n-lb#Zk*~$3xIWtvNcpt<{=2a%7}AzO6D{ZW`cC z+Nd|{TU*9>eR`z6b!&CJG7^7Ee{EX)_&dL718qYJ$x0d`uRm$|N!Lz|KSIEdJ*!68re9|hPNj913T@uIT{M{azl z2OdNs;s-LvT2lZo@ji{{q^1Bg_ir~2+_ss?3>IBjXbRvPmYXDnj$D>5vqI3T`tvNlUjWLc%cY zLkHsd3CZI7$F@uOzu9dcGio35IhtTj2nd?rxgW_ikuRMEab=sN=robO_}7BlBAyku z<8GG_S+H@WXBQ5Z=MXJp);%rUxhk~(yFI_{=d9ZWknER&V0iAaVjnf9{Q?PR(SIc` zBGuhd;cllvd@rW%lHD;c%P1kkh5G3MU6xLiVgZDtp1c06!hx92PHeekrXx$QARB~w`!P>?gU%~_}r1z8t;Q9B0IrgOu({*jOef0ar)7f zGgUYO5-fmFQ1{Pt<=ud=eEcyh6ElbMi;qqo!p)cvL5dq%#TycmPTL2qPTRpPSyB;% z4qdkCA>4%N*s%`mS~9872#O3{@x@}~?O)8d86P>M+e7G4iFn!1e&n)a7=sJRz#-oX zUI)JDlHJ8Wn6J62nQjKIYKIS8@;O-|M^{`%7E~SaaeJ1B0Ty!dx*53SgZcdN1y_9z zAGha0B6_Yq#B@MCZe02;@m@E4H=^rYg&?UM`M3db!Uzf_Io%8#P7G;?NFV9Y6<@@M zF8w0);BoDBK6nTqLCg(uw99t8v@gD1>F5<7&G);qAwGIL#AKIju{jJLmxW6QkClZy zMp9(U+mQHNNR<{@)b7Tv`XWAh*%xJ39%Cp>dgH6r)zBrUH13DDhGYPOV$1^Kw2%R* zh$+G4C@`CNN3w0B4^mBwOr$Ju96Giu_ zfD@#eZnW6Wp9@YH64uu3_UYWutai_Qtg1}%Dbi2AVjw^TOnhdydsNFY`|Z@8s@gV1 zs_Mjd6fUsu-^8jmjY43`5Gx5Geq-Jd=r>d-MG#r=2#e{g&970CJYwngK1$z_`obx!n!3|o3aTBSC%x9@0}#!!O`v!*VzZhfK>D$vfY{M zKvqEh4?Qn%S^g#;jEJ-%DqkjW(>6V?t2-Gf6dnG`g&1=f*$x)_vt9l@1#P83A+ zgD0=hnMH$=w<1~T_A}eD71=`e6M<%wLd;)>)t<%twXbC~<-I9_1b0@i>qFQQ0`Xgtqw zeOwxrkT{~m)2K3!DEt^yu?=uM!WAe;&lFQ}XhK4$+l#zWI#wzrnYrZQb|^0otE5b` za>Uq23_Pg6I)0K1qROv^N6GAxkVv`;@F<;OULH6u-a#e9-0DQxnY$|fZ0j-&}Af26%-tznk6!i8S4)*_Ma1@m1gSC0~Yl$;Vw>6*2Q z`M`TkvsOQ}d2t2em^B8uawE9$n99`7N~=0v#`6}5odS*I2Xa-pi7-ljbz{BR{wQmI z(|CC*exAsP>np5Wye>krSZxsZeCeWluDkB;Pn>(t#TRStIyJ=%L$S!Oq|ZfIW8ZOC z@IDYOcyByGkT88^sm8Fpl0nS(}I`^`Y%80H;j7Fw~=p zpNw~Vce!K0>JydD3FCy_1ciWBi!J~>npp$vRuF`Q&!rD1$5ZEy(abkiex%_0es=)a z`|W!#oR^cJb<>l_Z{6Cgv|_eIaL4o>;z#Jcg2WJ7>2w?s7(}g%(dQ&I zeRa829!mZl*A6?n+L|uU3=gfUPtP*7kbEpSOF_DfXYX_MlONbG!x>xi%q#2J=IJoR+Kao z(o9G*p`nw&U0CKa#R(MKBkOWDGUy|g8Je- zuhH3&sXUk{AJ>3XjsM1&1hZFlH}gp3O`ybDt7VlZAzbDMhqwB&C8unzfARm3E5NPOPm%x>CCTKZqPt$&MPW5zPI_4+oK-Pa zPI7w^bYf*|K(Pyq(svVdl0XtNrPVS_7jg|lhF>3&Ktg&lOotI`EvU1$)r*6YRmd5L zZ~&#R4T1?wC^BC%A!nVaM2Fj?#NT#(Qy76=n{?lix6W1^=1b16?-vlML7maCY^oZ_GuGSv4KY%=8$xgJt)!l5uD+)?c)R0E zL|Qs;@F0sh!i8=LcrKXX8en8}T*&Yi`hgecn&)fP{pMDywuE@gP%qvwmfba!k?5{U zxusp=QZEIUxMZu4E7r9OT!lJOet7?3k74$>!iAn4R|i6{BNypJMJ7-oI=y&sGL@N2w?qu41_z2_V=)+P7)oFwf;+fW2X($tM5s@_BKCU_QjZ`E z)fBfO7{sg-&+-Bw7?EA3qk?B=BOBO-9&T>e@I4e1U7d> zRpgsH4&P}?<9ML>8+V~vy}MSPu8t3l*K0M%&RTC6HorSMoO3gdB8uURp$+9G_y~;- zVT+EZQBbN(fwPR((zc3M^goMq{E;7fF0QIhNz(FY)75Pi<%E=$x zEKdF)p0P;In!cldY}`In!%j_-LFUAZ1H6a`pk%e?NT)OfO!exHMpZ%O29^REYFT8S ziK6h=m5F`HT{%&Nn_UpaVwFewk0`>pQ6Ps~%8EgYlPGrjY9VhOjs~E`LP%w##X^WW zUP5A_aDbLkz~ru+0>aHMC}6vIgxsrA3t|a^x}dgb>K8yn``M|*omE|qf2&y$Rg0CV zXvEj!RwJ>H<(A^U#k~{@ONLW|Vzz05qHwMvClI!RpFMjL=tB`Mp6dkG8DJT$7*l7a zJ`f9Khi;K7#==ikMgfz%ata7HyP$yJ4r&HAV0}Ez0!F)13g{Z4g=)&V1g^mpP-U$n zxS;AmiVI53Y8-~h&_7jV3#NYn+nY&Ji75a3oWZ-O@mMeLAg4UGIDrQyp(XGr2O1H* zQp;&E{e#SaBxn4bsTA}de=}G`dJ8#6cQ(ZbU*SbcnYb|;X9RH`fkGFG{R*aNmcR;4sJI|v1+{HW5%Jc8>01n@64{wsqy!LDwByRt zl@sMOF1ed~vkL;~sA}RM0!S**x+EPxmI!6A1DD>2M5ua@(m$p3mr8`nM=|}g0TUEO zlU;AlQX8Rv^Cb~N@o3LOC2LqpmbsBBBob-@*dhEZT4F)Qh~ZS+qc&f@^%n^NlpVTm z2%r>I&D?g2`$-yO1V4{R_{n6 zBt`ad%glXYZq!zcvRxI10VUI$+>81;d2I6u>(;JabHZVpwpA)E;MLa4*6gg*S|^Wf zs80}IC9O;MNSDTfYrK6~4p#!j#Llgd2P<{lVK%4yWLPGcn9VrKFxJp~GjPcHPC8pmgOP!(QXm%xanx-AZIiaKN1P=YgCOglxQ-mnUXlHU)PCMad z7qpXsa;_uHw1hzr$rDmO*{RW$JVuD8Yw5fwP(Z-Rvn=vR%j7FBu^VqnYqb_n0Wf!SkEl$3kyeT$&(dCgT)YJ zm(Ux2hpPHLu;SpO#1E0=WOhe8l|*2kNhgRwiOwEHtw7!9?xVYM({}`reF?|55vrAv zOACy@q~0{qe=)gK*-i+tl-bcZU8B?zi~Njg;svJ2C6a}s90vqW=$Lv*86lB-lV$@@ zeQW$A-;&C2g-6MxBEHQ4SHdpfSvs*Kzk^E_6rRn@EwEq$<$3hQ$W0`1U9aC?dxpInC z{$#1#BlJKpZ?+2yJuC*rqB)M@StFPMV&4UyJ&^y-n&11*ucW^-2xQ;quHd&LjxrLr zfGA%tGiAycqZsez*fU#&lBrlQr{rCAg13DP)j*O(g^xs=Jj7Nt^Wiw+Hfa;{^&(9a zEFhmhR4#5HbdcDix{Awl0QI3_8eHf$2!D=ZT42~%ucSyD7ATa$2bCsJ(&KC@k&Gxo z@?QXIh1YY@$!V&O1-U1cd^@E6hDXV~k|fc+l+z>`rTO;NVp_};_8tpG2d8)B(JU>7K3UN(^jWK857cuOMhb`TABrHDF|pv?%Oj7 ztw=A7Md!+v{U@S{DB%Q2g9{5RqWK1n3Gpc4f<+0HfK4PcnLAR-3TYDaC_}GkIA1_h zx&SURAWiwL8TkyyuXF^`u)`08G7|JUmASY+L>!+x0%?w&`pQR{!K1bj71v0bM$#DA z(RVTnmjy7S(8ov`A1-F4eLP$tydhe))Fo2BhJ|EZF#~Pl>)wAnCly(l0DJGb=cm6j z5%%u4e>(l0NwIgIe+fq&Ba_$sqK+~tB3ClR`Xpz7LaZ<&e+evHaGAENPB4k+q7&9{ z?uX-ZIKQZ4{!qDW)*IAOq!v0r7P?L0$xbRcq+AStnw zOazHPnxjNZ-2-e$lL&hNaRDvSYKc}$w9F-HX@ibj8p52kk0n|@Tx@IXnM{~s>>N8r%>O8+u> zD_4k~t@PhjCrexU&mSrmi+dyeiL$sCOIv4rh)2^XR1|?2DtIEwdEjhWmvEGcl&B(>Edabo- zygU^@&!~E;w(KF=aUFYrn_%)oX zMpE|tf*%q(mdo#C*atoT9VTcyh2y2cAS26VESPYLUahy7SpaEZK~sx91ju^SdbC` zKeIB{KUvNj2x7M&4T$5}ffYJIiFl$Noje!1HsoM+Ee|rSSQg!dt9V;b&dx1)E*l{v zFE(i`?P}f#6v zFDC@vNb|R*696f0OxrYlrxZF~W+v0ohir}@sKYFIkVl_%mX1EKUHBkqA+-GfI>gf* z58jHV+l53K&=-7mbe6M=&*TWc^pbOB1RD6y5Y;MkH+QH?v>4V_|afQUCVIXr2@ zV23wt%Yob$rIG`Y;%L|L35A6%fs|#zPv7@xUUD&?0OXbYk_n4a^2iwYbiy4FBp`Q% z=|Z+5x_QM`3N6!xi3md%HfF3MWwsKYP9HH|#VBDf!1y4EqYnw7Ag@q#aMbfxYHJzt zQQ3A05`{2V11Bs&W->Hc$%Nud>HLL|9T;|W0DB2CrV)D2=g)+>hvNm3xeb$SdN$c? z=@j~)fq>|4dS+ny9tpnYQ)rqcIQympD+S96i($p~0L3f@lCeU<`q1&=YfFI_`XMC4 zkPlWpi=nLLVr13ydPLl=5A#_~LZn5PS)&3%(h| z1z_^>fh%S(9XbdRKs$lxIROx!S#dbOF|+ zgc|lhr=d~>9(LMOfz9PZ-Vht+Kbjy&M2Fi+r&uyGTxjKcOZ7eJ3`>?uJ@R(82O}>s z$CC5QznJeW)fcBDmmCM)PC9bM45lNOoX+gXF)fubG`Cuo5U_ zWm}#N90DXv=@tZ$52`>zW(ylQ2oN~7y;K92kk&e2ZIvJHHGXr*{pa6$nhS^HOKDTVTzIH|CJiJMGzgBnV}jbndN_4s95xxh?= zU=5lh9A2hogGx#cFdx10oB8NLcmV@Ch)kf`gNQ=bm6J*3H1feqKPfwSe2Qg<%LCn` zmjTjJ=?PgI>un7*HH> zL+LEbzB#+cR9}?NvShi`W0&#aBGarq7JQ4TKADeQdMet+u9!qVcIg*o2ak7{j1?C+ zT#A19XCu6icvIx#eIt>T3^-`?|0Z}@)N8fMcuV|iXsl76j*@vp4l3CC(eJFoDB~b# zWt;2#ZbE+J7RY-nDKl%Q>-Sh9$qw(0h)*8bSe~rFuPsP8-aKmKu?IZ;z-8=D^R)M$ z^u3q=@TzD1`Lbo~@1Mf8oz-TwJ~9I@G~=Jf8PikCSHO>Lu59fIK ztZtNd!K7#IB8@#VQ6{27HZv7V4iq7*N0-O9Pd4g1Y7?0J2|JTbwYyENa%+dg8|ft2 zE2qnRkv2A}wN}&<;ZQ5bTh*NsS0^yQZjX^){5hLy<(c+2)=uq^I6p;ck80JOokq90 zQLdqZ#NMh*0=viZ4U*l9C@7kBLCDn7WnGbEktIGN4NbCruKVCUd;WK3 z`^4Au_CW#z*C+;ucf}T&4D}Hq-}|n*_MXeHzvuFc`Q8y13TzxLG4l=8cM@|9Kxg)i z2o{Rv;(cF$twVNCBtnbJdJhe<Fr*!9m9+&+VFZ-#N&;9at4#;lC4Ip_YYz%hpYu= zeeYX8yYIR$&|O5X71%!-H%h~=`%ZzgFlrsqq^#-iv@bMn{MIv;En|O&GN!}R!19I+ zhz9$0wpK*2#0Vo^jx|wY51aub7my{nArQAYw2m8jk}8i%OJ!=JG^uqlvX+9`x7?Vl zv_^+#plgfSP8ms;^#=HVTvM`Fz1gbX059%sZ;q-rfERn)o2%*#(5T+_=BauE45PQb z`KsPP+wE;{B~@>r3-z|QK-C*a%DwF^RQ1NhsNQx5B?%Sh+X7bGwk(-Fa(sZG9X z<8f=Bd*F+hi^_A?9kcob`2TV6_f5}wCj9)#AzwZK{`c&eWB#hSY}oiS)|!)Bo4})FSGiGHwrkfeqgvbE952sQn19H}?qB{Q#;4Y;Ub*><*Z=UkT{D+# z-?{fQe|5#TU-^gMz3z~YIRE?EZ&^M3tUvmTXZ^Q#{q?eEn{R&hcfx(OFRa`7#pca- zl=i)8?Iqv(*Z2JB@2)%Lic>%L@a0Er`L{3J{gYE}J7(u)*S+djAN}D!e{k%hA9?)I zaO4>Of!5Hq^+%3*@|Q=nJ~Z^^2hM%y!Y3|#;I?H?{N&Dm{L`15_S748{OZcf{_l=$ zU;m+h=C}UzC2zXI{=uHRp7rnrQ&Uq#a9!dvvUF#uFdA@cxgi_>bp*{)x}s^x$`&dimF89{kK%zuL9prQst7-!$^Ix4!16 z=Uue>o#%Y_P4~QN$BRGk!xwKm?V7iJ{Xf37r?qRtlmBq&j~_Yz*zK>n|9_u#*&%y> z^5q}@{%22BE@#5X>0cKM*= zpStyXUwmTxk$d)@R{GBCpIm-*>wxcmyY#&?|J}dgqkmv>$e-0AN0E0{^i8h;jcgXr%&wu(s!m_7JT(xH$Aw+eb47__^I>wL;rc}*UvxV z$=^QpR}a)4yY$PS+PUGiui13@OaJ_d=Rb1o`}UoB{8P{P%IY`lK6dO2qd$KCDK9zY zFL!-;^gFE`PYm65+vDdx`OlT=npy z&$#;K#tpC9@odle``5hcP0x7vq1$e~dghQTUi7-(+}9{aOj-20KYe(p^#y7_(2 z4sN*Q%F^?{zWMu4ZaVeEUq1DbEqfoYfAQG=`_ip1c;(~&`rONZ@cU(>rK?*X`qfh# zoD&cIf4?3(bN3&8_2EMgyYG~@zpQcKr5EnF;J>Cn`K7b}`{Iq@l z>n7v&Z~p6Lk6iiWk8Zp2;h&Xep1kCNpa1LRp0{q_^YHWE_|R+joO|t^kDs;t(Qlmn z){ox*y|X|5N$<9o-m>e7$@9`QN_sy}$YQ|M|5K zO|CrT;5$Bg-S;l5-aGn?@n1dX!0p4g{`iSw4l{qT?G66>{-W~pjem3C>(5*F^^33m zi@(@+U-|Oq-gw8Jw|)IP;g>G|*~-WFzWBZezx|f;KK`|HF8txg-udxs-u05-z3`=n zZhzu;Kk-^uyngJqcO84r>%aQupZ)OI7uTVz+OPfHtG;vY zpRYaOOF#U^9<%gcPh5G;t_Lsrt3SBzse7;Zw^eVw`6V~p7d~Q~dCQ)2uRrL4Rj+>D zsgM83_n&|LTR-rti$2wS=xJ~H_HD26R$up{YsWsZ^O<+we&PE*&^+v=C!ZU-@A#X^ z|9(R2)4|_;e&za8p7+6r{_EBk{Q93?`OqhS{KL=wN$Z#Yb?`OMzWAvdu6@B*pZMc< z7-zrpdZ&KY({BIq|J!Bl_|5ot?)=@62jBnugAcyz!Qb9yp8dGomJmiT_J#*yxb3gFn zi^}&rHu-|9fBVA6uK3#nk6m@kolkl9KlSmS;9#qTa1x#SK1@hAUs_4Ie2`^PW% z+7Y*2`_{w$;epN9TzaH^z>2S&_{(31t;_HH#y#&n-g^8$UUl->PyOMKAN~2Rs~)`n zfxrIcC*bdU@4Vr@-`_Ix?>B$*zUWREnHvy`2U$O?l|KQU;O+%H{JHc zbGARS;unAa;2)oK_21Rbe%qSezklsZ$A7zb?d^}1ZVj&a%YXRTIbS^M&p&;^KY!{C zwZA&=pl65AocQSHzIWB{Zn|aHWp8-#j$Ti=5@T|vv zcjk-hXC3tN```H5|9tU9*Z%fpmtOw0#jNG&^JE&y6s!6SHE-owY$u-AD;gF&mMol_FXIf>83j#dE;aEzbR-wb->53f8=TY z{b#*%$CI!7+piq`&O08O{P}PG{Oy-re!ye*E&I>k95wOb%`dy`>gTL`#!qh=x%LIt ziw=3;r~mBd$GqVs&wKg4p&K{9;>^cBbM4PRy4QGO_-kh#^oxJ|=^G9@>Uj^o_vNd; z_8(L4{M4U~Ra;ws_UQEbJ03syv0ENmRlj}Jul}{--g4Rr?|9h_kKFU=FFo?m=rdn& z){T>Qo^aF97j~Yy?$x)v=)KFHy5lQvJa6omPkZl8tKM_rFZPr!FSmYw;Q##W6O%Xp z?1m@ae(lNE|L3xo-}{%Jzw^u&ANywyd~(Mb&%E2)aO)|r{J`}8I`eDFvA?coN@?LsXnLb_2V7fAu|3sI<+;p*X?L_R zI5Kv8fL%3K^IN{cCLg3iAQU{DY{9Kr)T*2(F|tle8LNMwFA!O@7z-oIBAXO)LaUtTVm-z{U<)ux)2#*RvJAiuqfz>?vxRG&uN zMVcA$5JyR@%C>jRP08+gxpf+HjmG@$eLaWM#BBVxBf_5|M$}Ipqm0xKeY)0KZ-YXw zLtV>VrB8A~dtO#rw5_l&Tt=s@dD!H(6*%)xyrl?*047bvQ?8gvyrrHPmKU$-uPC17aDt%>w znH))i+iS4|EraGXhGOYyh@t0P+($=?iw&)$YBxiKi*dYZg{~AC)zprpf}06fIq$Lh zt(lGyCqkJ+#!ldF(w6aSa=JD@jhUnLqJX+uC`g*z|?DyrGIphW<=k9Q)@a8?eo(q%}j3 zH99#i^G$`c;R-1!Pt|1AbngIVl!a3a$G}LQ#$^)Cs0muYpxq#Ay*4~7S(g2&(&u~E z6urw*QJ4(H$Wd?>X6~Sx2KBF%xkP5D#>HmJ)%z6c8yg*n4{Ni z?-r~MF5wH+r6!b{8Z?)sGkFxu1H$epUIf3-G2fw?G>wX6cWTkBFpfdObeK}jCqjjy zl)*03lDS!x^guj(b*boiouvWot%R8ehA)Wa?jFcz)ADKTDHZ?BSX(Q*8Gvs3NWr>C z19GEW1Dn62p`cVIx%&D8`J{%io9amA)wUDLtanJieB*AqdhXn=MimMC3?2Lwt=xfD zb_pBR2p>uh;Yr?7x3Lo5wk&%hc+Eff)#ooD**?0sAWg+7dy={2n>j@m69o&hGecIC z;*6Q-l z4bc!K1z>)%Qtedy;DE+&=)BQ?wtuhR6F$Sctv4i?@MT9@;yrhr3+8mMnSZkn`7B6lv`S-)0NSF;!q5e%!4LpI$azQ8HS?xe_@P&05~6S9d#`9mG2 z`!`Xix|-2XwsK66`>7mu^mS|Bp7owBtlAn+%uYIsIfoWX;~Fs4XidDs^OYH1;j%uG7-gO91WW@wPkD=xg=Ryi zq1sZR{9u|HmSD#uj!jVvqPx#_>(Cthy?DFn(Bjzst)@YDN^LXJP%ZxKt@y27+UINoz-)ADXxk!Z9F zU{NSsapufr0oi1EsUj%#Omw^;f_oU6;wR0{CV604ySf4BBNp^dvKm)fLB^j*#p;n& zbaZ>q&hkP#9U)1NqWmcm$S{Bq>)~Fv(HK;5*d8N{X^O7%PeGud~5L25aeLr)WTX(gUI48k<-!DKjUlmM8869nVCJv370nm*w28PdAA`nX4-7er`tmQM#~JqQiw4>&zXGu&E2Penut6&_YwzUR zcFD-uNp{Iq&cHmm&;93WZ;B{9Qt=W|>?o4;+S>eZwjf32<-$=7@#UX!ey##;EjEPk zY<4~0(wuxds27z<{-N9!WzA%dEF(CgLLaxz@-~L|&)*+LS(UONmRPG7@&0RN04j7a7X8J*P%`KjgVry>%)Twfe+Ill`Bvu;ZaD$OKBy4_tC-$>XZJdru-c@13Kg+F%`Wq>x zMG1DdV?PUzSnUz6uj%tB8~582!qO!;By1w(H7kg7IX!F5)HiD!`H`5Fm(jR4qZZpg zac5U752XFT_{xK2P9mm=b6o-=LR}8)~MZdoSo!4Kn->{a*cm5#eg}S-5y9{xJ!59$? zChJX4as}Gk&lr(t5Xnz+E!DQNBkEtzgC;UAV*35+H&CgHvhXroB0ff4Ud15DiX?<`;z1dJ&AHbRNN2#MV zskYWk+(lT+c}^ZF|NJYkjDTcxJ5zmdd3?t<_FVhSQRe-H;YOvPZ~Y&QLC3r3P1q4o z9MkENP$b1=l5u0fSup$c6^cK!?yn^%*dYy$@(1tT_6mmV{pVb-fT*8|nBhVysaOs~&KVybB(Q^8+pF^{otl)W&7UP}Uw-{JXiz zkrIoN;QACs_$Cabw`w9-qev>AIKSIut54EX^YbG+>XXqP-XzQbjl8eT>^1^o;iBf0 zt5~-&xlrXMc_{!o5iQMDclXHKF_ln(47$(?q|92SP_wHKlo)hm;&CVF_4z)B$%8AN z{Q^XK$+8tpGdXFERTfR#$oIu@`l=GO+XwRB@mZRbay3}xa6tAZe^`ryL>~_40o>@o z?`N`zER`kcgPw~2j`yS8OPf~PSBG(De{%&N))3)~`4eG%EZc`ivZktj03M6C5m+cD zAW;1$XRdAwgyB^5&)(~!DINa7b6xBEi$?wQB~Kth09q26vVc_Hy76*pnc(3Z`VIUM ziJK{on!o)0c!VK&y@hWg3GIAx?$4$ zz$LJb_2TB4+%&7nHti~YL9D0zYV;Pag_%AJ@ovjPx6uBa^ zw_Kz~IKFenG9AD(-x>LUno8yC2F!|#SbamDOi00olAv zd)^khQ`~S28in!`faXZ%ViLrxRjXA4eHAA`9Pfp=>etwjJ_~I9K;z?bX$pT@$nq*1 zFKdj6kXP04gA%Ez+E|5kv^J&hRYxY~4}TEcfVGZrdB}KLE*eme;!vq0wL`H7|L)T4 zi3ml4OOt7urfQ2_FHr<>RjOJLtb>!@l1Hy_H!`dh9Eq-!aNM|>|xt46ER{)8rK5jd;V;Xi}|1!WVh_CJvQ;D6wJ+O2BMhWW`@ygv>`j2 z-~r89y4JQe+?TA{(z7JHn}ahBm7(}m$?3Gz&iA!(3Rw6Xs>j1cnDDfi21gHb@C|x# zPbqW-5---_UQpJV2!#$kX4v;~k}@pAGTw5-r=11N)*DRNV!Z5EaEEK$lIB@h36mIQ z2m{ji+$o|>dVQz^S~tmAQ>#38^b>;>$M||u>B8eV`K~IWiZN{OK35B2NX?T*(ZGit zoEooYw9&V@Df23&2Rzx?$5D*T@YculFEV}aeM&f@%IdvC`^MTEJ%)_V?vdeRf5`me z##G(Z(~gpv(hyt7&?I53KH+48aJmrLO;<}Lx25h@k~~b2dQNkzQ?X9Bcl3!4^SjRE z#dy%TN!TYzRwJQ~JYKrCj!R`N>3<*fAp;GEOAv7^mH-N$3&`eXoI=Kf;w(sUQM%Pe zB^Zs)!9T3Vvp1H@F;J0byL#h2+on&q?T*zaWBR8md|TM8#5dWeprlSX48rl7? zDEgAIYp%PDGQYZlN7to0@O~<&;_7WQr48NuilLYHu2g2>NDQoNtw5mZo{=~f3Hc*W z*cBiwkj-lu#8$y>xqOp8(nn){_zxtUK|{mK(0nT4CK4hSlt}($Oepp1OglbgVw!C* z9KAQO@!TJssZ~_!*RH^mQ!&cTagw$gu!PdkR)RIXEz9S({6qScw3j4fYKkRuWY)AZ zT}@?i1$_J5+h;^9d8K9DB#Dg-Z9B=7T5Ne3nq`wa?xG?`4G~pR^pVnSHKij~{xKrK zRXS}_XjzMuqOZhdJCS31L?kf4gP$Z(;lAX!B6Nd>@Lu{OAj@yX*&N@*D`L-rbPa!) zhXPC++tNhyka^-V*M@o3RLeRRaI^@pNyG|d^nrz?e~FTm85s90(>toN)Z7yUznA~H zI(@T}nBUW)kw@%jEMJ!R>562)MJC-#vZ9hhraYkodlPfvwPm)w%X!5#4{|ZGlZN|9 zJs4BI6xyf32LTKihHDg=_>pNhC>DT3x{_ThJ4#cm`6MlK2^phLE-}TA0{-oI>1kTd zI&;Wza?_0FO1gz6^0&q|pBe^##dgq|l^0Xl*+&(o&FOyL$W#@{9F-edn(1Fmuro47 zmSjg|@tu%s8gQpJ!m8mb`CCy7?RzXYWwvcP=fb5~!8~7L9lrZwiXp-V^D)V3dS5z_ zS%{2^pd#ge2phX$TT6P8ReMhB^^Tr%21QgLX$^SZy!@>&#^RZ>`|jk{GWjAC`cUo#g-B;u?|*6&CM=3RWX zTW+dE`5ygf((a@>7|!m*9o&x`D=8YwKCy((uiZu%Jo$Ju17HoLy_o-TI5l7%^2~Qo zMr;4$i0Xir!1jO0#h`I`{af?&RPQyQFu>uk@_T{VL6(K3j6lGz7gHxx!6sudBHdAE z5fk;N;Ni7*2c4FdIu*;an*~&ys)cRGqig&aWN4>64<_vlski27c}a#gu%O&O8NtclXUhgF6~ zS_`q+?K|=bPr2QxEU#GP@JUJNTD-Xo$`ySUE*lN&Z?W*KDW=LzjH7t%HdD=J#?i#F z1^K#(eP3OFNCPFkX;nn@ORc8Mmk3x>(`l-xF<m~k*~Xfod#hM4o0?- zu7)eXo;v`ONu z_QBn5jMHa{>Qx73EkRZmBvw&CC{P35twmvv(2o9^yRe#8F8aD$R`r>^X^D|P$9D$} z{inu!NXMH1xWDz6P2?wq%}@M7BlM89992*-Zig@`7^drAzF(GW&r!0kFa&0B_{npMg2__uRh9M z&ETJ4Z5zC?GvBk?LGmEqGM7!5MsTzxLqgOyND)*>(dsEFWae2SJQDPzb0^$LKx2@R zZCN9uuIO9lU390+oY7Jm|5a4BpzBA$&3WNighQgcBB6PXuVB^mvL-(nrUZ@I5I4@@ zsM~XwS{5QioOwkjd%#Dcte^ug;z2%KVnK#tx+zY+N*a1_@_pSSsCb)`TUTK!TdD}1Fhh;iGT9c#P9(kVpcKKWH){=myEQJnQ- zj_5!)Ii)~9Bzk`@#=#plc#b0~848;NKKVtZV5T^SMK=Wl3ws0xziy~d*y&-k4pJ3< z=&xT6-sO?QN@hW|tAg#~&>WFHi$s;M5=T`Vbahn;G-EJ|9C|L+f}RKjb5EbGfar~r z=@%GZkf>16dtnZt9SE`{0fi(gfmTBHDz6z8IvY733+(?QRYw~8Ugko2?5@WxkV>=P zNGh(h19Ou(xI^?sw5#_5kvOP_~Q5ZBXCGR5v9F+=#3 ztNm#J0#xmIimPYYqQ%)*8E;Y{q)32%>~BBLFE=HwVL>|#YDd{0hmIpG;fWLXUtU0T zQ)TWaJB!=^klAOKO2=n53B2}pT*klO>TUnFA2tHX4c5xgZg2fi^o z6)>6@7^mOj50=Pc9DWxK`TkL{MD!)6Jq@N`*(Ry#fM!*+1QMA7&LXj+Xs*>)e%IJk zX!w?&7wrFutE^BcOTmXdj8FBc%*$vlX^H7z-h_Z4>;7*qfF$4owAGrl)D*Rom+_7e zbU|OyqGGhKt=isa)fzz%_DA0GW8@#u!y|7HDTXM3xcqJOeQ;)JEhV)=cv(CuXZno92T7LgPK$MrM=2NNg=>M8g0%^b2)7^_JLxMZtP#_o`yvT$v;tG$YfB(bn5Rz5&1tZ6ED>wu5evxX;{t1SzzKMzR zd77(_2CY{GLfuQ~c!->I6I%Udr;)re`=muEC6~}$mKhL$J@adVFRgERDU#Bb#xNYC z)h4#G9S#l;p{+dYrT>1TkmuVi5xSmYM>5M7H9Hqz9`7Pt2L+yGdYb zMpHsxC4)a{2OX_rm0%x}r~x!vSAbjmlCQx~-Pr~CDgnc!k$0g@WoGZ4e{R6D?Lnc% z;yinoN8EB-9b;o8&_UM3Jz%ep$(5t8hGM}S5cob!n8 zOK{h(wVdikXvxHs6d8`y2GIImDFVJS^+HH7kt~pSn#1R==*9{Y!V8(H9Y&|Z5nXN& z$A1E_+7*e~=7@$S*F;(s&kF?{8oFl$erFmim=HI#JSP7-WoGrq=0@plkq`fCZg^}_ z4sl7W;)JI30lq}4U=_?mZ3ZcEyz0nK+s!FbChkYGG!5FP=i`4M<@;s&PpzZQ<1CC+ zV+hlAswj>`@)*ze@S5x_X^}sg(zx;z@|(&&GDn9FZ3HZGkb(^o_?cpT>r)>+`u$dR zsUTpd4MJ;xiFV$^xqheA$OC5x74ky-)KSw{KN->8Ig7s(6lGs-yFvI&S|^N%(Df}Y z5sIKGWTpl0#hv2<1tQs5&3@?}P#~)&3Bspd#weFC`VK%%=eAN>8_=b$a!)a1S#`NM zw*UFyv6WpO@q1wys@=M_m~GaV;^g0I&?p@l)0o?g>!*^8h)F5MvQQufQAq>xJVps? zCi*E0qeZ4nn_7ts;=kNFpGUs8dGp!lgI38r`UD34jN~JpIi>uwlr3*dq_$r85;sCo z+U*ua<9@2{B&|)2ncL)@?qsWnPv|~bphLwyJl!kL&>8nl!sfpMLt}8!t!-tBSd+J5 zv#=anoz`(`1HF7!xZJh^6Z_9E8zo4*XK0ttdRjD0qE$(2?8b`#i_U*)EPKvX5fR@! z*KRbME&LLKG-aiFuaul%?lNU7s4Ym;k6|f>MNmz5%`iOsKpYOrO7fcUQcuf{MV_ZJ z+)buRgoK7NTUW4?hTh1oI$OgxAU+J;(jFV4&yXbRB`2m(OcInJ#!&s9w4f3qfAed| z0ZskNJ4PHoNQUr(KMS@a2+W3#q4{$x&05KAGkrH6t=`=BtN{jFLu}sy3*gR1WHlRp zbOyj;kjdvN2V+H7*&NBNJ;*ENcE@U>2Wl#Zed)QS@X=vaYroeNWK5p4|E?rLGgAWU zrysHw?9-UaR2sV|{W4{7K++8JO(I2DY%9v`i2D#;#cam$CVYWlacLIzfXN19T@)WP zRXb?U0D1Sp!mYsjp)oY*d3j`Stq>s=UyK0w50<=C7zgN0WDsEo2${#tX<>TY8hRo! zmVFhrQ% z)0%MTnrIn}JS>e1?w?(v^y6ABEwEXHG(xH3ZS~g>$E6on_D`Ly`el5LDNrUrM8(< zAVkqEr(}kvXr*UVO&%>}rZu%6t~TN85np6BB+X-+Ur$D)Se3Qeo`lHq3>TVlITI4= zTHA*GS(2GnU;`UJVX))K1yRCSQZwoWjwJW8RKN9213(k7hha-G$cR42XqYA%@Jx7l z)u{CxTDdpxo;3K)@YiIm=E;69Ra(<#D&O`Qq3rdI^#LQ1RW+xDYh}0w-w_?}Tc&?MiSo3M5U*w|etb2QFdD}>EcrK4 zETA=>fv(mr!r4sy7h=$x(0Gksng)aAB`Af>@{(rA+>D;q67cs+d*qn{{7+Wnd+wJw zRzX}=;BOL%jTtBxmPMzgo2r|XFLUD=qJS|rI__xAzfR{1!!(mlJTfwBhv+h$Q?4wP zn}zNRW62@!XXM+gV`|;9A4#B;lz5jay74^3H}5U4NsL;qPA;D`9F$&3&XS=ijkTcr zmM_nZT31dWA6!Hu*!S}XY{w@PW_`+$l#UVgwvAPbuQ$mGc%?JCBlouA-jYHCe-sb0 zzYIhxda`?8F%P%}OjI5NtzDm-G#qEHk;@769=k(>a$<|I2s#_@Ap8Iro^H7^#y!Yq z_^7fP-$c3femcVH!MKd8XJ-z<7qWH#pS*(pERtn6r&VV z<(8?c>|)m%hs7tg4Py1%i2N+9-)(Pj*#{64-mLQ;-4xA*N_mb+*O;4cLyp8S2Az|* zDK1%hY^bKwnjfX8iIM``0&E_%O9n!#slS~JZt`rp-Qw7*l?3uAOtLx=1l%Z-MFvMz z+)${Ju?Q*-eMDJWW@LYf1L_wDD?`Uurs&ffE1Ma~bmlptv>oOndKk3$+$-avbNA;y zDv0JC@e4#H{c9Us_e+p{7DDDIUkp?@fDreQ_}4TPXCcM1z0j--BKpcL6%I#HDosU9 zyJaPR^%>Rwq4%$misbK|5=yefONT| zQrY;@C5h)9mAR(_y}ay#;dVK<<|UkF9bB`@_EIGMH|Fusp;$GCgNEk$FoTT4zT7}z zT$70_1#%9OIO)nHw_)@AkXDf^GynT@Z5`ytH#W8CfhM~~YJggPo~QA|!rxL^x;iT0 zN05z|-`mGBZoewfete-2u6Tr&@~Oh+SVvNS(2>dUMCy5zcv!`b;x|_%5|6b&$3~O4 z-M3`HozZ2z-+1fwX}QLk$pQ^P2xE~!5_tYtJnRB|*nLC~N}4i^r6a<$$B=RQg_(&= z+&3!@A1xkC1xxSan^Hn4J-)WEnFVXDCX@lv6ezUL) zd~Eadb~`6Ee1|bNy93?#6_gE^t9Nch0_s?~B5d-rqdnW^LrhMz!e|$ZpI@Nb?4z%F zJh^arihc~D8G8l!RFklF;Fw}Vg~oEjXjWP@7oa%`8GaI&p!vgT;DXj`5wymMptE02 z=&dboteo9b#b7@t_OUybaLOO+ch?(+ZRYvz8T{7g>kCYW-g|dq!ThEi-o&YeqU!~F zt%#9zc&N-I%ZGMz8LTVi+1r@^BHxM8iaI^NP}@>Q%`Lr3opfK`&n$wFkpJ26yxPU% zFNOhptEF_g>Xb@KWv3K!cp4{xRi)n8!Nd5VL>8NdJiMpND<&M?lJi@<>JOJ=DrN(J zvX3SD2+~H186p8cb`EZhllsUQ`QrH9@SWN?&N-ZH|az`FJ}}Cy+x;?(?>f} zHX(ycklqHOlDoS3*N8)Y0jGy4NCfpZ$pxv$TL?5v%H*JdZNvo)Cs+2`X zPy*3SvVvJz*1Hhs@O6U5BNssal<5{Nhi+V>_tKP#LdO-ol#t*+fh2bMY*9 z2T-qNkH1~(oCcXv^1cM5IL%Sw`aE$Cy&mI#+?sZIF~{LRVmy5E7ryOg?4Df-kz3$( z!5(q8$y*{Ln}5d)Ec!omZYwr2*kQ8splSbTDOgT4Xx~ho7Vf zC%t`fkKjq%<_?P6N`a{YtT?2^}D7wQuC`|%lo_KB) zLnk;vuUR^Pc!%#JryeaRey3Vc zy5ctb&-)n^SGnlnxLgemjm=Od%h1Or%Zq#0WW)M}sVgQB;}zaSuTd$BvaIbBna($T zJO#C%cIeCl3m|JBJT+q`7Db3XAV?8_cSGdkO%e3`%dGr|k*TR%oI#Z-+M0}pyLGS; z860l^C}@26PE=V+s4H3)^2Xe4m<|sr z)I75Nt1TKi{TO@E6o1uBxVU%tMOhS$?pwKNw_hwYC?CSda#;(%m8)N|bPa)D;AoS( z`}SvO=mcX=o{bYZppY!Xm$nnUiM5f*|q{G$x>0S zu9Vvmq!EJbCWFkA!nq}%15eBQcHrHYm$Ft<4ua^>i&EId*H_>&QSt*4TCR2bNlU}c zov%qPn>{Q506HW>uKLm#D`~71Ri%6QT92wPLh!}Nhj_Jz*;0Qlkgk~1D}}$8vWVjv zl335H?(F~i_Ja*Fz}}o#FT#{$zN&Iyab}ZDIma^Rld4nu4eYVZ^4rRF5RpRhb@>w7 z=h}sCj9WHzpi&NNaRHzYc@>fl_Ao!3<;kGH^z_a007%N@%vZr#1d&>qQQwfi<^+=- z?BLG1I*Cw}gyCAgyysM>VpGxl^`K&HF9J`%L##Mf#i{}t)KAwZCt*Npo%iE8Ayb`}W^62V2X!!TblKYN2Ey6Hfi!JgNa;ulx$LFR5gJolDGQ-1da_V)$oP zq6uPRsp`5yMwUfSR<)?s7uRCJf^$kuuW2vI5%IOFp~J(yZ&`Wl`fj=^m}_pgvIs4` zXl%|q-@d6hrjJ^YvZpAQ_y)EZr}n^&s9R9=_}KX6$u)>+&T^EQ@_PE?EJJDm#H`j< z#qbnv+9JJ^?uvj7XVC&cbMWaKHaU-MS*fr5vkrk_ssaJ81+xyhMM6~iWyOM)MXVyq z+L)~MN@j5;oN6p#A@fu?qMx#_CLW8O$T;+=6;amE_>d6HZ$wY>7kc}AK=nU3FQ5HQ zKQyPI5l)5mqa}@oIb#kfEJ;=-k+%UCu>?m&0~hU233R1g2h&m+6LlH~;UJaaA2=w9 zHy^#MY*&ZfyR=YB7wzWc{`Z3wzJ&@x0Uv9#1#*8!kd4My0jgLJ^O?HT;=QvaBS1C5 zcjJ+zQ_tzBEH)chNA_sdku#y})K4a&6Z`$wAeO0hvKQgxbv;T?-bx_vt$ZLU2#x9>EX8n{VZ zXtziB-n9M_SZ1ps<9cZtS2otlpc+rVTVmGrKr+#fca1vrV8vwseRS17ZBKXQDKWe@ zx5i^vL_); z@=QC4+Mkf>h4jUn=Mxy(MTRVXmMlCbafQADsl$xolS)CEpEL5&IR-*?(^X5JsKDwD z4^R58pj3Gi00~y!FZgM#TRy_7M5IMUFQYDnC>e!ZP>((dpBOGtT_1@cZe7gm<>AVL zqx4ZZXjZ*AyPU>@#lpO(5|D=EkK_NNNcyPS;df|voaV^(QLYxEa@Lpcia1GMZ^_ds zGULX7@P#d|8wB2`G_`u9|iAk+grlevy$+q^B#HwoCM&tr9-SKM&$TZs9 z?ED!de>m`{)-KSoyrhoDC~V2?1J?x(GYHMqxPFw-9!6EAO2;x5bCxJFWSyzvxaY^! z#w*npx|+kKF1U(dP0VCXIMdT+^Cp6h=L6qZ2$nn_+WY?MEWH~GdJ?&iK$;`=?FW6o z%*8-$HdMgF0l+zN(;~6ba=;$y!XCv{YF+(pVKUN_AQ-m14quq1{#awSM#n6Xo-shr z`tJ&MC0p~j>-lJSk&H)9kn^{%go7e_2wKbQXhM2c0L-~PA<@mq_+s@So65OTwjnEm zN@1T@D)~IIj8}hJenaYmhGsw8Z! zvp5V*f{QhXm4}=MBmox0)aj&zA{E&VKJ6g$Be(s#DdM~xb$oyOqft>>F!%Zg$ksEVM|6a){L{6?IF+n?;qo68yJspOmB_v zUlm4iEyNqz^weXgrsy+igBwkyvT?j8b=zhQyz1neC{}KD$ki&*T}JY+2|XFL zRqj6I65~CGqI4Vbz7D)dt4GQ~dj8?GMHo+E?cmf&M}-z`fgX#^LWO6!Q}OBwm^Z-G zYo)vKmFwo|S2!poxW>`h%kevP9xc_gjifJDfDtweLHFwgYwiSQ6Sr$dR=+F5+^*|< zLbO0?*7*Kz#77V+V>E;HYprJM$0Tjw^9f~x7K6d7O#K%?H}W>bOBWmNfVSc8z-ABlt($+l5-uS zzm*=AhN&97-m{^oXlH}2qWahFe#YD(_B7tkgMG3^#r{d;ERmnhqH@dc)UCu?m^#-S%=#?$#&^28>+1F)8 zdT&nSWkO?Yxx*>*{e9jhSKm;>S+c*zK`o|-Ae7>xA%{YGu+D974;YRe?5M(;?Gq! z4!bADKuzNxGr>nxDfL3+kB>7h`BTNUwqUTCD*-L6bwcUyGTJIU1BwgH%}<^scr80K zIT`4zoCEOjC)WOD;fZdJ3x2MbiWj^{w!Z@Q(K5J|b(|M=+>`$lB}iDTcO%tY7Lzi$ z86?xUU1PfY^MkFNjzu||DqZ_R7H0?XH$oltjBNLE^vlsq>dtBK_gk2cB^C@Z=!HrlO=$JRpLZi&9P-}S8jxd?1nj9_^-e9nZTJLW?h@t5AW zdy%E|HgzA`pVvIc(c%*$+QcF!JfgB$2#@x0fX|%*RQW8TxJkw^`OUb>j~fhIj$SZi zec}taBsr>OvdYsdX7hw>?oJ(@Thsbo!d${qSZI-DFv?c9(QRFv$8q}b==;6%jx{?1 z?;XCXx7n)q*x!2FL%VjdQ^Nl~mc$D#5U;5=X;RgQtA z#M$rAgt_alwdd)dt+(470( zMi-nZD#efOTrrofp6%|>NuR^tMPnu5Gvs#P*bS%ePw#9l-iSzOC?b+PS^=kgP;ST-bm|g+a+K zU?bptCdz1ypFsERtUigtoWSr%>F2b)gaw>sQlRV6=E#?>m+fn{_nW}4*Sxf6o+R*w z&!Ritc&%sdiiPK{*Dd}0QPWtXLyO{nAA18H%AxS`MM76=Ihr&B^SZ7%Xn$?0_vB9g ziCgW7W0>&(pM*$+pg2#m+x&fvtg4 zS*3Lo?~Tb-GBJh|sWRjjjE<61Lk+cUCvsGd+6y(jjfpD5y9&>YrrX%rUaYW>2nyKAwhVCPvK1An}J67_936$7nBCdg9elIGwl(k$t}qZ_VfdIX;q`V0LJpM>xYyDu6$ z68crA(9RuC?jL(jK1OToVUeyCNR8GIW+{*mK^IzeSjg!Z)?7qXM-~$zRAMT(RvVsH zblxsa)9HEB{G>mlT;~377y5?9?k&Dd;HtKzWLIqS{JN{U`5en=Sb?RXbzcYW?Vq)N zi(H=o5dd`Dyo}D|zBrS}nG3sxDTKsL~i6L?IP6Ih)C)T&}h3uS*8Ppf;CgFJGe0DA*qZvgBKfV}~*Hvskqz}^7Z z8vuI)U~d5I4S>A?ur~nq2Eg6`*c$+Q17L3e>Ge0DA*qZvgBKfV}~*Hvskq zz}^7Z8vuI)U~d5I4S>A?ur~nq2Eg6`*c$+Q17L69f0H-B3HAowz}^7Z8vuI)U~d5I z4S>A?ur~nq2Eg6`*c$+Q17L3e>Ge0DA*qZvgBKfV}~*Hvskqz}`UnjC?QH8vuI)U~d5I4S>A?ur~nq2Eg6`*c$+Q z17L3e>Ge0DA*qZvgBKfW3kL zLEgZr*TuLeDg?xTA6y6s2oGylYezPF3v=tQY}WQ)EiJhJAKrl0$Hk5aa39|;OZ#;n zKaj2(vJw!r)5M1m5U3pTQsP=(MyGkmPFjluBkz`5=yJR%7noPuuK|cLaIn=9Oq2*M zI0qP3c}4srgX*$PnnX>K60v5dTF!z|RwPe_0GlB?BnjqnavM0>E-1u0VR?`1)%!y~ zzLg)$E57Gv`C-akTa(ipozHpae*3Lk-kYxXoNo0_(~Xc}y$!3=ED)0rK$0;{J_yyd z|drJZ{97A2HC4wyH=^6-H2z)XR6!DWd=D&8BZXv#yeL4_mv&kIV z^8^V9kmCXcC??|geP8o-s!eh%DIv~rzKS^%=3aL~PQqVML2N)4V%E_@oI^ffeEwv1 z(xwrT(36NrzyG2Qp@KtB1CUuYejC=tb{y zfrwosr0vEvMjbyE{S5etXXR87A*O~(;>Uh)Q~y0$f0+!05`jx8B0#PlMYcChpMzVZ zlrrqG*?lGK2`{Bm?Jge0KB_AJ=nTdm?!F*X&d_T*-JR6 zgLz+8mq}-GmVrQ(HTNk{na~;eP2l!%Q|8? zJlGiIK89Zh@dbxvDEazVaYI0-#-_-fuW?^uv@RR@ymOfWfw5`aYmD~DtG z&cyt$Pk|Li=THLL%XYi7=6w>krNJqeZdejN0Y{+t8# zlu26OJVBqF!zW%AY;x-1{(hF-54zObQG4x&fLccvd5$L>P81wkv>V+FuEw0X{(T{a8aOzpS zvL8XW9lUlP+_IVMYG)*c%&xPaOO?qREEqRyVvw{c8wit)Ecy;b5>Sl{qwnk!129yOlhC zqiBDL$Ne48i}7H!i~5jcQxKZe< z=~=Z#qR$wP#5NCap=DvGp_5c4QL(aiLq1NBYL2<$z)V@Pvb}Y$gY6*Fs33HOs%5~Y zOB~=_+WW$QPzjT!F`2`UeJ=WB28foA9xjueeut#tc~)DL)4}WLHUI6(&iRU_MDW7x zpw_VJlw*5dbE~PS$U*}!Sz>NfI>ajEQ`;7;RTvkYb z!WuiJnJ6boJ4gGe+cUf8aR39SqzjJP(~SAdpB3rWKV!b7Bj&;ek0IBJx#cV2T+Ic$ zDaY(qS!}v{!wWgddA!I}oc}18lovT2BWuqY+rup0AFi^`Yat2ezKdDo2Q-r7&AV8A zV&rIF_d{}L0a;zl{7tao-`H2%@WNhH9x3@H6*KicAH z7Jt!UzYDj>BlX~jCOl=5XwdwK$>l<_&6VPpvN8SmZ^o#4e$7^Q zbC(S_NKS0k!=gV3p5g;ZBm~F}RyF%37GN7oq?N-0?tH zPv1^N0pZYpo9ALHy_hk%X5{|-dzQZsHn4M6xaH6sM;D*3^sN zMY3dmshw5Ew<;MrxzSqZG$(f;6)e2vHz$vK+S64O(K}3mAnj12BRMoEL4aRPcGYZn zq7o8;ebw|WGOi?fT{G@p-I{k|QLnJQ1Ood*$7MX%CPHH(n9dQ&rOhoBG9dt(5S=Sg zT2%xUysm4ra{-%tA{%D)Yg4SP#z$Wb9motw1J{zL^~LVti%+@L{{-Xbl|VA;5WDKh zgbpQd3eKvy%myL71#=e?s`bObtA<)`0u?f4{izZX zN9pqq0Tv0K!Vp9R-ZJTfTPTI)l&f!XKVt~~a4<9)cM{!BIh?#aQ7@e{53FPlvXUij z$o^AGze30a&c%FI_wEk3#sd{j!HzLkQl=qwSZ-iqXbI@HTi~_e;EVu_LLOEnug&K% zCw-0Ig?ElcodwD{lNk%$+3Emc1mlh#J02%23_4lT8Wd&~Pd1f4)NKR5 z5{jK1 z(kiryaHD&FlB8ylus|4X1}zZG9#D`zuC?x87=~k2d<(7IleTE47i4-bVBu<*=b)-e ztQO(%z!m~|t1!)lf04QU>*Z+B@@bD8I0eKQs0v``Ah*jD25PNG7|HeMvvr2{A^Ni0n&|vNTGT zkXP$dZas(mRh*hVlM>Z-2ahIoI{Q=Fv6xXYO;(^W5j$=bYy%OTU9! zFo5s7XJfb9iO%;4;ixxxbyU2Rq5N_wG}s$b?>-(ai0m*S{lpPw9!>h*`J=jT%qWi} z3K!*~NDRUojRpktqDjB{=oMM(aO}>K=DzV>l<)QRo3-^dei`|54rxqSu^jFBA* zq7|C|=tc6{m1;ZpTL{Zt8~=!Olu&l8;5rm>p-GN8-;?aQK|4t?U27CvGuv!R0| zoZX?Me6Y6vV1hmt~Ts_$r~P$EQ<^gK4nA7#)wRd0Wsf_ADdsG;0P znS{n-f`udf6sP(DK^=tb42Z4O1feLCANdUtCsUpV_ZbYh!r9$ zJ*iQ@Mb*fOyd4{QKRwpSYxYk`KD%Xc z@+Oi;=;l|(n%dM#Wu|bsm8;}xWzCfYN($V)Q$i6;`oYc7VNvByOoDU8qZVhGu;=j& z*rGt{iPOE+hjzbH&e1EA(R(%zKak2VcvZU@dr=#u(;tW}&=N2{)9yN4ltXN&H{lCnt+A^hlk zlZwwyu$QJr(rJ3S?eHqg4Z-bGj)kvronx&6n3w$V_2}{^KqZXp1tjSOq z6_fa8t?$L1CdcYuc?u4#F#v8^M~V%iydcfhC+;26<;K*Z0@1K&#i++FP>&3$fH!4A zI{e4XXNg(;#Ylrpgqmov7|*fSI?59mYIE;FWXCt$!H(*#!IREhpwr}x6N9Mi9O(?UMMZS zo3av`KMBkM`v)nChfH@YUC`!V8MdPQ2-(rP2csm)TF#iRLwVWY#nTJTK~uv0`^g)I#EB({qwFE9)Zszo#VeL+ydg9HpsNJ-NIKo+ z=C~qVDnjMC`&Mv>#jxc&59ERBR`KULORU<`V`BLX$4b;qe~_J4%Ne(&JVS=dqyP;S zZRG+*%V1qiB4SGL9{>-F7~_9U)nv9)we3`GJ5}3G)wWZ$?Nn_$RohP0wo|q3RBby| z+fLQCQ?>u+RPFGga~hoF004^MuG+pWQZ-3jt|z#6slJ_!y%qLt$3N_NQND00 zIrE(k*Yp9YcS%cQNe>%CX)QS>ThM&7yg(AtKh(D2~c@mkCw2vw1o8 zDf!3bD3-+oFOiqCuz9FAPRXaTak2!ys3_R^B;xthUS59&cvIkA>n7si2%a%DRcg^E zA@$OQcG<37mhMAWoS&adKg17^?QY%J$pbD2BO-9czRg}QMKlvA|Hv3bLVeWv}+oSoWN6%2eT_~#7s z9n7~~Ct6czX%CIi#mYXi^YLht){I4JpT0Gj+rV;9sq?abyB9~(TZ09c`o0yhk?ih@ z$`z+9$w9eUO=`}wG@pJvK|s^J;pXTAkCukRE?9jd3flFdd4S@X+~JsEvoCHF2(qw$ z>d3B#1jZYQ#Ory#@zSysC3+z6gmHw9Y5F1N)Y zZ$BUpUPJm?aN@jk7eyFe^O-QY{C#;4a(p*ijhw=YqXQg8$%+VLBe~TRMYF?0oEzSZ z5$~*~l=JUOLfGG7x?^Nij-**g$}|8*11kIVGSU!+u~by(BQHXslqjog{}C8aCL`Av ze>^mZ=GpmgJ0FoZ(90F1GM`GbnV4FjcnKRlK0e!Yxl!vw_zO;Ny2n>7CuI}_Wn8HC?XlQ=WwBq=_!#2=NT{3-1;$hoxHW3ICh-#}j z;xf#9kxFE!JVaFR>+AboaNUceuinP$QTt)8cFG;O+Et&RpD>qhd?eTC4os+i2s&Q6 z0PATVoJkJpgbF$~EM<Qv)!&bYi~sdBqo&xV-7`S)Yr zuEfie&LL`BGH<+u!C|&ZU+mm|bc9ALt5m8HO}AVU{wfmjwQohOF#896J;QXRuX3W@ zbID`u)xz`*A-jB{_#65?(&UqR(2M!cNa6L+}r+(!o|8YR>nF>*#y=r;qf#x z)z6ux7SLSxa$xDZ4wThS%ryB7CCXNug)Yl>e!HK1?*$Qdjw;;4qAAW+=ww7l6ltGg zG0)*!bO-dE7bqp2wTFc29AMn45PsI9gM9rMFXMuDSJ7%Fq2m0@6T@uKT(j~I7F zd6uX^a<;mZ3Kv?b^t`sBl%-S+W4Y1TVC~Gi0dtj+59Bj*6S?1$p(wku%nen)`?I`f zqIj@NE4A8Ov6^1CFJ7**dHIwA-%~w4#wHIx;iJtNUC!6XKWG>6vD#y7Y3Uo|zA}ps z&#M|EEFl+0q9dG>h#RI6cD3P%PeSrMw~yVnp85PV=BBnH$(uQ{qRdPB7nW(0OWvJ- zt|inlXg=Jpc2ItlhGg+jitzpYb;zAx;y#tsCLONenX5x3-w)RIa!hfyd&Q1LZy@)u|CQGRpc4Yc(}lT>uuOqvFh9=U&IbmuD(XL?|1 zH|DggqEKxC#<;lyh zd65M>t|K5Lt0pYgpMLjxaw#$gHoI)YnBluzts0qYtI_-ZoY5>Z<2k)l$YC3AB(LD9 zHVX6v#y2BC3;9avlX{I%Hw${KQOn$HG+DQGvMWY5<|zFI2Trq&s_9gbBRktf7Hm9*il{<6TwCg<)W3QjLTsLPvv)N+{Ud42cY!7^QJ;puxY0*%t6j{ zNL*a;)Dsd^e2Se#bg!n53YP~Ezu7HpA}#Z zmL9Mf;vjIXm+$itQ=I_LO3KO0hkq*q%}loKirbOu)}AWp~_` zGC18>E8tPypM~z%=g+gix|&E1J|_&;p6K zqDlV+t%qbQn#^C&gmH%#2)Enbzn}%<*3Jmi_WcFzCB;^>{eM9drP_*i;6Ks!;N88U zxW|ZaO(n$t0@sf_%D)9}>!;zmKf7%c?%o20@0}#=mbk4S2bnz$XAj`w3@Apt%E~eU zfTel4>W6;4DGW zul?rgXBhXoAGN`_*%31Dx-vrg7WZ{f_$_=DvEJO%-2;Or1X#X(%C#s206_hT#-IbY zdDnUzS9MP`uA>OqH&ZC=gW`M#h425R{55+oM;BX+mpdVI@Q2n4{xDK?bIqJ^H@mgj z8$)ni42ok7vHCf&!E(L(|Jw01zfoXcA_~@=KwG(c*tu=){oh~5UEuENUj?+)+hj|) zBGK*#i+A8!4-`0d{wX0_5PtarwkN^*#I-(3+ktyrK(YP7;jTJxuju>?3TyRQ$J+St zokDeuO5h#@Q1}?;dxSBofn_76)_sW8IspJc!SKBCuUfv8AAc>oF@ z5#vX^$&1x-b|b<;Xhd|O5&%HqBZg^7HX&9A*Nq5UCK{}69RPsBM^LwJMy!sg8xb>9 z)~W4f000WyVEa>|<48Ao@pBm6$he7Al27!20HE+0SS_;641%|K;Mcw&ByK(m3ZG$J zOTL*w@CI$?>n?XViSX4FtsRlt82o|pegPlxXJ)(#+7v~= zgQn{N_@SBg`x@=%8-nYb6tt{WmOFe92>_t*n?rGfb?+xi z{ofc|{sb7S|EKasKQ{nILOl>`{8?@9i5hI|VF#_9pyjf{;8zkmD~? - - 4.0.0 - - com.arm.equipment.system - arm-equipment-system-parent - 0.0.1-SNAPSHOT - - jar - admin - 0.0.1-SNAPSHOT - admin - Demo project for Spring Boot - - - 1.8 - - - - - com.arm.equipment.system - data - 0.0.1-SNAPSHOT - - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.session - spring-session-data-redis - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - javax.servlet - javax.servlet-api - - - - mysql - mysql-connector-java - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-web - - - - org.apache.commons - commons-lang3 - - - - com.alibaba - fastjson - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.springframework.retry - spring-retry - - - - - - arm-equipment-system-parent-${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/AdminApplication.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/AdminApplication.java deleted file mode 100644 index 32dc9a8..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/AdminApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.arm.equipment.system.admin.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; -import org.springframework.transaction.annotation.EnableTransactionManagement; -import org.springframework.web.util.IntrospectorCleanupListener; - -/** - * 工程启动配置 - * - * @author admin - */ -@SpringBootApplication -@ComponentScan("com.arm.equipment.system") -@EnableTransactionManagement -@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400) -@EnableAsync -@EnableCaching -@EnableScheduling -public class AdminApplication { - - public static void main(String[] args) { - SpringApplication.run(AdminApplication.class, args); - } - - @Bean - public ServletListenerRegistrationBean introspectorCleanupListener() { - ServletListenerRegistrationBean listenerRegistration = new ServletListenerRegistrationBean(); - listenerRegistration.setListener(new IntrospectorCleanupListener()); - return listenerRegistration; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/AdminCorsConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/AdminCorsConfiguration.java deleted file mode 100644 index 54f5f01..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/AdminCorsConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.arm.equipment.system.admin.app; - - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; - -/** - * CORS配置 - */ -@Configuration -public class AdminCorsConfiguration { - - @Bean - public CorsFilter corsFilter() { - // 添加CORS配置信息 - CorsConfiguration config = new CorsConfiguration(); - // 放行哪些原始域 - config.addAllowedOriginPattern("*"); - // 是否发送Cookie信息 - config.setAllowCredentials(true); - // 放行哪些原始域(请求方式) - config.addAllowedMethod("*"); - // 放行哪些原始域(头部信息) - config.addAllowedHeader("*"); - // 暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息) - // config.addExposedHeader("*"); - - //2.添加映射路径 - UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); - configSource.registerCorsConfiguration("/**", config); - - //3.返回新的CorsFilter. - return new CorsFilter(configSource); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/InterceptorConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/InterceptorConfiguration.java deleted file mode 100644 index 80a1a46..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/InterceptorConfiguration.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.arm.equipment.system.admin.app; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.arm.equipment.system.admin.filter.LoginPermissionsFilter; -import com.arm.equipment.system.admin.filter.SysLogFilter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; - -import java.math.BigInteger; -import java.util.List; - -/** - * @author: admin - * @time: 2022/9/16 11:20 - */ -@Configuration -public class InterceptorConfiguration extends WebMvcConfigurationSupport { - @Autowired - private LoginPermissionsFilter loginPermissionsFilter; - @Autowired - private SysLogFilter sysLogFilter; - - @Override - protected void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(sysLogFilter).addPathPatterns("/**/*"); - registry.addInterceptor(loginPermissionsFilter).addPathPatterns("/**/*") - .excludePathPatterns("/file/**");; - super.addInterceptors(registry); - } - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - /** - * @Description: 对文件的路径进行配置, 创建一个虚拟路径/Path/** ,即只要在便可以直接引用图片 - *这是图片的物理路径 "file:/+本地图片的地址" - */ - String os = System.getProperty("os.name"); - //Windows操作系统 - String resourcePath = System.getProperty("user.dir"); - if (os != null && os.toLowerCase().startsWith("windows")) { - resourcePath = resourcePath + "\\"; - } else { - resourcePath = resourcePath + "/"; - } - registry.addResourceHandler("/file/**").addResourceLocations("file:" + resourcePath); - super.addResourceHandlers(registry); - } - - @Override - protected void extendMessageConverters(List> converters) { - MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); - ObjectMapper objectMapper = new ObjectMapper(); - /** - * 序列换成json时,将所有的long变成string - * 因为js中得数字类型不能包含所有的java long值 - */ - SimpleModule simpleModule = new SimpleModule(); - simpleModule.addSerializer(Long.class, ToStringSerializer.instance); - simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); - simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance); - - // 反序列化时忽略多余字段 - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - // 注册 - objectMapper.registerModule(simpleModule); - jackson2HttpMessageConverter.setObjectMapper(objectMapper); - converters.add(0, jackson2HttpMessageConverter); - super.extendMessageConverters(converters); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/RedisListenerConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/RedisListenerConfiguration.java deleted file mode 100644 index c7ae4eb..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/RedisListenerConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.arm.equipment.system.admin.app; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.listener.RedisMessageListenerContainer; - -@Configuration -public class RedisListenerConfiguration { - - @Bean - RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory lettuceConnectionFactory) { - RedisMessageListenerContainer container = new RedisMessageListenerContainer(); - container.setConnectionFactory(lettuceConnectionFactory); - return container; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/SchedulerConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/SchedulerConfiguration.java deleted file mode 100644 index ad829b1..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/app/SchedulerConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.arm.equipment.system.admin.app; - - -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.SchedulingConfigurer; -import org.springframework.scheduling.config.ScheduledTaskRegistrar; - -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; - -/** - * 定时任务配置 - * @author admin - */ -@Configuration -public class SchedulerConfiguration implements SchedulingConfigurer { - @Override - public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { - taskRegistrar.setScheduler(taskExecutor()); - } - - /** - * 创建线程池 - * @return - */ - public ScheduledExecutorService taskExecutor() { - return Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors() + 1); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/BaseController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/BaseController.java deleted file mode 100644 index 1f6529a..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/BaseController.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.arm.equipment.system.admin.controller; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * 接口的基础类 - * @author admin - */ -public abstract class BaseController{ - protected Logger logger = LoggerFactory.getLogger(this.getClass()); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/ExceptionController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/ExceptionController.java deleted file mode 100644 index 3f5ad5a..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/ExceptionController.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.arm.equipment.system.admin.controller; - - -import com.alibaba.fastjson.JSON; -import com.arm.equipment.system.data.exception.AuthException; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.vo.RespJSON; -import com.arm.equipment.system.data.vo.ReturnCode; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.QueryTimeoutException; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.validation.BindException; -import org.springframework.validation.FieldError; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; - -import javax.servlet.http.HttpServletRequest; -import java.text.ParseException; - -/** - * 统一异常处理 - * - * @author admin - */ -@ControllerAdvice -public class ExceptionController { - private final static Logger LOGGER = LoggerFactory.getLogger(ExceptionController.class); - @Autowired - private RedisTemplate redisTemplate; - - @ExceptionHandler(value = IllegalArgumentException.class) - @ResponseBody - public RespJSON illegalArgumentException(HttpServletRequest req, Exception e) { - logErrDetail(req); - return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, "参数错误: " + e.getMessage()); - } - - @ExceptionHandler(value = MethodArgumentTypeMismatchException.class) - @ResponseBody - public RespJSON methodArgumentTypeMismatchException(HttpServletRequest req, Exception e) { - logErrDetail(req); - String field = ((MethodArgumentTypeMismatchException) e).getName(); - String rejectedValue = ((MethodArgumentTypeMismatchException) e).getValue().toString(); - String message = "参数:" + field + "注入的值不合法:" + rejectedValue; - LOGGER.error("入参错误", e); - return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, message); - } - - @ExceptionHandler(value = BusinessException.class) - @ResponseBody - public RespJSON customException(HttpServletRequest req, BusinessException e) { - //投票成功返自定义message - if (e.getErrorCode() != null && StringUtils.isNotBlank(e.getMessage())) { - return RespJSON.returnCustomCodeWithMessage(e.getErrorCode(), e.getMessage()); - } - LOGGER.info("自定义异常: {}", e.getMessage()); - LOGGER.info("异常请求: {}", req.getRequestURI()); - LOGGER.info("异常参数: {}", JSON.toJSONString(req.getParameterMap())); - return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, e.getMessage()); - } - - @ExceptionHandler(value = AuthException.class) - @ResponseBody - public RespJSON authException(HttpServletRequest req, AuthException e) { - logErrDetail(req); - if (e.getReturnCode() != null) { - return RespJSON.returnCode(e.getReturnCode()); - } else { - return RespJSON.returnCode(ReturnCode.CODE_OK, e.getMessage()); - } - } - - @ExceptionHandler(value = BindException.class) - @ResponseBody - public RespJSON bindException(HttpServletRequest req, Exception e) { - logErrDetail(req); - FieldError fieldError = ((BindException) e).getBindingResult().getFieldError(); - String field = fieldError.getField(); - Object rejectedValue = fieldError.getRejectedValue(); - String message = "参数:" + field + "注入的值不合法:" + rejectedValue; - LOGGER.error("入参错误", e); - return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, message); - } - - @ExceptionHandler(value = ParseException.class) - @ResponseBody - public RespJSON parseException(HttpServletRequest req, Exception e) { - logErrDetail(req); - return RespJSON.returnCode(ReturnCode.PARSE_ERROR); - } - - @ExceptionHandler(value = QueryTimeoutException.class) - @ResponseBody - public RespJSON queryTimeoutException(HttpServletRequest req, Exception e) { - logErrDetail(req); - LOGGER.error(e.getMessage(), e); - ((LettuceConnectionFactory) redisTemplate.getConnectionFactory()).resetConnection(); - ((LettuceConnectionFactory) redisTemplate.getConnectionFactory()).afterPropertiesSet(); - LOGGER.info("reset redis connection"); - return RespJSON.returnCode(ReturnCode.SYS_ERROR); - } - -// @ExceptionHandler(value = MethodNotSupportedException.class) -// @ResponseBody -// public RespJSON httpRequestMethodNotSupportedException(HttpServletRequest req, Exception e) { -// logErrDetail(req); -// return RespJSON.genJsonResultWithMsgData(ReturnCode.CUSTOM_MESSAGE, "请求方式不支持!"); -// } - - @ExceptionHandler(value = Exception.class) - @ResponseBody - public RespJSON defaultErrorHandler(HttpServletRequest req, Exception e) { - logErrDetail(req); - LOGGER.error(e.getMessage(), e); - return RespJSON.returnCode(ReturnCode.SYS_ERROR); - } - - - private void logErrDetail(HttpServletRequest req) { - LOGGER.error("异常请求: " + req.getRequestURI()); - LOGGER.error("异常参数: " + JSON.toJSONString(req.getParameterMap())); - LOGGER.error("异常UA: {}", req.getHeader("user-agent")); - LOGGER.error("异常referer: {}", req.getHeader("referer")); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/common/DictController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/common/DictController.java deleted file mode 100644 index f2f64c8..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/common/DictController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.arm.equipment.system.admin.controller.common; - -import com.arm.equipment.system.data.service.common.IDictService; -import com.arm.equipment.system.data.vo.RespJSON; -import com.arm.equipment.system.data.vo.dict.DictVO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -/** - * 字典接口 - */ -@RestController -@RequestMapping("/common/dict") -public class DictController { - @Autowired - private IDictService dictService; - - /** - * 统计枚举名称获得枚举的数据 - * - * @param name 枚举名称, 枚举文件必须在com.arm.equipment.system.data.enums.dict包下 - * @return - */ - @RequestMapping("/getDictDataByName/{name}") - public RespJSON getDictDataByName(@PathVariable String name) { - List dictData = dictService.getDictData(name); - return RespJSON.success(dictData); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/file/UploadController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/file/UploadController.java deleted file mode 100644 index 24afa35..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/file/UploadController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.arm.equipment.system.admin.controller.file; - -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.data.enums.file.EnumUpload; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.service.file.IFileService; -import com.arm.equipment.system.data.util.StringUtils; -import com.arm.equipment.system.data.vo.RespJSON; -import org.springframework.beans.factory.annotation.Autowired; -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.springframework.web.multipart.MultipartFile; - -/** - * 公共文件上传接口 - * - * @author: xly - * @time: 2023/3/10 10:56 - */ -@RestController -@RequestMapping("/file/upload") -public class UploadController extends BaseController { - @Autowired - private IFileService fileService; - - /** - * 文件上传接口 - * - * @param file - * @return - */ - @PostMapping("/upload") - public RespJSON upload(String uploadItem, @RequestParam("file") MultipartFile file) { - if (null == file) { - throw new BusinessException("文件不合法"); - } - EnumUpload enumUploadItem = EnumUpload.RES_PHOTO_LIB; - if (StringUtils.isNotBlank(uploadItem)) { - enumUploadItem = EnumUpload.getEnum(uploadItem); - } - if (enumUploadItem == null) { - throw new BusinessException("上传文件类目不正确"); - } - try { - return RespJSON.success(fileService.upload(file, enumUploadItem)); - } catch (Exception e) { - logger.error("文件上传错误", e); - throw new BusinessException("文件上传错误"); - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysBaseParamController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysBaseParamController.java deleted file mode 100644 index 0fb302c..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysBaseParamController.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.arm.equipment.system.admin.controller.system; - -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.data.domain.PageResult; -import com.arm.equipment.system.data.domain.system.SysBaseParam; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.service.system.ISysBaseParamService; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.vo.RespJSON; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.List; - -/** - * 系统--基础参数 - * - * @author Administrator - * @date 2021年10月26日 16:36:52 - */ -@RestController -@RequestMapping("/system/sysBaseParam") -public class SysBaseParamController extends BaseController { - - @Autowired - private ISysBaseParamService sysBaseParamService; - - /** - * 保存或更新 - * - * @param sysBaseParamReq sysBaseParamReq - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody SysBaseParam sysBaseParamReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - sysBaseParamService.save(sysBaseParamReq, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param sysBaseParamReq sysBaseParamReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody SysBaseParam sysBaseParamReq) { - int count = sysBaseParamService.getCount(sysBaseParamReq); - List list = new ArrayList<>(); - if (count > 0) { - list = sysBaseParamService.getPageList(sysBaseParamReq); - } - PageResult result = new PageResult(sysBaseParamReq.getPageNo(), sysBaseParamReq.getPageSize(), count, list); - return RespJSON.success(result); - } - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @RequestMapping("/getOneById") - public RespJSON getOneById(Long id) { - return RespJSON.success(sysBaseParamService.getOneById(id)); - } - - /** - * 审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/audit") - @ResponseBody - public RespJSON audit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - sysBaseParamService.audit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - - @PostMapping("/delete") - public RespJSON delete(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - sysBaseParamService.delete(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 取消审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/unaudit") - @ResponseBody - public RespJSON unaudit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - sysBaseParamService.unaudit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 通过code查value - * - * @param unicode - * @return - */ - @PostMapping("/selectValueByUnicode") - public RespJSON selectValueByUnicode(String unicode) { - WJAssert.isMaxLength(unicode, 33, "参数非法"); - String value = sysBaseParamService.getOneByUniCode(unicode).getValue(); - return RespJSON.success(value); - } - - /** - * 通过code设置value - * - * @param sysBaseParamReq - * @return - */ - @PostMapping("/setValueByUnicode") - public RespJSON setValueByUnicode(@RequestBody SysBaseParam sysBaseParamReq) { - WJAssert.notNull(sysBaseParamReq.getUniCode(), "参数非法"); - WJAssert.notNull(sysBaseParamReq.getValue(), "参数值非法"); - SysBaseParam sysBaseParamDB = sysBaseParamService.getOneByUniCode(sysBaseParamReq.getUniCode()); - sysBaseParamDB.setValue(sysBaseParamReq.getValue()); - return RespJSON.success(sysBaseParamService.updateSelectiveById(sysBaseParamDB)); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysLogController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysLogController.java deleted file mode 100644 index 0617693..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysLogController.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.arm.equipment.system.admin.controller.system; - -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.data.domain.PageResult; -import com.arm.equipment.system.data.domain.system.SysLog; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.service.system.ISysLogService; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.vo.RespJSON; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.List; - -/** - * 日志表 - * - * @author admin - * @date 2022年09月16日 12:41:35 - */ -@RestController -@RequestMapping("/system/sysLog") -public class SysLogController extends BaseController { - - @Autowired - private ISysLogService sysLogService; - - /** - * 保存或更新 - * - * @param sysLogReq sysLogReq - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody SysLog sysLogReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - sysLogService.save(sysLogReq, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param sysLogReq sysLogReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody SysLog sysLogReq) { - int count = sysLogService.getCount(sysLogReq); - List list = new ArrayList<>(); - if (count > 0) { - list = sysLogService.getPageList(sysLogReq); - } - PageResult result = new PageResult(sysLogReq.getPageNo(), sysLogReq.getPageSize(), count, list); - return RespJSON.success(result); - } - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @RequestMapping("/getOneById") - public RespJSON getOneById(Long id) { - return RespJSON.success(sysLogService.getOneById(id)); - } - - /** - * 审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/audit") - @ResponseBody - public RespJSON audit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - sysLogService.audit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 取消审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/unaudit") - @ResponseBody - public RespJSON unaudit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - sysLogService.unaudit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysResourceController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysResourceController.java deleted file mode 100644 index e58d02c..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysResourceController.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.arm.equipment.system.admin.controller.system; - -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.data.domain.PageResult; -import com.arm.equipment.system.data.vo.RespJSON; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.domain.system.SysResource; -import com.arm.equipment.system.data.service.system.ISysResourceService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.ArrayList; - -/** - * 系统--权限表 - * - * @author admin - * @date 2021年10月19日 15:06:30 - */ -@RestController -@RequestMapping("/system/sysResource") -public class SysResourceController extends BaseController { - - @Autowired - private ISysResourceService sysResourceService; - - /** - * 保存或更新 - * - * @param sysResourceReq sysResourceReq - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody SysResource sysResourceReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - sysResourceService.save(sysResourceReq, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param sysResourceReq sysResourceReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody SysResource sysResourceReq) { - int count = sysResourceService.getCount(sysResourceReq); - List list = new ArrayList<>(); - if (count > 0) { - list = sysResourceService.getPageList(sysResourceReq); - } - PageResult result = new PageResult(sysResourceReq.getPageNo(), sysResourceReq.getPageSize(), count, list); - return RespJSON.success(result); - } - - /** - * 目录树分页查询 - * - * @param sysResourceReq sysResourceReq - * @return RespJSON - */ - @PostMapping("/getPageTreeList") - public RespJSON getPageTreeList(@RequestBody SysResource sysResourceReq) { - int count = sysResourceService.getCount(sysResourceReq); - List list = new ArrayList<>(); - if (count > 0) { - list = sysResourceService.getPageTreeList(sysResourceReq); - } - PageResult result = new PageResult(sysResourceReq.getPageNo(), sysResourceReq.getPageSize(), count, list); - return RespJSON.success(result); - } - - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @RequestMapping("/getOneById") - public RespJSON getOneById(Long id) { - return RespJSON.success(sysResourceService.getOneById(id)); - } - - - /** - *获取资源树 - * - * @return RespJSON - */ - @RequestMapping("/getResourceTree") - public RespJSON getResourceTree() { - return RespJSON.success(sysResourceService.getResourceTree()); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysRoleController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysRoleController.java deleted file mode 100644 index 7ddbd95..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysRoleController.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.arm.equipment.system.admin.controller.system; - -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.data.domain.PageResult; -import com.arm.equipment.system.data.domain.system.SysRole; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.service.system.ISysRoleService; -import com.arm.equipment.system.data.vo.RespJSON; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.List; - -/** - * 系统--角色表 - * - * @author admin - * @date 2021年10月19日 15:06:47 - */ -@RestController -@RequestMapping("/system/sysRole") -public class SysRoleController extends BaseController { - - @Autowired - private ISysRoleService sysRoleService; - - /** - * 保存或更新 - * - * @param sysRoleReq sysRoleReq - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody SysRole sysRoleReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - sysRoleService.save(sysRoleReq, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param sysRoleReq sysRoleReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody SysRole sysRoleReq) { - sysRoleReq.setStatus(EnumStatus.NEW.getCode()); - int count = sysRoleService.getCount(sysRoleReq); - List list = new ArrayList<>(); - if (count > 0) { - list = sysRoleService.getPageList(sysRoleReq); - } - PageResult result = new PageResult(sysRoleReq.getPageNo(), sysRoleReq.getPageSize(), count, list); - return RespJSON.success(result); - } - - - /** - * 删除角色 - * - * @param id - * @param loginSysUser - * @return - */ - @PostMapping("/delete") - public RespJSON delete(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - sysRoleService.delete(id, loginSysUser.getName()); - return RespJSON.success(); - } - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @RequestMapping("/getOneById") - public RespJSON getOneById(Long id) { - - return RespJSON.success(sysRoleService.getOneById(id)); - } - - /** - * 获取用户角色 - * - * @param loginSysUser - * @return - */ - @PostMapping("/getCurrentUserRole") - public RespJSON getCurrentUserRole(@SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - List sysRoleList = sysRoleService.getCurrentUserRole(loginSysUser.getId()); - return RespJSON.success(sysRoleList); - } - - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysRoleResourceController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysRoleResourceController.java deleted file mode 100644 index 3843b48..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysRoleResourceController.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.arm.equipment.system.admin.controller.system; - -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.service.system.ISysRoleResourceService; -import com.arm.equipment.system.data.vo.RespJSON; -import com.arm.equipment.system.data.vo.system.SysRoleResourceVO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -/** - * 系统-角色权限关联表 - * - * @author admin - * @date 2021年10月19日 15:06:41 - */ -@RestController -@RequestMapping("/system/sysRoleResource") -public class SysRoleResourceController extends BaseController { - - @Autowired - private ISysRoleResourceService sysRoleResourceService; - - /** - * 添加角色按此单 - * @param roleResourceVO - * @param loginSysUser - * @return - */ - @PostMapping("/addResource") - public RespJSON addResource(@RequestBody SysRoleResourceVO roleResourceVO, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - sysRoleResourceService.addResource(roleResourceVO, loginSysUser.getName()); - return RespJSON.success(); - } - - /** - * 根据角色ID查询所拥有菜单权限 - * - * @param roleResourceVO - * @return RespJSON - */ - @PostMapping("/getResourcesIdListByRoleId") - public RespJSON getResourcesIdListByRoleId(@RequestBody SysRoleResourceVO roleResourceVO) { - return RespJSON.success(sysRoleResourceService.getResourcesIdListByRoleId(roleResourceVO.getRoleId())); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysUserController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysUserController.java deleted file mode 100644 index bd04108..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysUserController.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.arm.equipment.system.admin.controller.system; - -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.data.domain.PageResult; -import com.arm.equipment.system.data.domain.system.*; -import com.arm.equipment.system.data.service.system.*; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.vo.RespJSON; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpSession; -import java.util.ArrayList; -import java.util.List; - -/** - * 系统--用户表 - * - * @author admin - * @date 2021年10月19日 15:07:06 - */ -@RestController -@RequestMapping("/system/sysUser") -public class SysUserController extends BaseController { - - @Autowired - private ISysUserService sysUserService; - @Autowired - private ISysRoleService sysRoleService; - @Autowired - private ISysRoleResourceService roleResourceService; - - /** - * 保存或更新 - * - * @param sysUserReq sysUserReq - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody SysUser sysUserReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - sysUserService.save(sysUserReq, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param sysUserReq sysUserReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody SysUser sysUserReq) { - int count = sysUserService.getCount(sysUserReq); - List list = new ArrayList<>(); - if (count > 0) { - list = sysUserService.getPageList(sysUserReq); - } - PageResult result = new PageResult(sysUserReq.getPageNo(), sysUserReq.getPageSize(), count, list); - return RespJSON.success(result); - } - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @RequestMapping("/getOneById") - public RespJSON getOneById(Long id) { - return RespJSON.success(sysUserService.getOneById(id)); - } - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/delete") - public RespJSON delete(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - sysUserService.delete(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - - - /** - * 登陆 - *

- * param username 用户名 - * param password 密码 - * - * @return - */ - @PostMapping("/login") - public RespJSON login(@RequestBody SysUser sysUser, HttpSession webSession) { - SysUser sysUserDB = sysUserService.login(sysUser, webSession); - webSession.setAttribute(CurrentUserUtils.SYSTEM_USER, sysUserDB); - return RespJSON.success(webSession.getId()); - } - - /** - * 注销 - * - * @param webSession - * @return - */ - @PostMapping("/logout") - public RespJSON logout(HttpSession webSession) { - webSession.removeAttribute(CurrentUserUtils.SYSTEM_USER); - return RespJSON.success(); - } - - /** - * 获取当前用户信息 - * - * @param loginSysUser - * @return - */ - @GetMapping("/getCurrentUser") - public RespJSON getCurrentUserAndRole(@SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - List currentUserRole = sysRoleService.getCurrentUserRole(loginSysUser.getId()); - - loginSysUser.setSysRoleList(currentUserRole); - List sysResourceIdentityList = new ArrayList<>(); - List sysResourceList = new ArrayList<>(); - - roleResourceService.buildUserResourceListAndIdentityList(currentUserRole, sysResourceList, sysResourceIdentityList); - if (CollectionUtils.isEmpty(currentUserRole)) { - currentUserRole = new ArrayList<>(); - SysRole sysRole = new SysRole(); - sysRole.setName("首页"); - currentUserRole.add(sysRole); - loginSysUser.setSysRoleList(currentUserRole); - } - loginSysUser.setSysResourceList(sysResourceList); - loginSysUser.setSysResourceIdentityList(sysResourceIdentityList); - return RespJSON.success(loginSysUser); - } - - /** - * 修改密码 - * - * @param oldPassword - * @param newPassword - * @param loginSysUser - * @return - */ - @PostMapping("/updatePassword") - public RespJSON login(String oldPassword, String newPassword, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - WJAssert.isMaxLength(oldPassword, 32, "旧密码错误"); - WJAssert.isMaxLength(newPassword, 32, "新密码错误"); - sysUserService.updatePassword(oldPassword, newPassword, loginSysUser.getId()); - return RespJSON.success(); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysUserRoleController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysUserRoleController.java deleted file mode 100644 index 19ba719..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysUserRoleController.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.arm.equipment.system.admin.controller.system; - -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.data.domain.PageResult; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.domain.system.SysUserRole; -import com.arm.equipment.system.data.service.system.ISysUserRoleService; -import com.arm.equipment.system.data.service.system.ISysUserService; -import com.arm.equipment.system.data.vo.RespJSON; -import com.arm.equipment.system.data.vo.system.AddRoleVO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 系统--用户角色关联表 - * - * @author admin - * @date 2021年10月19日 15:06:59 - */ -@RestController -@RequestMapping("/system/sysUserRole") -public class SysUserRoleController extends BaseController { - - @Autowired - private ISysUserRoleService sysUserRoleService; - @Autowired - private ISysUserService sysUserService; - - - /** - * 保存或更新 - * - * @param sysUserRoleReq sysUserRoleReq - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody SysUserRole sysUserRoleReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - sysUserRoleService.save(sysUserRoleReq, loginSysUser.getOperator()); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param sysUserRoleReq sysUserRoleReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody SysUserRole sysUserRoleReq) { - int count = sysUserRoleService.getCount(sysUserRoleReq); - List list = new ArrayList<>(); - if (count > 0) { - list = sysUserRoleService.getPageList(sysUserRoleReq); - } - PageResult result = new PageResult(sysUserRoleReq.getPageNo(), sysUserRoleReq.getPageSize(), count, list); - return RespJSON.success(result); - } - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @RequestMapping("/getOneById") - public RespJSON getOneById(Long id) { - return RespJSON.success(sysUserRoleService.getOneById(id)); - } - - /** - * 为用户分配角色 - * - * @param addRoleVO - * @param loginSysUser - * @return - */ - @PostMapping("/addRole") - public RespJSON addRole(@RequestBody AddRoleVO addRoleVO, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - sysUserRoleService.addRole(addRoleVO, loginSysUser); - return RespJSON.success(); - } - - /** - * 列表查询 - * - * @param sysUserRoleReq - * @param loginSysUser - * @return - */ - @PostMapping("/getList") - public RespJSON addRole(@RequestBody SysUserRole sysUserRoleReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - List sysUserList = sysUserRoleService.getList(sysUserRoleReq).stream().map(item -> { - return sysUserService.getExitOneById(item.getSysUserId()); - }).collect(Collectors.toList()); - sysUserList.removeAll(Collections.singleton(null)); - return RespJSON.success(sysUserList); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/user/AppUserController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/user/AppUserController.java deleted file mode 100644 index 320b8cd..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/user/AppUserController.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.arm.equipment.system.admin.controller.user; - -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.data.domain.PageResult; -import com.arm.equipment.system.data.vo.RespJSON; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.domain.user.AppUser; -import com.arm.equipment.system.data.service.user.IAppUserService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.ArrayList; - -/** - * APP用户 - * - * @author admin - * @date 2023年03月13日 22:34:47 - */ -@RestController -@RequestMapping("/user/appUser") -public class AppUserController extends BaseController { - - @Autowired - private IAppUserService appUserService; - - /** - * 保存或更新 - * - * @param appUserReq appUserReq - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody AppUser appUserReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - appUserService.save(appUserReq, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param appUserReq appUserReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody AppUser appUserReq) { - int count = appUserService.getCount(appUserReq); - List list = new ArrayList<>(); - if (count > 0) { - list = appUserService.getPageList(appUserReq); - } - PageResult result = new PageResult(appUserReq.getPageNo(), appUserReq.getPageSize(), count, list); - return RespJSON.success(result); - } - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @RequestMapping("/getOneById") - public RespJSON getOneById(Long id) { - return RespJSON.success(appUserService.getOneById(id)); - } - - /** - * 审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/audit") - @ResponseBody - public RespJSON audit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - appUserService.audit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 取消审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/unaudit") - @ResponseBody - public RespJSON unaudit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - appUserService.unaudit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/verifycode/VerifyCodeController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/verifycode/VerifyCodeController.java deleted file mode 100644 index b4e83e4..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/verifycode/VerifyCodeController.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.arm.equipment.system.admin.controller.verifycode; - - -import com.arm.equipment.system.data.service.common.IVerifyCodeService; -import com.arm.equipment.system.data.util.ValidCodeUtil; -import com.arm.equipment.system.data.vo.system.VerifyCodeVO; -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.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -import javax.imageio.ImageIO; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.awt.image.BufferedImage; -import java.io.IOException; - -/** - * @author: admin - * @time: 2022/9/16 14:35 - */ -@RestController -@RequestMapping("/verifycode") -public class VerifyCodeController { - @Autowired - private IVerifyCodeService verifyCodeService; - /** - * 验证码key开头 - */ - public final static String KEY_TOP = "verifyCode_"; - - /** - * 生成验证码图片与存入SESSION - * - * @param response - * @param webSession - * @return - * @throws IOException - */ - @ResponseBody - @GetMapping("/getVerifyCode") - public void getVerifyCode(HttpServletResponse response, HttpSession webSession) throws IOException { - VerifyCodeVO verifyCode = verifyCodeService.generate(80, 28); - String code = verifyCode.getCode(); - webSession.setAttribute(KEY_TOP + code, verifyCode); - response.setContentType(MediaType.IMAGE_JPEG_VALUE); - ServletOutputStream outputStream; - try { - outputStream = response.getOutputStream(); - } catch (IOException e) { - throw new RuntimeException("获得响应流失败"); - } - try { - BufferedImage image = ValidCodeUtil.generateImg(code); - ImageIO.write(image, "png", outputStream); - outputStream.flush(); - outputStream.close(); - } catch (IOException e) { - throw new RuntimeException("验证码输出到流失败"); - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryController.java deleted file mode 100644 index aac9a5c..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryController.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.arm.equipment.system.admin.controller.weaponry; - -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.data.domain.PageResult; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.vo.RespJSON; -import com.arm.equipment.system.data.domain.weaponry.Weaponry; -import com.arm.equipment.system.data.service.weaponry.IWeaponryService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.ArrayList; - -/** - * 装备武器 - * - * @author admin - * @date 2023年03月23日 10:29:48 - */ -@RestController -@RequestMapping("/weaponry/weaponry") -public class WeaponryController extends BaseController { - - @Autowired - private IWeaponryService weaponryService; - - /** - * 保存或更新 - * - * @param weaponryReq weaponryReq - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody Weaponry weaponryReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - weaponryService.save(weaponryReq, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param weaponryReq weaponryReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody Weaponry weaponryReq) { - int count = weaponryService.getCount(weaponryReq); - List list = new ArrayList<>(); - if (count > 0) { - list = weaponryService.getPageList(weaponryReq); - } - PageResult result = new PageResult(weaponryReq.getPageNo(), weaponryReq.getPageSize(), count, list); - return RespJSON.success(result); - } - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @RequestMapping("/getOneById") - public RespJSON getOneById(Long id) { - return RespJSON.success(weaponryService.getOneById(id)); - } - - /** - * 审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/audit") - @ResponseBody - public RespJSON audit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - weaponryService.audit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 取消审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/unaudit") - @ResponseBody - public RespJSON unaudit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - weaponryService.unaudit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryLendRecordController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryLendRecordController.java deleted file mode 100644 index c643cd3..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryLendRecordController.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.arm.equipment.system.admin.controller.weaponry; - -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.data.domain.PageResult; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord; -import com.arm.equipment.system.data.service.weaponry.IWeaponryLendRecordService; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.vo.RespJSON; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.List; - -/** - * 装备武器借出记录 - * - * @author admin - * @date 2023年03月23日 09:20:19 - */ -@RestController -@RequestMapping("/weaponry/weaponryLendRecord") -public class WeaponryLendRecordController extends BaseController { - - @Autowired - private IWeaponryLendRecordService weaponryLendRecordService; - - /** - * 保存或更新 - * - * @param weaponryLendRecordReq weaponryLendRecordReq - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody WeaponryLendRecord weaponryLendRecordReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - weaponryLendRecordService.save(weaponryLendRecordReq, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param weaponryLendRecordReq weaponryLendRecordReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody WeaponryLendRecord weaponryLendRecordReq) { - int count = weaponryLendRecordService.getCount(weaponryLendRecordReq); - List list = new ArrayList<>(); - if (count > 0) { - list = weaponryLendRecordService.getPageList(weaponryLendRecordReq); - } - PageResult result = new PageResult(weaponryLendRecordReq.getPageNo(), weaponryLendRecordReq.getPageSize(), count, list); - return RespJSON.success(result); - } - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @RequestMapping("/getOneById") - public RespJSON getOneById(Long id) { - return RespJSON.success(weaponryLendRecordService.getOneById(id)); - } - - /** - * 拒绝 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/refuse") - @ResponseBody - public RespJSON refuse(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - weaponryLendRecordService.refuse(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 通过 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/adopt") - @ResponseBody - public RespJSON adopt(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - weaponryLendRecordService.adopt(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryReturnRecordController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryReturnRecordController.java deleted file mode 100644 index 5751797..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryReturnRecordController.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.arm.equipment.system.admin.controller.weaponry; - -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.data.domain.PageResult; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.vo.RespJSON; -import com.arm.equipment.system.data.domain.weaponry.WeaponryReturnRecord; -import com.arm.equipment.system.data.service.weaponry.IWeaponryReturnRecordService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.ArrayList; - -/** - * 装备武器归还记录 - * - * @author admin - * @date 2023年03月23日 09:20:25 - */ -@RestController -@RequestMapping("/weaponry/weaponryReturnRecord") -public class WeaponryReturnRecordController extends BaseController { - - @Autowired - private IWeaponryReturnRecordService weaponryReturnRecordService; - - /** - * 保存或更新 - * - * @param weaponryReturnRecordReq weaponryReturnRecordReq - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody WeaponryReturnRecord weaponryReturnRecordReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - weaponryReturnRecordService.save(weaponryReturnRecordReq, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param weaponryReturnRecordReq weaponryReturnRecordReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody WeaponryReturnRecord weaponryReturnRecordReq) { - int count = weaponryReturnRecordService.getCount(weaponryReturnRecordReq); - List list = new ArrayList<>(); - if (count > 0) { - list = weaponryReturnRecordService.getPageList(weaponryReturnRecordReq); - } - PageResult result = new PageResult(weaponryReturnRecordReq.getPageNo(), weaponryReturnRecordReq.getPageSize(), count, list); - return RespJSON.success(result); - } - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @RequestMapping("/getOneById") - public RespJSON getOneById(Long id) { - return RespJSON.success(weaponryReturnRecordService.getOneById(id)); - } - - /** - * 审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/audit") - @ResponseBody - public RespJSON audit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - weaponryReturnRecordService.audit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 取消审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/unaudit") - @ResponseBody - public RespJSON unaudit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - weaponryReturnRecordService.unaudit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/BodyReaderHttpServletRequestWrapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/BodyReaderHttpServletRequestWrapper.java deleted file mode 100644 index 433fba0..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/BodyReaderHttpServletRequestWrapper.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.arm.equipment.system.admin.filter; - -import javax.servlet.ReadListener; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import java.io.*; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - -/** - * request封装 - */ -public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper { - - private final byte[] body; - private String bodyStr; - - public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException { - super(request); - String bodyString = getBodyString(request); - body = bodyString.getBytes(StandardCharsets.UTF_8); - bodyStr = bodyString; - } - - public String getBodyStr() { - return bodyStr; - } - - @Override - public ServletInputStream getInputStream() throws IOException { - final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body); - - return new ServletInputStream() { - @Override - public int read() throws IOException { - return byteArrayInputStream.read(); - } - - @Override - public boolean isFinished() { - return false; - } - - @Override - public boolean isReady() { - return false; - } - - @Override - public void setReadListener(ReadListener readListener) { - } - }; - } - - - public String getBodyString(HttpServletRequest request) throws IOException { - StringBuilder sb = new StringBuilder(); - InputStream inputStream = null; - BufferedReader reader = null; - try { - inputStream = request.getInputStream(); - reader = new BufferedReader( - new InputStreamReader(inputStream, Charset.forName("UTF-8"))); - - char[] bodyCharBuffer = new char[1024]; - int len = 0; - while ((len = reader.read(bodyCharBuffer)) != -1) { - sb.append(new String(bodyCharBuffer, 0, len)); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (inputStream != null) { - try { - inputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return sb.toString(); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/LoginPermissionsFilter.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/LoginPermissionsFilter.java deleted file mode 100644 index 860e332..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/LoginPermissionsFilter.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.arm.equipment.system.admin.filter; - -import com.alibaba.fastjson.JSON; -import com.google.common.base.Throwables; -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.vo.RespJSON; -import com.arm.equipment.system.data.vo.ReturnCode; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.annotation.Order; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.Arrays; -import java.util.List; - -/** - * @author: admin - * @time: 2022/9/16 11:20 - */ -@Order(1001) -@Configuration -public class LoginPermissionsFilter implements HandlerInterceptor { - private final static Logger logger = LoggerFactory.getLogger(LoginPermissionsFilter.class); - @Value("${domain.admin}") - private String adminDomain; - - private static final List IGNORE_URL_LIST = Arrays.asList("/login", "/file/upload", "/common/dict", "/verifycode/getVerifyCode"); - - private final String RETURN_INFO = JSON.toJSONString(RespJSON.returnCode(ReturnCode.NOT_LOGIN_ERROR)); - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - // 将 options 请求放过 - String method = request.getMethod(); - if ("options".equalsIgnoreCase(method)) { - return true; - } - String uri = request.getRequestURI(); - for (String ignoreUrl : IGNORE_URL_LIST) { - if (StringUtils.contains(uri, ignoreUrl)) { - return true; - } - } - SysUser sysUser = (SysUser) request.getSession().getAttribute(CurrentUserUtils.SYSTEM_USER); - if (null != sysUser) { - return true; - } - returnNoLogin(response, request); - return false; - - } - - private void returnNoLogin(HttpServletResponse response, HttpServletRequest request) { - String origin = adminDomain; - String originHeader = request.getHeader("Origin"); - if (StringUtils.isNotEmpty(originHeader)) { - origin = originHeader; - } - response.setCharacterEncoding("UTF-8"); - response.setHeader("Content-Type", "application/json; charset=utf-8"); - response.setHeader("Access-Control-Allow-Credentials", "true"); - response.setHeader("Access-Control-Allow-Origin", origin); - PrintWriter writer = null; - try { - writer = response.getWriter(); - writer.write(RETURN_INFO); - } catch (IOException e) { - logger.error(Throwables.getStackTraceAsString(e)); - } finally { - writer.close(); - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/RequestBodyFilter.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/RequestBodyFilter.java deleted file mode 100644 index de3a12d..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/RequestBodyFilter.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.arm.equipment.system.admin.filter; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import javax.servlet.*; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; - -/** - * 记录用户请求参数 - */ -@Component -@WebFilter(filterName = "httpServletRequestWrapperFilter", urlPatterns = {"/"}) -public class RequestBodyFilter implements Filter { - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - ServletRequest requestWrapper = null; - if (request instanceof HttpServletRequest) { - HttpServletRequest httpRequest = (HttpServletRequest) request; - //遇到post方法才对request进行包装 - String methodType = httpRequest.getMethod(); - String contentType = ((HttpServletRequest) request).getHeader("Content-Type"); - if (StringUtils.isNotEmpty(contentType) && contentType.contains("application/json") && "POST".equals(methodType)) { - requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request); - } - } - if (null == requestWrapper) { - chain.doFilter(request, response); - } else { - chain.doFilter(requestWrapper, response); - - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/SysLogFilter.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/SysLogFilter.java deleted file mode 100644 index 20ceb08..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/SysLogFilter.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.arm.equipment.system.admin.filter; - -import com.alibaba.fastjson.JSONObject; -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.data.domain.system.SysLog; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.enums.dict.EnumSysLogType; -import com.arm.equipment.system.data.service.system.ISysLogService; -import com.arm.equipment.system.data.util.IPUtil; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.annotation.Order; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * 系统日志filter, 记录所有请求 - */ -@Order(1002) -@Configuration -public class SysLogFilter implements HandlerInterceptor { - private final static Logger logger = LoggerFactory.getLogger(SysLogFilter.class); - @Autowired - private ISysLogService sysLogService; - /** - * 50个线程, 无界队列, 超过异常 - */ - private final static ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(50, 50, 120, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.AbortPolicy()); - /** - * 登录路径 - */ - private final static String LOGIN_PATH = "/system/sysUser/login"; - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - THREAD_POOL_EXECUTOR.submit(() -> { - String userAgent = request.getHeader("User-Agent"); - SysLog sysLog = new SysLog(); - sysLog.setType(EnumSysLogType.LOG.getCode()); - // todo 尽量设置访问链接的菜单 - sysLog.setTitle(" "); - sysLog.setRemoteAddr(IPUtil.getRemoteAddress(request)); - - sysLog.setUserAgent(userAgent); - sysLog.setRequestUri(buildUri(request)); - sysLog.setMethod(request.getMethod()); - String requestBody = getRequestBody(((BodyReaderHttpServletRequestWrapper) request).getBodyStr()); - sysLog.setParams(requestBody); - //登录接口日志特殊处理 不显示密码 - if (sysLog.getRequestUri().contains(LOGIN_PATH)) { - JSONObject loginInfoJson = JSONObject.parseObject(requestBody); - loginInfoJson.put("password", ""); - sysLog.setParams(loginInfoJson.toJSONString()); - } - SysUser sysUser = (SysUser) request.getSession().getAttribute(CurrentUserUtils.SYSTEM_USER); - if (null != sysUser) { - sysLogService.save(sysLog, sysUser.getUsername()); - } else { - sysLogService.save(sysLog, "SYSTEM"); - } - }); - return true; - } - - private Map getAllHeader(HttpServletRequest request) { - Enumeration headerNames = request.getHeaderNames(); - Map map = new HashMap<>(); - while (headerNames.hasMoreElements()) { - String key = headerNames.nextElement(); - map.put(key, request.getHeader(key)); - } - return map; - } - - private String getRequestBody(String requestBody) { - if (StringUtils.isEmpty(requestBody)) { - return null; - } - return requestBody; - } - - private String buildUri(HttpServletRequest request) { - String path = request.getRequestURL().toString(); - String query = request.getQueryString(); - if (StringUtils.isEmpty(query)) { - return path; - } - return path + "?" + query; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/util/CurrentUserUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/util/CurrentUserUtils.java deleted file mode 100644 index 07fd4f9..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/util/CurrentUserUtils.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.arm.equipment.system.admin.util; - -/** - * - * - * @author: admin - * @time: 2022/9/16 11:20 - */ -public class CurrentUserUtils { - - public static final String SYSTEM_USER = "system_user"; - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application-dev.yml b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application-dev.yml deleted file mode 100644 index e45c91a..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application-dev.yml +++ /dev/null @@ -1,34 +0,0 @@ -env: dev -spring: - datasource: - url: jdbc:mysql://127.0.0.1:3306/arm-equipment-system?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull - driver-class-name: com.mysql.cj.jdbc.Driver - username: root - password: - type: com.zaxxer.hikari.HikariDataSource - hikari: - auto-commit: true - connection-timeout: 30000 - idle-timeout: 600000 - max-lifetime: 1800000 - minimum-idle: 1 - maximum-pool-size: 10 - pool-name: hikaricp - validation-timeout: 5000 - redis: - host: 127.0.0.1 - port: 6379 - password: - database: 0 - timeout: 5000ms - lettuce: - pool: - max-idle: 100 - min-idle: 1 - max-active: 1000 - web: - resources: - static-locations: file:admin/src/main/resources/static -# 域名配置 -domain: - admin: http://localhost:9527 diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application.yml b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application.yml deleted file mode 100644 index 818c7ac..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application.yml +++ /dev/null @@ -1,25 +0,0 @@ -git: - version: "@git.commit.id.abbrev@" - commitTime: "@git.commit.time@" -server: - port: 18081 - compression: - enabled: true - mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain -spring: - jackson: - serialization: - write-dates-as-timestamps: true - output: - ansi: - enabled: always - webflux: - static-path-pattern: /** - session: - store-type: redis - timeout: 86400 - profiles: - active: dev - servlet: - multipart: - max-file-size: 1024MB diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/logback-spring.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/logback-spring.xml deleted file mode 100644 index eb56ff8..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - ${log.base}.log - - true - 30 - - ${log.base}.%d{yyyy-MM-dd}.log - - - - - %date [%thread] %-5level %logger{80} - %msg%n - - - - - - - - - - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/AdminApplicationTests.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/AdminApplicationTests.java deleted file mode 100644 index 182e469..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/AdminApplicationTests.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.arm.equipment.system.admin; - -import com.arm.equipment.system.admin.app.AdminApplication; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.util.passwordEncoder.BCryptPasswordEncoderUtils; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit.jupiter.SpringExtension; - - -@ExtendWith(SpringExtension.class) -@SpringBootTest(classes = AdminApplication.class) -@ActiveProfiles(profiles = "dev") -public class AdminApplicationTests { - - @Autowired - private BCryptPasswordEncoderUtils bCryptPasswordEncoder; - - @Test - public void test() { - System.out.println(bCryptPasswordEncoder.encode("123123")); - } - - - - @Autowired - IIdWorkerService idWorkerService; - - @Test - public void aa(){ - for (int i = 0; i < 30; i++) { - System.out.println(idWorkerService.getNextId()); - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/SysResourceTests.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/SysResourceTests.java deleted file mode 100644 index 6dbaedc..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/SysResourceTests.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.arm.equipment.system.admin; - -import com.google.common.collect.ImmutableMap; -import com.arm.equipment.system.admin.app.AdminApplication; -import com.arm.equipment.system.data.domain.system.SysResource; -import com.arm.equipment.system.data.service.system.ISysResourceService; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -@ExtendWith(SpringExtension.class) -@SpringBootTest(classes = AdminApplication.class) -@ActiveProfiles(profiles = "dev") -public class SysResourceTests { - @Autowired - private ISysResourceService sysResourceService; - - /** - * 公共按钮map - */ - private final static Map MAP = ImmutableMap.builder() - .put("list", "查询") - .put("add", "添加") - .put("edit", "编辑") - .put("delete", "删除") - .put("audit", "审核") - .put("unAudit", "取消审核") - .put("publish", "发布") - .put("unPublish", "取消发布") - .put("archives", "归档") - .put("unArchives", "取消归档") - .put("setPosition", "调整位置") - .put("exportToExcel", "导出Excel") - .put("recommend", "推荐") - .put("unRecommend", "取消推荐") - .put("used", "标记使用") - .put("clueFee", "线索费") - .put("show", "显示") - .put("unShow", "取消显示") - .put("send", "发放红包") - .put("refuse", "拒绝") - .put("top", "置顶") - .put("unTop", "取消置顶") - .put("handle", "处理") - .put("onShelves", "上架") - .put("offShell", "下架") - .put("push", "推送") - .put("recruit", "招聘管理") - .put("download", "下载简历模板") - .put("recruitmentDeliverInfoList", "查看职位投递信息") - .put("updateStatus", "操作提醒状态") - .put("option", "直播间设置") - .put("startLuckyBag", "直播间开启福袋") - .put("closeLuckyBag", "直播间关闭福袋") - .put("modifyLuckyBag", "直播间修改福袋") - .put("startRedPacket", "直播间开启红包") - .put("modifyRedPacket", "直播间修改红包") - .put("interaction", "直播间互动") - .put("data", "直播间数据") - .put("split", "直播间拆条") - .put("startLive", "直播间开始直播") - .put("stopLive", "直播间结束直播") - .put("modifyLive", "直播间修改直播") - .put("addLine", "直播间新增线路") - .put("breakLine", "直播间断开线路") - .put("restoreLine", "直播间恢复线路") - .put("modifyLine", "直播间修改线路") - .put("deleteLine", "直播间删除线路") - .put("addVote", "直播间添加投票") - .put("modifyVote", "直播间修改投票") - .put("deleteVote", "直播间删除投票") - .put("deleteComment", "直播间删除评论") - .put("cancelTopComment", "直播间取消置顶评论") - .put("topComment", "直播间置顶评论") - .put("addDraw", "直播间创建抽奖") - .put("addCoupon", "直播间创建优惠券") - .put("startCoupon", "直播间开启优惠券") - .put("closeCoupon", "直播间关闭优惠券") - .put("modifyCoupon", "直播间修改优惠券") - .put("updateBrowseMultiple", "浏览倍率") - .put("sliderManage", "轮播管理") - .put("navManage", "导航栏管理") - .put("start", "导播台开启") - .put("stop", "导播台关闭") - .put("detail", "导播台详情") - .put("canPublish", "可发布文章") - .put("sign", "标记") - .build(); - /**父级菜单查询条件 这里是根据路径找到对象 根据需求更换*/ - private final static String URL_WHERE = "/live/liveStudioGiftsList"; - /**按钮标识前缀 根据需求更换*/ - private final static String SUFFIX_IDENTITY = "live_studio_gifts"+"_"; - /**按钮名称前缀 根据需求更换*/ - private final static String SUFFIX_NAME = "直播间礼物"; - /**需要生成的按钮权限 已公共map中的为准 有其他公共权限可以自行添加到map 一般如果存在多个按钮 list按钮权限最好生成 根据需求更换*/ - private final static List COMMON_ROLE = Arrays.asList("list", "add","edit","delete","audit","unAudit"); -// "startRedPacket", "modifyRedPacket", "interaction", "data", "split", "startLive", "stopLive", "modifyLive", -// "addLine", "breakLine", "restoreLine", "modifyLine", "deleteLine", "addVote", "modifyVote", "deleteVote", -// "deleteComment", "cancelTopComment", "topComment", "addDraw", "addCoupon", "startCoupon", "closeCoupon"); - /** - * 公共添加 - */ - @Test - public void commonSave() { - SysResource where = new SysResource(); - where.setUrl(URL_WHERE); - List sysResourcesListDB = sysResourceService.getList(where); - COMMON_ROLE.forEach(item -> { - buildSave(sysResourcesListDB.get(0).getId().toString(), SUFFIX_IDENTITY + item, SUFFIX_NAME + MAP.get(item)); - }); - } - - /** - * 单个添加 - */ -// @Test -// public void save() { -// SysResource where = new SysResource(); -// where.setUrl(URL_WHERE); -// List sysResourcesListDB = sysResourceService.getList(where); -// buildSave(sysResourcesListDB.get(0).getId(), SUFFIX_IDENTITY + "generalize", SUFFIX_NAME + "微兔眼爆料跟踪信息"); -// } - - private void buildSave(String parentId, String identity, String name) { - SysResource req = new SysResource(); - req.setIdentity(identity); - req.setName(name); - req.setParentId(parentId); - req.setType(2); - req.setSort(1); - req.setIsShow(1); - sysResourceService.save(req, "admin"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/pom.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/pom.xml deleted file mode 100644 index bd7bf59..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/pom.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - 4.0.0 - - com.arm.equipment.system - arm-equipment-system-parent - 0.0.1-SNAPSHOT - - api - 0.0.1-SNAPSHOT - api - 接口工程 - - - 1.8 - - - - - com.arm.equipment.system - data - 0.0.1-SNAPSHOT - - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.session - spring-session-data-redis - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - javax.servlet - javax.servlet-api - - - - mysql - mysql-connector-java - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-web - - - - org.apache.commons - commons-lang3 - - - - com.alibaba - fastjson - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - arm-equipment-system-parent-${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/annotation/LoginCheck.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/annotation/LoginCheck.java deleted file mode 100644 index 39ca155..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/annotation/LoginCheck.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.arm.equipment.system.api.annotation; - - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * 判断接口是否必须要登录才能使用 - * @author admin - */ -@Retention(RetentionPolicy.RUNTIME) -public @interface LoginCheck { -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiApplication.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiApplication.java deleted file mode 100644 index b8affdf..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiApplication.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.arm.equipment.system.api.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; -import org.springframework.transaction.annotation.EnableTransactionManagement; -import org.springframework.web.util.IntrospectorCleanupListener; - -/** - * 工程启动配置 - * - * @author admin - */ -@SpringBootApplication -@ComponentScan("com.arm.equipment.system") -@EnableTransactionManagement -@EnableRedisHttpSession -@EnableCaching -public class ApiApplication { - - public static void main(String[] args) { - SpringApplication.run(ApiApplication.class, args); - } - - @Bean - public ServletListenerRegistrationBean introspectorCleanupListener() { - ServletListenerRegistrationBean listenerRegistration = new ServletListenerRegistrationBean(); - listenerRegistration.setListener(new IntrospectorCleanupListener()); - return listenerRegistration; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiCorsConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiCorsConfiguration.java deleted file mode 100644 index 5e68d0c..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiCorsConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.arm.equipment.system.api.app; - - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; - -/** - * CORS配置 - */ -@Configuration -public class ApiCorsConfiguration { - - @Bean - public CorsFilter corsFilter() { - // 添加CORS配置信息 - CorsConfiguration config = new CorsConfiguration(); - // 放行哪些原始域 - config.addAllowedOriginPattern("*"); - // 是否发送Cookie信息 - config.setAllowCredentials(true); - // 放行哪些原始域(请求方式) - config.addAllowedMethod("*"); - // 放行哪些原始域(头部信息) - config.addAllowedHeader("*"); - // 暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息) - // config.addExposedHeader("*"); - - //2.添加映射路径 - UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); - configSource.registerCorsConfiguration("/**", config); - - //3.返回新的CorsFilter. - return new CorsFilter(configSource); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/InterceptorConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/InterceptorConfiguration.java deleted file mode 100644 index 777741b..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/InterceptorConfiguration.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.arm.equipment.system.api.app; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.arm.equipment.system.api.filter.LoginFilter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; - -import java.math.BigInteger; -import java.util.List; - - -/** - * @author: admin - * @time: 2022/9/16 11:20 - */ -@Configuration -public class InterceptorConfiguration extends WebMvcConfigurationSupport { - @Autowired - private LoginFilter loginFilter; - - @Override - protected void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(loginFilter) - .excludePathPatterns("/file/**"); - super.addInterceptors(registry); - } - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - /** - * @Description: 对文件的路径进行配置, 创建一个虚拟路径/Path/** ,即只要在便可以直接引用图片 - *这是图片的物理路径 "file:/+本地图片的地址" - */ - String os = System.getProperty("os.name"); - //Windows操作系统 - String resourcePath = System.getProperty("user.dir"); - if (os != null && os.toLowerCase().startsWith("windows")) { - resourcePath = resourcePath + "\\"; - } else { - resourcePath = resourcePath + "/"; - } - registry.addResourceHandler("/file/**").addResourceLocations("file:" + resourcePath); - super.addResourceHandlers(registry); - } - - @Override - protected void extendMessageConverters(List> converters) { - MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); - ObjectMapper objectMapper = new ObjectMapper(); - /** - * 序列换成json时,将所有的long变成string - * 因为js中得数字类型不能包含所有的java long值 - */ - SimpleModule simpleModule = new SimpleModule(); - simpleModule.addSerializer(Long.class, ToStringSerializer.instance); - simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); - simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance); - - // 反序列化时忽略多余字段 - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - // 注册 - objectMapper.registerModule(simpleModule); - jackson2HttpMessageConverter.setObjectMapper(objectMapper); - converters.add(0, jackson2HttpMessageConverter); - super.extendMessageConverters(converters); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/BaseController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/BaseController.java deleted file mode 100644 index b2aa1f5..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/BaseController.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.arm.equipment.system.api.controller; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; - -/** - * 接口的基础类 - * @author admin - */ -public abstract class BaseController{ - @Autowired - protected RedisTemplate redisTemplate; - protected Logger logger = LoggerFactory.getLogger(this.getClass()); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/ExceptionController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/ExceptionController.java deleted file mode 100644 index a0fc1e3..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/ExceptionController.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.arm.equipment.system.api.controller; - - -import com.alibaba.fastjson.JSON; -import com.arm.equipment.system.data.constant.ConstantValues; -import com.arm.equipment.system.data.exception.AuthException; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.util.EnvUtil; -import com.arm.equipment.system.data.vo.RespJSON; -import com.arm.equipment.system.data.vo.ReturnCode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.QueryTimeoutException; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.validation.BindException; -import org.springframework.validation.FieldError; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import org.springframework.web.server.ServerWebInputException; -import org.springframework.web.server.UnsupportedMediaTypeStatusException; - -import javax.servlet.http.HttpServletRequest; -import java.text.ParseException; - -/** - * 统一异常处理 - * - * @author admin - */ -@ControllerAdvice -public class ExceptionController { - private final static Logger LOGGER = LoggerFactory.getLogger(ExceptionController.class); - @Autowired - private RedisTemplate redisTemplate; - - @ExceptionHandler(value = IllegalArgumentException.class) - @ResponseBody - public RespJSON illegalArgumentException(HttpServletRequest req, Exception e) { - if (EnvUtil.isDev()) { - LOGGER.error("异常", e); - } else { - LOGGER.info("异常: {}", e.getMessage()); - } - logErrDetail(req); - return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, "参数错误: " + e.getMessage()); - } - - @ExceptionHandler(value = MethodArgumentTypeMismatchException.class) - @ResponseBody - public RespJSON methodArgumentTypeMismatchException(HttpServletRequest req, Exception e) { - logErrDetail(req); - String field = ((MethodArgumentTypeMismatchException) e).getName(); - String rejectedValue = ((MethodArgumentTypeMismatchException) e).getValue().toString(); - String message = "参数:" + field + "注入的值不合法:" + rejectedValue; - LOGGER.error("入参错误", e); - return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, message); - } - - @ExceptionHandler(value = BusinessException.class) - @ResponseBody - public RespJSON customException(HttpServletRequest req, BusinessException e) { - if (EnvUtil.isDev()) { - LOGGER.error("自定义异常", e); - } else { - LOGGER.info("自定义异常: {}", e.getMessage()); - } - logErrDetail(req); - return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, e.getMessage()); - } - - @ExceptionHandler(value = AuthException.class) - @ResponseBody - public RespJSON authException(HttpServletRequest req, AuthException e) { - logErrDetail(req); - if (e.getReturnCode() != null) { - return RespJSON.returnCode(e.getReturnCode()); - } else { - return RespJSON.returnCode(ReturnCode.CODE_OK, e.getMessage()); - } - } - - @ExceptionHandler(value = BindException.class) - @ResponseBody - public RespJSON bindException(HttpServletRequest req, Exception e) { - logErrDetail(req); - FieldError fieldError = ((BindException) e).getBindingResult().getFieldError(); - String field = fieldError.getField(); - Object rejectedValue = fieldError.getRejectedValue(); - String message = "参数:" + field + "注入的值不合法:" + rejectedValue; - LOGGER.error("入参错误", e); - return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, message); - } - - @ExceptionHandler(value = ParseException.class) - @ResponseBody - public RespJSON parseException(HttpServletRequest req, Exception e) { - logErrDetail(req); - return RespJSON.returnCode(ReturnCode.PARSE_ERROR); - } - - @ExceptionHandler(value = UnsupportedMediaTypeStatusException.class) - @ResponseBody - public RespJSON unsupportedMediaTypeStatusException(HttpServletRequest req, Exception e) { - logErrDetail(req); - return RespJSON.returnCustomCodeWithMessage(ReturnCode.SYS_ERROR.getCode(), "错误的请求格式"); - } - - @ExceptionHandler(value = ServerWebInputException.class) - @ResponseBody - public RespJSON serverWebInputException(HttpServletRequest req, Exception e) { - logErrDetail(req); - LOGGER.error(e.getMessage(), e); - return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, "请在body中传参"); - } - - @ExceptionHandler(value = QueryTimeoutException.class) - @ResponseBody - public RespJSON queryTimeoutException(HttpServletRequest req, Exception e) { - logErrDetail(req); - LOGGER.error(e.getMessage(), e); - ((LettuceConnectionFactory)redisTemplate.getConnectionFactory()).initConnection(); - LOGGER.info("reset redis connection"); - return RespJSON.returnCode(ReturnCode.SYS_ERROR); - } - - @ExceptionHandler(value = Exception.class) - @ResponseBody - public RespJSON defaultErrorHandler(HttpServletRequest req, Exception e) { - logErrDetail(req); - LOGGER.error(e.getMessage(), e); - return RespJSON.returnCode(ReturnCode.SYS_ERROR); - } - - - /** - * 打印异常参数等信息 - * @param req - */ - private void logErrDetail(HttpServletRequest req) { - LOGGER.error("异常请求: {}", req.getRequestURI()); - LOGGER.error("异常参数: {}", JSON.toJSONString(req.getParameterMap())); - Object requestBody = req.getAttribute(ConstantValues.REQUEST_BODY); - if (null == requestBody) { - requestBody = ""; - } - LOGGER.error("异常参数: {}", requestBody.toString()); - LOGGER.error("异常UA: {}", req.getHeader("user-agent")); - LOGGER.error("异常referer: {}", req.getHeader("referer")); - LOGGER.error("异常Content-Type: {}", req.getHeader("Content-Type")); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/app/SysBaseParamAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/app/SysBaseParamAction.java deleted file mode 100644 index 670867b..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/app/SysBaseParamAction.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.arm.equipment.system.api.controller.app; - -import com.arm.equipment.system.api.controller.BaseController; -import com.arm.equipment.system.data.domain.system.SysBaseParam; -import com.arm.equipment.system.data.service.system.ISysBaseParamService; -import com.arm.equipment.system.data.vo.RespJSON; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 系统--基础参数 - * - * @author: admin - * @time: 2022/9/22 22:03 - */ -@RestController -@RequestMapping("/system/sysBaseParam") -public class SysBaseParamAction extends BaseController { - - @Autowired - private ISysBaseParamService sysBaseParamService; - - /** - * 主键查询 - * - * @param uniCode uniCode - * @return RespJSON - */ - @RequestMapping("/getOneUniCode/{uniCode}") - public RespJSON getOneUniCode(@PathVariable String uniCode) { - SysBaseParam baseParamDB = sysBaseParamService.getOneByUniCode(uniCode); - if (baseParamDB != null) { - //不返回备注 - baseParamDB.setDescription(null); - } - return RespJSON.success(baseParamDB); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/common/UploadAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/common/UploadAction.java deleted file mode 100644 index d7d69a9..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/common/UploadAction.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.arm.equipment.system.api.controller.common; - - -import com.arm.equipment.system.api.controller.BaseController; -import com.arm.equipment.system.data.enums.file.EnumUpload; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.service.file.IFileService; -import com.arm.equipment.system.data.util.StringUtils; -import com.arm.equipment.system.data.vo.RespJSON; -import org.springframework.beans.factory.annotation.Autowired; -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.springframework.web.multipart.MultipartFile; - -/** - * 公共文件上传接口 - * - * @author: xly - * @time: 2023/3/10 10:55 - */ -@RestController -@RequestMapping("/common/file") -public class UploadAction extends BaseController { - @Autowired - private IFileService fileService; - - /** - * 文件上传接口 - * - * @param file - * @return - */ - @PostMapping("/upload") - public RespJSON upload(String uploadItem, @RequestParam("file") MultipartFile file) { - if (null == file) { - throw new BusinessException("文件不合法"); - } - EnumUpload enumUploadItem = EnumUpload.RES_PHOTO_LIB; - if (StringUtils.isNotBlank(uploadItem)) { - enumUploadItem = EnumUpload.getEnum(uploadItem); - } - if (enumUploadItem == null) { - throw new BusinessException("上传文件类目不正确"); - } - try { - return RespJSON.success(fileService.upload(file, enumUploadItem)); - } catch (Exception e) { - logger.error("文件上传错误", e); - throw new BusinessException("文件上传错误"); - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/dict/DictAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/dict/DictAction.java deleted file mode 100644 index e8fe92f..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/dict/DictAction.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.arm.equipment.system.api.controller.dict; - - -import com.arm.equipment.system.data.service.common.IDictService; -import com.arm.equipment.system.data.vo.RespJSON; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 字典接口 - */ -@RestController -@RequestMapping("/common/dict") -public class DictAction { - @Autowired - private IDictService dictService; - - /** - * 统计枚举名称获得枚举的数据 - * - * @param name - * @return - */ - @RequestMapping("/getDictData/{name}") - public RespJSON getDictData(@PathVariable("name") String name) { - return RespJSON.success(dictService.getDictData(name)); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/user/AppUserAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/user/AppUserAction.java deleted file mode 100644 index d6a121e..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/user/AppUserAction.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.arm.equipment.system.api.controller.user; - -import com.arm.equipment.system.api.annotation.LoginCheck; -import com.arm.equipment.system.api.controller.BaseController; -import com.arm.equipment.system.api.util.LoginUtil; -import com.arm.equipment.system.data.constant.RedisKeys; -import com.arm.equipment.system.data.domain.user.AppUser; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.service.user.IAppUserService; -import com.arm.equipment.system.data.vo.RespJSON; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletRequest; -import java.util.Optional; - -/** - * 用户 - * - * @author ousei - * @date 2020年11月4日15:13:16 - */ -@RestController -@RequestMapping("/user/appUser") -public class AppUserAction extends BaseController { - @Autowired - private IAppUserService appUserService; - - @LoginCheck - @PostMapping("/getUserInfo") - public RespJSON getBaseUserInfo(@SessionAttribute(value = LoginUtil.LOGIN_USER_SESSION_KEY, required = false) AppUser loginUser, HttpServletRequest request) { - AppUser appUserDB = Optional.ofNullable(appUserService.getOneById(loginUser.getId())).orElseThrow(() -> new BusinessException("用户不存在")); - LoginUtil.saveInCache(appUserDB, request); - return RespJSON.success(appUserDB); - } - - /** - * 登录 - * * @return - */ - @PostMapping("/login") - public RespJSON login(@RequestBody AppUser appUser, HttpServletRequest request) { - AppUser appUserDB = appUserService.login(appUser); - LoginUtil.saveInCache(appUserDB, request); - return RespJSON.success(appUserDB); - } - - /** - * 注册 - * - * @param req - * @return - */ - @PostMapping("/save") - public RespJSON save(@RequestBody AppUser req) { - appUserService.saveUser(req); - return RespJSON.success(); - } - - /** - * 退出登陆 - * - * @param loginUser - * @return - */ - @LoginCheck - @PostMapping("/logout") - public RespJSON logout(@SessionAttribute(LoginUtil.LOGIN_USER_SESSION_KEY) AppUser loginUser) { - // 删除登陆缓存 - redisTemplate.delete(RedisKeys.getAppUserSessionKey(loginUser.getToken())); - return RespJSON.success(); - } - - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryAction.java deleted file mode 100644 index 5055113..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryAction.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.arm.equipment.system.api.controller.weaponry; - -import com.arm.equipment.system.api.controller.BaseController; -import com.arm.equipment.system.data.domain.weaponry.Weaponry; -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.enums.dict.EnumYesNo; -import com.arm.equipment.system.data.service.weaponry.IWeaponryLendRecordService; -import com.arm.equipment.system.data.service.weaponry.IWeaponryService; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.vo.RespJSON; -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 java.util.List; -import java.util.stream.Collectors; - -/** - * 装备武器 - * - * @author admin - * @date 2023年03月22日 10:39:04 - */ -@RestController -@RequestMapping("/weaponry/weaponry") -public class WeaponryAction extends BaseController { - - @Autowired - private IWeaponryService weaponryService; - @Autowired - private IWeaponryLendRecordService weaponryLendRecordService; - - /** - * 分页查询 - * - * @param weaponryReq weaponryReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody Weaponry weaponryReq) { - WJAssert.notNull(weaponryReq.getPageNo(), "参数非法"); - WJAssert.notNull(weaponryReq.getPageSize(), "参数非法"); - weaponryReq.setStatus(EnumStatus.AUDIT.getCode()); - List list = weaponryService.getPageList(weaponryReq) - .parallelStream() - .peek(item -> { - item.setIsLend(EnumYesNo.NO.getCode()); - //判断是否已借出 - int count = weaponryLendRecordService.getCountByWeaponryId(item.getId()); - if (count > 0) { - item.setIsLend(EnumYesNo.YES.getCode()); - } - }).collect(Collectors.toList()); - - return RespJSON.success(list); - } - - /** - * 武器预警定位列表(查询借出数量大于1的武器列表) - * - * @param weaponryReq weaponryReq - * @return RespJSON - */ - @PostMapping("/getLocationWarningPageList") - public RespJSON getLocationWarningPageList(@RequestBody Weaponry weaponryReq) { - WJAssert.notNull(weaponryReq.getPageNo(), "参数非法"); - WJAssert.notNull(weaponryReq.getPageSize(), "参数非法"); - weaponryReq.setStatus(EnumStatus.AUDIT.getCode()); - weaponryReq.setLockInventoryStart(1); - List list = weaponryService.getPageList(weaponryReq); - return RespJSON.success(list); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryLendRecordAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryLendRecordAction.java deleted file mode 100644 index 96bb4f6..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryLendRecordAction.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.arm.equipment.system.api.controller.weaponry; - - -import com.arm.equipment.system.api.controller.BaseController; -import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord; -import com.arm.equipment.system.data.enums.dict.EnumWeaponryLendRecordStatus; -import com.arm.equipment.system.data.service.weaponry.IWeaponryLendRecordService; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.vo.RespJSON; -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 java.util.List; - -/** - * 装备武器借出表 - * - * @author admin - * @date 2023年03月22日 10:57:51 - */ -@RestController -@RequestMapping("/weaponry/weaponryLend") -public class WeaponryLendRecordAction extends BaseController { - - @Autowired - private IWeaponryLendRecordService weaponryLendRecordService; - - /** - * 保存或更新 - * - * @param weaponryLendRecord weaponryLendRecord - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody WeaponryLendRecord weaponryLendRecord) { - weaponryLendRecordService.saveLend(weaponryLendRecord); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param weaponryLendReq weaponryLendReq - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody WeaponryLendRecord weaponryLendReq) { - WJAssert.notNull(weaponryLendReq.getPageNo(), "参数非法"); - WJAssert.notNull(weaponryLendReq.getPageSize(), "参数非法"); - weaponryLendReq.setStatus(EnumWeaponryLendRecordStatus.ADOPT.getCode()); - List pageList = weaponryLendRecordService.getPageList(weaponryLendReq); - return RespJSON.success(pageList); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryReturnRecordAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryReturnRecordAction.java deleted file mode 100644 index ad402c6..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryReturnRecordAction.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.arm.equipment.system.api.controller.weaponry; - -import com.arm.equipment.system.api.controller.BaseController; -import com.arm.equipment.system.data.service.weaponry.IWeaponryReturnRecordService; -import com.arm.equipment.system.data.vo.RespJSON; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -/** - * 装备武器归还日志 - * - * @author admin - * @date 2023年03月22日 10:42:24 - */ -@RestController -@RequestMapping("/weaponry/weaponryReturnRecord") -public class WeaponryReturnRecordAction extends BaseController { - - @Autowired - private IWeaponryReturnRecordService weaponryReturnRecordService; - - /** - * 保存归还 - * - * @param lendRecordId - * @return - */ - @GetMapping("/save") - public RespJSON save( Long lendRecordId) { - weaponryReturnRecordService.saveReturn(lendRecordId); - return RespJSON.success(); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/BodyReaderHttpServletRequestWrapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/BodyReaderHttpServletRequestWrapper.java deleted file mode 100644 index fa32531..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/BodyReaderHttpServletRequestWrapper.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.arm.equipment.system.api.filter; - -import javax.servlet.ReadListener; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import java.io.*; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - -/** - * request封装 - */ -public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper { - - private final byte[] body; - private String bodyStr; - - public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException { - super(request); - String bodyString = getBodyString(request); - body = bodyString.getBytes(StandardCharsets.UTF_8); - bodyStr = bodyString; - } - - public String getBodyStr() { - return bodyStr; - } - - @Override - public ServletInputStream getInputStream() throws IOException { - final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body); - - return new ServletInputStream() { - @Override - public int read() throws IOException { - return byteArrayInputStream.read(); - } - - @Override - public boolean isFinished() { - return false; - } - - @Override - public boolean isReady() { - return false; - } - - @Override - public void setReadListener(ReadListener readListener) { - } - }; - } - - - public String getBodyString(HttpServletRequest request) throws IOException { - StringBuilder sb = new StringBuilder(); - InputStream inputStream = null; - BufferedReader reader = null; - try { - inputStream = request.getInputStream(); - reader = new BufferedReader( - new InputStreamReader(inputStream, Charset.forName("UTF-8"))); - - char[] bodyCharBuffer = new char[1024]; - int len = 0; - while ((len = reader.read(bodyCharBuffer)) != -1) { - sb.append(new String(bodyCharBuffer, 0, len)); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (inputStream != null) { - try { - inputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return sb.toString(); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/LoginFilter.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/LoginFilter.java deleted file mode 100644 index 1238d50..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/LoginFilter.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.arm.equipment.system.api.filter; - -import com.alibaba.fastjson.JSON; -import com.arm.equipment.system.api.annotation.LoginCheck; -import com.arm.equipment.system.api.util.LoginUtil; -import com.google.common.base.Throwables; -import com.arm.equipment.system.data.domain.user.AppUser; -import com.arm.equipment.system.data.util.StringUtils; -import com.arm.equipment.system.data.vo.RespJSON; -import com.arm.equipment.system.data.vo.ReturnCode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.annotation.Order; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * 登录过滤器 - * 用于将登录信息放到session中 - **/ -@Order(1004) -@Configuration -public class LoginFilter implements HandlerInterceptor { - private final static Logger logger = LoggerFactory.getLogger(LoginFilter.class); - private final String NO_LOGIN_RETURN_INFO = JSON.toJSONString(RespJSON.returnCode(ReturnCode.NOT_LOGIN_ERROR)); - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - // 将 options 请求放过 - String method = request.getMethod(); - if ("options".equalsIgnoreCase(method)) { - return true; - } - HandlerMethod handlerMethod = (HandlerMethod) handler; - LoginCheck loginCheckAnnotation = handlerMethod.getMethodAnnotation(LoginCheck.class); - String userTokenHeader = request.getHeader("User-Token"); - AppUser loginUser; - // 不需要登录的接口直接放过 - if (null == loginCheckAnnotation) { - if (StringUtils.isEmpty(userTokenHeader)) { - return true; - } - // 没有获取到用户信息 直接报错 - loginUser = LoginUtil.getLoginUser(userTokenHeader); - - } else { - // 请求头没有token 直接报错 - if (StringUtils.isEmpty(userTokenHeader)) { - returnNoLogin(response); - return false; - } - // 没有获取到用户信息 直接报错 - loginUser = LoginUtil.getLoginUser(userTokenHeader); - if (null == loginUser) { - returnNoLogin(response); - return false; - } - } - - // 用户信息保存到session - AppUser finalLoginUser = loginUser; - HttpSession session = request.getSession(); - session.setAttribute(LoginUtil.LOGIN_USER_SESSION_KEY, finalLoginUser); - return true; - } - - /** - * 未登录时的返回内容 - * - * @param response - * @return - */ - private void returnNoLogin(HttpServletResponse response) { - response.setCharacterEncoding("UTF-8"); - response.setHeader("Content-Type", "application/json; charset=utf-8"); - PrintWriter writer = null; - try { - writer = response.getWriter(); - writer.write(NO_LOGIN_RETURN_INFO); - } catch (IOException e) { - logger.error(Throwables.getStackTraceAsString(e)); - } finally { - writer.close(); - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/RequestBodyFilter.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/RequestBodyFilter.java deleted file mode 100644 index 4469a39..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/RequestBodyFilter.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.arm.equipment.system.api.filter; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import javax.servlet.*; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; - -/** - * 记录用户请求参数 - */ -@Component -@WebFilter(filterName = "httpServletRequestWrapperFilter", urlPatterns = {"/"}) -public class RequestBodyFilter implements Filter { - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - ServletRequest requestWrapper = null; - if (request instanceof HttpServletRequest) { - HttpServletRequest httpRequest = (HttpServletRequest) request; - //遇到post方法才对request进行包装 - String methodType = httpRequest.getMethod(); - String contentType = ((HttpServletRequest) request).getHeader("Content-Type"); - if (StringUtils.isNotEmpty(contentType) && contentType.contains("application/json") && "POST".equals(methodType)) { - requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request); - } - } - if (null == requestWrapper) { - chain.doFilter(request, response); - } else { - chain.doFilter(requestWrapper, response); - - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/util/LoginUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/util/LoginUtil.java deleted file mode 100644 index 9e735cf..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/util/LoginUtil.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.arm.equipment.system.api.util; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.arm.equipment.system.data.constant.RedisKeys; -import com.arm.equipment.system.data.domain.user.AppUser; -import com.arm.equipment.system.data.util.UuidUtils; -import com.arm.equipment.system.data.util.WJAssert; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -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.SetOperations; -import org.springframework.data.redis.core.ValueOperations; -import org.springframework.stereotype.Component; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import java.util.Set; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * 登录用户的工具类 - */ -@Component -public class LoginUtil { - private final static Logger logger = LoggerFactory.getLogger(LoginUtil.class); - private static RedisTemplate redisTemplate; - private static ValueOperations valueOps; - /** - * 登录用户在session中的key - */ - public static final String LOGIN_USER_SESSION_KEY = "appUserSessionKey"; - /** - * 50个线程, 无界队列, 超过异常 - */ - private final static ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(50, 50, 120, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.AbortPolicy()); - - public static AppUser getLoginUser(String token) { - WJAssert.isMaxLength(token, 500, "token非法"); - String key = RedisKeys.getAppUserSessionKey(token); - String s = valueOps.get(key); - if (StringUtils.isEmpty(s)) { - return null; - } - return JSONObject.parseObject(s, AppUser.class); - } - - /** - * 用户登录状态保存到redis - * 不会重新设置token - * - * @param appUser - * @param request - * @return - */ - public static AppUser refreshCache(AppUser appUser, HttpServletRequest request) { - String key = RedisKeys.getAppUserSessionKey(appUser.getToken()); - valueOps.set(key, JSON.toJSONString(appUser), 1, TimeUnit.DAYS); - HttpSession session = request.getSession(); - if (null == session) { - logger.info("session 是空的"); - return null; - } - session.setAttribute(LoginUtil.LOGIN_USER_SESSION_KEY, appUser); - return appUser; - } - - /** - * 用户登录状态保存到redis - * 会重新设置token - * - * @param appUser - * @param request - * @return - */ - public static AppUser saveInCache(AppUser appUser, HttpServletRequest request) { - appUser.setToken(UuidUtils.uuid()); - refreshCache(appUser, request); - // 保存token和用户的关系, 是个 set - String appUsernameByTokenSetKey = RedisKeys.getAppUsernameByTokenSetKey(appUser.getUsername()); - SetOperations setOps = redisTemplate.opsForSet(); - setOps.add(appUsernameByTokenSetKey, appUser.getToken()); - // 清除set中的过期token, 避免set过大 - clearUserTokenSet(appUsernameByTokenSetKey); - return appUser; - } - - /** - * 清除用户的登录token set避免过大 - * - * @param appUsernameByTokenSetKey - */ - private static void clearUserTokenSet(String appUsernameByTokenSetKey) { - THREAD_POOL_EXECUTOR.submit(() -> { - SetOperations setOps = redisTemplate.opsForSet(); - Set tokenSet = setOps.members(appUsernameByTokenSetKey); - if (CollectionUtils.isEmpty(tokenSet)) { - return; - } - tokenSet.forEach(token -> { - String appUserSessionKey = RedisKeys.getAppUserSessionKey(token); - Long expire = redisTemplate.getExpire(appUserSessionKey); - if (null == expire || expire < 0) { - logger.info("删除过期key {}", token); - setOps.remove(appUsernameByTokenSetKey, token); - } - }); - }); - } - - @Autowired - public void setRedisTemplate(RedisTemplate redisTemplate) { - LoginUtil.redisTemplate = redisTemplate; - LoginUtil.valueOps = redisTemplate.opsForValue(); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/RefreshTokenVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/RefreshTokenVO.java deleted file mode 100644 index 6927787..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/RefreshTokenVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.arm.equipment.system.api.vo.user; - -public class RefreshTokenVO { - /** 手机号 */ - private String data; - /** 平台 */ - private Integer platform; - - public Integer getPlatform() { - return platform; - } - - public void setPlatform(Integer platform) { - this.platform = platform; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UpdateUserVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UpdateUserVO.java deleted file mode 100644 index a08d651..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UpdateUserVO.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.arm.equipment.system.api.vo.user; - -import java.util.Date; - -/** - * - * 编辑用户信息VO - * @author: xly - * @time: 2022/9/19 12:00 - */ -public class UpdateUserVO { - /** 生日 */ - private Date birthday; - /** 昵称 */ - private String nickname; - /** 性别 1 男 2 女 */ - private Integer genderCode; - /** 所在地址 */ - private String address; - /** 学历 */ - private String education; - /**头像 */ - private String avatarPath; - - public String getAvatarPath() { - return avatarPath; - } - - public void setAvatarPath(String avatarPath) { - this.avatarPath = avatarPath; - } - - public Date getBirthday() { - return birthday; - } - - public void setBirthday(Date birthday) { - this.birthday = birthday; - } - - public String getNickname() { - return nickname; - } - - public void setNickname(String nickname) { - this.nickname = nickname; - } - - public Integer getGenderCode() { - return genderCode; - } - - public void setGenderCode(Integer genderCode) { - this.genderCode = genderCode; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public String getEducation() { - return education; - } - - public void setEducation(String education) { - this.education = education; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserCenterVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserCenterVO.java deleted file mode 100644 index cada3fb..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserCenterVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.arm.equipment.system.api.vo.user; - -/** - * 用户中心VO - * @author: xly - * @time: 2021/11/19 17:41 - */ -public class UserCenterVO { - /** - * 用户ID - */ - private String userId; - /** - * 由于微兔眼小程序只统计爆料评论的总数 所以这里由此类型 - * 请求类型 type (0 智能农机云 1 微兔眼小程序) - */ - private Integer type; - - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserLoginVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserLoginVO.java deleted file mode 100644 index 3226038..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserLoginVO.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.arm.equipment.system.api.vo.user; - -/** - * 用户登录信息VO - * - * @author ousei - * @date 2020年11月4日15:17:48 - */ -public class UserLoginVO { - /** 手机号 */ - private String username; - /** 验证码 */ - private String verifyCode; - /** 设备TOKEN */ - private String deviceToken; - /** unionid */ - private String unionid; - /** 登录的类型 */ - private Integer loginType; - /**用户密码*/ - private String password; - /**平台*/ - private Integer platform; - /**邀请码*/ - private String invcode; - /**微信code**/ - private String code; - /**一键登录手机号token*/ - private String usernameToken; - - public String getUsernameToken() { - return usernameToken; - } - - public void setUsernameToken(String usernameToken) { - this.usernameToken = usernameToken; - } - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public Integer getPlatform() { - return platform; - } - - public void setPlatform(Integer platform) { - this.platform = platform; - } - - public String getInvcode() { - return invcode; - } - - public void setInvcode(String invcode) { - this.invcode = invcode; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public Integer getLoginType() { - return loginType; - } - - public void setLoginType(Integer loginType) { - this.loginType = loginType; - } - - public String getUnionid() { - return unionid; - } - - public void setUnionid(String unionid) { - this.unionid = unionid; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getVerifyCode() { - return verifyCode; - } - - public void setVerifyCode(String verifyCode) { - this.verifyCode = verifyCode; - } - - public String getDeviceToken() { - return deviceToken; - } - - public void setDeviceToken(String deviceToken) { - this.deviceToken = deviceToken; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application-dev.yml b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application-dev.yml deleted file mode 100644 index 30a52df..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application-dev.yml +++ /dev/null @@ -1,31 +0,0 @@ -env: dev -spring: - datasource: - url: jdbc:mysql://127.0.0.1:3306/arm-equipment-system?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull - driver-class-name: com.mysql.cj.jdbc.Driver - username: root - password: - type: com.zaxxer.hikari.HikariDataSource - hikari: - auto-commit: true - connection-timeout: 30000 - idle-timeout: 600000 - max-lifetime: 1800000 - minimum-idle: 1 - maximum-pool-size: 10 - pool-name: hikaricp - validation-timeout: 5000 - redis: - host: 127.0.0.1 - port: 6379 - password: - database: 0 - timeout: 5000ms - lettuce: - pool: - max-idle: 100 - min-idle: 1 - max-active: 1000 - web: - resources: - static-locations: file:admin/src/main/resources/static diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application.yml b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application.yml deleted file mode 100644 index d80075d..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application.yml +++ /dev/null @@ -1,21 +0,0 @@ -git: - version: "@git.commit.id.abbrev@" - commitTime: "@git.commit.time@" -server: - port: 8088 - compression: - enabled: true - mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain -spring: - jackson: - serialization: - write-dates-as-timestamps: true - output: - ansi: - enabled: always - webflux: - static-path-pattern: /** - session: - store-type: redis - profiles: - active: dev diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/logback-spring.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/logback-spring.xml deleted file mode 100644 index c0898d6..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - ${log.base}.log - - true - 30 - - ${log.base}.%d{yyyy-MM-dd}.log - - - - - %date [%thread] %-5level %logger{80} - %msg%n - - - - - - - - - - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/test/java/com/arm/equipment/system/api/ApiApplicationTests.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/test/java/com/arm/equipment/system/api/ApiApplicationTests.java deleted file mode 100644 index 83c2b60..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/test/java/com/arm/equipment/system/api/ApiApplicationTests.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.arm.equipment.system.api; - -import com.arm.equipment.system.api.app.ApiApplication; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -@ExtendWith(SpringExtension.class) -@SpringBootTest(classes = ApiApplication.class) -@ActiveProfiles(profiles = "dev") -public class ApiApplicationTests { - private final static Logger LOGGER = LoggerFactory.getLogger(ApiApplicationTests.class); - - @Test - public void test() { - - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/pom.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/pom.xml deleted file mode 100644 index ac9ec02..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/pom.xml +++ /dev/null @@ -1,141 +0,0 @@ - - - 4.0.0 - - com.arm.equipment.system - arm-equipment-system-parent - 0.0.1-SNAPSHOT - - data - 0.0.1-SNAPSHOT - data - 业务公共项目 - - - - org.springframework.boot - spring-boot-starter-web - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-aop - - - - mysql - mysql-connector-java - - - - org.apache.commons - commons-lang3 - - - - com.alibaba - fastjson - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.springframework.boot - spring-boot-starter - - - - org.apache.commons - commons-pool2 - - - - org.bouncycastle - bcprov-jdk16 - 1.46 - - - - - org.apache.velocity - velocity - 1.7 - test - - - - org.springframework.boot - spring-boot-starter-test - test - - - com.alibaba - easyexcel - - - commons-logging - commons-logging - - - 1.1.1 - - - org.apache.httpcomponents - httpmime - 4.5.2 - - - - javax.validation - validation-api - 2.0.1.Final - - - org.hibernate - hibernate-validator - 5.2.0.Final - - - commons-lang - commons-lang - 2.6 - - - - org.jsoup - jsoup - 1.13.1 - - - - com.belerweb - pinyin4j - 2.5.0 - - - javax.servlet - javax.servlet-api - 4.0.1 - - - - com.google.zxing - javase - 3.0.0 - - - com.google.guava - guava - 16.0.1 - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/AsyncConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/AsyncConfiguration.java deleted file mode 100644 index d2c62c0..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/AsyncConfiguration.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.arm.equipment.system.data.app; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; - -/** - * spring异步配置 - * @author admin - */ -@Configuration -@EnableAsync -public class AsyncConfiguration { - - @Bean - public Executor threadPoolTaskExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(1); - executor.setMaxPoolSize(100); - executor.setQueueCapacity(1000); - executor.setThreadNamePrefix("thread-pool-"); - executor.setKeepAliveSeconds(120); - executor.setDaemon(true); - executor.setWaitForTasksToCompleteOnShutdown(true); - executor.setAwaitTerminationSeconds(90); - // CALLER_RUNS:当抛出RejectedExecutionException异常时,会调rejectedExecution方法 调用者运行策略实现了一种调节机制, - // 该策略既不会抛弃任务也不会爆出异常,而是将任务退回给调用者,从而降低新任务的流量 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - executor.initialize(); - return executor; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/BCryptConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/BCryptConfiguration.java deleted file mode 100644 index ffec75c..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/BCryptConfiguration.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.arm.equipment.system.data.app; - -import com.arm.equipment.system.data.util.passwordEncoder.BCryptPasswordEncoderUtils; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * - * - * @author: admin - * @time: 2022/9/16 11:20 - */ -@Configuration -public class BCryptConfiguration { - - /** - * BCrypt密码校验 - * - * @return - */ - @Bean - public BCryptPasswordEncoderUtils bCryptPasswordEncoder() { - return new BCryptPasswordEncoderUtils(5, null); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/DataApplication.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/DataApplication.java deleted file mode 100644 index d0db0e7..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/DataApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.arm.equipment.system.data.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@SpringBootApplication -@EnableTransactionManagement -@ComponentScan("com.arm.equipment.system") -public class DataApplication { - - public static void main(String[] args) { - SpringApplication.run(DataApplication.class, args); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/MyBatisConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/MyBatisConfiguration.java deleted file mode 100644 index 07f11c2..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/MyBatisConfiguration.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.arm.equipment.system.data.app; - -import com.arm.equipment.system.data.exception.BusinessException; -import com.zaxxer.hikari.HikariDataSource; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.ibatis.mapping.VendorDatabaseIdProvider; -import org.apache.ibatis.session.SqlSessionFactory; -import org.mybatis.spring.SqlSessionFactoryBean; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.jdbc.datasource.DataSourceTransactionManager; - -/** - * mybatis配置 - * @author admin - */ -@MapperScan("com.arm.equipment.system.data.mapper") -@Configuration -public class MyBatisConfiguration { - - @Bean(name = "sessionFactory") - public SqlSessionFactory sessionFactory(HikariDataSource dataSource) { - SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); - bean.setDataSource(dataSource); - bean.setDatabaseIdProvider(new VendorDatabaseIdProvider()); - bean.setTypeHandlersPackage("com.arm.equipment.system.data.mybatis.type"); - - //添加XML目录 - ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); - try { - //设置xml扫描路径 - Resource[] baseMapperResource = resolver.getResources("classpath*:/mybatis/base-mapper.xml"); - Resource[] resources = resolver.getResources("classpath*:/mybatis/**/*.xml"); - bean.setMapperLocations(ArrayUtils.addAll(resources, resources)); - return bean.getObject(); - } catch (Exception e) { - throw new BusinessException("sessionFactory init fail",e); - } - } - - /** - * 配置事务管理器 - */ - @Bean(name = "transactionManager") - public DataSourceTransactionManager transactionManager(HikariDataSource dataSource) { - return new DataSourceTransactionManager(dataSource); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RedisConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RedisConfiguration.java deleted file mode 100644 index 418e6a7..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RedisConfiguration.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.arm.equipment.system.data.app; - -import com.arm.equipment.system.data.constant.RedisKeys; -import org.apache.commons.pool2.impl.GenericObjectPoolConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.data.redis.RedisProperties; -import org.springframework.boot.context.event.ApplicationStartedEvent; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.context.Lifecycle; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.context.event.ContextClosedEvent; -import org.springframework.data.redis.cache.RedisCacheConfiguration; -import org.springframework.data.redis.cache.RedisCacheManager; -import org.springframework.data.redis.cache.RedisCacheWriter; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.connection.RedisStandaloneConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; -import org.springframework.data.redis.connection.stream.MapRecord; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.RedisSerializationContext; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; -import org.springframework.data.redis.stream.StreamMessageListenerContainer; - -import java.time.Duration; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * redis 配置 - * - * @author admin - */ -@Configuration -public class RedisConfiguration implements ApplicationListener { - @Autowired - private RedisProperties redisProperties; - /** - * 100个线程, 无界队列, 超过异常 - */ - private final static ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(100, 100, 120, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.AbortPolicy()); - - /** - * lettuce对象连接池 - * - * @return - */ - @Bean - public LettuceConnectionFactory lettuceConnectionFactory() { - RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(); - configuration.setHostName(redisProperties.getHost()); - configuration.setDatabase(redisProperties.getDatabase()); - configuration.setPort(redisProperties.getPort()); - configuration.setPassword(redisProperties.getPassword()); - //连接池配置 - GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); - RedisProperties.Pool pool = redisProperties.getLettuce().getPool(); - poolConfig.setMaxIdle(20); - poolConfig.setMinIdle(1); - poolConfig.setMaxTotal(100); - poolConfig.setMaxWaitMillis(3000); - poolConfig.setTimeBetweenEvictionRunsMillis(20000); - poolConfig.setTestWhileIdle(true); - LettucePoolingClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder() - .commandTimeout(Duration.ofSeconds(10)) - .poolConfig(poolConfig).build(); - return new LettuceConnectionFactory(configuration, clientConfiguration); - } - - @Bean - public RedisTemplate getTemplate(@Qualifier(value = "redisTemplate") RedisTemplate template) { - template.setConnectionFactory(lettuceConnectionFactory()); - template.setDefaultSerializer(new StringRedisSerializer()); - template.setKeySerializer(new StringRedisSerializer()); - template.setValueSerializer(new StringRedisSerializer()); - template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer()); - template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); - return template; - } - - /** - * 缓存管理器 - * 1.默认缓存为1天 - * - * @return - */ - @Bean - @Primary - public RedisCacheManager cacheManager() { - RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(lettuceConnectionFactory()); - GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); - RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() - .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string())) - .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)) - .entryTtl(Duration.ofDays(1)); - RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisCacheWriter) - .cacheDefaults(redisCacheConfiguration) - .withInitialCacheConfigurations(getRedisCacheConfigurationMap()).build(); - return redisCacheManager; - } - - /** - * 为指定 key 设置过期时间 - * - * @return - */ - private Map getRedisCacheConfigurationMap() { - Map redisCacheConfigurationMap = new HashMap<>(); - redisCacheConfigurationMap.put(RedisKeys.WECHAT_ACCESS_TOKEN, getRedisCacheConfigurationWithTtl(600)); - // 直播间统计ID集合 默认保存七天 - return redisCacheConfigurationMap; - } - - private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) { - GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); - return RedisCacheConfiguration.defaultCacheConfig() - .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string())) - .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)) - .computePrefixWith(name -> name + ":").entryTtl(Duration.ofSeconds(seconds)); - } - - - /** - * 流监听容器, 这里只是创建, 需要在下面启动 - * - * @param redisConnectionFactory - * @return - */ - @Bean - public StreamMessageListenerContainer> streamMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) { - // 创建配置对象 - StreamMessageListenerContainer.StreamMessageListenerContainerOptions> listenerContainerOptions = StreamMessageListenerContainer.StreamMessageListenerContainerOptions - .builder() - // 一次性最多拉取多少条消息 - .batchSize(100) - .executor(THREAD_POOL_EXECUTOR) - .build(); - // 根据配置对象创建监听容器 - - StreamMessageListenerContainer> listenerContainer = StreamMessageListenerContainer.create(redisConnectionFactory, listenerContainerOptions); - return listenerContainer; - } - - /** - * 1.spring启动后启动redis监听容器 - * 2.spring结束后关闭redis监听容器 - * - * @param applicationEvent - */ - @Override - public void onApplicationEvent(ApplicationEvent applicationEvent) { - if (applicationEvent instanceof ApplicationStartedEvent) { - // 启动redis stream 监听 - ((ApplicationStartedEvent) applicationEvent).getApplicationContext() - .getBeanProvider(StreamMessageListenerContainer.class) - .ifAvailable(Lifecycle::start); - } - if (applicationEvent instanceof ContextClosedEvent) { - // 启动redis stream 监听 - ((ContextClosedEvent) applicationEvent).getApplicationContext() - .getBeanProvider(StreamMessageListenerContainer.class) - .ifAvailable(Lifecycle::stop); - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RestTemplateConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RestTemplateConfiguration.java deleted file mode 100644 index 3a1d53a..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RestTemplateConfiguration.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.arm.equipment.system.data.app; - -import com.alibaba.fastjson.serializer.SerializerFeature; -import com.alibaba.fastjson.support.config.FastJsonConfig; -import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.SimpleClientHttpRequestFactory; -import org.springframework.http.converter.FormHttpMessageConverter; -import org.springframework.http.converter.StringHttpMessageConverter; -import org.springframework.web.client.RestTemplate; - -import java.util.ArrayList; -import java.util.List; - -@Configuration -public class RestTemplateConfiguration { - @Bean(name = "restTemplate") - public RestTemplate getRestTemplate() { - List messageConverters = new ArrayList<>(); - messageConverters.add(new FormHttpMessageConverter()); - messageConverters.add(getFastJsonHttpMessageConverter()); - messageConverters.add(new StringHttpMessageConverter()); - RestTemplate restTemplate = new RestTemplate(getHttpRequestFactory()); - restTemplate.setMessageConverters(messageConverters); - return restTemplate; - } - - private FastJsonHttpMessageConverter getFastJsonHttpMessageConverter() { - FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); - fastJsonHttpMessageConverter.setFastJsonConfig(getFastJsonConfig()); - return fastJsonHttpMessageConverter; - } - - private FastJsonConfig getFastJsonConfig() { - FastJsonConfig fastJsonConfig = new FastJsonConfig(); - fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteDateUseDateFormat); - return fastJsonConfig; - } - - private SimpleClientHttpRequestFactory getHttpRequestFactory() { - SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); - simpleClientHttpRequestFactory.setConnectTimeout(120000); - simpleClientHttpRequestFactory.setReadTimeout(120000); - return simpleClientHttpRequestFactory; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/ConstantValues.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/ConstantValues.java deleted file mode 100644 index c822b04..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/ConstantValues.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.arm.equipment.system.data.constant; - -import java.util.Arrays; -import java.util.List; - -/** - * 全局变量存放处 - * @author wyd - */ -public class ConstantValues { - /** request请求中的参数 */ - public final static String REQUEST_BODY = "WJ-Request-Body"; -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/RedisKeys.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/RedisKeys.java deleted file mode 100644 index 09d6080..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/RedisKeys.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.arm.equipment.system.data.constant; - -/** - * redisKey集合 - */ -public class RedisKeys { - public final static String SYS_BASE_PARAM_KEY = "sysBaseParamKey"; - /** * 微信accesstoken*/ - public final static String WECHAT_ACCESS_TOKEN = "wechatAccessToken"; - /*** id worker service中的worker id*/ - public static final String SNOW_FLAKE_WORKER_ID = "snow:flake_worker:id"; - /**系统用户登陆错误次数*/ - public static final String SYS_USER_LOGIN_ERROR_NUM = "sys:user:login:error:num:%s"; - /** - * token和用户的对应关系 - *

- * 数据结构: SET - * - * @param token - * @return - */ - public static String getAppUsernameByTokenSetKey(String token) { - return String.format("app:user:token:%s", token); - } - - public static String getAppUserSessionKey(String token) { - return String.format("app:user:session:%s", token); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BaseDomain.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BaseDomain.java deleted file mode 100644 index f6d2bb7..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BaseDomain.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.arm.equipment.system.data.domain; - -import java.util.Date; - -/** - * 数据库实体基类 - * @author admin - */ -public class BaseDomain extends BasePage { - /** 主键 */ - private Long id; - /** 创建时间 */ - private Date createTime; - /** 更新时间 */ - private Date updateTime; - /** 更新时间结束 */ - private Date updateTimeEnd; - /** 操作人*/ - private String operator; - /** 备注 */ - private String remark; - - public String getOperator() { - return operator; - } - - public void setOperator(String operator) { - this.operator = operator; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Date getCreateTime() { return createTime; } - - public void setCreateTime(Date createTime) { this.createTime = createTime; } - - public Date getUpdateTime() { return updateTime; } - - public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } - - public Date getUpdateTimeEnd() { return updateTimeEnd; } - - public void setUpdateTimeEnd(Date updateTimeEnd) { this.updateTimeEnd = updateTimeEnd; } - - public String getRemark() { return remark; } - - public void setRemark(String remark) { this.remark = remark; } - - @Override - public String toString() { - return "BaseDomain{" + - "id=" + id + - ", createTime=" + createTime + - ", updateTime=" + updateTime + - ", updateTimeEnd=" + updateTimeEnd + - ", remark='" + remark + '\'' + - '}'; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BasePage.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BasePage.java deleted file mode 100644 index 8b4ff6c..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BasePage.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.arm.equipment.system.data.domain; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.Serializable; - -/** - * 每个对象都需要继承的类, 用于分页 - * @author admin - */ -public class BasePage implements Serializable { - private static final Logger LOGGER = LoggerFactory.getLogger(BasePage.class); - private static final long serialVersionUID = -320995871886379593L; - /** 页码 */ - private Integer pageNo; - /** 每页大小 */ - private Integer pageSize; - - public Integer getPageNo() { - return pageNo; - } - - public void setPageNo(Integer pageNo) { - this.pageNo = pageNo; - } - - public Integer getPageSize() { - //最大限制为5000 - if (null != pageSize && pageSize > 5000) { - LOGGER.warn(" pageSize 过大!!!pageSize={}", pageSize); - return 5000; - } - return pageSize; - } - - public void setPageSize(Integer pageSize) { - this.pageSize = pageSize; - } - - @JsonIgnore - public Integer getStartIndex() { - if (pageNo == null || pageSize == null) { - return null; - } - return (this.pageNo - 1) * this.pageSize; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/PageResult.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/PageResult.java deleted file mode 100644 index f3f5281..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/PageResult.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.arm.equipment.system.data.domain; - -import java.util.Collection; - -/** - * @author admin - */ -public class PageResult { - /** 页数 */ - private int pageNo; - /** 总页数 */ - private int pageCount; - /** 总条数 */ - private int total; - /** 数据 */ - private Collection rows; - /** 页大小 */ - private int pageSize; - - public PageResult() { - } - - public PageResult(int pageNo, int pageSize, int total, Collection rows) { - this.pageNo = pageNo; - this.total = total; - this.rows = rows; - this.pageSize = pageSize; - this.pageCount = calcPageCount(total); - - } - - private int calcPageCount(int count) { - if (pageSize == 0) { - return 0; - } - if (count % pageSize == 0) { - return count / pageSize; - } else { - return count / pageSize + 1; - - } - } - - public static int getPageCount(int count, int pageSize) { - if (pageSize == 0) { - return 0; - } - if (count % pageSize == 0) { - return count / pageSize; - } else { - return count / pageSize + 1; - } - } - - public int getPageSize() { - return pageSize; - } - - public void setPageSize(int pageSize) { - this.pageSize = pageSize; - } - - public int getPageNo() { - return pageNo; - } - - public void setPageNo(int pageNo) { - this.pageNo = pageNo; - } - - public int getPageCount() { - return pageCount; - } - - public void setPageCount(int pageCount) { - this.pageCount = pageCount; - } - - public int getTotal() { - return total; - } - - public void setTotal(int total) { - this.total = total; - } - - public Collection getRows() { - return rows; - } - - public void setRows(Collection rows) { - this.rows = rows; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysBaseParam.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysBaseParam.java deleted file mode 100644 index ecbe306..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysBaseParam.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.arm.equipment.system.data.domain.system; - -import com.arm.equipment.system.data.domain.BaseDomain; - -/** - * 系统--基础参数 - * - * @author Administrator - * @date 2021年10月26日 16:36:52 - */ -public class SysBaseParam extends BaseDomain { - /** 唯一编码 */ - private String uniCode; - /** 值 */ - private String value; - /** 描述 */ - private String description; - /** 操作人 */ - private String operator; - /** 数据状态 */ - private Integer status; - - public String getUniCode() { - return uniCode; - } - - public void setUniCode(String uniCode) { - this.uniCode = uniCode; - } - - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - - public String getOperator() { - return operator; - } - - public void setOperator(String operator) { - this.operator = operator; - } - - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysLog.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysLog.java deleted file mode 100644 index 0b34c59..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysLog.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.arm.equipment.system.data.domain.system; - -import com.arm.equipment.system.data.domain.BaseDomain; - -/** - * 日志表 - * - * @author admin - * @date 2022年09月16日 12:41:35 - */ -public class SysLog extends BaseDomain { - /** 日志类型(1:接入日志;2:错误日志) */ - private Integer type; - /** 日志标题 */ - private String title; - /** 操作IP地址 */ - private String remoteAddr; - /** 用户代理 */ - private String userAgent; - /** 请求URI */ - private String requestUri; - /** 操作方式 */ - private String method; - /** 操作提交的数据 */ - private String params; - /** 异常信息 */ - private String exception; - /** 状态 */ - private Integer status; - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - - public String getRemoteAddr() { - return remoteAddr; - } - - public void setRemoteAddr(String remoteAddr) { - this.remoteAddr = remoteAddr; - } - - - public String getUserAgent() { - return userAgent; - } - - public void setUserAgent(String userAgent) { - this.userAgent = userAgent; - } - - - public String getRequestUri() { - return requestUri; - } - - public void setRequestUri(String requestUri) { - this.requestUri = requestUri; - } - - - public String getMethod() { - return method; - } - - public void setMethod(String method) { - this.method = method; - } - - - public String getParams() { - return params; - } - - public void setParams(String params) { - this.params = params; - } - - - public String getException() { - return exception; - } - - public void setException(String exception) { - this.exception = exception; - } - - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysResource.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysResource.java deleted file mode 100644 index 3bcb845..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysResource.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.arm.equipment.system.data.domain.system; - -import com.arm.equipment.system.data.domain.BaseDomain; - -import java.util.List; - -/** - * 系统--权限表 - * - * @author admin - * @date 2021年10月20日 08:59:10 - */ -public class SysResource extends BaseDomain { - /** 菜单名称 */ - private String name; - /** 链接地址 */ - private String url; - /** 父菜单ID */ - private String parentId; - /** 图标 */ - private String icon; - /** 排序 */ - private Integer sort; - /** 菜单类型 */ - private Integer type; - /** 权限标识 */ - private String identity; - /** 是否显示 */ - private Integer isShow; - /** 状态 */ - private Integer status; - /** 操作人 */ - private String operator; - /** 根路径,用.分隔 */ - private String rootPath; - - /********VO******/ - /**子集集合*/ - private List children; - /**标签*/ - private String label; - /**ID集合*/ - private List idsList; - - public List getIdsList() { - return idsList; - } - - public void setIdsList(List idsList) { - this.idsList = idsList; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - - public String getParentId() { - return parentId; - } - - public void setParentId(String parentId) { - this.parentId = parentId; - } - - - public String getIcon() { - return icon; - } - - public void setIcon(String icon) { - this.icon = icon; - } - - - public Integer getSort() { - return sort; - } - - public void setSort(Integer sort) { - this.sort = sort; - } - - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - - public String getIdentity() { - return identity; - } - - public void setIdentity(String identity) { - this.identity = identity; - } - - - public Integer getIsShow() { - return isShow; - } - - public void setIsShow(Integer isShow) { - this.isShow = isShow; - } - - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - - public String getOperator() { - return operator; - } - - public void setOperator(String operator) { - this.operator = operator; - } - - - public String getRootPath() { - return rootPath; - } - - public void setRootPath(String rootPath) { - this.rootPath = rootPath; - } - - public List getChildren() { - return children; - } - - public void setChildren(List children) { - this.children = children; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRole.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRole.java deleted file mode 100644 index 19a89f1..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRole.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.arm.equipment.system.data.domain.system; - -import com.arm.equipment.system.data.domain.BaseDomain; - -import java.util.List; - -/** - * 系统--角色表 - * - * @author admin - * @date 2021年10月19日 15:06:47 - */ -public class SysRole extends BaseDomain { - /** 角色名称 */ - private String name; - /** 描述 */ - private String description; - /** 状态 */ - private Integer status; - /** 操作人 */ - private String operator; - - /****** VO ***/ - /**角色ID集合*/ - private List sysRoleIdList; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - - public String getOperator() { - return operator; - } - - public void setOperator(String operator) { - this.operator = operator; - } - - public List getSysRoleIdList() { - return sysRoleIdList; - } - - public void setSysRoleIdList(List sysRoleIdList) { - this.sysRoleIdList = sysRoleIdList; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRoleResource.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRoleResource.java deleted file mode 100644 index 8648703..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRoleResource.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.arm.equipment.system.data.domain.system; - -import com.arm.equipment.system.data.domain.BaseDomain; - -import java.util.List; - -/** - * 系统-角色权限关联表 - * - * @author admin - * @date 2021年10月19日 15:06:41 - */ -public class SysRoleResource extends BaseDomain { - /** 角色ID */ - private Long sysRoleId; - /** 权限ID */ - private Long sysResourceId; - /** 状态 */ - private Integer status; - /** 操作人 */ - private String operator; - - /****** VO ***/ - /**添加新权限(修改权限)*/ - private List newResources; - - public List getNewResources() { - return newResources; - } - - public void setNewResources(List newResources) { - this.newResources = newResources; - } - - public Long getSysRoleId() { - return sysRoleId; - } - - public void setSysRoleId(Long sysRoleId) { - this.sysRoleId = sysRoleId; - } - - - public Long getSysResourceId() { - return sysResourceId; - } - - public void setSysResourceId(Long sysResourceId) { - this.sysResourceId = sysResourceId; - } - - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - - public String getOperator() { - return operator; - } - - public void setOperator(String operator) { - this.operator = operator; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUser.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUser.java deleted file mode 100644 index 7bcc362..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUser.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.arm.equipment.system.data.domain.system; - -import com.arm.equipment.system.data.domain.BaseDomain; - -import java.util.List; - -/** - * 系统--用户表 - * - * @author admin - * @date 2021年10月19日 15:07:06 - */ -public class SysUser extends BaseDomain { - /** 用户名 */ - private String username; - /** 密码 */ - private String password; - /** 手机 */ - private String phone; - /** 姓名 */ - private String name; - /** 邮箱 */ - private String email; - /** - * 用户标签 - * @see - * */ - private String tag; - /** 状态 */ - private Integer status; - /**是否需要二次登陆*/ - private Integer isSecondLanding; - - /******VO****/ - /** - * 验证码 - */ - private String verifyCode; - /** - * 角色信息 - */ - private List sysRoleList; - /** - * 用户菜单标识信息 - */ - private List sysResourceIdentityList; - /** - * 用户菜单列表 - */ - private List sysResourceList; - /**标签集合*/ - private List tagList; - /**二次登陆验证码*/ - private String twoVerifyCode; - - public String getTwoVerifyCode() { - return twoVerifyCode; - } - - public void setTwoVerifyCode(String twoVerifyCode) { - this.twoVerifyCode = twoVerifyCode; - } - - public Integer getIsSecondLanding() { - return isSecondLanding; - } - - public void setIsSecondLanding(Integer isSecondLanding) { - this.isSecondLanding = isSecondLanding; - } - - public List getTagList() { - return tagList; - } - - public void setTagList(List tagList) { - this.tagList = tagList; - } - - public String getVerifyCode() { - return verifyCode; - } - - public void setVerifyCode(String verifyCode) { - this.verifyCode = verifyCode; - } - - 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 getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public List getSysRoleList() { - return sysRoleList; - } - - public void setSysRoleList(List sysRoleList) { - this.sysRoleList = sysRoleList; - } - - public List getSysResourceIdentityList() { - return sysResourceIdentityList; - } - - public void setSysResourceIdentityList(List sysResourceIdentityList) { - this.sysResourceIdentityList = sysResourceIdentityList; - } - - public List getSysResourceList() { - return sysResourceList; - } - - public void setSysResourceList(List sysResourceList) { - this.sysResourceList = sysResourceList; - } - - public String getTag() { - return tag; - } - - public void setTag(String tag) { - this.tag = tag; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUserRole.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUserRole.java deleted file mode 100644 index 55de1e3..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUserRole.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.arm.equipment.system.data.domain.system; - -import com.arm.equipment.system.data.domain.BaseDomain; - -/** - * 系统--用户角色关联表 - * - * @author admin - * @date 2021年10月19日 15:06:59 - */ -public class SysUserRole extends BaseDomain { - /** 角色ID */ - private Long sysRoleId; - /** 用户ID */ - private Long sysUserId; - /** 状态 */ - private Integer status; - /** 执行者 */ - private String operator; - - public Long getSysRoleId() { - return sysRoleId; - } - - public void setSysRoleId(Long sysRoleId) { - this.sysRoleId = sysRoleId; - } - - - public Long getSysUserId() { - return sysUserId; - } - - public void setSysUserId(Long sysUserId) { - this.sysUserId = sysUserId; - } - - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - - public String getOperator() { - return operator; - } - - public void setOperator(String operator) { - this.operator = operator; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/user/AppUser.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/user/AppUser.java deleted file mode 100644 index 796f65d..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/user/AppUser.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.arm.equipment.system.data.domain.user; - -import com.arm.equipment.system.data.domain.BaseDomain; - -import java.util.Date; - -/** - * APP用户 - * - * @author admin - * @date 2023年03月13日 22:34:47 - */ -public class AppUser extends BaseDomain { - /** 用户昵称 */ - private String nickname; - /** 登录账号 */ - private String username; - /** 密码 */ - private String password; - /** 手机号 */ - private String phone; - /** 数据状态 */ - private Integer status; - /** 登录时间 */ - private Date loginTime; - - private String token; - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - public String getNickname() { - return nickname; - } - - public void setNickname(String nickname) { - this.nickname = nickname; - } - - - 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 getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - - public Date getLoginTime() { - return loginTime; - } - - public void setLoginTime(Date loginTime) { - this.loginTime = loginTime; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/Weaponry.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/Weaponry.java deleted file mode 100644 index c763cf8..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/Weaponry.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.arm.equipment.system.data.domain.weaponry; - -import com.arm.equipment.system.data.domain.BaseDomain; - -import java.util.Date; - -/** - * 装备武器 - * - * @author admin - * @date 2023年03月23日 10:29:48 - */ -public class Weaponry extends BaseDomain { - /** 武器名称 */ - private String name; - /** 武器封面 */ - private String imgPath; - /** 弹夹容量(发) */ - private Integer cartridgeCapacity; - /** 子弹口径(mm) */ - private Double bulletCaliber; - /** 有效射程 */ - private Integer effectiveRange; - /** 总库存 */ - private Integer totalInventory; - /** 锁定库存 */ - private Integer lockInventory; - /** 数据状态 */ - private Integer status; - - /**VO*/ - /**是否已借出*/ - private Integer isLend; - /**锁定数起始值*/ - private Integer lockInventoryStart; - - public Integer getLockInventoryStart() { - return lockInventoryStart; - } - - public void setLockInventoryStart(Integer lockInventoryStart) { - this.lockInventoryStart = lockInventoryStart; - } - - public Integer getIsLend() { - return isLend; - } - - public void setIsLend(Integer isLend) { - this.isLend = isLend; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - - public String getImgPath() { - return imgPath; - } - - public void setImgPath(String imgPath) { - this.imgPath = imgPath; - } - - - public Integer getCartridgeCapacity() { - return cartridgeCapacity; - } - - public void setCartridgeCapacity(Integer cartridgeCapacity) { - this.cartridgeCapacity = cartridgeCapacity; - } - - - public Double getBulletCaliber() { - return bulletCaliber; - } - - public void setBulletCaliber(Double bulletCaliber) { - this.bulletCaliber = bulletCaliber; - } - - - public Integer getEffectiveRange() { - return effectiveRange; - } - - public void setEffectiveRange(Integer effectiveRange) { - this.effectiveRange = effectiveRange; - } - - - public Integer getTotalInventory() { - return totalInventory; - } - - public void setTotalInventory(Integer totalInventory) { - this.totalInventory = totalInventory; - } - - - public Integer getLockInventory() { - return lockInventory; - } - - public void setLockInventory(Integer lockInventory) { - this.lockInventory = lockInventory; - } - - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryLendRecord.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryLendRecord.java deleted file mode 100644 index e6f3686..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryLendRecord.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.arm.equipment.system.data.domain.weaponry; - -import com.arm.equipment.system.data.domain.BaseDomain; - -import java.util.Date; - -/** - * 装备武器借出记录 - * - * @author admin - * @date 2023年03月23日 11:02:17 - */ -public class WeaponryLendRecord extends BaseDomain { - /** 武器ID */ - private Long weaponryId; - /** 武器名称 */ - private String weaponryName; - /** 借出数量 */ - private Integer num; - /** 归还时间 */ - private Date returnTime; - /** 归还状态(0未归还 1已归还) */ - private Integer returnStatus; - /** 数据状态 */ - private Integer status; - - /****************VO**************/ - private Weaponry weaponry; - - public Weaponry getWeaponry() { - return weaponry; - } - - public void setWeaponry(Weaponry weaponry) { - this.weaponry = weaponry; - } - - - public Long getWeaponryId() { - return weaponryId; - } - - public void setWeaponryId(Long weaponryId) { - this.weaponryId = weaponryId; - } - - - public String getWeaponryName() { - return weaponryName; - } - - public void setWeaponryName(String weaponryName) { - this.weaponryName = weaponryName; - } - - - public Integer getNum() { - return num; - } - - public void setNum(Integer num) { - this.num = num; - } - - - public Date getReturnTime() { - return returnTime; - } - - public void setReturnTime(Date returnTime) { - this.returnTime = returnTime; - } - - - public Integer getReturnStatus() { - return returnStatus; - } - - public void setReturnStatus(Integer returnStatus) { - this.returnStatus = returnStatus; - } - - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryReturnRecord.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryReturnRecord.java deleted file mode 100644 index 836ee51..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryReturnRecord.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.arm.equipment.system.data.domain.weaponry; - -import com.arm.equipment.system.data.domain.BaseDomain; - -import java.util.Date; - -/** - * 装备武器归还记录 - * - * @author admin - * @date 2023年03月23日 11:03:25 - */ -public class WeaponryReturnRecord extends BaseDomain { - /** 武器ID */ - private Long weaponryId; - /** 武器名称 */ - private String weaponryName; - /** 记录ID */ - private Long lendRecordId; - /** 借出数量 */ - private Integer num; - /** 归还时间 */ - private Date returnTime; - /** 数据状态 */ - private Integer status; - - /****************VO**************/ - private Weaponry weaponry; - - public Weaponry getWeaponry() { - return weaponry; - } - - public void setWeaponry(Weaponry weaponry) { - this.weaponry = weaponry; - } - - public Long getWeaponryId() { - return weaponryId; - } - - public void setWeaponryId(Long weaponryId) { - this.weaponryId = weaponryId; - } - - - public String getWeaponryName() { - return weaponryName; - } - - public void setWeaponryName(String weaponryName) { - this.weaponryName = weaponryName; - } - - - public Long getLendRecordId() { - return lendRecordId; - } - - public void setLendRecordId(Long lendRecordId) { - this.lendRecordId = lendRecordId; - } - - - public Integer getNum() { - return num; - } - - public void setNum(Integer num) { - this.num = num; - } - - - public Date getReturnTime() { - return returnTime; - } - - public void setReturnTime(Date returnTime) { - this.returnTime = returnTime; - } - - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumFileResourceType.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumFileResourceType.java deleted file mode 100644 index 275323a..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumFileResourceType.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.arm.equipment.system.data.enums.dict; - -/*** - * - * 资源文件类型 - * @author: admin - * @time: 2021/11/17 17:35 - */ -public enum EnumFileResourceType { - /** */ - IMG(1, "图片"), - VIDEO(2, "视频"), - ; - - private Integer code; - private String text; - - EnumFileResourceType(Integer code, String text) { - this.code = code; - this.text = text; - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - }} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumGender.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumGender.java deleted file mode 100644 index 0e7570b..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumGender.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.arm.equipment.system.data.enums.dict; - -import com.arm.equipment.system.data.exception.BusinessException; - -/** - * 数据状态枚举 - * @author admin - */ -public enum EnumGender { - /** 审核 */ - MALE(1, "男"), - - /** The release. */ - FEMALE(2, "女"), - ; - - private Integer code; - private String text; - - EnumGender(Integer code, String text) { - this.code = code; - this.text = text; - } - - public static EnumGender getByCode(Integer code) { - if (null == code) { - return null; - } - for (EnumGender type : EnumGender.values()) { - if (type.getCode().equals(code)) { - return type; - } - } - throw new BusinessException("内容类型非法"); - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - }} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSortType.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSortType.java deleted file mode 100644 index 9be4db9..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSortType.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.arm.equipment.system.data.enums.dict; - -/** - * 排序类型 - * - * @author: xly - * @time: 2022/9/16 18:30 - */ -public enum EnumSortType { - ASC(1, "升序"), - DESC(2, "降序"), - ; - - private Integer code; - private String text; - - EnumSortType(Integer code, String text) { - this.code = code; - this.text = text; - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - - public static EnumSortType getByCode(Integer code) { - if (code == null) { - return null; - } - EnumSortType[] values = EnumSortType.values(); - for (EnumSortType v : values) { - if (v.getCode().equals(code)) { - return v; - } - } - return null; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumStatus.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumStatus.java deleted file mode 100644 index 908b4fe..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumStatus.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.arm.equipment.system.data.enums.dict; - -/** - * 数据状态枚举 - * - * @author admin - */ -public enum EnumStatus { - /** - * The new. - */ - NEW(0, "新增"), - - AUDIT(1, "已审核"), - - DEL(-9, "已删除"); - - private Integer code; - private String text; - EnumStatus(Integer code, String text) { - this.code = code; - this.text = text; - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - /** - * 通过code获得该枚举类型 - * - * @param code - * @return - */ - public static EnumStatus getByCode(Integer code) { - EnumStatus[] values = EnumStatus.values(); - for (EnumStatus type : values) { - if (type.code.equals(code)) { - return type; - } - } - return NEW; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysLogType.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysLogType.java deleted file mode 100644 index b0d5028..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysLogType.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.arm.equipment.system.data.enums.dict; - -/** - * 数据状态枚举 - * - * @author admin - */ -public enum EnumSysLogType { - /** - * The new. - */ - LOG(1, "普通日志"), - - EXCEPTION_LOG(2, "异常日志"), - ; - - private Integer code; - private String text; - - EnumSysLogType(Integer code, String text) { - this.code = code; - this.text = text; - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - /** - * 通过code获得该枚举类型 - * - * @param code - * @return - */ - public static EnumSysLogType getByCode(Integer code) { - EnumSysLogType[] values = EnumSysLogType.values(); - for (EnumSysLogType type : values) { - if (type.code.equals(code)) { - return type; - } - } - return null; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysResourceType.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysResourceType.java deleted file mode 100644 index 34163d6..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysResourceType.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.arm.equipment.system.data.enums.dict; - -/** - * 系统资源菜单类型 - * - * @author: admin - * @time: 2021/10/19 18:02 - */ -public enum EnumSysResourceType { - /** - * - */ - CATALOGUE(0, "目录"), - MENU(1, "菜单"), - BUTTON(2, "按钮"), - ; - - private Integer code; - private String text; - - EnumSysResourceType(Integer code, String text) { - this.code = code; - this.text = text; - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordReturnStatus.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordReturnStatus.java deleted file mode 100644 index 27b650b..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordReturnStatus.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.arm.equipment.system.data.enums.dict; - -/** - * @author: xly - * @time: 2023/3/23 9:02 - */ -public enum EnumWeaponryLendRecordReturnStatus { - NOT_RETURN(0, "未归还"), - RETURN(1, "已经归还"), - ; - private Integer code; - private String text; - - EnumWeaponryLendRecordReturnStatus(Integer code, String text) { - this.code = code; - this.text = text; - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - /** - * 通过code获得该枚举类型 - * - * @param code - * @return - */ - public static EnumSysLogType getByCode(Integer code) { - EnumSysLogType[] values = EnumSysLogType.values(); - for (EnumSysLogType type : values) { - if (type.getCode().equals(code)) { - return type; - } - } - return null; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordStatus.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordStatus.java deleted file mode 100644 index 1155c62..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordStatus.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.arm.equipment.system.data.enums.dict; - -/** - * @author: xly - * @time: 2023/3/23 9:02 - */ -public enum EnumWeaponryLendRecordStatus { - NEW(0, "新增"), - ADOPT(1, "通过"), - REFUSE(2, "拒绝"), - ; - private Integer code; - private String text; - - EnumWeaponryLendRecordStatus(Integer code, String text) { - this.code = code; - this.text = text; - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - /** - * 通过code获得该枚举类型 - * - * @param code - * @return - */ - public static EnumSysLogType getByCode(Integer code) { - EnumSysLogType[] values = EnumSysLogType.values(); - for (EnumSysLogType type : values) { - if (type.getCode().equals(code)) { - return type; - } - } - return null; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumYesNo.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumYesNo.java deleted file mode 100644 index aed2617..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumYesNo.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.arm.equipment.system.data.enums.dict; - -/** - * yes no枚举 - * @author admin - */ -public enum EnumYesNo { - /** */ - NO(0, "否"), - - YES(1, "是") - ; - - private Integer code; - private String text; - - EnumYesNo(Integer code, String text) { - this.code = code; - this.text = text; - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - }} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/file/EnumUpload.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/file/EnumUpload.java deleted file mode 100644 index adf03f4..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/file/EnumUpload.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.arm.equipment.system.data.enums.file; - -import org.apache.commons.lang3.StringUtils; - -/** - * 上传枚举,写名每个上传的作用 - * 1.规定文件夹 - * 2.规定后缀,避免任意文件上传 - * - * @author admin - */ -public enum EnumUpload { - RES_PHOTO_LIB("resPhotoLib", "jpg", "上传图片"), - RES_VIDEO_LIB("resVideoLib", "mp4", "上传视频"), - QR_CODE("qrCode", "jpg", "二维码"), - ; - - EnumUpload(String baseDir, String suffix, String desc) { - this.baseDir = baseDir; - this.suffix = suffix; - this.desc = desc; - } - - /** - * 上传具体业务目录,只允许为英文数字,不允许重复 - * 业务名称,请参考业务表名称也定义 - */ - String baseDir; - /** - * 文件类型,比如jpg,png,txt,apk等等 - */ - String suffix; - /** - * 功能描述说明 - */ - String desc; - - public static EnumUpload getEnum(String baseDir) { - if (StringUtils.isEmpty(baseDir)) { - return null; - } - for (EnumUpload type : EnumUpload.values()) { - if (type.getBaseDir().equals(baseDir)) { - return type; - } - } - return null; - } - - public String getBaseDir() { - return baseDir; - } - - public void setBaseDir(String baseDir) { - this.baseDir = baseDir; - } - - public String getSuffix() { - return suffix; - } - - public void setSuffix(String suffix) { - this.suffix = suffix; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/AuthException.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/AuthException.java deleted file mode 100644 index fd5141f..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/AuthException.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.arm.equipment.system.data.exception; - -import com.arm.equipment.system.data.vo.ReturnCode; - -/** - * @author 向帅 用户登录异常 - * @Date 2019/7/27 17:11 - **/ -public class AuthException extends RuntimeException { - - private static final long serialVersionUID = -7429924842303522242L; - - String message; - - ReturnCode returnCode; - - public AuthException() { - super(); - } - - public AuthException(String message) { - this.message = message; - } - - public AuthException(ReturnCode returnCode) { - this.returnCode = returnCode; - } - - public AuthException(String message, ReturnCode returnCode) { - this.message = message; - this.returnCode = returnCode; - } - - public AuthException(String message, Throwable cause) { - super(message, cause); - } - - public AuthException(Throwable cause) { - super(cause); - } - - protected AuthException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } - - @Override - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public ReturnCode getReturnCode() { - return returnCode; - } - - public void setReturnCode(ReturnCode returnCode) { - this.returnCode = returnCode; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/BusinessException.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/BusinessException.java deleted file mode 100644 index 9943531..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/BusinessException.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.arm.equipment.system.data.exception; - -/** - * 自定义异常,service中业务异常使用这个 - */ -public class BusinessException extends RuntimeException { - - - private static final long serialVersionUID = -6053475656376646723L; - - Integer errorCode; - - String message; - - public BusinessException(String message) { - this.message = message; - } - - public BusinessException(Integer errorCode, String message) { - this.errorCode = errorCode; - this.message = message; - } - - public BusinessException(Throwable cause) { - super(cause); - } - - public BusinessException(String message, Throwable cause) { - super(message, cause); - } - - public Integer getErrorCode() { - return errorCode; - } - - public void setErrorCode(Integer errorCode) { - this.errorCode = errorCode; - } - - @Override - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysBaseParamMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysBaseParamMapper.java deleted file mode 100644 index 749c3ce..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysBaseParamMapper.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.arm.equipment.system.data.mapper.system; - -import com.arm.equipment.system.data.domain.system.SysBaseParam; - -import java.util.List; - -/** - * 系统--基础参数 - * - * @author Administrator - * @date 2021年10月26日 16:36:52 - */ -public interface ISysBaseParamMapper { - - /** - * 插入 - * - * @param sysBaseParam sysBaseParam - * @return int - */ - int insertSelective(SysBaseParam sysBaseParam); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective(SysBaseParam setParam, SysBaseParam whereParam); - - /** - * 数量 - * - * @param sysBaseParam sysBaseParam - * @return int - */ - int getCount(SysBaseParam sysBaseParam); - - /** - * 单条 - * - * @param sysBaseParam sysBaseParam - * @return SysBaseParam - */ - SysBaseParam getOne(SysBaseParam sysBaseParam); - - /** - * 多条 - * - * @param sysBaseParam sysBaseParam - * @return List - */ - List getList(SysBaseParam sysBaseParam); - - /** - * 分页 - * - * @param sysBaseParam sysBaseParam - * @return List - */ - List getPageList(SysBaseParam sysBaseParam); - - /** - * 根据ID删除 - * - * @param id - * @return - */ - int delete(String id); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysLogMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysLogMapper.java deleted file mode 100644 index 21f3b48..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysLogMapper.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.arm.equipment.system.data.mapper.system; - -import com.arm.equipment.system.data.domain.system.SysLog; - -import java.util.List; - -/** - * 日志表 - * - * @author admin - * @date 2022年09月16日 12:41:35 - */ -public interface ISysLogMapper { - - /** - * 插入 - * - * @param sysLog sysLog - * @return int - */ - int insertSelective(SysLog sysLog); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective(SysLog setParam, SysLog whereParam); - - /** - * 数量 - * - * @param sysLog sysLog - * @return int - */ - int getCount(SysLog sysLog); - - /** - * 单条 - * - * @param sysLog sysLog - * @return SysLog - */ - SysLog getOne(SysLog sysLog); - - /** - * 多条 - * - * @param sysLog sysLog - * @return List - */ - List getList(SysLog sysLog); - - /** - * 分页 - * - * @param sysLog sysLog - * @return List - */ - List getPageList(SysLog sysLog); - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysResourceMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysResourceMapper.java deleted file mode 100644 index e7d9cee..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysResourceMapper.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.arm.equipment.system.data.mapper.system; - -import com.arm.equipment.system.data.domain.system.SysResource; - -import java.util.List; - -/** - * 系统--权限表 - * - * @author admin - * @date 2021年10月19日 15:06:30 - */ -public interface ISysResourceMapper { - - /** - * 插入 - * - * @param sysResource sysResource - * @return int - */ - int insertSelective(SysResource sysResource); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective(SysResource setParam, SysResource whereParam); - - /** - * 数量 - * - * @param sysResource sysResource - * @return int - */ - int getCount(SysResource sysResource); - - /** - * 单条 - * - * @param sysResource sysResource - * @return SysResource - */ - SysResource getOne(SysResource sysResource); - - /** - * 多条 - * - * @param sysResource sysResource - * @return List - */ - List getList(SysResource sysResource); - - /** - * 分页 - * - * @param sysResource sysResource - * @return List - */ - List getPageList(SysResource sysResource); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleMapper.java deleted file mode 100644 index b369299..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleMapper.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.arm.equipment.system.data.mapper.system; - -import com.arm.equipment.system.data.domain.system.SysRole; - -import java.util.List; - -/** - * 系统--角色表 - * - * @author admin - * @date 2021年10月19日 15:06:47 - */ -public interface ISysRoleMapper { - - /** - * 插入 - * - * @param sysRole sysRole - * @return int - */ - int insertSelective(SysRole sysRole); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective(SysRole setParam, SysRole whereParam); - - /** - * 数量 - * - * @param sysRole sysRole - * @return int - */ - int getCount(SysRole sysRole); - - /** - * 单条 - * - * @param sysRole sysRole - * @return SysRole - */ - SysRole getOne(SysRole sysRole); - - /** - * 多条 - * - * @param sysRole sysRole - * @return List - */ - List getList(SysRole sysRole); - - /** - * 分页 - * - * @param sysRole sysRole - * @return List - */ - List getPageList(SysRole sysRole); - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleResourceMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleResourceMapper.java deleted file mode 100644 index 815cc67..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleResourceMapper.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.arm.equipment.system.data.mapper.system; - -import com.arm.equipment.system.data.domain.system.SysRoleResource; - -import java.util.List; - -/** - * 系统-角色权限关联表 - * - * @author admin - * @date 2021年10月19日 15:06:41 - */ -public interface ISysRoleResourceMapper { - - /** - * 插入 - * - * @param sysRoleResource sysRoleResource - * @return int - */ - int insertSelective(SysRoleResource sysRoleResource); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective(SysRoleResource setParam, SysRoleResource whereParam); - - /** - * 数量 - * - * @param sysRoleResource sysRoleResource - * @return int - */ - int getCount(SysRoleResource sysRoleResource); - - /** - * 单条 - * - * @param sysRoleResource sysRoleResource - * @return SysRoleResource - */ - SysRoleResource getOne(SysRoleResource sysRoleResource); - - /** - * 多条 - * - * @param sysRoleResource sysRoleResource - * @return List - */ - List getList(SysRoleResource sysRoleResource); - - /** - * 分页 - * - * @param sysRoleResource sysRoleResource - * @return List - */ - List getPageList(SysRoleResource sysRoleResource); - - /** - * 获取权限ID in数据 - * @param sysUserRoleIdList - * @return - */ - List getListBySysRoleIdIn(List sysUserRoleIdList); - - /** - * 根据权限ID删除 - * @param roleId - */ - void deleteByRoleId(Long roleId); - - /** - * 批量添加 - * @param list - */ - void batchInsert(List list); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserMapper.java deleted file mode 100644 index 60e9db1..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserMapper.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.arm.equipment.system.data.mapper.system; - -import com.arm.equipment.system.data.domain.system.SysUser; - -import java.util.List; - -/** - * 系统--用户表 - * - * @author admin - * @date 2021年10月19日 15:07:06 - */ -public interface ISysUserMapper { - - /** - * 插入 - * - * @param sysUser sysUser - * @return int - */ - int insertSelective(SysUser sysUser); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective(SysUser setParam, SysUser whereParam); - - /** - * 数量 - * - * @param sysUser sysUser - * @return int - */ - int getCount(SysUser sysUser); - - /** - * 单条 - * - * @param sysUser sysUser - * @return SysUser - */ - SysUser getOne(SysUser sysUser); - - /** - * 多条 - * - * @param sysUser sysUser - * @return List - */ - List getList(SysUser sysUser); - - /** - * 分页 - * - * @param sysUser sysUser - * @return List - */ - List getPageList(SysUser sysUser); - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserRoleMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserRoleMapper.java deleted file mode 100644 index 03165f1..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserRoleMapper.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.arm.equipment.system.data.mapper.system; - -import com.arm.equipment.system.data.domain.system.SysUserRole; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 系统--用户角色关联表 - * - * @author admin - * @date 2021年10月19日 15:06:59 - */ -public interface ISysUserRoleMapper { - - /** - * 插入 - * - * @param sysUserRole sysUserRole - * @return int - */ - int insertSelective(SysUserRole sysUserRole); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective(SysUserRole setParam, SysUserRole whereParam); - - /** - * 数量 - * - * @param sysUserRole sysUserRole - * @return int - */ - int getCount(SysUserRole sysUserRole); - - /** - * 单条 - * - * @param sysUserRole sysUserRole - * @return SysUserRole - */ - SysUserRole getOne(SysUserRole sysUserRole); - - /** - * 多条 - * - * @param sysUserRole sysUserRole - * @return List - */ - List getList(SysUserRole sysUserRole); - - /** - * 分页 - * - * @param sysUserRole sysUserRole - * @return List - */ - List getPageList(SysUserRole sysUserRole); - - /** - * 根据用户ID删除用户角色 - * - * @param userId - */ - void deleteByUserId(Long userId); - - /** - * 为用户批量添加角色 - * - * @param newRole - * @param userId - * @param operator - */ - void insertByRoleIdIn(@Param("newRole") List newRole, @Param("userId") Long userId, @Param("operator") String operator); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/user/IAppUserMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/user/IAppUserMapper.java deleted file mode 100644 index 908b1d3..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/user/IAppUserMapper.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.arm.equipment.system.data.mapper.user; - -import com.arm.equipment.system.data.domain.user.AppUser; - -import java.util.List; - -/** - * APP用户 - * - * @author admin - * @date 2023年03月13日 22:34:47 - */ -public interface IAppUserMapper { - - /** - * 插入 - * - * @param appUser appUser - * @return int - */ - int insertSelective(AppUser appUser); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective(AppUser setParam, AppUser whereParam); - - /** - * 数量 - * - * @param appUser appUser - * @return int - */ - int getCount(AppUser appUser); - - /** - * 单条 - * - * @param appUser appUser - * @return AppUser - */ - AppUser getOne(AppUser appUser); - - /** - * 多条 - * - * @param appUser appUser - * @return List - */ - List getList(AppUser appUser); - - /** - * 分页 - * - * @param appUser appUser - * @return List - */ - List getPageList(AppUser appUser); - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryLendRecordMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryLendRecordMapper.java deleted file mode 100644 index 9ff8c04..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryLendRecordMapper.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.arm.equipment.system.data.mapper.weaponry; - -import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord; - -import java.util.List; - -/** - * 装备武器借出记录 - * - * @author admin - * @date 2023年03月23日 11:02:17 - */ -public interface IWeaponryLendRecordMapper { - - /** - * 插入 - * - * @param weaponryLendRecord weaponryLendRecord - * @return int - */ - int insertSelective(WeaponryLendRecord weaponryLendRecord); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective(WeaponryLendRecord setParam, WeaponryLendRecord whereParam); - - /** - * 数量 - * - * @param weaponryLendRecord weaponryLendRecord - * @return int - */ - int getCount(WeaponryLendRecord weaponryLendRecord); - - /** - * 单条 - * - * @param weaponryLendRecord weaponryLendRecord - * @return WeaponryLendRecord - */ - WeaponryLendRecord getOne(WeaponryLendRecord weaponryLendRecord); - - /** - * 多条 - * - * @param weaponryLendRecord weaponryLendRecord - * @return List - */ - List getList(WeaponryLendRecord weaponryLendRecord); - - /** - * 分页 - * - * @param weaponryLendRecord weaponryLendRecord - * @return List - */ - List getPageList(WeaponryLendRecord weaponryLendRecord); - -} \ No newline at end of file diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryMapper.java deleted file mode 100644 index d38b48d..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryMapper.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.arm.equipment.system.data.mapper.weaponry; - -import com.arm.equipment.system.data.domain.weaponry.Weaponry; - -import java.util.List; - -/** - * 装备武器 - * - * @author admin - * @date 2023年03月23日 10:29:48 - */ -public interface IWeaponryMapper { - - /** - * 插入 - * - * @param weaponry weaponry - * @return int - */ - int insertSelective(Weaponry weaponry); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective(Weaponry setParam, Weaponry whereParam); - - /** - * 数量 - * - * @param weaponry weaponry - * @return int - */ - int getCount(Weaponry weaponry); - - /** - * 单条 - * - * @param weaponry weaponry - * @return Weaponry - */ - Weaponry getOne(Weaponry weaponry); - - /** - * 多条 - * - * @param weaponry weaponry - * @return List - */ - List getList(Weaponry weaponry); - - /** - * 分页 - * - * @param weaponry weaponry - * @return List - */ - List getPageList(Weaponry weaponry); - -} \ No newline at end of file diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryReturnRecordMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryReturnRecordMapper.java deleted file mode 100644 index be80762..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryReturnRecordMapper.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.arm.equipment.system.data.mapper.weaponry; - -import com.arm.equipment.system.data.domain.weaponry.WeaponryReturnRecord; - -import java.util.List; - -/** - * 装备武器归还记录 - * - * @author admin - * @date 2023年03月23日 11:03:25 - */ -public interface IWeaponryReturnRecordMapper { - - /** - * 插入 - * - * @param weaponryReturnRecord weaponryReturnRecord - * @return int - */ - int insertSelective(WeaponryReturnRecord weaponryReturnRecord); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective(WeaponryReturnRecord setParam, WeaponryReturnRecord whereParam); - - /** - * 数量 - * - * @param weaponryReturnRecord weaponryReturnRecord - * @return int - */ - int getCount(WeaponryReturnRecord weaponryReturnRecord); - - /** - * 单条 - * - * @param weaponryReturnRecord weaponryReturnRecord - * @return WeaponryReturnRecord - */ - WeaponryReturnRecord getOne(WeaponryReturnRecord weaponryReturnRecord); - - /** - * 多条 - * - * @param weaponryReturnRecord weaponryReturnRecord - * @return List - */ - List getList(WeaponryReturnRecord weaponryReturnRecord); - - /** - * 分页 - * - * @param weaponryReturnRecord weaponryReturnRecord - * @return List - */ - List getPageList(WeaponryReturnRecord weaponryReturnRecord); - -} \ No newline at end of file diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mybatis/type/CustomLocalTimeTypeHandler.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mybatis/type/CustomLocalTimeTypeHandler.java deleted file mode 100644 index 1146d89..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mybatis/type/CustomLocalTimeTypeHandler.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.arm.equipment.system.data.mybatis.type; - -import org.apache.commons.lang3.StringUtils; -import org.apache.ibatis.lang.UsesJava8; -import org.apache.ibatis.type.JdbcType; -import org.apache.ibatis.type.LocalTimeTypeHandler; - -import java.sql.*; -import java.time.LocalTime; - -/** - * 继承了LocalTimeTypeHandler这个类, 重写了对localtime的处理 - * 主要是针对0点返回null的问题 - * @author - */ -@UsesJava8 -public class CustomLocalTimeTypeHandler extends LocalTimeTypeHandler { - - @Override - public void setNonNullParameter(PreparedStatement ps, int i, LocalTime parameter, JdbcType jdbcType) - throws SQLException { - ps.setTime(i, Time.valueOf(parameter)); - } - - @Override - public LocalTime getNullableResult(ResultSet rs, String columnName) throws SQLException { - String stringTime = rs.getString(columnName); - return getLocalTime(stringTime); - } - - @Override - public LocalTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException { - String stringTime = rs.getString(columnIndex); - return getLocalTime(stringTime); - } - - @Override - public LocalTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { - String stringTime = cs.getString(columnIndex); - return getLocalTime(stringTime); - } - - /** - * 从字符串中解析时间 - * 取出每一位设置为localtime的时,分,秒,毫秒 - * @param stringTime 时间字符串 - * @return - */ - private LocalTime getLocalTime(String stringTime) { - if (StringUtils.isEmpty(stringTime)) { - return null; - } - String[] timeSplit = stringTime.split(":"); - if (stringTime.contains(".")) { - String[] secondSplit = timeSplit[2].split("\\."); - String nano = secondSplit[1].replaceAll("[0]+$", ""); - return LocalTime.of(Integer.parseInt(timeSplit[0]), Integer.parseInt(timeSplit[1]), Integer.parseInt(secondSplit[0]), Integer.parseInt(nano)); - } else { - return LocalTime.of(Integer.parseInt(timeSplit[0]), Integer.parseInt(timeSplit[1]), Integer.parseInt(timeSplit[2])); - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IDictService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IDictService.java deleted file mode 100644 index 9f70eab..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IDictService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.arm.equipment.system.data.service.common; - -import com.arm.equipment.system.data.vo.dict.DictVO; - -import java.util.List; - -/** - * 字典业务类 - * - * @author admin - */ -public interface IDictService { - /** - * 获取字典数据 - * - * @param name 字典名称 - * @return 字典数据 - */ - List getDictData(String name); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IIdWorkerService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IIdWorkerService.java deleted file mode 100644 index 2c2589d..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IIdWorkerService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.arm.equipment.system.data.service.common; - -/** - * id生成器 - */ -public interface IIdWorkerService { - - /** - * 获取id(趋势为自增) - * long最大值9223372036854775807 - * - * @return - */ - long getNextId(); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IVerifyCodeService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IVerifyCodeService.java deleted file mode 100644 index 2e255d3..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IVerifyCodeService.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.arm.equipment.system.data.service.common; - -import com.arm.equipment.system.data.vo.system.VerifyCodeVO; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * 后台管理验证码生成 - * - * @author Ousei - * @date 2020年7月17日15:27:07 - */ -public interface IVerifyCodeService { - /** - * 生成验证码并返回code,将图片写到os中 - * - * @param width - * @param height - * @param os - * @return - * @throws IOException - */ - String generate(int width, int height, OutputStream os) throws IOException; - - /** - * 生成验证码对象 - * - * @param width - * @param height - * @return - * @throws IOException - */ - VerifyCodeVO generate(int width, int height) throws IOException; -} - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/DictServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/DictServiceImpl.java deleted file mode 100644 index 417e231..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/DictServiceImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.arm.equipment.system.data.service.common.impl; - - -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.service.common.IDictService; -import com.arm.equipment.system.data.vo.dict.DictVO; -import org.springframework.stereotype.Service; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; - -/** - * 字典业务类 - * - * @author admin - */ -@Service -public class DictServiceImpl implements IDictService { - /** - * 所有的新枚举都在这个包下 - */ - String DICT_BASE_PACKAGE = "com.arm.equipment.system.data.enums.dict"; - - - @Override - public List getDictData(String name) { - return getEnumDict(name); - } - - /** - * 通过枚举名称获得枚举数据 - * - * @param name 枚举名称, 注意枚举必须放在DICT_BASE_PACKAGE下面 - * @return - */ - private List getEnumDict(String name) { - String className = DICT_BASE_PACKAGE + "." + name; - Method method; - try { - method = Class.forName(className).getMethod("values"); - } catch (NoSuchMethodException e) { - throw new BusinessException("枚举类反射异常:不存在的方法!method=values"); - } catch (ClassNotFoundException e) { - throw new BusinessException(String.format("枚举类反射异常:不存在的枚举类!className=%s", className)); - } - try { - Object invoke = method.invoke(null); - Object[] list = (Object[]) invoke; - List voList = new ArrayList<>(); - for (Object o : list) { - Object enumCode = o.getClass().getMethod("getCode").invoke(o); - String enumText = o.getClass().getMethod("getText").invoke(o).toString(); - DictVO vo = new DictVO(enumCode.toString(), enumText); - voList.add(vo); - } - return voList; - } catch (IllegalAccessException | InvocationTargetException e) { - throw new BusinessException(String.format("枚举类反射异常:方法[%s]执行失败!", method.getName())); - } catch (NoSuchMethodException e) { - throw new BusinessException(String.format("枚举类反射异常:方法[%s]不存在!", method.getName())); - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/IdWorkerServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/IdWorkerServiceImpl.java deleted file mode 100644 index b43d216..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/IdWorkerServiceImpl.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.arm.equipment.system.data.service.common.impl; - -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.constant.RedisKeys; -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.stereotype.Service; - -import javax.annotation.PostConstruct; - - -/** - * Twitter_Snowflake
- * SnowFlake的结构如下(每部分用-分开):
- * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
- * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
- * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截) - * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
- * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId
- * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号
- * 加起来刚好64位,为一个Long型。
- * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。 - */ -@Service -public class IdWorkerServiceImpl implements IIdWorkerService { - private final static Logger logger = LoggerFactory.getLogger(IdWorkerServiceImpl.class); - @Autowired - private RedisTemplate redisTemplate; - - /** - * 开始时间截 (Thu Mar 05 2020 11:57:29 GMT+0800) - */ - private final long twepoch = 1583380649557L; - /** - * 机器id所占的位数 - */ - private final static long WORKER_ID_BITS = 5L; - /** - * 数据标识id所占的位数 - */ - private final long datacenterIdBits = 5L; - /** - * 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) - */ - private final static long MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS); - /** - * 支持的最大数据标识id,结果是31 - */ - private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); - /** - * 序列在id中占的位数 - */ - private final long sequenceBits = 12L; - /** - * 机器ID向左移12位 - */ - private final long workerIdShift = sequenceBits; - /** - * 数据标识id向左移17位(12+5) - */ - private final long datacenterIdShift = sequenceBits + WORKER_ID_BITS; - /** - * 时间截向左移22位(5+5+12) - */ - private final long timestampLeftShift = sequenceBits + WORKER_ID_BITS + datacenterIdBits; - /** - * 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) - */ - private final long sequenceMask = -1L ^ (-1L << sequenceBits); - /** - * 工作机器ID(0~31) - */ - private Long workerId = (long) (Math.random() * 32); - /** - * 数据中心ID(0~31) - */ - private static long datacenterId = 0; - /** - * 毫秒内序列(0~4095) - */ - private long sequence = 0L; - /** - * 上次生成ID的时间截 - */ - private long lastTimestamp = -1L; - - /** - * 初始化worker id - * 1.从redis中自增 - * 2.自增值对32求余(拿到0~31) - */ - @PostConstruct - public void init() { - Long increment = redisTemplate.opsForValue().increment(RedisKeys.SNOW_FLAKE_WORKER_ID); - workerId = increment % 32; - logger.info("当前机器 workerId: {}", workerId); - } - - /** - * 获得下一个ID (该方法是线程安全的) - * - * @return SnowflakeId - */ - @Override - public synchronized long getNextId() { - long timestamp = timeGen(); - //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常 - if (timestamp < lastTimestamp) { - throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); - } - //如果是同一时间生成的,则进行毫秒内序列 - if (lastTimestamp == timestamp) { - sequence = (sequence + 1) & sequenceMask; - //毫秒内序列溢出 - if (sequence == 0) { - //阻塞到下一个毫秒,获得新的时间戳 - timestamp = tilNextMillis(lastTimestamp); - } - } - //时间戳改变,毫秒内序列重置 - else { - sequence = 0L; - } - //上次生成ID的时间截 - lastTimestamp = timestamp; - //移位并通过或运算拼到一起组成64位的ID - long id = ((timestamp - twepoch) << timestampLeftShift) - | (datacenterId << datacenterIdShift) - | (workerId << workerIdShift) - | sequence; - return id; - } - - - /** - * 阻塞到下一个毫秒,直到获得新的时间戳 - * - * @param lastTimestamp 上次生成ID的时间截 - * @return 当前时间戳 - */ - private long tilNextMillis(long lastTimestamp) { - long timestamp = timeGen(); - while (timestamp <= lastTimestamp) { - timestamp = timeGen(); - } - return timestamp; - } - - /** - * 返回以毫秒为单位的当前时间 - * - * @return 当前时间(毫秒) - */ - private static long timeGen() { - return System.currentTimeMillis(); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/VerifyCodeServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/VerifyCodeServiceImpl.java deleted file mode 100644 index 3c69db6..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/VerifyCodeServiceImpl.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.arm.equipment.system.data.service.common.impl; - -import com.arm.equipment.system.data.service.common.IVerifyCodeService; -import com.arm.equipment.system.data.util.RandomUtils; -import com.arm.equipment.system.data.vo.system.VerifyCodeVO; -import org.springframework.stereotype.Service; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Random; - -@Service -public class VerifyCodeServiceImpl implements IVerifyCodeService { - - private static final String[] FONT_TYPES = {"\u5b8b\u4f53", "\u65b0\u5b8b\u4f53", "\u9ed1\u4f53", "\u6977\u4f53", "\u96b6\u4e66"}; - - private static final int VALICATE_CODE_LENGTH = 4; - - /** - * 设置背景颜色及大小,干扰线 - * - * @param graphics - * @param width - * @param height - */ - private static void fillBackground(Graphics graphics, int width, int height) { - // 填充背景 - graphics.setColor(Color.WHITE); - //设置矩形坐标x y 为0 - graphics.fillRect(0, 0, width, height); - // 加入干扰线条 - for (int i = 0; i < 8; i++) { - //设置随机颜色算法参数 - graphics.setColor(RandomUtils.randomColor(40, 150)); - Random random = new Random(); - int x = random.nextInt(width); - int y = random.nextInt(height); - int x1 = random.nextInt(width); - int y1 = random.nextInt(height); - graphics.drawLine(x, y, x1, y1); - } - } - - /** - * 生成随机字符 - * - * @param width - * @param height - * @param os - * @return - * @throws IOException - */ - @Override - public String generate(int width, int height, OutputStream os) throws IOException { - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - Graphics graphics = image.getGraphics(); - fillBackground(graphics, width, height); - String randomStr = RandomUtils.randomString(VALICATE_CODE_LENGTH); - createCharacter(graphics, randomStr); - graphics.dispose(); - //设置JPEG格式 - ImageIO.write(image, "JPEG", os); - return randomStr; - } - - /** - * 验证码生成 - * - * @param width - * @param height - * @return - */ - @Override - public VerifyCodeVO generate(int width, int height) { - VerifyCodeVO verifyCode = null; - //将流的初始化放到这里就不需要手动关闭流 - try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { - String code = generate(width, height, baos); - verifyCode = new VerifyCodeVO(); - verifyCode.setCode(code); - verifyCode.setImgBytes(baos.toByteArray()); - } catch (IOException e) { - verifyCode = null; - } - return verifyCode; - } - - /** - * 设置字符颜色大小 - * - * @param g - * @param randomStr - */ - private void createCharacter(Graphics g, String randomStr) { - char[] charArray = randomStr.toCharArray(); - for (int i = 0; i < charArray.length; i++) { - //设置RGB颜色算法参数 - g.setColor(new Color(50 + RandomUtils.nextInt(100), - 50 + RandomUtils.nextInt(100), 50 + RandomUtils.nextInt(100))); - //设置字体大小,类型 - g.setFont(new Font(FONT_TYPES[RandomUtils.nextInt(FONT_TYPES.length)], Font.BOLD, 26)); - //设置x y 坐标 - g.drawString(String.valueOf(charArray[i]), 15 * i + 5, 19 + RandomUtils.nextInt(8)); - } - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/IFileService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/IFileService.java deleted file mode 100644 index 46cb86b..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/IFileService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.arm.equipment.system.data.service.file; - - -import com.arm.equipment.system.data.enums.file.EnumUpload; -import org.springframework.web.multipart.MultipartFile; - -/** - * 文件业务类 - * - * @author admin - */ -public interface IFileService { - /** - * 上传文件 - * - * @param file - * @param enumUploadItem - * @return - * @throws Exception - */ - String upload(MultipartFile file, EnumUpload enumUploadItem); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/impl/FileServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/impl/FileServiceImpl.java deleted file mode 100644 index 795c247..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/impl/FileServiceImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.arm.equipment.system.data.service.file.impl; - - -import com.arm.equipment.system.data.enums.file.EnumUpload; -import com.arm.equipment.system.data.service.file.IFileService; -import com.arm.equipment.system.data.util.DateUtils; -import com.arm.equipment.system.data.util.UuidUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - -import java.io.File; -import java.io.IOException; -import java.util.Date; - -/** - * 上传文件 - * - * @author: xly - * @time: 2023/3/10 10:54 - */ -@Component -public class FileServiceImpl implements IFileService { - private final static Logger LOGGER = LoggerFactory.getLogger(FileServiceImpl.class); - @Override - public String upload(MultipartFile file, EnumUpload enumUploadItem) { - try { - String os = System.getProperty("os.name"); - //Windows操作系统 - String resourcePath = System.getProperty("user.dir"); - if (os != null && os.toLowerCase().startsWith("windows")) { - resourcePath = resourcePath + "\\"; - } else { - resourcePath = resourcePath + "/"; - } - File pathFile = new File(resourcePath); - //判断文件夹是否存在 - if (!pathFile.exists() && !pathFile.isDirectory()) { - pathFile.mkdirs(); - } - String fileName = UuidUtils.uuid() + "." + enumUploadItem.getSuffix(); - String filePath = resourcePath + fileName; - file.transferTo(new File(filePath)); - return fileName; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysBaseParamService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysBaseParamService.java deleted file mode 100644 index bee886d..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysBaseParamService.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.arm.equipment.system.data.service.system; - -import com.arm.equipment.system.data.domain.system.SysBaseParam; - -import java.util.List; - -/** - * 系统--基础参数 - * - * @author Administrator - * @date 2021年10月26日 16:36:52 - */ -public interface ISysBaseParamService { - /** - * 保存或更新 - * @param req - */ - void save(SysBaseParam req, String operator); - - /** - * 插入 - * - * @param sysBaseParam sysBaseParam - * @return int - */ - int insertSelective(SysBaseParam sysBaseParam); - - /** - * 主键更新 - * - * @param sysBaseParam sysBaseParam - * @return int - */ - int updateSelectiveById(SysBaseParam sysBaseParam); - - /** - * 数量 - * - * @param sysBaseParam sysBaseParam - * @return int - */ - int getCount(SysBaseParam sysBaseParam); - - /** - * unicode查询 - * @param uniCode - * @return - */ - SysBaseParam getOneByUniCode(String uniCode); - - /** - * 主键查询 - * - * @param id id - * @return SysBaseParam - */ - SysBaseParam getOneById(Long id); - - /** - * 多条 - * - * @param sysBaseParam sysBaseParam - * @return List - */ - List getList(SysBaseParam sysBaseParam); - - /** - * 分页 - * - * @param sysBaseParam sysBaseParam - * @return List - */ - List getPageList(SysBaseParam sysBaseParam); - - /** - * 审核 - * @param id - * @param operator - */ - void audit(Long id, String operator); - - /** - * 取消审核 - * @param id - * @param operator - */ - void unaudit(Long id, String operator); - - /** - * 删除 - * @param id - * @param operator - */ - void delete(Long id, String operator); - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysLogService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysLogService.java deleted file mode 100644 index c83be9d..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysLogService.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.arm.equipment.system.data.service.system; - -import com.arm.equipment.system.data.domain.system.SysLog; - -import java.util.List; - -/** - * 日志表 - * - * @author admin - * @date 2022年09月16日 12:41:35 - */ -public interface ISysLogService { - /** - * 保存或更新 - * @param req - */ - void save(SysLog req, String operator); - - /** - * 插入 - * - * @param sysLog sysLog - * @return int - */ - int insertSelective(SysLog sysLog); - - /** - * 主键更新 - * - * @param sysLog sysLog - * @return int - */ - int updateSelectiveById(SysLog sysLog); - - /** - * 数量 - * - * @param sysLog sysLog - * @return int - */ - int getCount(SysLog sysLog); - - /** - * 主键查询 - * - * @param id id - * @return SysLog - */ - SysLog getOneById(Long id); - - /** - * 多条 - * - * @param sysLog sysLog - * @return List - */ - List getList(SysLog sysLog); - - /** - * 分页 - * - * @param sysLog sysLog - * @return List - */ - List getPageList(SysLog sysLog); - - /** - * 审核 - * @param id - * @param operator - */ - void audit(Long id, String operator); - - /** - * 取消审核 - * @param id - * @param operator - */ - void unaudit(Long id, String operator); - - /** - * 删除 - * @param id - * @param operator - */ - void delete(Long id, String operator); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysResourceService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysResourceService.java deleted file mode 100644 index 185cdc6..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysResourceService.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.arm.equipment.system.data.service.system; - -import com.arm.equipment.system.data.domain.system.SysResource; - -import java.util.List; - -/** - * 系统--权限表 - * - * @author admin - * @date 2021年10月19日 15:06:30 - */ -public interface ISysResourceService { - /** - * 保存或更新 - * - * @param req - */ - void save(SysResource req, String operator); - - /** - * 插入 - * - * @param sysResource sysResource - * @return int - */ - int insertSelective(SysResource sysResource); - - /** - * 主键更新 - * - * @param sysResource sysResource - * @return int - */ - int updateSelectiveById(SysResource sysResource); - - /** - * 数量 - * - * @param sysResource sysResource - * @return int - */ - int getCount(SysResource sysResource); - - /** - * 主键查询 - * - * @param id id - * @return SysResource - */ - SysResource getOneById(Long id); - - /** - * 多条 - * - * @param sysResource sysResource - * @return List - */ - List getList(SysResource sysResource); - - /** - * 分页 - * - * @param sysResource sysResource - * @return List - */ - List getPageList(SysResource sysResource); - - /** - * 审核 - * - * @param id - * @param operator - */ - void audit(Long id, String operator); - - /** - * 取消审核 - * - * @param id - * @param operator - */ - void unaudit(Long id, String operator); - - /** - * 删除 - * - * @param id - * @param operator - */ - void delete(Long id, String operator); - - /** - * 获取目录分页数据 - * - * @param sysResource - * @return - */ - List getPageTreeList(SysResource sysResource); - - /** - * 获取资源树 - * - * @return - */ - List getResourceTree(); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleResourceService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleResourceService.java deleted file mode 100644 index 0be329c..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleResourceService.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.arm.equipment.system.data.service.system; - -import com.arm.equipment.system.data.domain.system.SysResource; -import com.arm.equipment.system.data.domain.system.SysRole; -import com.arm.equipment.system.data.domain.system.SysRoleResource; -import com.arm.equipment.system.data.vo.system.SysRoleResourceVO; - -import java.util.List; -import java.util.Map; - -/** - * 系统-角色权限关联表 - * - * @author admin - * @date 2021年10月19日 15:06:41 - */ -public interface ISysRoleResourceService { - /** - * 保存或更新 - * - * @param req - */ - void save(SysRoleResource req, String operator); - - /** - * 插入 - * - * @param sysRoleResource sysRoleResource - * @return int - */ - int insertSelective(SysRoleResource sysRoleResource); - - /** - * 主键更新 - * - * @param sysRoleResource sysRoleResource - * @return int - */ - int updateSelectiveById(SysRoleResource sysRoleResource); - - /** - * 数量 - * - * @param sysRoleResource sysRoleResource - * @return int - */ - int getCount(SysRoleResource sysRoleResource); - - /** - * 主键查询 - * - * @param id id - * @return SysRoleResource - */ - SysRoleResource getOneById(Long id); - - /** - * 多条 - * - * @param sysRoleResource sysRoleResource - * @return List - */ - List getList(SysRoleResource sysRoleResource); - - /** - * 分页 - * - * @param sysRoleResource sysRoleResource - * @return List - */ - List getPageList(SysRoleResource sysRoleResource); - - /** - * 审核 - * - * @param id - * @param operator - */ - void audit(Long id, String operator); - - /** - * 取消审核 - * - * @param id - * @param operator - */ - void unaudit(Long id, String operator); - - /** - * 删除 - * - * @param id - * @param operator - */ - void delete(Long id, String operator); - - /** - * 构建用户资源菜单及资源标识 - * - * @param sysUserRoleIdList - * @param sysUserResourceList - * @param sysResourceIdentityList - */ - void buildUserResourceListAndIdentityList(List sysUserRoleIdList, List sysUserResourceList, - List sysResourceIdentityList); - - /** - * 添加角色资源 - * @param roleResourceVO - * @param operator - */ - void addResource(SysRoleResourceVO roleResourceVO, String operator); - - /** - * 获取角色资源 - * @param roleId - * @return - */ - Map getResourcesIdListByRoleId(Long roleId); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleService.java deleted file mode 100644 index e8d884d..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleService.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.arm.equipment.system.data.service.system; - -import com.arm.equipment.system.data.domain.system.SysRole; - -import java.util.List; - -/** - * 系统--角色表 - * - * @author admin - * @date 2021年10月19日 15:06:47 - */ -public interface ISysRoleService { - /** - * 保存或更新 - * - * @param req - */ - void save(SysRole req, String operator); - - /** - * 插入 - * - * @param sysRole sysRole - * @return int - */ - int insertSelective(SysRole sysRole); - - /** - * 主键更新 - * - * @param sysRole sysRole - * @return int - */ - int updateSelectiveById(SysRole sysRole); - - /** - * 数量 - * - * @param sysRole sysRole - * @return int - */ - int getCount(SysRole sysRole); - - /** - * 主键查询 - * - * @param id id - * @return SysRole - */ - SysRole getOneById(Long id); - - /** - * 多条 - * - * @param sysRole sysRole - * @return List - */ - List getList(SysRole sysRole); - - /** - * 分页 - * - * @param sysRole sysRole - * @return List - */ - List getPageList(SysRole sysRole); - - /** - * 审核 - * - * @param id - * @param operator - */ - void audit(Long id, String operator); - - /** - * 取消审核 - * - * @param id - * @param operator - */ - void unaudit(Long id, String operator); - - /** - * 删除 - * - * @param id - * @param operator - */ - void delete(Long id, String operator); - - /** - * 获取当前登陆用户拥有绝角色 - * - * @param userId - * @return - */ - List getCurrentUserRole(Long userId); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserRoleService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserRoleService.java deleted file mode 100644 index 429796a..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserRoleService.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.arm.equipment.system.data.service.system; - -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.domain.system.SysUserRole; -import com.arm.equipment.system.data.vo.system.AddRoleVO; - -import java.util.List; - -/** - * 系统--用户角色关联表 - * - * @author admin - * @date 2021年10月19日 15:06:59 - */ -public interface ISysUserRoleService { - /** - * 保存或更新 - * - * @param req - */ - void save(SysUserRole req, String operator); - - /** - * 插入 - * - * @param sysUserRole sysUserRole - * @return int - */ - int insertSelective(SysUserRole sysUserRole); - - /** - * 主键更新 - * - * @param sysUserRole sysUserRole - * @return int - */ - int updateSelectiveById(SysUserRole sysUserRole); - - /** - * 数量 - * - * @param sysUserRole sysUserRole - * @return int - */ - int getCount(SysUserRole sysUserRole); - - /** - * 主键查询 - * - * @param id id - * @return SysUserRole - */ - SysUserRole getOneById(Long id); - - /** - * 多条 - * - * @param sysUserRole sysUserRole - * @return List - */ - List getList(SysUserRole sysUserRole); - - /** - * 分页 - * - * @param sysUserRole sysUserRole - * @return List - */ - List getPageList(SysUserRole sysUserRole); - - /** - * 删除 - * - * @param id - * @param operator - */ - void delete(Long id, String operator); - - /** - * 为用户分配角色 - * - * @param addRoleVO - * @param currentUser - */ - void addRole(AddRoleVO addRoleVO, SysUser currentUser); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserService.java deleted file mode 100644 index 5367c2f..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserService.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.arm.equipment.system.data.service.system; - -import com.arm.equipment.system.data.domain.system.SysUser; - -import javax.servlet.http.HttpSession; -import java.util.List; - -/** - * 系统--用户表 - * - * @author admin - * @date 2021年10月19日 15:07:06 - */ -public interface ISysUserService { - /** - * 保存或更新 - * - * @param req - */ - void save(SysUser req, String operator); - - /** - * 插入 - * - * @param sysUser sysUser - * @return int - */ - int insertSelective(SysUser sysUser); - - /** - * 主键更新 - * - * @param sysUser sysUser - * @return int - */ - int updateSelectiveById(SysUser sysUser); - - /** - * 数量 - * - * @param sysUser sysUser - * @return int - */ - int getCount(SysUser sysUser); - - /** - * 主键查询 - * - * @param id id - * @return SysUser - */ - SysUser getOneById(Long id); - - /** - * 多条 - * - * @param sysUser sysUser - * @return List - */ - List getList(SysUser sysUser); - - /** - * 分页 - * - * @param sysUser sysUser - * @return List - */ - List getPageList(SysUser sysUser); - - /** - * @param id - * @return - */ - SysUser getExitOneById(Long id); - - /** - * 删除 - * - * @param id - * @param operator - */ - void delete(Long id, String operator); - - /** - * 登陆 - * - * @param sysUserReq - * @return - */ - SysUser login(SysUser sysUserReq, HttpSession webSession); - - /** - * 接口登陆 - * - * @param username - * @param password - * @return - */ - SysUser thirdLogin(String username, String password); - - /** - * 修改密码 - * - * @param oldPassword - * @param newPassword - * @param sysUserId - */ - void updatePassword(String oldPassword, String newPassword, Long sysUserId); - - /** - * 验证用户登陆错误次数 - * @param username - */ - void checkLoginErrorNumByUsername(String username); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysBaseParamServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysBaseParamServiceImpl.java deleted file mode 100644 index 0a57c0e..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysBaseParamServiceImpl.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.arm.equipment.system.data.service.system.impl; - -import com.arm.equipment.system.data.domain.system.SysBaseParam; -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.mapper.system.ISysBaseParamMapper; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.service.system.ISysBaseParamService; -import com.arm.equipment.system.data.constant.RedisKeys; -import com.arm.equipment.system.data.util.WJAssert; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 系统--基础参数 - * - * @author Administrator - * @date 2021年10月26日 16:36:52 - */ -@Service -public class SysBaseParamServiceImpl implements ISysBaseParamService { - @Autowired - private ISysBaseParamMapper sysBaseParamMapper; - @Autowired - private IIdWorkerService idWorkerService; - @Autowired - @Lazy - private ISysBaseParamService sysBaseParamService; - - @Override - public void save(SysBaseParam req, String operator) { - req.setOperator(operator); - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective(SysBaseParam req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - if (null != getOneByUniCode(req.getUniCode())) { - throw new BusinessException("已存在同名参数值"); - } - checkStringLength(req, false); - return sysBaseParamMapper.insertSelective(req); - } - - @Override - @CacheEvict(value = RedisKeys.SYS_BASE_PARAM_KEY, key = "#sysBaseParam.uniCode") - public int updateSelectiveById(SysBaseParam sysBaseParam) { - WJAssert.notNull(sysBaseParam, "入参对象不能为空"); - WJAssert.notNull(sysBaseParam.getId(), "id参数错误"); - SysBaseParam where = new SysBaseParam(); - where.setId(sysBaseParam.getId()); - return sysBaseParamMapper.updateSelective(sysBaseParam, where); - } - - @Override - public int getCount(SysBaseParam sysBaseParam) { - checkStringLength(sysBaseParam, true); - return sysBaseParamMapper.getCount(sysBaseParam); - } - - @Override - public SysBaseParam getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - SysBaseParam where = new SysBaseParam(); - where.setId(id); - return sysBaseParamMapper.getOne(where); - } - - @Override - public List getList(SysBaseParam sysBaseParam) { - checkStringLength(sysBaseParam, true); - return sysBaseParamMapper.getList(sysBaseParam); - } - - @Override - public List getPageList(SysBaseParam sysBaseParam) { - checkStringLength(sysBaseParam, true); - return sysBaseParamMapper.getPageList(sysBaseParam); - } - - @Override - public void audit(Long id, String operator) { - SysBaseParam req = new SysBaseParam(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.AUDIT.getCode()); - - SysBaseParam baseParamDB = getOneById(id); - req.setUniCode(baseParamDB.getUniCode()); - sysBaseParamService.updateSelectiveById(req); - } - - @Override - public void unaudit(Long id, String operator) { - SysBaseParam req = new SysBaseParam(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.NEW.getCode()); - - SysBaseParam baseParamDB = getOneById(id); - req.setUniCode(baseParamDB.getUniCode()); - sysBaseParamService.updateSelectiveById(req); - } - - @Override - public void delete(Long id, String operator) { - SysBaseParam req = new SysBaseParam(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.DEL.getCode()); - updateSelectiveById(req); - } - - @Cacheable(value = RedisKeys.SYS_BASE_PARAM_KEY, key = "#uniCode") - @Override - public SysBaseParam getOneByUniCode(String uniCode) { - WJAssert.isMaxLength(uniCode, 50, "UNICODE非法"); - SysBaseParam where = new SysBaseParam(); - where.setUniCode(uniCode); - where.setStatus(EnumStatus.AUDIT.getCode()); - return sysBaseParamMapper.getOne(where); - } - - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength(SysBaseParam sysBaseParam, boolean nullAble) { - WJAssert.notNull(sysBaseParam, "入参对象不能为空"); - WJAssert.limitMaxLength(sysBaseParam.getUniCode(), nullAble, 50, "唯一编码不合法!"); - WJAssert.limitMaxLength(sysBaseParam.getValue(), nullAble, 2000, "值不合法!"); - WJAssert.limitMaxLength(sysBaseParam.getDescription(), nullAble, 300, "描述不合法!"); - WJAssert.limitMaxLength(sysBaseParam.getOperator(), nullAble, 100, "操作人不合法!"); - WJAssert.limitMaxLength(sysBaseParam.getRemark(), true, 255, "备注不合法!"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysLogServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysLogServiceImpl.java deleted file mode 100644 index c0f7130..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysLogServiceImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.arm.equipment.system.data.service.system.impl; - -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.mapper.system.ISysLogMapper; -import com.arm.equipment.system.data.domain.system.SysLog; -import com.arm.equipment.system.data.service.system.ISysLogService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 日志表 - * - * @author admin - * @date 2022年09月16日 12:41:35 - */ -@Service -public class SysLogServiceImpl implements ISysLogService { - @Autowired - private ISysLogMapper sysLogMapper; - @Autowired - private IIdWorkerService idWorkerService; - - @Override - public void save(SysLog req, String operator) { - req.setOperator(operator); - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective(SysLog req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - checkStringLength(req, false); - return sysLogMapper.insertSelective(req); - } - - @Override - public int updateSelectiveById(SysLog sysLog) { - WJAssert.notNull(sysLog, "入参对象不能为空"); - WJAssert.notNull(sysLog.getId(), "id参数错误"); - SysLog where = new SysLog(); - where.setId(sysLog.getId()); - return sysLogMapper.updateSelective(sysLog, where); - } - - @Override - public int getCount(SysLog sysLog) { - checkStringLength(sysLog, true); - return sysLogMapper.getCount(sysLog); - } - - @Override - public SysLog getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - SysLog where = new SysLog(); - where.setId(id); - return sysLogMapper.getOne(where); - } - - @Override - public List getList(SysLog sysLog) { - checkStringLength(sysLog, true); - return sysLogMapper.getList(sysLog); - } - - @Override - public List getPageList(SysLog sysLog) { - checkStringLength(sysLog, true); - return sysLogMapper.getPageList(sysLog); - } - - @Override - public void audit(Long id, String operator) { - SysLog req = new SysLog(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.AUDIT.getCode()); - updateSelectiveById(req); - } - - @Override - public void unaudit(Long id, String operator) { - SysLog req = new SysLog(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.NEW.getCode()); - updateSelectiveById(req); - } - - @Override - public void delete(Long id, String operator) { - SysLog req = new SysLog(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.DEL.getCode()); - updateSelectiveById(req); - } - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength(SysLog sysLog, boolean nullAble) { - WJAssert.notNull(sysLog, "入参对象不能为空"); - WJAssert.limitMaxLength(sysLog.getTitle(), true, 500, "日志标题不合法!"); - WJAssert.limitMaxLength(sysLog.getRemoteAddr(), true, 255, "操作IP地址不合法!"); - WJAssert.limitMaxLength(sysLog.getUserAgent(), true, 255, "用户代理不合法!"); - WJAssert.limitMaxLength(sysLog.getRequestUri(), true, 255, "请求URI不合法!"); - WJAssert.limitMaxLength(sysLog.getMethod(), true, 10, "操作方式不合法!"); - WJAssert.limitMaxLength(sysLog.getParams(), true, 1000, "操作提交的数据不合法!"); - WJAssert.limitMaxLength(sysLog.getException(), true, 1000, "异常信息不合法!"); - WJAssert.limitMaxLength(sysLog.getOperator(), nullAble, 50, "操作人不合法!"); - WJAssert.limitMaxLength(sysLog.getRemark(), true, 255, "备注不合法!"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysResourceServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysResourceServiceImpl.java deleted file mode 100644 index a79362e..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysResourceServiceImpl.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.arm.equipment.system.data.service.system.impl; - -import com.arm.equipment.system.data.domain.system.SysResource; -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.enums.dict.EnumSysResourceType; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.mapper.system.ISysResourceMapper; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.service.system.ISysResourceService; -import com.arm.equipment.system.data.util.WJAssert; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 系统--权限表 - * - * @author admin - * @date 2021年10月20日 08:59:10 - */ -@Service -public class SysResourceServiceImpl implements ISysResourceService { - @Autowired - private ISysResourceMapper sysResourceMapper; - @Autowired - private IIdWorkerService idWorkerService; - - @Override - public void save(SysResource req, String operator) { - req.setOperator(operator); - if (StringUtils.isNotBlank(req.getIdentity())) { - SysResource where = new SysResource(); - where.setIdentity(req.getIdentity()); - SysResource resourceDB = sysResourceMapper.getOne(where); - if (resourceDB != null && !resourceDB.getId().equals(req.getId())) { - throw new BusinessException("标识已存在!"); - } - } - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective(SysResource req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - checkStringLength(req, false); - return sysResourceMapper.insertSelective(req); - } - - @Override - public int updateSelectiveById(SysResource sysResource) { - WJAssert.notNull(sysResource, "入参对象不能为空"); - WJAssert.notNull(sysResource.getId(), "id参数错误"); - SysResource where = new SysResource(); - where.setId(sysResource.getId()); - return sysResourceMapper.updateSelective(sysResource, where); - } - - @Override - public int getCount(SysResource sysResource) { - checkStringLength(sysResource, true); - return sysResourceMapper.getCount(sysResource); - } - - @Override - public SysResource getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - SysResource where = new SysResource(); - where.setId(id); - return sysResourceMapper.getOne(where); - } - - @Override - public List getList(SysResource sysResource) { - checkStringLength(sysResource, true); - return sysResourceMapper.getList(sysResource); - } - - @Override - public List getPageList(SysResource sysResource) { - checkStringLength(sysResource, true); - return sysResourceMapper.getPageList(sysResource); - } - - @Override - public void audit(Long id, String operator) { - SysResource req = new SysResource(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.AUDIT.getCode()); - updateSelectiveById(req); - } - - @Override - public void unaudit(Long id, String operator) { - SysResource req = new SysResource(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.NEW.getCode()); - updateSelectiveById(req); - } - - @Override - public void delete(Long id, String operator) { - SysResource req = new SysResource(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.DEL.getCode()); - updateSelectiveById(req); - } - - /** - * 获取目录分页数据 - * - * @param sysResource - * @return - */ - @Override - public List getPageTreeList(SysResource sysResource) { - SysResource where = new SysResource(); - sysResource.setStatus(EnumStatus.NEW.getCode()); - List listDB = sysResourceMapper.getList(where); - - return sysResourceMapper.getPageList(sysResource) - .stream().peek(item -> { - item.setLabel(item.getName()); - item.setChildren(getChildrenTree(listDB, item.getId().toString())); - }).collect(Collectors.toList()); - } - - /** - * 获取资源树 - * 获取全部数据进行楼中楼 - * - * @return - */ - @Override - public List getResourceTree() { - SysResource sysResource = new SysResource(); - sysResource.setStatus(EnumStatus.NEW.getCode()); - List listDB = sysResourceMapper.getList(sysResource); - - List catalogueList = listDB.stream().filter(item -> { - return item.getType().equals(EnumSysResourceType.CATALOGUE.getCode()); - }).sorted(Comparator.comparing(SysResource::getSort)).collect(Collectors.toList()); - - return catalogueList.stream() - .peek(item -> { - item.setLabel(item.getName()); - item.setIcon("el-icon-folder-opened"); - item.setChildren(getChildrenTree(listDB, item.getId().toString())); - }).collect(Collectors.toList()); - } - - /** - * 根据目录盖楼 格式(目录->菜单->按钮) - * - * @param listDB - * @param parentId - * @return - */ - private List getChildrenTree(List listDB, String parentId) { - return listDB.stream() - .filter(item -> { - return parentId.equals(item.getParentId()) && EnumSysResourceType.MENU.getCode().equals(item.getType()); - }).peek(item -> { - item.setLabel(item.getName()); - item.setIcon("el-icon-document"); - List btnList = listDB.stream() - .filter(btnItem -> { - return btnItem.getParentId().equals(item.getId().toString()) && EnumSysResourceType.BUTTON.getCode().equals(btnItem.getType()); - }).peek(btnItem -> { - btnItem.setLabel(btnItem.getName()); - }).sorted(Comparator.comparing(SysResource::getSort)).collect(Collectors.toList()); - item.setChildren(btnList); - }).sorted(Comparator.comparing(SysResource::getSort)).collect(Collectors.toList()); - } - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength(SysResource sysResource, boolean nullAble) { - WJAssert.notNull(sysResource, "入参对象不能为空"); - WJAssert.limitMaxLength(sysResource.getName(), nullAble, 100, "菜单名称不合法!"); - WJAssert.limitMaxLength(sysResource.getUrl(), true, 200, "链接地址不合法!"); - WJAssert.limitMaxLength(sysResource.getParentId(), true, 32, "父菜单ID不合法!"); - WJAssert.limitMaxLength(sysResource.getIcon(), true, 200, "图标不合法!"); - WJAssert.limitMaxLength(sysResource.getIdentity(), nullAble, 255, "权限标识不合法!"); - WJAssert.limitMaxLength(sysResource.getOperator(), true, 50, "操作人不合法!"); - WJAssert.limitMaxLength(sysResource.getRemark(), true, 255, "备注不合法!"); - WJAssert.limitMaxLength(sysResource.getRootPath(), true, 255, "根路径,用.分隔不合法!"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleResourceServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleResourceServiceImpl.java deleted file mode 100644 index c12a856..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleResourceServiceImpl.java +++ /dev/null @@ -1,311 +0,0 @@ -package com.arm.equipment.system.data.service.system.impl; - -import com.arm.equipment.system.data.domain.system.SysResource; -import com.arm.equipment.system.data.domain.system.SysRole; -import com.arm.equipment.system.data.domain.system.SysRoleResource; -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.enums.dict.EnumSysResourceType; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.mapper.system.ISysRoleResourceMapper; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.service.system.ISysResourceService; -import com.arm.equipment.system.data.service.system.ISysRoleResourceService; -import com.arm.equipment.system.data.service.system.ISysRoleService; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.vo.system.SysRoleResourceVO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 系统-角色权限关联表 - * - * @author admin - * @date 2021年10月19日 15:06:41 - */ -@Service -public class SysRoleResourceServiceImpl implements ISysRoleResourceService { - @Autowired - private ISysRoleResourceMapper sysRoleResourceMapper; - @Autowired - private IIdWorkerService idWorkerService; - @Autowired - private ISysResourceService sysResourceService; - @Autowired - private ISysRoleService sysRoleService; - - @Override - public void save(SysRoleResource req, String operator) { - req.setOperator(operator); - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective(SysRoleResource req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - checkStringLength(req, false); - return sysRoleResourceMapper.insertSelective(req); - } - - @Override - public int updateSelectiveById(SysRoleResource sysRoleResource) { - WJAssert.notNull(sysRoleResource, "入参对象不能为空"); - WJAssert.notNull(sysRoleResource.getId(), "id参数错误"); - SysRoleResource where = new SysRoleResource(); - where.setId(sysRoleResource.getId()); - return sysRoleResourceMapper.updateSelective(sysRoleResource, where); - } - - @Override - public int getCount(SysRoleResource sysRoleResource) { - checkStringLength(sysRoleResource, true); - return sysRoleResourceMapper.getCount(sysRoleResource); - } - - @Override - public SysRoleResource getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - SysRoleResource where = new SysRoleResource(); - where.setId(id); - return sysRoleResourceMapper.getOne(where); - } - - @Override - public List getList(SysRoleResource sysRoleResource) { - checkStringLength(sysRoleResource, true); - return sysRoleResourceMapper.getList(sysRoleResource); - } - - @Override - public List getPageList(SysRoleResource sysRoleResource) { - checkStringLength(sysRoleResource, true); - return sysRoleResourceMapper.getPageList(sysRoleResource); - } - - @Override - public void audit(Long id, String operator) { - SysRoleResource req = new SysRoleResource(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.AUDIT.getCode()); - updateSelectiveById(req); - } - - @Override - public void unaudit(Long id, String operator) { - SysRoleResource req = new SysRoleResource(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.NEW.getCode()); - updateSelectiveById(req); - } - - @Override - public void delete(Long id, String operator) { - SysRoleResource req = new SysRoleResource(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.DEL.getCode()); - updateSelectiveById(req); - } - - /** - * 构建用户资源菜单及资源标识 - * - * @param sysUserRoleIdList - * @param sysUserResourceList - * @param sysResourceIdentityList - */ - @Override - public void buildUserResourceListAndIdentityList(List sysUserRoleIdList, List sysUserResourceList, - List sysResourceIdentityList) { - if (CollectionUtils.isEmpty(sysUserRoleIdList)) { - return; - } - List roleIds = sysUserRoleIdList.stream().map(SysRole::getId).collect(Collectors.toList()); - List list = sysRoleResourceMapper.getListBySysRoleIdIn(roleIds); - if (CollectionUtils.isEmpty(list)) { - return; - } - List resourceIdList = list.stream().map(SysRoleResource::getSysResourceId).distinct().collect(Collectors.toList()); - - SysResource sysResourceWhere = new SysResource(); - sysResourceWhere.setStatus(EnumStatus.NEW.getCode()); - sysResourceWhere.setIdsList(resourceIdList); - List sysResourcesList = sysResourceService.getList(sysResourceWhere); - if (CollectionUtils.isEmpty(sysResourcesList)) { - return; - } - //用户所拥有资源标识 - List resourceIdentityList = sysResourcesList.stream().map(SysResource::getIdentity).collect(Collectors.toList()); - //目录资源集合 - List allCatalogueResourceList = sysResourcesList.stream().filter(item -> { - return EnumSysResourceType.CATALOGUE.getCode().equals(item.getType()); - }).sorted(Comparator.comparing(SysResource::getSort)).collect(Collectors.toList()); - //菜单资源集合 - List allMenuResourceList = sysResourcesList.stream().filter(item -> { - return EnumSysResourceType.MENU.getCode().equals(item.getType()); - }).collect(Collectors.toList()); - //用户所拥有目录菜单资源盖楼 - List userResourceList = allCatalogueResourceList.stream() - .peek(item -> { - List childrenList = allMenuResourceList.stream().filter(childrenItem -> { - return item.getId().toString().equals(childrenItem.getParentId()); - }).sorted(Comparator.comparing(SysResource::getSort)).collect(Collectors.toList()); - item.setChildren(childrenList); - }).collect(Collectors.toList()); - sysUserResourceList.addAll(userResourceList); - sysResourceIdentityList.addAll(resourceIdentityList); - } - - /** - * 添加角色资源 - * - * @param roleResourceVO - * @param operator - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void addResource(SysRoleResourceVO roleResourceVO, String operator) { - List newResourcesList = roleResourceVO.getResourcesIds(); - if (null == roleResourceVO.getRoleId()) { - return; - } - SysRole sysRoleDB = sysRoleService.getOneById(roleResourceVO.getRoleId()); - if (sysRoleDB == null) { - throw new BusinessException("不存的角色!"); - } - sysRoleResourceMapper.deleteByRoleId(roleResourceVO.getRoleId()); - if (CollectionUtils.isEmpty(newResourcesList)) { - return; - } - List list = newResourcesList.parallelStream().map(item -> { - SysRoleResource req = new SysRoleResource(); - req.setOperator(operator); - req.setSysResourceId(item); - req.setSysRoleId(roleResourceVO.getRoleId()); - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - return req; - }).collect(Collectors.toList()); - sysRoleResourceMapper.batchInsert(list); - } - - /** - * 获取角色所拥有权限 el-tree树默认勾选 - * 1.获取当前角色所拥有所有权限菜单 - * 2.分别获取当前角色所拥有所有权限菜单中的目录、菜单、按钮集合 - * 3.过滤当前角色菜单中是否所有按钮权限都拥有,是返回当前菜单ID 否 不返回(决定当前菜单树下面的所有子节点是否全勾选) - * 4.过滤当前角色目录中是否所有菜单权限都拥有,(使用步骤三过滤出来的菜单集合进行判断)是返回当前目录ID 否 不返回(决定当前菜单树下面的所有子节点是否全勾选) - * 5.返回过滤后的目录、菜单、按钮集合(用与默认勾选)与无过滤的集合(防止不更改直接提交) - * - * @param roleId - * @return - */ - @Override - public Map getResourcesIdListByRoleId(Long roleId) { - Map resultMap = new HashMap<>(2); - resultMap.put("checkedTreeList", new ArrayList<>()); - resultMap.put("treeList", new ArrayList<>()); - - List resultList = new ArrayList<>(); - SysRoleResource req = new SysRoleResource(); - req.setSysRoleId(roleId); - List resourceIdList = getList(req).stream().map(SysRoleResource::getSysResourceId).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(resourceIdList)) { - return resultMap; - } - - SysResource sysResourceWhere = new SysResource(); - sysResourceWhere.setStatus(EnumStatus.NEW.getCode()); - sysResourceWhere.setIdsList(resourceIdList); - List sysResourcesList = sysResourceService.getList(sysResourceWhere); - if (CollectionUtils.isEmpty(sysResourcesList)) { - return resultMap; - } - //用户所拥有目录资源集合 - List allCatalogueResourceIdList = sysResourcesList.stream().filter(item -> { - return EnumSysResourceType.CATALOGUE.getCode().equals(item.getType()); - }).map(SysResource::getId).collect(Collectors.toList()); - - //用户所拥有菜单资源集合 - List allMenuResourceIdList = sysResourcesList.stream().filter(item -> { - return EnumSysResourceType.MENU.getCode().equals(item.getType()); - }).collect(Collectors.toList()); - - //用户所拥有按钮资源集合 - List allButtonResourceIdList = sysResourcesList.stream().filter(item -> { - return EnumSysResourceType.BUTTON.getCode().equals(item.getType()); - }).collect(Collectors.toList()); - - - SysResource srWhere = new SysResource(); - srWhere.setStatus(EnumStatus.NEW.getCode()); - List resourceAllListDB = sysResourceService.getList(srWhere); - - - //过滤后的结果菜单 - List menuResourceIdListResult = allMenuResourceIdList.stream() - .filter(item -> { - return isHasAllChildren(allButtonResourceIdList, resourceAllListDB, EnumSysResourceType.BUTTON.getCode(), item.getId()); - }).collect(Collectors.toList()); - - //过滤后的结果目录 - List catalogueResourceIdListResult = allCatalogueResourceIdList.stream() - .filter(item -> { - return isHasAllChildren(menuResourceIdListResult, resourceAllListDB, EnumSysResourceType.MENU.getCode(), item); - }).collect(Collectors.toList()); - List buttonIdList = allButtonResourceIdList.stream().map(SysResource::getId).collect(Collectors.toList()); - List menuIdList = menuResourceIdListResult.stream().map(SysResource::getId).collect(Collectors.toList()); - resultList.addAll(catalogueResourceIdListResult); - resultList.addAll(menuIdList); - resultList.addAll(buttonIdList); - - resultMap.put("checkedTreeList", resultList); - resultMap.put("treeList", resourceIdList); - - return resultMap; - } - - /** - * 菜单是否包含所有子类 - * - * @param resourceIdList - * @param type - * @param resourceId - * @return - */ - private boolean isHasAllChildren(List resourceIdList, List resourceAllListDB, Integer type, Long resourceId) { - //得到当前类型的所有对应子节点 - List idList = resourceIdList - .stream() - .filter(item -> item.getParentId().equals(resourceId.toString())) - .map(SysResource::getId).collect(Collectors.toList()); - List idListDB = resourceAllListDB - .stream() - .filter(item -> item.getParentId().equals(resourceId.toString()) && item.getType().equals(type)) - .map(SysResource::getId).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(idListDB)) { - return true; - } - return idList.size() == idListDB.size(); - } - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength(SysRoleResource sysRoleResource, boolean nullAble) { - WJAssert.notNull(sysRoleResource, "入参对象不能为空"); - WJAssert.limitMaxLength(sysRoleResource.getOperator(), true, 255, "操作人不合法!"); - WJAssert.limitMaxLength(sysRoleResource.getRemark(), true, 255, "备注不合法!"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleServiceImpl.java deleted file mode 100644 index b501198..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleServiceImpl.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.arm.equipment.system.data.service.system.impl; - -import com.arm.equipment.system.data.domain.system.SysRole; -import com.arm.equipment.system.data.domain.system.SysUserRole; -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.mapper.system.ISysRoleMapper; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.service.system.ISysRoleService; -import com.arm.equipment.system.data.service.system.ISysUserRoleService; -import com.arm.equipment.system.data.util.WJAssert; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 系统--角色表 - * - * @author admin - * @date 2021年10月19日 15:06:47 - */ -@Service -public class SysRoleServiceImpl implements ISysRoleService { - @Autowired - private ISysRoleMapper sysRoleMapper; - @Autowired - private IIdWorkerService idWorkerService; - @Autowired - private ISysUserRoleService sysUserRoleService; - - @Override - public void save(SysRole req, String operator) { - req.setOperator(operator); - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective(SysRole req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - checkStringLength(req, false); - return sysRoleMapper.insertSelective(req); - } - - @Override - public int updateSelectiveById(SysRole sysRole) { - WJAssert.notNull(sysRole, "入参对象不能为空"); - WJAssert.notNull(sysRole.getId(), "id参数错误"); - SysRole where = new SysRole(); - where.setId(sysRole.getId()); - return sysRoleMapper.updateSelective(sysRole, where); - } - - @Override - public int getCount(SysRole sysRole) { - checkStringLength(sysRole, true); - return sysRoleMapper.getCount(sysRole); - } - - @Override - public SysRole getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - SysRole where = new SysRole(); - where.setId(id); - where.setStatus(EnumStatus.NEW.getCode()); - return sysRoleMapper.getOne(where); - } - - @Override - public List getList(SysRole sysRole) { - checkStringLength(sysRole, true); - return sysRoleMapper.getList(sysRole); - } - - @Override - public List getPageList(SysRole sysRole) { - checkStringLength(sysRole, true); - return sysRoleMapper.getPageList(sysRole); - } - - @Override - public void audit(Long id, String operator) { - SysRole req = new SysRole(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.AUDIT.getCode()); - updateSelectiveById(req); - } - - @Override - public void unaudit(Long id, String operator) { - SysRole req = new SysRole(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.NEW.getCode()); - updateSelectiveById(req); - } - - @Override - public void delete(Long id, String operator) { - SysRole req = new SysRole(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.DEL.getCode()); - updateSelectiveById(req); - } - - /** - * 获取当前登陆用户拥有绝角色 - * - * @param userId - * @return - */ - @Override - public List getCurrentUserRole(Long userId) { - SysUserRole sysUserRole = new SysUserRole(); - sysUserRole.setStatus(EnumStatus.NEW.getCode()); - sysUserRole.setSysUserId(userId); - List sysUserRoleList = sysUserRoleService.getList(sysUserRole); - if (CollectionUtils.isEmpty(sysUserRoleList)) { - return null; - } - List sysRoleIdList = sysUserRoleList.stream().map(SysUserRole::getSysRoleId).collect(Collectors.toList()); - SysRole sysRole = new SysRole(); - sysRole.setSysRoleIdList(sysRoleIdList); - List sysRoleList = sysRoleMapper.getList(sysRole); - return sysRoleList; - } - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength(SysRole sysRole, boolean nullAble) { - WJAssert.notNull(sysRole, "入参对象不能为空"); - WJAssert.limitMaxLength(sysRole.getName(), nullAble, 100, "角色名称不合法!"); - WJAssert.limitMaxLength(sysRole.getDescription(), nullAble, 200, "描述不合法!"); - WJAssert.limitMaxLength(sysRole.getOperator(), true, 255, "操作人不合法!"); - WJAssert.limitMaxLength(sysRole.getRemark(), true, 255, "备注不合法!"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserRoleServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserRoleServiceImpl.java deleted file mode 100644 index 2eca55b..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserRoleServiceImpl.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.arm.equipment.system.data.service.system.impl; - -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.domain.system.SysUserRole; -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.mapper.system.ISysUserRoleMapper; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.service.system.ISysUserRoleService; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.vo.system.AddRoleVO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * 系统--用户角色关联表 - * - * @author admin - * @date 2021年10月19日 15:06:59 - */ -@Service -public class SysUserRoleServiceImpl implements ISysUserRoleService { - @Autowired - private ISysUserRoleMapper sysUserRoleMapper; - @Autowired - private IIdWorkerService idWorkerService; - - @Override - public void save(SysUserRole req, String operator) { - req.setOperator(operator); - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective(SysUserRole req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - checkStringLength(req, false); - return sysUserRoleMapper.insertSelective(req); - } - - @Override - public int updateSelectiveById(SysUserRole sysUserRole) { - WJAssert.notNull(sysUserRole, "入参对象不能为空"); - WJAssert.notNull(sysUserRole.getId(), "id参数错误"); - SysUserRole where = new SysUserRole(); - where.setId(sysUserRole.getId()); - return sysUserRoleMapper.updateSelective(sysUserRole, where); - } - - @Override - public int getCount(SysUserRole sysUserRole) { - checkStringLength(sysUserRole, true); - return sysUserRoleMapper.getCount(sysUserRole); - } - - @Override - public SysUserRole getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - SysUserRole where = new SysUserRole(); - where.setId(id); - return sysUserRoleMapper.getOne(where); - } - - @Override - public List getList(SysUserRole sysUserRole) { - checkStringLength(sysUserRole, true); - return sysUserRoleMapper.getList(sysUserRole); - } - - @Override - public List getPageList(SysUserRole sysUserRole) { - checkStringLength(sysUserRole, true); - return sysUserRoleMapper.getPageList(sysUserRole); - } - - @Override - public void delete(Long id, String operator) { - SysUserRole req = new SysUserRole(); - req.setId(id); - req.setOperator(operator); - updateSelectiveById(req); - } - - /** - * 为用户分配角色 - * - * @param addRoleVO - * @param currentUser - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void addRole(AddRoleVO addRoleVO, SysUser currentUser) { - List newRoleList = addRoleVO.getNewRole(); - if (null == addRoleVO.getUserId()) { - throw new BusinessException("新增角色ID或用户ID不能为空"); - } - sysUserRoleMapper.deleteByUserId(addRoleVO.getUserId()); - newRoleList.stream().forEach(item -> { - SysUserRole req = new SysUserRole(); - req.setSysRoleId(item); - req.setOperator(currentUser.getName()); - req.setSysUserId(addRoleVO.getUserId()); - insertSelective(req); - }); - } - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength(SysUserRole sysUserRole, boolean nullAble) { - WJAssert.notNull(sysUserRole, "入参对象不能为空"); - WJAssert.limitMaxLength(sysUserRole.getOperator(), nullAble, 50, "执行者不合法!"); - WJAssert.limitMaxLength(sysUserRole.getRemark(), true, 255, "备注不合法!"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserServiceImpl.java deleted file mode 100644 index 26f4c03..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserServiceImpl.java +++ /dev/null @@ -1,254 +0,0 @@ -package com.arm.equipment.system.data.service.system.impl; - -import com.arm.equipment.system.data.constant.RedisKeys; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.mapper.system.ISysUserMapper; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.service.system.ISysUserService; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.util.passwordEncoder.BCryptPasswordEncoderUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.servlet.http.HttpSession; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -/** - * 系统--用户表 - * - * @author admin - * @date 2021年10月19日 15:07:06 - */ -@Service -public class SysUserServiceImpl implements ISysUserService { - @Autowired - private ISysUserMapper sysUserMapper; - @Autowired - private IIdWorkerService idWorkerService; - @Autowired - private BCryptPasswordEncoderUtils bCryptPasswordEncoder; - @Autowired - private RedisTemplate redisTemplate; - - - @Override - @Transactional(rollbackFor = Exception.class) - public void save(SysUser req, String operator) { - req.setOperator(operator); - String password = req.getPassword(); - if (StringUtils.isNotBlank(password)) { - req.setPassword(bCryptPasswordEncoder.encode(password)); - } - // 检查用户名 - if (isUsernameExist(req)) { - throw new BusinessException("用户名已存在"); - } - // 检查用户名 - if (isEmailExist(req)) { - throw new BusinessException("邮箱已存在"); - } - // 检查邮箱 - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective(SysUser req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - checkStringLength(req, false); - return sysUserMapper.insertSelective(req); - } - - @Override - public int updateSelectiveById(SysUser sysUser) { - WJAssert.notNull(sysUser, "入参对象不能为空"); - WJAssert.notNull(sysUser.getId(), "id参数错误"); - SysUser where = new SysUser(); - where.setId(sysUser.getId()); - return sysUserMapper.updateSelective(sysUser, where); - } - - @Override - public int getCount(SysUser sysUser) { - checkStringLength(sysUser, true); - return sysUserMapper.getCount(sysUser); - } - - @Override - public SysUser getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - SysUser where = new SysUser(); - where.setId(id); - return sysUserMapper.getOne(where); - } - - @Override - public List getList(SysUser sysUser) { - checkStringLength(sysUser, true); - return sysUserMapper.getList(sysUser); - } - - @Override - public List getPageList(SysUser sysUser) { - checkStringLength(sysUser, true); - return sysUserMapper.getPageList(sysUser) - .parallelStream() - .peek(item -> { - if (StringUtils.isNotBlank(item.getTag())) { - item.setTagList(Arrays.asList(item.getTag().split(","))); - } - }).collect(Collectors.toList()); - } - - - @Override - public SysUser getExitOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - SysUser where = new SysUser(); - where.setStatus(EnumStatus.NEW.getCode()); - where.setId(id); - return sysUserMapper.getOne(where); - } - - @Override - public void delete(Long id, String operator) { - SysUser req = new SysUser(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.DEL.getCode()); - updateSelectiveById(req); - } - - @Override - public SysUser login(SysUser sysUserReq, HttpSession webSession) { - WJAssert.limitMaxLength(sysUserReq.getUsername(), false, 100, "用户名不合法!"); - WJAssert.limitMaxLength(sysUserReq.getPassword(), false, 100, "密码不合法!"); - Object code = webSession.getAttribute("verifyCode_" + sysUserReq.getVerifyCode().toUpperCase()); - //验证码判断 - if (code == null) { - throw new BusinessException("验证码错误"); - } - checkLoginErrorNum(sysUserReq.getUsername()); - - SysUser sysUser = new SysUser(); - sysUser.setUsername(sysUserReq.getUsername()); - SysUser sysUserDB = sysUserMapper.getOne(sysUser); - if (Objects.isNull(sysUserDB) || !bCryptPasswordEncoder.matches(sysUserReq.getPassword(), sysUserDB.getPassword())) { - checkLoginErrorNumByUsername(sysUserReq.getUsername()); - throw new BusinessException("账户不存在或密码错误"); - } - if (Objects.equals(sysUserDB.getStatus(), EnumStatus.DEL.getCode())) { - throw new BusinessException("账户已删除"); - } - return sysUserDB; - } - - @Override - public SysUser thirdLogin(String username, String password) { - checkLoginErrorNum(username); - - SysUser sysUser = new SysUser(); - sysUser.setUsername(username); - SysUser sysUserDB = sysUserMapper.getOne(sysUser); - if (Objects.isNull(sysUserDB) || !bCryptPasswordEncoder.matches(password, sysUserDB.getPassword())) { - checkLoginErrorNumByUsername(username); - throw new BusinessException("用户名或密码错误"); - } - if (Objects.equals(sysUserDB.getStatus(), EnumStatus.DEL.getCode())) { - throw new BusinessException("账户已删除"); - } - return sysUserDB; - } - - /** - * 检查错误次数 - * - * @param username - */ - private void checkLoginErrorNum(String username) { - ValueOperations valueOperations = redisTemplate.opsForValue(); - String key = String.format(RedisKeys.SYS_USER_LOGIN_ERROR_NUM, username); - Object errorNumObj = valueOperations.get(key); - if (errorNumObj != null && Integer.parseInt(errorNumObj.toString()) > 4) { - throw new BusinessException("错误次数过多,请过半小时后再试!"); - } - } - - @Override - public void updatePassword(String oldPassword, String newPassword, Long sysUserId) { - SysUser sysUser = new SysUser(); - sysUser.setId(sysUserId); - SysUser sysUserDB = sysUserMapper.getOne(sysUser); - if (Objects.isNull(sysUserDB) || !bCryptPasswordEncoder.matches(oldPassword, sysUserDB.getPassword())) { - throw new BusinessException("旧密码输入有误!"); - } - sysUserDB.setPassword(bCryptPasswordEncoder.encode(newPassword)); - updateSelectiveById(sysUserDB); - } - - /** - * 验证用户登陆错误次数 - * - * @param username - */ - @Override - public void checkLoginErrorNumByUsername(String username) { - String key = String.format(RedisKeys.SYS_USER_LOGIN_ERROR_NUM, username); - ValueOperations valueOperations = redisTemplate.opsForValue(); - Object errorNumObj = valueOperations.get(key); - int errorNum = 1; - if (errorNumObj != null) { - errorNum += Integer.parseInt(errorNumObj.toString()); - } - valueOperations.set(key, String.valueOf(errorNum), 30, TimeUnit.MINUTES); - if (errorNum > 4) { - throw new BusinessException("错误次数过多,请过半小时后再试!"); - } - } - - private boolean isEmailExist(SysUser sysUserReq) { - return getOneByEmail(sysUserReq.getEmail()).map(item -> !item.getId().equals(sysUserReq.getId())).orElse(false); - } - - private Boolean isUsernameExist(SysUser sysUserReq) { - return getOneByUsername(sysUserReq.getUsername()).map(item -> !item.getId().equals(sysUserReq.getId())).orElse(false); - } - - private Optional getOneByUsername(String username) { - SysUser req = new SysUser(); - req.setUsername(username); - return Optional.ofNullable(sysUserMapper.getOne(req)); - } - - private Optional getOneByEmail(String email) { - SysUser req = new SysUser(); - req.setEmail(email); - return Optional.ofNullable(sysUserMapper.getOne(req)); - } - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength(SysUser sysUser, boolean nullAble) { - WJAssert.notNull(sysUser, "入参对象不能为空"); - WJAssert.limitMaxLength(sysUser.getUsername(), nullAble, 100, "用户名不合法!"); - WJAssert.limitMaxLength(sysUser.getPassword(), nullAble, 100, "密码不合法!"); - WJAssert.limitMaxLength(sysUser.getPhone(), true, 20, "手机不合法!"); - WJAssert.limitMaxLength(sysUser.getName(), true, 50, "姓名不合法!"); - WJAssert.limitMaxLength(sysUser.getEmail(), true, 100, "邮箱不合法!"); - WJAssert.limitMaxLength(sysUser.getOperator(), nullAble, 50, "操作人不合法!"); - WJAssert.limitMaxLength(sysUser.getRemark(), true, 255, "备注不合法!"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/IAppUserService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/IAppUserService.java deleted file mode 100644 index e777073..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/IAppUserService.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.arm.equipment.system.data.service.user; - -import com.arm.equipment.system.data.domain.user.AppUser; - -import java.util.List; - -/** - * APP用户 - * - * @author admin - * @date 2023年03月13日 22:34:47 - */ -public interface IAppUserService { - /** - * 保存或更新 - * @param req - */ - void save(AppUser req, String operator); - - /** - * 插入 - * - * @param appUser appUser - * @return int - */ - int insertSelective(AppUser appUser); - - /** - * 主键更新 - * - * @param appUser appUser - * @return int - */ - int updateSelectiveById(AppUser appUser); - - /** - * 数量 - * - * @param appUser appUser - * @return int - */ - int getCount(AppUser appUser); - - /** - * 主键查询 - * - * @param id id - * @return AppUser - */ - AppUser getOneById(Long id); - - /** - * 多条 - * - * @param appUser appUser - * @return List - */ - List getList(AppUser appUser); - - /** - * 分页 - * - * @param appUser appUser - * @return List - */ - List getPageList(AppUser appUser); - - /** - * 审核 - * @param id - * @param operator - */ - void audit(Long id, String operator); - - /** - * 取消审核 - * @param id - * @param operator - */ - void unaudit(Long id, String operator); - - /** - * 删除 - * @param id - * @param operator - */ - void delete(Long id, String operator); - - /** - * 登录 - * @param req - * @return - */ - AppUser login(AppUser req); - - /** - * 注册 - * @param req - */ - void saveUser(AppUser req); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/impl/AppUserServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/impl/AppUserServiceImpl.java deleted file mode 100644 index 2ef4f1d..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/impl/AppUserServiceImpl.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.arm.equipment.system.data.service.user.impl; - -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.mapper.user.IAppUserMapper; -import com.arm.equipment.system.data.domain.user.AppUser; -import com.arm.equipment.system.data.service.user.IAppUserService; -import com.arm.equipment.system.data.util.passwordEncoder.BCryptPasswordEncoderUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Date; -import java.util.List; -import java.util.Objects; - -/** - * APP用户 - * - * @author admin - * @date 2023年03月13日 22:34:47 - */ -@Service -public class AppUserServiceImpl implements IAppUserService { - @Autowired - private IAppUserMapper appUserMapper; - @Autowired - private IIdWorkerService idWorkerService; - @Autowired - private BCryptPasswordEncoderUtils bCryptPasswordEncoder; - - @Override - public void save(AppUser req, String operator) { - req.setOperator(operator); - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective(AppUser req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - checkStringLength(req, false); - return appUserMapper.insertSelective(req); - } - - @Override - public int updateSelectiveById(AppUser appUser) { - WJAssert.notNull(appUser, "入参对象不能为空"); - WJAssert.notNull(appUser.getId(), "id参数错误"); - AppUser where = new AppUser(); - where.setId(appUser.getId()); - return appUserMapper.updateSelective(appUser, where); - } - - @Override - public int getCount(AppUser appUser) { - checkStringLength(appUser, true); - return appUserMapper.getCount(appUser); - } - - - private boolean getCountByPhone(String phone) { - WJAssert.notBlank(phone, "手机号非法"); - AppUser appUser = new AppUser(); - appUser.setPhone(phone); - return appUserMapper.getCount(appUser) > 0; - } - - private boolean getCountByUsername(String username) { - WJAssert.notBlank(username, "用户名非法"); - AppUser appUser = new AppUser(); - appUser.setUsername(username); - return appUserMapper.getCount(appUser) > 0; - } - - @Override - public AppUser getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - AppUser where = new AppUser(); - where.setId(id); - return appUserMapper.getOne(where); - } - - @Override - public List getList(AppUser appUser) { - checkStringLength(appUser, true); - return appUserMapper.getList(appUser); - } - - @Override - public List getPageList(AppUser appUser) { - checkStringLength(appUser, true); - return appUserMapper.getPageList(appUser); - } - - @Override - public void audit(Long id, String operator) { - AppUser req = new AppUser(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.AUDIT.getCode()); - updateSelectiveById(req); - } - - @Override - public void unaudit(Long id, String operator) { - AppUser req = new AppUser(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.NEW.getCode()); - updateSelectiveById(req); - } - - @Override - public void delete(Long id, String operator) { - AppUser req = new AppUser(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.DEL.getCode()); - updateSelectiveById(req); - } - - @Override - public AppUser login(AppUser req) { - WJAssert.notBlank(req.getUsername(), "账号非法"); - WJAssert.notBlank(req.getPassword(), "密码非法吗"); - AppUser where = new AppUser(); - where.setUsername(req.getUsername()); - AppUser appUserDB = appUserMapper.getOne(where); - if (Objects.isNull(appUserDB) || !bCryptPasswordEncoder.matches(req.getPassword(), appUserDB.getPassword())) { - throw new BusinessException("账户不存在或密码错误"); - } - appUserDB.setPassword(null); - appUserDB.setLoginTime(new Date()); - updateSelectiveById(appUserDB); - return appUserDB; - } - - @Override - public void saveUser(AppUser req) { - checkStringLength(req, false); - req.setPassword(bCryptPasswordEncoder.encode(req.getPassword())); - // 检查用户名 - if (getCountByPhone(req.getPhone())) { - throw new BusinessException("用户名已存在"); - } - // 检查用户名 - if (getCountByUsername(req.getUsername())) { - throw new BusinessException("登录账号已存在"); - } - req.setId(null); - req.setLoginTime(new Date()); - insertSelective(req); - } - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength(AppUser appUser, boolean nullAble) { - WJAssert.notNull(appUser, "入参对象不能为空"); - WJAssert.limitMaxLength(appUser.getNickname(), nullAble, 50, "用户昵称不合法!"); - WJAssert.limitMaxLength(appUser.getUsername(), nullAble, 20, "登录账号不合法!"); - WJAssert.limitMaxLength(appUser.getPassword(), nullAble, 100, "密码不合法!"); - WJAssert.limitMaxLength(appUser.getPhone(), nullAble, 11, "手机号不合法!"); - WJAssert.limitMaxLength(appUser.getRemark(), true, 255, "备注不合法!"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryLendRecordService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryLendRecordService.java deleted file mode 100644 index fa4d74f..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryLendRecordService.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.arm.equipment.system.data.service.weaponry; - -import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord; - -import java.util.List; - -/** - * 装备武器借出记录 - * - * @author admin - * @date 2023年03月23日 09:20:19 - */ -public interface IWeaponryLendRecordService { - /** - * 保存或更新 - * - * @param req - */ - void save(WeaponryLendRecord req, String operator); - - /** - * 插入 - * - * @param weaponryLendRecord weaponryLendRecord - * @return int - */ - int insertSelective(WeaponryLendRecord weaponryLendRecord); - - /** - * 主键更新 - * - * @param weaponryLendRecord weaponryLendRecord - * @return int - */ - int updateSelectiveById(WeaponryLendRecord weaponryLendRecord); - - /** - * 数量 - * - * @param weaponryLendRecord weaponryLendRecord - * @return int - */ - int getCount(WeaponryLendRecord weaponryLendRecord); - - /** - * 主键查询 - * - * @param id id - * @return WeaponryLendRecord - */ - WeaponryLendRecord getOneById(Long id); - - /** - * 多条 - * - * @param weaponryLendRecord weaponryLendRecord - * @return List - */ - List getList(WeaponryLendRecord weaponryLendRecord); - - /** - * 分页 - * - * @param weaponryLendRecord weaponryLendRecord - * @return List - */ - List getPageList(WeaponryLendRecord weaponryLendRecord); - - /** - * 审核拒绝 - * - * @param id - * @param operator - */ - void refuse(Long id, String operator); - - /** - * 审核通过 - * - * @param id - * @param operator - */ - void adopt(Long id, String operator); - - /** - * 删除 - * - * @param id - * @param operator - */ - void delete(Long id, String operator); - - /** - * 借出 - * - * @param req - */ - void saveLend(WeaponryLendRecord req); - - /** - * 获取未归还得总数 - * - * @param weaponryId - * @return - */ - int getCountByWeaponryId(Long weaponryId); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryReturnRecordService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryReturnRecordService.java deleted file mode 100644 index 5094597..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryReturnRecordService.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.arm.equipment.system.data.service.weaponry; - -import com.arm.equipment.system.data.domain.weaponry.WeaponryReturnRecord; - -import java.util.List; - -/** - * 装备武器归还记录 - * - * @author admin - * @date 2023年03月23日 09:20:25 - */ -public interface IWeaponryReturnRecordService { - /** - * 保存或更新 - * - * @param req - */ - void save(WeaponryReturnRecord req, String operator); - - /** - * 插入 - * - * @param weaponryReturnRecord weaponryReturnRecord - * @return int - */ - int insertSelective(WeaponryReturnRecord weaponryReturnRecord); - - /** - * 主键更新 - * - * @param weaponryReturnRecord weaponryReturnRecord - * @return int - */ - int updateSelectiveById(WeaponryReturnRecord weaponryReturnRecord); - - /** - * 数量 - * - * @param weaponryReturnRecord weaponryReturnRecord - * @return int - */ - int getCount(WeaponryReturnRecord weaponryReturnRecord); - - /** - * 主键查询 - * - * @param id id - * @return WeaponryReturnRecord - */ - WeaponryReturnRecord getOneById(Long id); - - /** - * 多条 - * - * @param weaponryReturnRecord weaponryReturnRecord - * @return List - */ - List getList(WeaponryReturnRecord weaponryReturnRecord); - - /** - * 分页 - * - * @param weaponryReturnRecord weaponryReturnRecord - * @return List - */ - List getPageList(WeaponryReturnRecord weaponryReturnRecord); - - /** - * 审核 - * - * @param id - * @param operator - */ - void audit(Long id, String operator); - - /** - * 取消审核 - * - * @param id - * @param operator - */ - void unaudit(Long id, String operator); - - /** - * 删除 - * - * @param id - * @param operator - */ - void delete(Long id, String operator); - - /** - * 保存退还记录 - * - * @param lendRecordId - */ - void saveReturn(Long lendRecordId); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryService.java deleted file mode 100644 index fc31ffb..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryService.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.arm.equipment.system.data.service.weaponry; - -import com.arm.equipment.system.data.domain.weaponry.Weaponry; - -import java.util.List; - -/** - * 装备武器 - * - * @author admin - * @date 2023年03月23日 10:29:48 - */ -public interface IWeaponryService { - /** - * 保存或更新 - * @param req - */ - void save(Weaponry req, String operator); - - /** - * 插入 - * - * @param weaponry weaponry - * @return int - */ - int insertSelective(Weaponry weaponry); - - /** - * 主键更新 - * - * @param weaponry weaponry - * @return int - */ - int updateSelectiveById(Weaponry weaponry); - - /** - * 数量 - * - * @param weaponry weaponry - * @return int - */ - int getCount(Weaponry weaponry); - - /** - * 主键查询 - * - * @param id id - * @return Weaponry - */ - Weaponry getOneById(Long id); - - /** - * 多条 - * - * @param weaponry weaponry - * @return List - */ - List getList(Weaponry weaponry); - - /** - * 分页 - * - * @param weaponry weaponry - * @return List - */ - List getPageList(Weaponry weaponry); - - /** - * 审核 - * @param id - * @param operator - */ - void audit(Long id, String operator); - - /** - * 取消审核 - * @param id - * @param operator - */ - void unaudit(Long id, String operator); - - /** - * 删除 - * @param id - * @param operator - */ - void delete(Long id, String operator); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryLendRecordServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryLendRecordServiceImpl.java deleted file mode 100644 index 51bffa0..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryLendRecordServiceImpl.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.arm.equipment.system.data.service.weaponry.impl; - -import com.arm.equipment.system.data.domain.weaponry.Weaponry; -import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord; -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.enums.dict.EnumWeaponryLendRecordReturnStatus; -import com.arm.equipment.system.data.enums.dict.EnumWeaponryLendRecordStatus; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.mapper.weaponry.IWeaponryLendRecordMapper; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.service.weaponry.IWeaponryLendRecordService; -import com.arm.equipment.system.data.service.weaponry.IWeaponryService; -import com.arm.equipment.system.data.util.WJAssert; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * 装备武器借出记录 - * - * @author admin - * @date 2023年03月23日 09:20:19 - */ -@Service -public class WeaponryLendRecordServiceImpl implements IWeaponryLendRecordService { - @Autowired - private IWeaponryLendRecordMapper weaponryLendRecordMapper; - @Autowired - private IIdWorkerService idWorkerService; - @Autowired - private IWeaponryService weaponryService; - - @Override - public void save(WeaponryLendRecord req, String operator) { - req.setOperator(operator); - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective(WeaponryLendRecord req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - checkStringLength(req, false); - return weaponryLendRecordMapper.insertSelective(req); - } - - @Override - public int updateSelectiveById(WeaponryLendRecord weaponryLendRecord) { - WJAssert.notNull(weaponryLendRecord, "入参对象不能为空"); - WJAssert.notNull(weaponryLendRecord.getId(), "id参数错误"); - WeaponryLendRecord where = new WeaponryLendRecord(); - where.setId(weaponryLendRecord.getId()); - return weaponryLendRecordMapper.updateSelective(weaponryLendRecord, where); - } - - @Override - public int getCount(WeaponryLendRecord weaponryLendRecord) { - checkStringLength(weaponryLendRecord, true); - return weaponryLendRecordMapper.getCount(weaponryLendRecord); - } - - @Override - public WeaponryLendRecord getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - WeaponryLendRecord where = new WeaponryLendRecord(); - where.setId(id); - return weaponryLendRecordMapper.getOne(where); - } - - @Override - public List getList(WeaponryLendRecord weaponryLendRecord) { - checkStringLength(weaponryLendRecord, true); - return weaponryLendRecordMapper.getList(weaponryLendRecord); - } - - @Override - public List getPageList(WeaponryLendRecord weaponryLendRecord) { - checkStringLength(weaponryLendRecord, true); - return weaponryLendRecordMapper.getPageList(weaponryLendRecord) - .parallelStream() - .peek(item -> { - Weaponry weaponryDB = weaponryService.getOneById(item.getWeaponryId()); - item.setWeaponry(weaponryDB); - }).collect(Collectors.toList()); - } - - /** - * 拒绝 - * - * @param id - * @param operator - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void refuse(Long id, String operator) { - WeaponryLendRecord req = new WeaponryLendRecord(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumWeaponryLendRecordStatus.REFUSE.getCode()); - updateSelectiveById(req); - - //拒绝通过 归还锁定库存 - WeaponryLendRecord weaponryLendRecordDB = getOneById(id); - Weaponry weaponryDB = weaponryService.getOneById(weaponryLendRecordDB.getWeaponryId()); - weaponryDB.setLockInventory(weaponryDB.getLockInventory() - weaponryLendRecordDB.getNum()); - weaponryService.updateSelectiveById(weaponryDB); - - } - - /** - * 通过 - * - * @param id - * @param operator - */ - @Override - public void adopt(Long id, String operator) { - WeaponryLendRecord req = new WeaponryLendRecord(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumWeaponryLendRecordStatus.ADOPT.getCode()); - updateSelectiveById(req); - } - - @Override - public void delete(Long id, String operator) { - WeaponryLendRecord req = new WeaponryLendRecord(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.DEL.getCode()); - updateSelectiveById(req); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void saveLend(WeaponryLendRecord req) { - WJAssert.notNull(req.getNum(), "数量非法"); - WJAssert.notNull(req.getReturnTime(), "归还时间非法"); - WJAssert.notNull(req.getWeaponryId(), "装备非法"); - if (req.getNum() < 0) { - throw new BusinessException("数量非法"); - } - Weaponry weaponryDB = Optional.ofNullable(weaponryService.getOneById(req.getWeaponryId())) - .orElseThrow(() -> new BusinessException("装备不存在")); - //剩余库存 = 总库存 - 锁定库存 - if ((weaponryDB.getTotalInventory() - weaponryDB.getLockInventory()) < req.getNum()) { - throw new BusinessException("库存不足"); - } - req.setWeaponryName(weaponryDB.getName()); - insertSelective(req); - - //增加锁定库存 - weaponryDB.setLockInventory(weaponryDB.getLockInventory() + req.getNum()); - weaponryService.updateSelectiveById(weaponryDB); - } - - @Override - public int getCountByWeaponryId(Long weaponryId) { - WeaponryLendRecord where = new WeaponryLendRecord(); - where.setWeaponryId(weaponryId); - where.setReturnStatus(EnumWeaponryLendRecordReturnStatus.NOT_RETURN.getCode()); - where.setStatus(EnumWeaponryLendRecordStatus.ADOPT.getCode()); - return getCount(where); - } - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength(WeaponryLendRecord weaponryLendRecord, boolean nullAble) { - WJAssert.notNull(weaponryLendRecord, "入参对象不能为空"); - WJAssert.limitMaxLength(weaponryLendRecord.getRemark(), true, 255, "备注不合法!"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryReturnRecordServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryReturnRecordServiceImpl.java deleted file mode 100644 index e9a90c3..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryReturnRecordServiceImpl.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.arm.equipment.system.data.service.weaponry.impl; - -import com.arm.equipment.system.data.domain.weaponry.Weaponry; -import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord; -import com.arm.equipment.system.data.domain.weaponry.WeaponryReturnRecord; -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.enums.dict.EnumWeaponryLendRecordReturnStatus; -import com.arm.equipment.system.data.enums.dict.EnumWeaponryLendRecordStatus; -import com.arm.equipment.system.data.exception.BusinessException; -import com.arm.equipment.system.data.mapper.weaponry.IWeaponryReturnRecordMapper; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.service.weaponry.IWeaponryLendRecordService; -import com.arm.equipment.system.data.service.weaponry.IWeaponryReturnRecordService; -import com.arm.equipment.system.data.service.weaponry.IWeaponryService; -import com.arm.equipment.system.data.util.WJAssert; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * 装备武器归还记录 - * - * @author admin - * @date 2023年03月23日 09:20:25 - */ -@Service -public class WeaponryReturnRecordServiceImpl implements IWeaponryReturnRecordService { - @Autowired - private IWeaponryReturnRecordMapper weaponryReturnRecordMapper; - @Autowired - private IIdWorkerService idWorkerService; - @Autowired - private IWeaponryLendRecordService weaponryLendRecordService; - @Autowired - private IWeaponryService weaponryService; - - @Override - public void save(WeaponryReturnRecord req, String operator) { - req.setOperator(operator); - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective(WeaponryReturnRecord req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - checkStringLength(req, false); - return weaponryReturnRecordMapper.insertSelective(req); - } - - @Override - public int updateSelectiveById(WeaponryReturnRecord weaponryReturnRecord) { - WJAssert.notNull(weaponryReturnRecord, "入参对象不能为空"); - WJAssert.notNull(weaponryReturnRecord.getId(), "id参数错误"); - WeaponryReturnRecord where = new WeaponryReturnRecord(); - where.setId(weaponryReturnRecord.getId()); - return weaponryReturnRecordMapper.updateSelective(weaponryReturnRecord, where); - } - - @Override - public int getCount(WeaponryReturnRecord weaponryReturnRecord) { - checkStringLength(weaponryReturnRecord, true); - return weaponryReturnRecordMapper.getCount(weaponryReturnRecord); - } - - @Override - public WeaponryReturnRecord getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - WeaponryReturnRecord where = new WeaponryReturnRecord(); - where.setId(id); - return weaponryReturnRecordMapper.getOne(where); - } - - @Override - public List getList(WeaponryReturnRecord weaponryReturnRecord) { - checkStringLength(weaponryReturnRecord, true); - return weaponryReturnRecordMapper.getList(weaponryReturnRecord); - } - - @Override - public List getPageList(WeaponryReturnRecord weaponryReturnRecord) { - checkStringLength(weaponryReturnRecord, true); - return weaponryReturnRecordMapper.getPageList(weaponryReturnRecord) - .parallelStream() - .peek(item -> { - Weaponry weaponryDB = weaponryService.getOneById(item.getWeaponryId()); - item.setWeaponry(weaponryDB); - }).collect(Collectors.toList()); - } - - @Override - public void audit(Long id, String operator) { - WeaponryReturnRecord req = new WeaponryReturnRecord(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.AUDIT.getCode()); - updateSelectiveById(req); - } - - @Override - public void unaudit(Long id, String operator) { - WeaponryReturnRecord req = new WeaponryReturnRecord(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.NEW.getCode()); - updateSelectiveById(req); - } - - @Override - public void delete(Long id, String operator) { - WeaponryReturnRecord req = new WeaponryReturnRecord(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.DEL.getCode()); - updateSelectiveById(req); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void saveReturn(Long lendRecordId) { - WJAssert.notNull(lendRecordId, "ID非法"); - WeaponryLendRecord weaponryLendRecordDB = Optional.ofNullable(weaponryLendRecordService.getOneById(lendRecordId)) - .orElseThrow(() -> new BusinessException("借出记录不存在")); - if (!EnumWeaponryLendRecordStatus.ADOPT.getCode().equals(weaponryLendRecordDB.getStatus()) - || !EnumWeaponryLendRecordReturnStatus.NOT_RETURN.getCode().equals(weaponryLendRecordDB.getReturnStatus())) { - throw new BusinessException("数据非法"); - } - WeaponryReturnRecord req = new WeaponryReturnRecord(); - req.setWeaponryId(weaponryLendRecordDB.getWeaponryId()); - req.setLendRecordId(weaponryLendRecordDB.getId()); - req.setNum(weaponryLendRecordDB.getNum()); - req.setReturnTime(weaponryLendRecordDB.getReturnTime()); - req.setWeaponryName(weaponryLendRecordDB.getWeaponryName()); - insertSelective(req); - - //修改借出归还状态 - weaponryLendRecordDB.setReturnStatus(EnumWeaponryLendRecordReturnStatus.RETURN.getCode()); - weaponryLendRecordService.updateSelectiveById(weaponryLendRecordDB); - - //扣除锁定库存 - Weaponry weaponryDB = Optional.ofNullable(weaponryService.getOneById(weaponryLendRecordDB.getWeaponryId())) - .orElseThrow(() -> new BusinessException("武器不存在")); - weaponryDB.setLockInventory(weaponryDB.getLockInventory() - weaponryLendRecordDB.getNum()); - weaponryService.updateSelectiveById(weaponryDB); - } - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength(WeaponryReturnRecord weaponryReturnRecord, boolean nullAble) { - WJAssert.notNull(weaponryReturnRecord, "入参对象不能为空"); - WJAssert.limitMaxLength(weaponryReturnRecord.getRemark(), true, 255, "备注不合法!"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryServiceImpl.java deleted file mode 100644 index 2ae92ee..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryServiceImpl.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.arm.equipment.system.data.service.weaponry.impl; - -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import com.arm.equipment.system.data.mapper.weaponry.IWeaponryMapper; -import com.arm.equipment.system.data.domain.weaponry.Weaponry; -import com.arm.equipment.system.data.service.weaponry.IWeaponryService; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 装备武器 - * - * @author admin - * @date 2023年03月23日 10:29:48 - */ -@Service -public class WeaponryServiceImpl implements IWeaponryService { - @Autowired - private IWeaponryMapper weaponryMapper; - @Autowired - private IIdWorkerService idWorkerService; - - @Override - public void save(Weaponry req, String operator) { - req.setOperator(operator); - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective(Weaponry req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - checkStringLength(req, false); - return weaponryMapper.insertSelective(req); - } - - @Override - public int updateSelectiveById(Weaponry weaponry) { - WJAssert.notNull(weaponry, "入参对象不能为空"); - WJAssert.notNull(weaponry.getId(), "id参数错误"); - Weaponry where = new Weaponry(); - where.setId(weaponry.getId()); - return weaponryMapper.updateSelective(weaponry, where); - } - - @Override - public int getCount(Weaponry weaponry) { - checkStringLength(weaponry, true); - return weaponryMapper.getCount(weaponry); - } - - @Override - public Weaponry getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - Weaponry where = new Weaponry(); - where.setId(id); - return weaponryMapper.getOne(where); - } - - @Override - public List getList(Weaponry weaponry) { - checkStringLength(weaponry, true); - return weaponryMapper.getList(weaponry); - } - - @Override - public List getPageList(Weaponry weaponry) { - checkStringLength(weaponry, true); - return weaponryMapper.getPageList(weaponry); - } - - @Override - public void audit(Long id, String operator) { - Weaponry req = new Weaponry(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.AUDIT.getCode()); - updateSelectiveById(req); - } - - @Override - public void unaudit(Long id, String operator) { - Weaponry req = new Weaponry(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.NEW.getCode()); - updateSelectiveById(req); - } - - @Override - public void delete(Long id, String operator) { - Weaponry req = new Weaponry(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.DEL.getCode()); - updateSelectiveById(req); - } - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength(Weaponry weaponry, boolean nullAble) { - WJAssert.notNull(weaponry, "入参对象不能为空"); - WJAssert.limitMaxLength(weaponry.getName(), nullAble, 50, "武器名称不合法!"); - WJAssert.limitMaxLength(weaponry.getImgPath(), nullAble, 200, "武器封面不合法!"); - WJAssert.limitMaxLength(weaponry.getRemark(), true, 255, "备注不合法!"); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/AesUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/AesUtil.java deleted file mode 100644 index d67e9e7..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/AesUtil.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.arm.equipment.system.data.util; - -import org.bouncycastle.util.encoders.Hex; -import sun.misc.BASE64Decoder; - -import javax.crypto.Cipher; -import javax.crypto.spec.SecretKeySpec; - -/** - * Aes 加密/解密工具类 - */ -public class AesUtil { - - private static final String ALGORITHM = "AES"; - private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding"; - - - public String encrypt(String input, String key) { - byte[] decodeKey = Hex.decode(key); - byte[] crypted = null; - try { - SecretKeySpec skey = new SecretKeySpec(decodeKey, ALGORITHM); - Cipher cipher = Cipher.getInstance(TRANSFORMATION); - cipher.init(Cipher.ENCRYPT_MODE, skey); - crypted = cipher.doFinal(input.getBytes()); - } catch (Exception e) { - System.out.println(e.toString()); - } - return parseByte2HexStr(crypted); - - } - - /** - * 解密 - * - * @param content 原文 - * @param key 安全key - * @param platform 平台 @see EnumPlatform - * @return - * @throws Exception - */ - public static String decrypt(String content, String key, Integer platform) throws Exception { - content = new String(new BASE64Decoder().decodeBuffer(content)); - Cipher cipher = Cipher.getInstance(TRANSFORMATION); - byte[] keyBytes = key.getBytes(); - SecretKeySpec sk = new SecretKeySpec(keyBytes, "AES"); - //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY - cipher.init(Cipher.DECRYPT_MODE, sk); - byte[] bytes = parseHexStr2Byte(content); - byte[] decode = cipher.doFinal(bytes); - return new String(decode, "utf-8"); - } - - private static byte[] parseHexStr2Byte(String hexStr) { - if (hexStr.length() < 1) { - return null; - } - byte[] result = new byte[hexStr.length() / 2]; - for (int i = 0; i < hexStr.length() / 2; i++) { - int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16); - int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16); - result[i] = (byte) (high * 16 + low); - } - return result; - - } - - private static String parseByte2HexStr(byte buf[]) { - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < buf.length; i++) { - String hex = Integer.toHexString(buf[i] & 0xFF); - if (hex.length() == 1) { - hex = '0' + hex; - } - sb.append(hex.toUpperCase()); - } - return sb.toString(); - - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/BeanUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/BeanUtil.java deleted file mode 100644 index 97d2dd4..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/BeanUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.arm.equipment.system.data.util; - -import org.springframework.beans.BeanWrapper; -import org.springframework.beans.BeanWrapperImpl; - -import java.util.HashSet; -import java.util.Set; - -/** - * @author admin - */ -public class BeanUtil { - - /** - * 获得对象里是null的属性 - * @param source - * @return - */ - public static String[] getNullPropertyNames (Object source) { - final BeanWrapper src = new BeanWrapperImpl(source); - java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors(); - - Set emptyNames = new HashSet(); - for(java.beans.PropertyDescriptor pd : pds) { - Object srcValue = src.getPropertyValue(pd.getName()); - if (srcValue == null){ - emptyNames.add(pd.getName()); - } - } - String[] result = new String[emptyNames.size()]; - return emptyNames.toArray(result); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DATAUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DATAUtil.java deleted file mode 100644 index 556579d..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DATAUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.arm.equipment.system.data.util; - -import org.springframework.dao.DataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.util.UUID; - -/** - * 基础数据单元 - * - * Update by xy on 2017/4/27. - */ -public class DATAUtil { - - /** - * 获得查询分页总页数 - * - * @param sql - * @param jdbcTemplate - * @param pageSize - * @return - */ - public static final int getPageCount(String sql, JdbcTemplate jdbcTemplate, int pageSize, Object... objects) { - try { - Integer totalCount = jdbcTemplate.queryForObject(sql, objects, Integer.class); - int pageCount = (totalCount - 1) / pageSize; - return pageCount + 1; - } catch (DataAccessException e) { - return 0; - } - } - - /** - * 获取页总数 - * @param totalCount - * @param pageSize - * @return - */ - public static int getPageCount(int totalCount, int pageSize) { - int pageCount = (totalCount - 1) / pageSize; - return pageCount + 1; - } - - /** - * 获取UUID - * - * @return - */ - public static String uuid() { - return UUID.randomUUID().toString().replace("-", ""); - } - - /** - * 生成六位随机数 - * - * @return - */ - public static String getCode() { - String code = Math.round(Math.random() * 1000000) + ""; - if (code.length() < 6) { - code = ((1+ Math.round(Math.random())) * 100000) +""; - //生成一个以1开头的6位数 - } - code = code.substring(0,6);//防止第一次生成code时,round方法对六个9四舍五入导致可能超过6位的情况 - return code; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DateUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DateUtils.java deleted file mode 100644 index 571f585..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DateUtils.java +++ /dev/null @@ -1,343 +0,0 @@ -package com.arm.equipment.system.data.util; - -import org.apache.commons.lang.time.DateFormatUtils; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.List; - -/** - * 日期工具类, 继承org.apache.commons.lang.time.DateUtils类 - */ -public class DateUtils extends org.apache.commons.lang.time.DateUtils { - /** - * 中文月份数组 - */ - public static final String[] NUM_ARRAY = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"}; - - 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", - "yyyy-MM-dd HH"}; - - /** - * 得到当前日期字符串 格式(yyyy-MM-dd) - */ - public static String getDate() { - return getDate("yyyy-MM-dd"); - } - - /** - * 得到当前日期字符串 格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E" - */ - public static String getDate(String pattern) { - return DateFormatUtils.format(new Date(), pattern); - } - - /** - * 得到日期字符串 默认格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E" - */ - public static String formatDate(Date date, Object... pattern) { - String formatDate = null; - if (pattern != null && pattern.length > 0) { - formatDate = DateFormatUtils.format(date, pattern[0].toString()); - } else { - formatDate = DateFormatUtils.format(date, "yyyy-MM-dd"); - } - return formatDate; - } - - /** - * 得到日期时间字符串,转换格式(yyyy-MM-dd HH:mm:ss) - */ - public static String formatDateTime(Date date) { - return formatDate(date, "yyyy-MM-dd HH:mm:ss"); - } - - /** - * 得到当前时间字符串 格式(HH:mm:ss) - */ - public static String getTime() { - return formatDate(new Date(), "HH:mm:ss"); - } - - /** - * 得到当前日期和时间字符串 格式(yyyy-MM-dd HH:mm:ss) - */ - public static String getDateTime() { - return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"); - } - - /** - * 得到当前年份字符串 格式(yyyy) - */ - public static String getYear() { - return formatDate(new Date(), "yyyy"); - } - - /** - * 得到当前月份字符串 格式(MM) - */ - public static String getMonth() { - return formatDate(new Date(), "MM"); - } - - /** - * 得到当天字符串 格式(dd) - */ - public static String getDay() { - return formatDate(new Date(), "dd"); - } - - /** - * 得到当前星期字符串 格式(E)星期几 - */ - public static String getWeek() { - return formatDate(new Date(), "E"); - } - - /** - * 日期型字符串转化为日期 格式 - * { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", - * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", - * "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" } - */ - public static Date parseDate(Object str) { - if (str == null) { - return null; - } - try { - return parseDate(str.toString(), parsePatterns); - } catch (ParseException e) { - return null; - } - } - - /** - * 获取过去的天数 - * - * @param date - * @return - */ - public static long pastDays(Date date) { - long t = new Date().getTime() - date.getTime(); - return t / (24 * 60 * 60 * 1000); - } - - /** - * 获取过去的小时 - * - * @param date - * @return - */ - public static long pastHour(Date date) { - long t = new Date().getTime() - date.getTime(); - return t / (60 * 60 * 1000); - } - - /** - * 获取过去的分钟 - * - * @param date - * @return - */ - public static long pastMinutes(Date date) { - long t = new Date().getTime() - date.getTime(); - return t / (60 * 1000); - } - - /** - * 转换为时间(天,时:分:秒.毫秒) - * - * @param timeMillis - * @return - */ - public static String formatDateTime(long timeMillis) { - long day = timeMillis / (24 * 60 * 60 * 1000); - long hour = (timeMillis / (60 * 60 * 1000) - day * 24); - long min = ((timeMillis / (60 * 1000)) - day * 24 * 60 - hour * 60); - long s = (timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); - long sss = (timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000); - return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "." + sss; - } - - /** - * 获取两个日期之间的天数 - * - * @param before - * @param after - * @return - */ - public static double getDistanceOfTwoDate(Date before, Date after) { - long beforeTime = before.getTime(); - long afterTime = after.getTime(); - return (afterTime - beforeTime) / (1000 * 60 * 60 * 24); - } - - /** - * 获取在当前时间往后增加指定天数的Date - * - * @param appendDay - * @return - */ - public static Date addAppendDay(int appendDay) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); - Date dt = new Date(); - Calendar rightNow = Calendar.getInstance(); - rightNow.setTime(dt); - rightNow.add(Calendar.DAY_OF_YEAR, appendDay); - return rightNow.getTime(); - } - - /** - * 获取日期的零点时间 - * - * @param date - * @return - */ - public static Date getStartTimeOfDate(Date date) { - Calendar cal = Calendar.getInstance(); - cal.setTime(date); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - return cal.getTime(); - } - - /** - * 获取日期的23:59:59:999 - * - * @param date - * @return - */ - public static Date getEndTimeOfDate(Date date) { - Calendar cal = Calendar.getInstance(); - cal.setTime(date); - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 999); - return cal.getTime(); - } - - /** - * 获取昨天日期时间 - * - * @return - */ - public static Date getYesterdayDateTime() { - Calendar cal = Calendar.getInstance(); - cal.add(5, -1); - return cal.getTime(); - } - - /** - * 根据开始时间和结束时间返回时间段内的时间集合 - * - * @param beginDate - * @param endDate - * @return List - */ - public static List getDatesBetweenTwoDate(Date beginDate, Date endDate) { - if (beginDate.getTime() >= endDate.getTime()) { - throw new RuntimeException("endDate must after beginDate ..."); - } - List lDate = new ArrayList(); - lDate.add(beginDate);// 把开始时间加入集合 - Calendar cal = Calendar.getInstance(); - // 使用给定的 Date 设置此 Calendar 的时间 - cal.setTime(beginDate); - boolean bContinue = true; - while (bContinue) { - // 根据日历的规则,为给定的日历字段添加或减去指定的时间量 - cal.add(Calendar.DAY_OF_MONTH, 1); - // 测试此日期是否在指定日期之后 - if (endDate.after(cal.getTime())) { - lDate.add(cal.getTime()); - } else { - break; - } - } - lDate.add(endDate);// 把结束时间加入集合 - return lDate; - } - - /** - * 取得昨天0点整时间 - * - * @return - */ - public static Date getYesterDayZEROTIME() { - return getSpecifiedDay(-1, 0, 0, 0); - } - - - /** - * 获得指定 - * - * @param day 整数,指定一月中的某天,正数为未来某天时间,负数为过去某天时间 - * @param hour 正整数,一天当中的指定小时数 - * @param minute 正整数,指定分钟数 - * @param second 正整数,指定秒数 - * @return - */ - public static Date getSpecifiedDay(int day, int hour, int minute, int second) { - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + day); - calendar.set(Calendar.HOUR_OF_DAY, hour); - calendar.set(Calendar.MINUTE, minute); - calendar.set(Calendar.SECOND, second); - calendar.set(Calendar.MILLISECOND, 0); - return calendar.getTime(); - } - - /** - * 取得今天0点整时间 - * - * @return - */ - public static Date getZEROTIME() { - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - return calendar.getTime(); - } - - /** - * /** - * 获取当前时间前n个小时德开始与结束后时间 - * - * @param type 0 开始 1结束 - * @param n n个小时 - * @return - */ - public static Date getDateBeforeOneHour(Date date, int type, int n) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - n); - String dateStr = formatDate(calendar.getTime(), "yyyy-MM-dd HH"); - if (type == 1) { - return parseDate(dateStr + ":59:59"); - } - return parseDate(dateStr + ":00:00"); - } - - /** - * 获取指定时间的当前小时 - * - * @param date - * @return - */ - public static int getHourByDate(Date date) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - return calendar.get(Calendar.HOUR_OF_DAY); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EasyExcelListener.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EasyExcelListener.java deleted file mode 100644 index 85acd99..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EasyExcelListener.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.arm.equipment.system.data.util; - -import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.event.AnalysisEventListener; -import com.alibaba.excel.metadata.BaseRowModel; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.List; - -public class EasyExcelListener extends AnalysisEventListener { - - private final static Logger logger = LoggerFactory.getLogger(EasyExcelListener.class); - - private final List rows = new ArrayList<>(); - - @Override - public void invoke(T object, AnalysisContext context) { - rows.add(object); - } - - @Override - public void doAfterAllAnalysed(AnalysisContext context) { - logger.info("read {} rows %n", rows.size()); - } - - public List getRows() { - logger.info("read {} rows %n", rows); - return rows; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EnvUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EnvUtil.java deleted file mode 100644 index 3b90625..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EnvUtil.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.arm.equipment.system.data.util; - -import org.springframework.context.EnvironmentAware; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -/** - * 判断当前系统运行环境 - */ -@Component -public class EnvUtil implements EnvironmentAware { - /** 系统环境 */ - private static Environment environment; - - /** - * 判断是否开发环境 - * @return - */ - public static boolean isDev() { - return isEnv("dev"); - } - - /** - * 判断是否测试环境 - * @return - */ - public static boolean isTest() { - return isEnv("test"); - } - - /** - * 判断是否生产环境 - * @return - */ - public static boolean isProd() { - return isEnv("prod"); - } - - /** - * 判断是否激活某个profile - * @param env - * @return - */ - private static boolean isEnv(String env) { - return environment.getProperty("env").equalsIgnoreCase(env); - } - - public static String getEnv() { - return environment.getProperty("env"); - } - - @Override - public void setEnvironment(Environment environment) { - EnvUtil.environment = environment; - } - - public static boolean isESEnable() { - return true; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/FileUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/FileUtils.java deleted file mode 100644 index 234126a..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/FileUtils.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.arm.equipment.system.data.util; - -import com.arm.equipment.system.data.exception.BusinessException; -import org.apache.commons.lang3.StringUtils; -import org.springframework.util.CollectionUtils; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.nio.ByteBuffer; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; -import java.nio.channels.WritableByteChannel; -import java.util.Map; - -/** - * 文件工具类 - * @author admin - */ -public class FileUtils { - - /** - * 获得文件的扩展名 - * @param fileName - * @return - */ - public static String getSuffix(String fileName) { - if (StringUtils.isEmpty(fileName)) { - return ""; - } - return fileName.substring(fileName.lastIndexOf(".")); - } - - /** - * 获得路径中包含后缀的文件名 - * @param path 文件路径 - * @return - */ - public static String getFileName(String path) { - return path.substring(path.lastIndexOf("/")); - } - - public static String getFileNameWithoutSuffix(String path) { - if (StringUtils.isEmpty(path)) { - throw new BusinessException("文件路径非法"); - } - // 有些人上传文件没有后缀 - if (!path.contains(".")) { - return path; - } - return path.substring(0, path.lastIndexOf(".")); - } - - /** - * 获得远程路径文件的字节码 - * @param url - * @return - * @throws IOException - */ - public static byte[] getUrlBytes(String url) throws IOException { - WJAssert.hasLength(url, "URL不合法"); - WJAssert.isTrue(url.contains("http"), "URL没有协议"); - URL requestUrl = new URL(url); - InputStream inputStream = requestUrl.openStream(); - ReadableByteChannel src = Channels.newChannel(inputStream); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - WritableByteChannel dest = Channels.newChannel(byteArrayOutputStream); - ByteBuffer buffer = ByteBuffer.allocate(10240); - while (src.read(buffer) != -1) { - buffer.flip(); - while (buffer.hasRemaining()) { - dest.write(buffer); - } - buffer.clear(); - } - inputStream.close(); - src.close(); - dest.close(); - byteArrayOutputStream.close(); - return byteArrayOutputStream.toByteArray(); - } - - /** - * 获得远程路径的字节码 - * @param url - * @param header - * @return - * @throws IOException - */ - public static byte[] getUrlBytes(String url, Map header) throws IOException { - URLConnection requestUrl = new URL(url).openConnection(); - if(!CollectionUtils.isEmpty(header)) { - header.forEach((k, v) -> requestUrl.setRequestProperty(k, v)); - } - InputStream inputStream = requestUrl.getInputStream(); - ReadableByteChannel src = Channels.newChannel(inputStream); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - WritableByteChannel dest = Channels.newChannel(byteArrayOutputStream); - ByteBuffer buffer = ByteBuffer.allocate(10240); - while (src.read(buffer) != -1) { - buffer.flip(); - while (buffer.hasRemaining()) { - dest.write(buffer); - } - buffer.clear(); - } - inputStream.close(); - src.close(); - dest.close(); - byteArrayOutputStream.close(); - return byteArrayOutputStream.toByteArray(); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/IPUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/IPUtil.java deleted file mode 100644 index 3fbdc8b..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/IPUtil.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.arm.equipment.system.data.util; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.http.HttpHeaders; -import org.springframework.util.CollectionUtils; - -import javax.servlet.http.HttpServletRequest; -import java.util.List; -import java.util.Map; - -/** - * ip工具类 - */ -public class IPUtil { - - private static final String IP_UTILS_FLAG = ","; - - /** - * 获得用户远程地址 - */ - public static String getRemoteAddress(HttpHeaders headers) { - List remoteAddrList = headers.get("X-Real-IP"); - if (CollectionUtils.isEmpty(remoteAddrList)) { - remoteAddrList = headers.get("X-Forwarded-For"); - } else if (CollectionUtils.isEmpty(remoteAddrList)) { - remoteAddrList = headers.get("Proxy-Client-IP"); - } else if (CollectionUtils.isEmpty(remoteAddrList)) { - remoteAddrList = headers.get("WL-Proxy-Client-IP"); - } - if (CollectionUtils.isEmpty(remoteAddrList)) { - return ""; - } - String remoteAddr = remoteAddrList.get(0); - //使用代理,则获取第一个IP地址 - if (StringUtils.isNotBlank(remoteAddr) && remoteAddr.indexOf(IP_UTILS_FLAG) > 0) { - remoteAddr = remoteAddr.substring(0, remoteAddr.indexOf(IP_UTILS_FLAG)); - } - return remoteAddr; - } - - public static String getRemoteAddress(Map map) { - String remoteAddr = map.get("X-Real-IP"); - if (StringUtils.isEmpty(remoteAddr)) { - remoteAddr = map.get("X-Forwarded-For"); - } else if (StringUtils.isEmpty(remoteAddr)) { - remoteAddr = map.get("Proxy-Client-IP"); - } else if (StringUtils.isEmpty(remoteAddr)) { - remoteAddr = map.get("WL-Proxy-Client-IP"); - } - if (StringUtils.isEmpty(remoteAddr)) { - return ""; - } - //使用代理,则获取第一个IP地址 - if (StringUtils.isNotBlank(remoteAddr) && remoteAddr.indexOf(IP_UTILS_FLAG) > 0) { - remoteAddr = remoteAddr.substring(0, remoteAddr.indexOf(IP_UTILS_FLAG)); - } - return remoteAddr; - } - - public static String getRemoteAddress(HttpServletRequest request) { - String ip = request.getHeader("x-forwarded-for"); - if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { - // 多次反向代理后会有多个ip值,第一个ip才是真实ip - if (ip.indexOf(IP_UTILS_FLAG) != -1) { - ip = ip.split(",")[0]; - } - } - 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("remoteip"); - } - 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("HTTP_CLIENT_IP"); - } - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { - ip = request.getHeader("HTTP_X_FORWARDED_FOR"); - } - 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.getRemoteHost(); - } - - return ip.replaceAll(":", "."); - } - - - /** - * aj captcha使用的 - * - * @param request - * @return - */ - public static final String getRemoteId(HttpServletRequest request) { - String xfwd = IPUtil.getRemoteAddress(request); - String ip = getRemoteIpFromXfwd(xfwd); - String ua = request.getHeader("user-agent"); - if (StringUtils.isNotBlank(ip)) { - return ip + ua; - } - return request.getRemoteAddr() + ua; - } - - private static String getRemoteIpFromXfwd(String xfwd) { - if (StringUtils.isNotBlank(xfwd)) { - String[] ipList = xfwd.split(","); - return StringUtils.trim(ipList[0]); - } - return null; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/LocalDateUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/LocalDateUtils.java deleted file mode 100644 index eddd23c..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/LocalDateUtils.java +++ /dev/null @@ -1,267 +0,0 @@ -package com.arm.equipment.system.data.util; - -import java.time.*; -import java.time.format.DateTimeFormatter; -import java.time.temporal.ChronoUnit; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * 基于java8 的日期工具类 - * Created by liuyu on 2017/8/18. - */ -public class LocalDateUtils { - - /** - * 收集起始日期到结束日期之间所有的日期并以集合方式返回 - * - * @param start LocalDate 开始日期 - * @param end LocalDate 结束日期 - * @return 返回 String类型 日期 集合 - */ - public static List collectLocalDatesStrByTwoDate(LocalDate start, LocalDate end) { - // 用起始时间作为流的源头,按照每次加一天的方式创建一个无限流 - return Stream.iterate(start, localDate -> localDate.plusDays(1)) - // 截断无限流,长度为起始时间和结束时间的差+1个 - .limit(ChronoUnit.DAYS.between(start, end) + 1) - // 由于最后要的是字符串,所以map转换一下 - .map(LocalDate::toString) - // 把流收集为List - .collect(Collectors.toList()); - } - - - /** - * 收集起始日期到结束日期之间所有的日期并以集合方式返回 - * - * @param start String 开始日期 - * @param end String 结束日期 - * @return 返回 String类型 日期 集合 - */ - public static List collectLocalDatesStrByTwoDateStr(String start, String end) { - return collectLocalDatesStrByTwoDate(LocalDate.parse(start), LocalDate.parse(end)); - } - - /** - * 收集起始日期到结束日期之间所有的日期并以集合方式返回 - * - * @param start LocalDate 开始日期 - * @param end LocalDate 结束日期 - * @return 返回 LocalDate类型 日期 集合 - */ - public static List collectLocalDatesByTwoDate(LocalDate start, LocalDate end) { - return Stream.iterate(start, localDate -> localDate.plusDays(1)) - .limit(ChronoUnit.DAYS.between(start, end) + 1) - .collect(Collectors.toList()); - } - - /** - * 收集起始日期到结束日期之间所有的日期并以集合方式返回 - * - * @param start String 开始日期 - * @param end String 结束日期 - * @return 返回 LocalDate类型 日期 集合 - */ - public static List collectLocalDatesByTwoDateStr(String start, String end) { - return collectLocalDatesByTwoDate(LocalDate.parse(start), LocalDate.parse(end)); - } - - /** - * 按周收集起始日期到结束日期之间所有的日期并以集合方式返回 - * - * @param start LocalDate 开始日期 - * @param end LocalDate 结束日期 - * @return 返回 LocalDate类型 日期 集合 - */ - public static List collectOfWeekByTwoDate(LocalDate start, LocalDate end) { - return Stream.iterate(start, localDate -> localDate.plusWeeks(1)) - .limit(ChronoUnit.WEEKS.between(start, end) + 1) - .collect(Collectors.toList()); - } - - /** - * 按周收集起始日期到结束日期之间所有的日期并以集合方式返回 - * - * @param start String 开始日期 - * @param end String 结束日期 - * @return 返回 LocalDate类型 日期 集合 - */ - public static List collectOfWeekByTwoDate(String start, String end) { - return collectOfWeekByTwoDate(LocalDate.parse(start), LocalDate.parse(end)); - } - - /** - * 按周收集起始日期到结束日期之间所有的日期并以集合方式返回 - * - * @param start LocalDate 开始日期 - * @param end LocalDate 结束日期 - * @return 返回 String类型 日期 集合 - */ - public static List collectOfWeekStrByTwoDate(LocalDate start, LocalDate end) { - return Stream.iterate(start, localDate -> localDate.plusWeeks(1)) - .limit(ChronoUnit.WEEKS.between(start, end) + 1) - .map(LocalDate::toString) - .collect(Collectors.toList()); - } - - /** - * 按周收集起始日期到结束日期之间所有的日期并以集合方式返回 - * - * @param start String 开始日期 - * @param end String 结束日期 - * @return 返回 String类型 日期 集合 - */ - public static List collectOfWeekStrByTwoDateStr(String start, String end) { - return collectOfWeekStrByTwoDate(LocalDate.parse(start), LocalDate.parse(end)); - } - - /** - * 获取当前时间戳秒数 - */ - public static long getCurrentSecond() { - return LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")); - } - - /** - * 获取当前时间戳毫秒数 - */ - public static long getCurrentSecondMill() { - return LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(); - } - - /** - * 获取LocaDate得 毫秒数 - */ - public static long getCurrentSecondMillByLocalDate(LocalDate localDate) { - return localDate.atStartOfDay().toInstant(ZoneOffset.of("+8")).toEpochMilli(); - } - - /** - * 获取毫秒数 - */ - public static long getCurrentSecondMill(LocalDateTime localDateTime) { - return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli(); - } - - /** - * 获取当前时间的小时与分钟 - */ - public static String getNowHourAndMinute() { - DateTimeFormatter pattern = DateTimeFormatter.ofPattern("HH:mm"); - return pattern.format(LocalDateTime.now()); - } - - /** - * Date 转 LocalDateTime - * - * @param date - * @return - */ - public static LocalDateTime dateToLocalDateTime(Date date) { - Instant instant = date.toInstant(); - ZoneId zoneId = ZoneId.systemDefault(); - return instant.atZone(zoneId).toLocalDateTime(); - } - - /** - * Date 转 LocalDateTime - * - * @param localDateTime - * @return - */ - public static Date localDateTimeToDate(LocalDateTime localDateTime) { - ZoneId zoneId = ZoneId.systemDefault(); - ZonedDateTime zdt = localDateTime.atZone(zoneId); - return Date.from(zdt.toInstant()); - } - - /** - * LocalDate转Date - * - * @param localDate - * @return - */ - public static Date localDateToDate(LocalDate localDate) { - ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault()); - return Date.from(zonedDateTime.toInstant()); - } - - /** - * Date转LocalDate - * - * @param date - */ - public static LocalDate dateToLocalDate(Date date) { - return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); - } - - public static void main(String[] args) { - System.out.println(new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); - } - - /** - * 根据年月获取当前月开始时间 - * - * @param year - * @param month - * @return - */ - public static Date getBeginTimeByYearAndMonth(int year, int month) { - YearMonth yearMonth = YearMonth.of(year, month); - LocalDate localDate = yearMonth.atDay(1); - LocalDateTime startOfDay = localDate.atStartOfDay(); - ZonedDateTime zonedDateTime = startOfDay.atZone(ZoneId.of("Asia/Shanghai")); - - return Date.from(zonedDateTime.toInstant()); - } - - /** - * 根据年月获取当前月结束时间 - * - * @param year - * @param month - * @return - */ - public static Date getEndTimeByYearAndMonth(int year, int month) { - YearMonth yearMonth = YearMonth.of(year, month); - LocalDate endOfMonth = yearMonth.atEndOfMonth(); - LocalDateTime localDateTime = endOfMonth.atTime(23, 59, 59, 999); - ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai")); - return Date.from(zonedDateTime.toInstant()); - } - - /** - * 时间戳转localDate - * - * @param timestamp - * @return - */ - public static LocalDate timestampToLocalDate(long timestamp) { - return Instant.ofEpochMilli(timestamp).atZone(ZoneOffset.ofHours(8)).toLocalDate(); - } - - /** - * 获取指定日期所在月份的开始或结束日期 - * - * @param today - * @param isFirst true 开始 false 结束 - * @return - */ - public static LocalDate getStartOrEndDayOfMonth(LocalDate today, Boolean isFirst) { - LocalDate resDate = LocalDate.now(); - if (today == null) { - today = resDate; - } - Month month = today.getMonth(); - int length = month.length(today.isLeapYear()); - if (isFirst) { - resDate = LocalDate.of(today.getYear(), month, 1); - } else { - resDate = LocalDate.of(today.getYear(), month, length); - } - return resDate; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/Md5Utils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/Md5Utils.java deleted file mode 100644 index 62fa2ae..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/Md5Utils.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.arm.equipment.system.data.util; - -import java.security.MessageDigest; - -public class Md5Utils { - - private static byte[] md5(String s) throws Exception{ - MessageDigest algorithm = MessageDigest.getInstance("MD5"); - algorithm.reset(); - algorithm.update(s.getBytes("UTF-8")); - byte[] messageDigest = algorithm.digest(); - return messageDigest; - } - - 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) throws Exception{ - return new String(toHex(md5(s)).getBytes("UTF-8"), "UTF-8"); - } - - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/PinYinUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/PinYinUtil.java deleted file mode 100644 index 216d8c2..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/PinYinUtil.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.arm.equipment.system.data.util; - -import net.sourceforge.pinyin4j.PinyinHelper; -import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; -import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; -import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; -import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; - -/** - * @author: admin - * @time: 2021/5/20 17:59 - */ -public class PinYinUtil { - /** - * 测试main方法 - * - * @param args - */ - public static void main(String[] args) { - System.out.println(toFirstChar("汉字转换为拼音").toUpperCase()); //转为首字母大写 - System.out.println(toPinyin("234234")); - } - - /** - * 获取字符串拼音的第一个字母 - * - * @param chinese - * @return - */ - public static String toFirstChar(String chinese) { - String pinyinStr = ""; - char[] newChar = chinese.toCharArray(); //转为单个字符 - HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); - defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); - defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); - for (int i = 0; i < newChar.length; i++) { - if (newChar[i] > 128) { - try { - pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0].charAt(0); - } catch (BadHanyuPinyinOutputFormatCombination e) { - e.printStackTrace(); - } - } else { - pinyinStr += newChar[i]; - } - } - return pinyinStr; - } - - /** - * 汉字转为拼音 - * - * @param chinese - * @return - */ - public static String toPinyin(String chinese) { - String pinyinStr = ""; - char[] newChar = chinese.toCharArray(); - HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); - defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); - defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); - for (int i = 0; i < newChar.length; i++) { - if (newChar[i] > 128) { - try { - pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0]; - } catch (BadHanyuPinyinOutputFormatCombination e) { - e.printStackTrace(); - } - } else { - pinyinStr += newChar[i]; - } - } - return pinyinStr; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/RandomUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/RandomUtils.java deleted file mode 100644 index 414e0fa..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/RandomUtils.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.arm.equipment.system.data.util; - - -import java.awt.*; -import java.util.Random; - -public class RandomUtils extends org.apache.commons.lang3.RandomUtils { - - private static final char[] CODE_SEQ = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', - 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', - 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9' }; - - private static final char[] NUMBER_ARRAY = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; - - private static Random random = new Random(); - - public static String randomString(int length) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) { - sb.append(CODE_SEQ[random.nextInt(CODE_SEQ.length)]); - } - return sb.toString(); - } - - public static String randomNumberString(int length) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) { - sb.append(NUMBER_ARRAY[random.nextInt(NUMBER_ARRAY.length)]); - } - return sb.toString(); - } - - public static Color randomColor(int fc, int bc) { - int f = fc; - int b = bc; - Random random = new Random(); - if (f > 255) { - f = 255; - } - if (b > 255) { - b = 255; - } - return new Color(f + random.nextInt(b - f), f + random.nextInt(b - f), f + random.nextInt(b - f)); - } - - public static int nextInt(int bound) { - return random.nextInt(bound); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/RequestUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/RequestUtil.java deleted file mode 100644 index 546e862..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/RequestUtil.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.arm.equipment.system.data.util; - -import com.alibaba.fastjson.JSONObject; -import com.arm.equipment.system.data.exception.BusinessException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; - -/** - * 请求工具类 - */ -@Component -public class RequestUtil { - private final static Logger logger = LoggerFactory.getLogger(RequestUtil.class); - private static RestTemplate restTemplate; - - /** - * 发起请求 - * - * @param requestUrl 请求地址 - * @param params 参数 - * @return - */ - public static String post(String requestUrl, MultiValueMap params) { - logger.info("请求: {}, 参数: {}", requestUrl, JSONObject.toJSON(params)); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - HttpEntity request = new HttpEntity<>(params, headers); - try { - String result = restTemplate.postForObject(requestUrl, request, String.class); - logger.info("返回结: {}", result); - return result; - } catch (Exception e) { - logger.info("接口请求异常: {}", e); - throw new BusinessException("接口请求异常"); - } - } - - @Autowired - public void setRestTemplate(RestTemplate restTemplate) { - RequestUtil.restTemplate = restTemplate; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/StreamUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/StreamUtil.java deleted file mode 100644 index d20115a..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/StreamUtil.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.arm.equipment.system.data.util; - -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; -import java.util.function.Predicate; - -public class StreamUtil { - - public static Predicate distinctByKey(Function keyExtractor) { - Set seen = ConcurrentHashMap.newKeySet(); - return t -> seen.add(keyExtractor.apply(t)); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/StringUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/StringUtils.java deleted file mode 100644 index 2688e8f..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/StringUtils.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.arm.equipment.system.data.util; - -import org.apache.commons.lang3.StringEscapeUtils; - -import javax.servlet.http.HttpServletRequest; -import java.io.UnsupportedEncodingException; -import java.util.UUID; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * 字符串工具类 - */ -public class StringUtils extends org.apache.commons.lang3.StringUtils { - - private static final String DASH = "-"; - - /** - * 缩略字符串(不区分中英文字符) - * - * @param str 目标字符串 - * @param length 截取长度 - * @return - */ - public static String abbr(String str, int length) { - if (str == null) { - return ""; - } - try { - StringBuilder sb = new StringBuilder(); - int currentLength = 0; - for (char c : replaceHtml(StringEscapeUtils.unescapeHtml4(str)).toCharArray()) { - currentLength += String.valueOf(c).getBytes("GBK").length; - if (currentLength <= length - 3) { - sb.append(c); - } else { - sb.append("..."); - break; - } - } - return sb.toString(); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - return ""; - } - - /** - * 替换掉HTML标签方法 - */ - public static String replaceHtml(String html) { - if (isBlank(html)) { - return ""; - } - String regEx = "<.+?>"; - Pattern p = Pattern.compile(regEx); - Matcher m = p.matcher(html); - String s = m.replaceAll(""); - return s; - } - - /** - * 获取UUID - * - * @return uuid - */ - public static String uuid() { - return UUID.randomUUID().toString().replace(DASH, EMPTY); - } - - /** - * 批量发货时调用 - * - * @return - */ - public static synchronized String threadUUID() { - return UUID.randomUUID().toString().replace(DASH, EMPTY); - } - - /** - * 获取N位随机数 - * - * @param num - * @return - */ - public static String getRandomNumber(int num) { - if (num <= 0) { - throw new IllegalArgumentException(); - } - double d = (Math.random() * 9 + 1) * (Math.pow(10, num - 1)); - return String.valueOf((int) d); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/UuidUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/UuidUtils.java deleted file mode 100644 index 1d44c47..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/UuidUtils.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.arm.equipment.system.data.util; - -import java.util.UUID; - -public class UuidUtils { - - public static String uuid() { - return UUID.randomUUID().toString().replaceAll("-",""); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/ValidCodeUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/ValidCodeUtil.java deleted file mode 100644 index bb09571..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/ValidCodeUtil.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.arm.equipment.system.data.util; - -import java.awt.*; -import java.awt.image.BufferedImage; -import java.util.Random; - -/** - * 验证码工具类 - * @author wyd - */ -public class ValidCodeUtil { - private final static char[] CODE_SEQUENCE = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', - 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', - 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; - private final static int CODE_COUNT = 4; - - /** - * 生成验证码图片 - * @param validCode - * @return - */ - public static BufferedImage generateImg(String validCode) { - //图片的宽和高 - int imgWidth = CODE_COUNT * 20; - int imgHeight = 30; - - BufferedImage image = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_BGR); - drawImg(image, validCode, imgWidth , imgHeight); - return image; - } - - /** - * 生成验证码 - * @return - */ - public static String generateRandomCode() { - Random rand = new Random(); - //记录验证码 - StringBuilder chapter = new StringBuilder(); - for (int i = 0; i < CODE_COUNT; i++) { - //记录字符 - chapter.append(CODE_SEQUENCE[rand.nextInt(CODE_SEQUENCE.length)]); - } - return chapter.toString(); - } - - /** - * 根据宽度、高度、和验证码的个数绘制验证码图片,并返回验证码的值 - * @param buffImg BufferedImage对象 - * @param validCode 验证码 - * @param imgWidth 图片宽度 - * @param imgHeight 图片高度 - * @return 验证码的值 - */ - private static void drawImg(BufferedImage buffImg, String validCode, int imgWidth, int imgHeight) { - Random rand = new Random(); - Graphics2D gd = buffImg.createGraphics(); - - //填充矩形 - gd.setColor(Color.WHITE); - gd.fillRect(0, 0, imgWidth, imgHeight); - - //设置字体 - Font font = new Font("微软雅黑", Font.PLAIN, imgHeight - 5); - gd.setFont(font); - - //绘制边框 - gd.setColor(Color.BLACK); - gd.drawRect(0, 0, imgWidth - 1, imgHeight - 1); - - //绘制灰色干扰线 - gd.setColor(Color.GRAY); - for (int i = 0, x, y, x1, y1; i < 30; i++) { - x = rand.nextInt(imgWidth); - y = rand.nextInt(imgHeight); - x1 = rand.nextInt(12); - y1 = rand.nextInt(12); - gd.drawLine(x, y, x + x1, y + y1); - } - - //int codeCount = 4, - int codeX = 15, codeY = 25; - - //临时变量 - String item; - - for (int i = 0, red, green, blue; i < validCode.length(); i++) { - item = String.valueOf(validCode.charAt(i)); - //随机选择字符颜色 - red = rand.nextInt(255); - green = rand.nextInt(255); - blue = rand.nextInt(255); - gd.setColor(new Color(red, green, blue)); - - //绘制字符 - gd.drawString(item, (i + 1) * codeX, codeY); - } - } - - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/ValidateCode.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/ValidateCode.java deleted file mode 100644 index baae01f..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/ValidateCode.java +++ /dev/null @@ -1,276 +0,0 @@ -package com.arm.equipment.system.data.util; - -import java.awt.*; -import java.awt.image.BufferedImage; -import java.util.Random; - -/** - * Desc: 验证码生成器类,可生成数字、大写、小写字母及三者混合类型的验证码。 - * 支持自定义验证码字符数量; 支持自定义验证码图片的大小; 支持自定义需排除的特殊字符; - * 支持自定义干扰线的数量; 支持自定义验证码图文颜色 - */ -public class ValidateCode { - - /** - * 验证码类型为仅数字 0~9 - */ - public static final int TYPE_NUM_ONLY = 0; - - /** - * 验证码类型为仅字母,即大写、小写字母混合 - */ - public static final int TYPE_LETTER_ONLY = 1; - - /** - * 验证码类型为数字、大写字母、小写字母混合 - */ - public static final int TYPE_ALL_MIXED = 2; - - /** - * 验证码类型为数字、大写字母混合 - */ - public static final int TYPE_NUM_UPPER = 3; - - /** - * 验证码类型为数字、小写字母混合 - */ - public static final int TYPE_NUM_LOWER = 4; - - /** - * 验证码类型为仅大写字母 - */ - public static final int TYPE_UPPER_ONLY = 5; - - /** - * 验证码类型为仅小写字母 - */ - public static final int TYPE_LOWER_ONLY = 6; - - private ValidateCode() { - - } - - /** - * 生成验证码字符串 - * - * @param type - * 验证码类型,参见本类的静态属性 - * @param length - * 验证码长度,大于0的整数 - * @param exChars - * 需排除的特殊字符(仅对数字、字母混合型验证码有效,无需排除则为null) - * @return 验证码字符串 - */ - public static String generateTextCode(int type, int length, String exChars) { - - if (length <= 0) - return ""; - - StringBuffer code = new StringBuffer(); - int i = 0; - Random r = new Random(); - - switch (type) { - - // 仅数字 - case TYPE_NUM_ONLY: - while (i < length) { - int t = r.nextInt(10); - if (exChars == null || exChars.indexOf(t + "") < 0) {// 排除特殊字符 - code.append(t); - i++; - } - } - break; - - // 仅字母(即大写字母、小写字母混合) - case TYPE_LETTER_ONLY: - while (i < length) { - int t = r.nextInt(123); - if ((t >= 97 || (t >= 65 && t <= 90)) && (exChars == null || exChars.indexOf((char) t) < 0)) { - code.append((char) t); - i++; - } - } - break; - - // 数字、大写字母、小写字母混合 - case TYPE_ALL_MIXED: - while (i < length) { - int t = r.nextInt(123); - if ((t >= 97 || (t >= 65 && t <= 90) || (t >= 48 && t <= 57)) - && (exChars == null || exChars.indexOf((char) t) < 0)) { - code.append((char) t); - i++; - } - } - break; - - // 数字、大写字母混合 - case TYPE_NUM_UPPER: - while (i < length) { - int t = r.nextInt(91); - if ((t >= 65 || (t >= 48 && t <= 57)) && (exChars == null || exChars.indexOf((char) t) < 0)) { - code.append((char) t); - i++; - } - } - break; - - // 数字、小写字母混合 - case TYPE_NUM_LOWER: - while (i < length) { - int t = r.nextInt(123); - if ((t >= 97 || (t >= 48 && t <= 57)) && (exChars == null || exChars.indexOf((char) t) < 0)) { - code.append((char) t); - i++; - } - } - break; - - // 仅大写字母 - case TYPE_UPPER_ONLY: - while (i < length) { - int t = r.nextInt(91); - if ((t >= 65) && (exChars == null || exChars.indexOf((char) t) < 0)) { - code.append((char) t); - i++; - } - } - break; - - // 仅小写字母 - case TYPE_LOWER_ONLY: - while (i < length) { - int t = r.nextInt(123); - if ((t >= 97) && (exChars == null || exChars.indexOf((char) t) < 0)) { - code.append((char) t); - i++; - } - } - break; - - } - - return code.toString(); - } - - /** - * 已有验证码,生成验证码图片 - * - * @param textCode - * 文本验证码 - * @param width - * 图片宽度 - * @param height - * 图片高度 - * @param interLine - * 图片中干扰线的条数 - * @param randomLocation - * 每个字符的高低位置是否随机 - * @param backColor - * 图片颜色,若为null,则采用随机颜色 - * @param foreColor - * 字体颜色,若为null,则采用随机颜色 - * @param lineColor - * 干扰线颜色,若为null,则采用随机颜色 - * @return 图片缓存对象 - */ - public static BufferedImage generateImageCode(String textCode, int width, int height, int interLine, - boolean randomLocation, Color backColor, Color foreColor, Color lineColor) { - - BufferedImage bim = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - Graphics g = bim.getGraphics(); - - // 画背景图 - g.setColor(backColor == null ? getRandomColor() : backColor); - g.fillRect(0, 0, width, height); - - // 画干扰线 - Random r = new Random(); - if (interLine > 0) { - - int x = 0, y = 0, x1 = width, y1 = 0; - for (int i = 0; i < interLine; i++) { - g.setColor(lineColor == null ? getRandomColor() : lineColor); - y = r.nextInt(height); - y1 = r.nextInt(height); - - g.drawLine(x, y, x1, y1); - } - } - - // 写验证码 - - // g.setColor(getRandomColor()); - // g.setColor(isSimpleColor?Color.BLACK:Color.WHITE); - - // 字体大小为图片高度的80% - int fsize = (int) (height * 0.8); - int fx = height - fsize; - int fy = fsize; - - g.setFont(new Font("Default", Font.PLAIN, fsize)); - - // 写验证码字符 - for (int i = 0; i < textCode.length(); i++) { - fy = randomLocation ? (int) ((Math.random() * 0.3 + 0.6) * height) : fy;// 每个字符高低是否随机 - g.setColor(foreColor == null ? getRandomColor() : foreColor); - g.drawString(textCode.charAt(i) + "", fx, fy); - fx += fsize * 0.9; - } - - g.dispose(); - - return bim; - } - - /** - * 生成图片验证码 - * - * @param type - * 验证码类型,参见本类的静态属性 - * @param length - * 验证码字符长度,大于0的整数 - * @param exChars - * 需排除的特殊字符 - * @param width - * 图片宽度 - * @param height - * 图片高度 - * @param interLine - * 图片中干扰线的条数 - * @param randomLocation - * 每个字符的高低位置是否随机 - * @param backColor - * 图片颜色,若为null,则采用随机颜色 - * @param foreColor - * 字体颜色,若为null,则采用随机颜色 - * @param lineColor - * 干扰线颜色,若为null,则采用随机颜色 - * @return 图片缓存对象 - */ - public static BufferedImage generateImageCode(int type, int length, String exChars, int width, int height, - int interLine, boolean randomLocation, Color backColor, Color foreColor, Color lineColor) { - - String textCode = generateTextCode(type, length, exChars); - BufferedImage bim = generateImageCode(textCode, width, height, interLine, randomLocation, backColor, foreColor, - lineColor); - - return bim; - } - - /** - * 产生随机颜色 - * - * @return - */ - private static Color getRandomColor() { - Random r = new Random(); - Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)); - return c; - } - - - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/WJAssert.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/WJAssert.java deleted file mode 100644 index fce9ccf..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/WJAssert.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.arm.equipment.system.data.util; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.util.Assert; - -/** - * 参数校验 - * @author admin - */ -public class WJAssert extends Assert { - - /** - * 判断是否在规定的长度内 - * - * @param str - * @param minLength - * @param maxLength - * @param message - */ - public static void isRange(String str, int minLength, int maxLength, String message) { - if (StringUtils.isEmpty(str)) { - throw new IllegalArgumentException(message); - } - if (str.length() < minLength || str.length() > maxLength) { - throw new IllegalArgumentException(message); - } - } - - /** - * 判断是否超过最大限制 - *

判定目标不可以为空

- * - * @param str - * @param maxLength - * @param message - */ - public static void isMaxLength(String str, int maxLength, String message) { - limitMaxLength(str, false, maxLength, message); - } - - /** - * 判断字符串是否为null或空字符串 - *

判定目标不可以为空

- * - * @param str - * @param message - */ - public static void notBlank(String str, String message) { - if (StringUtils.isBlank(str)) { - throw new IllegalArgumentException(message); - } - } - - /** - * 判断是否超过最大限制 - * - * @param str 判定目标 - * @param nullAble 是否可空 - * @param maxLength 最大长度 - * @param message 提示信息 - */ - public static void limitMaxLength(String str, boolean nullAble, int maxLength, String message) { - if (!nullAble) { - if (StringUtils.isEmpty(str) || str.length() > maxLength) { - throw new IllegalArgumentException(message); - } - } else { - if (str != null && str.length() > maxLength) { - throw new IllegalArgumentException(message); - } - } - } - - /** - * 判断地址 - * @param str - * @param message - */ - public static void isMatchesLiveUrl(String str, String message) { - String regex = "^(https?|ftp|file|http?|rtmp?)://\\S+"; - if(!str.matches(regex)) { - throw new IllegalArgumentException(message); - } - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/excel/EasyExcelListener.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/excel/EasyExcelListener.java deleted file mode 100644 index 92dea84..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/excel/EasyExcelListener.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.arm.equipment.system.data.util.excel; - -import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.event.AnalysisEventListener; -import com.alibaba.excel.metadata.BaseRowModel; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.List; - -public class EasyExcelListener extends AnalysisEventListener { - - private final static Logger logger = LoggerFactory.getLogger(EasyExcelListener.class); - - private final List rows = new ArrayList<>(); - - @Override - public void invoke(T object, AnalysisContext context) { - rows.add(object); - } - - @Override - public void doAfterAllAnalysed(AnalysisContext context) { - logger.info("read {} rows %n", rows.size()); - } - - public List getRows() { - logger.info("read {} rows %n", rows); - return rows; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/excel/EasyExcelUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/excel/EasyExcelUtils.java deleted file mode 100644 index bd16f22..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/excel/EasyExcelUtils.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.arm.equipment.system.data.util.excel; - -import com.alibaba.excel.ExcelReader; -import com.alibaba.excel.ExcelWriter; -import com.alibaba.excel.metadata.BaseRowModel; -import com.alibaba.excel.metadata.Sheet; -import com.alibaba.excel.support.ExcelTypeEnum; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.poi.poifs.filesystem.FileMagic; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * - * - * @author: admin - * @time: 2022/9/16 11:20 - */ -public final class EasyExcelUtils { - - private final static Logger logger = LoggerFactory.getLogger(EasyExcelUtils.class); - - - /** - * sheet编号 - */ - private static final int sheetNo = 1; - /** - * 从第几行开始读 - */ - private static final int headLineMun = 0; - - public static final List> headList = new ArrayList<>(); - - static { - headList.add(Stream.of("列1").collect(Collectors.toList())); - } - - /** - * 根据模型关系构建excel文件 - */ - public static void accordingModelRelationBuilder( - Class clazz, List tList, String url, ExcelTypeEnum typeEnum) - throws FileNotFoundException { - OutputStream outputStream = new FileOutputStream(url); - try { - ExcelWriter writer = new ExcelWriter(outputStream, typeEnum); - Sheet sheet1 = new Sheet(sheetNo, headLineMun, clazz); - sheet1.setAutoWidth(Boolean.TRUE); - writer.write(tList, sheet1); - writer.finish(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - outputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - /** - * 自定义excel文件 - */ - public static void customBuilder( - Class clazz, List> tList, String url, ExcelTypeEnum typeEnum, - String sheetName, List> headList) - throws FileNotFoundException { - OutputStream outputStream = new FileOutputStream(url); - try { - ExcelWriter writer = new ExcelWriter(outputStream, typeEnum); - Sheet sheet1 = new Sheet(sheetNo, headLineMun, clazz, sheetName, headList); - sheet1.setAutoWidth(Boolean.TRUE); - writer.write1(tList, sheet1); - writer.finish(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - outputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public static List readExcel(final InputStream inputStream, final Class clazz) { - if (null == inputStream) { - throw new NullPointerException("the inputStream is null!"); - } - EasyExcelListener listener = new EasyExcelListener<>(); - // 这里因为EasyExcel-1.1.1版本的bug,所以需要选用下面这个标记已经过期的版本 - ExcelReader reader = new ExcelReader(inputStream, valueOf(inputStream), null, listener); - reader.read(new Sheet(1, 1, clazz)); - return listener.getRows(); - } - - public static void writeExcel(final File file, List list) { - try (OutputStream out = new FileOutputStream(file)) { - ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX); - //写第一个sheet, 有模型映射关系 - Class t = null; - if (CollectionUtils.isNotEmpty(list)) { - t = list.get(0).getClass(); - } else { - t = BaseRowModel.class; - } - Sheet sheet = new Sheet(1, 0, t); - writer.write(list, sheet); - writer.finish(); - } catch (IOException e) { - logger.warn("fail to write to excel file: file[{}]", file.getName(), e); - } - } - - - /** - * 根据输入流,判断为xls还是xlsx,该方法原本存在于easyexcel 1.1.0 的ExcelTypeEnum中。 - */ - public static ExcelTypeEnum valueOf(InputStream inputStream) { - try { - FileMagic fileMagic = FileMagic.valueOf(inputStream); - if (FileMagic.OLE2.equals(fileMagic)) { - return ExcelTypeEnum.XLS; - } - if (FileMagic.OOXML.equals(fileMagic)) { - return ExcelTypeEnum.XLSX; - } - throw new IllegalArgumentException("excelTypeEnum can not null"); - - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/passwordEncoder/BCrypt.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/passwordEncoder/BCrypt.java deleted file mode 100644 index 2e95b38..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/passwordEncoder/BCrypt.java +++ /dev/null @@ -1,628 +0,0 @@ -package com.arm.equipment.system.data.util.passwordEncoder; - -import java.io.ByteArrayOutputStream; -import java.io.UnsupportedEncodingException; -import java.security.SecureRandom; - -/** - * - * - * @author: admin - * @time: 2022/9/16 11:20 - */ -public class BCrypt {// BCrypt parameters - - private static final int GENSALT_DEFAULT_LOG2_ROUNDS = 10; - private static final int BCRYPT_SALT_LEN = 16; - // Blowfish parameters - private static final int BLOWFISH_NUM_ROUNDS = 16; - // Initial contents of key schedule - private static final int P_orig[] = { 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, - 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, - 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, - 0x9216d5d9, 0x8979fb1b }; - private static final int S_orig[] = { 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, - 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, - 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, - 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, - 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, - 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, - 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, - 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, - 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, - 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, - 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, - 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, - 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, - 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, - 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, - 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, - 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, - 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, - 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, - 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, - 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, - 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, - 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, - 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, - 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, - 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, - 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, - 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, - 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, - 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, - 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, - 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, - 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, - 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, - 0xc75442f5, 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, - 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, - 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, - 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, - 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, - 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, - 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, - 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, - 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, - 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, - 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, - 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, - 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, - 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, - 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, - 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, - 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, - 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, - 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, - 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, - 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, - 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, - 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, - 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, - 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, - 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, - 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, - 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, - 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, - 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, - 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, - 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, - 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, - 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, - 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, - 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, - 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, - 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, - 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, - 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, - 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, - 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, - 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, - 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, - 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, - 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, - 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, - 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, - 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, - 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, - 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, - 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, - 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, - 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, - 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, - 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, - 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, - 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, - 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, - 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, - 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, - 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, - 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, - 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, - 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, - 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, - 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, - 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, - 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, - 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, - 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, - 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, - 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, - 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, - 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, - 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, - 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, - 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, - 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, - 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, - 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, - 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, - 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, - 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, - 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, - 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, - 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, - 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, - 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, - 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, - 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, - 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, - 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, - 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, - 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, - 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, - 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, - 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, - 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, - 0xf8d56629, 0x79132e28, 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, - 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, - 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, - 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, - 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, - 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, - 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, - 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, - 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, - 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, - 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, - 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, - 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, - 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, - 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, - 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, - 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, - 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, - 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, - 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, - 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, - 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, - 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, - 0x6e163697, 0x88d273cc, 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, - 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, - 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, - 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, - 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, - 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 }; - // bcrypt IV: "OrpheanBeholderScryDoubt" - static private final int bf_crypt_ciphertext[] = { 0x4f727068, 0x65616e42, - 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274 }; - // Table for Base64 encoding - static private final char base64_code[] = { '.', '/', 'A', 'B', 'C', 'D', 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', - 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', - 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', - 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; - // Table for Base64 decoding - static private final byte index_64[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - -1, -1, -1, -1, -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1 }; - static final int MIN_LOG_ROUNDS = 4; - static final int MAX_LOG_ROUNDS = 31; - // Expanded Blowfish key - private int P[]; - private int S[]; - - /** - * Encode a byte array using bcrypt's slightly-modified base64 encoding scheme. Note - * that this is not compatible with the standard MIME-base64 - * encoding. - * - * @param d the byte array to encode - * @param len the number of bytes to encode - * @param rs the destination buffer for the base64-encoded string - * @exception IllegalArgumentException if the length is invalid - */ - static void encode_base64(byte d[], int len, StringBuilder rs) - throws IllegalArgumentException { - int off = 0; - int c1, c2; - - if (len <= 0 || len > d.length) { - throw new IllegalArgumentException("Invalid len"); - } - - while (off < len) { - c1 = d[off++] & 0xff; - rs.append(base64_code[(c1 >> 2) & 0x3f]); - c1 = (c1 & 0x03) << 4; - if (off >= len) { - rs.append(base64_code[c1 & 0x3f]); - break; - } - c2 = d[off++] & 0xff; - c1 |= (c2 >> 4) & 0x0f; - rs.append(base64_code[c1 & 0x3f]); - c1 = (c2 & 0x0f) << 2; - if (off >= len) { - rs.append(base64_code[c1 & 0x3f]); - break; - } - c2 = d[off++] & 0xff; - c1 |= (c2 >> 6) & 0x03; - rs.append(base64_code[c1 & 0x3f]); - rs.append(base64_code[c2 & 0x3f]); - } - } - - /** - * Look up the 3 bits base64-encoded by the specified character, range-checking - * against conversion table - * @param x the base64-encoded value - * @return the decoded value of x - */ - private static byte char64(char x) { - if (x > index_64.length) { - return -1; - } - return index_64[x]; - } - - /** - * Decode a string encoded using bcrypt's base64 scheme to a byte array. Note that - * this is *not* compatible with the standard MIME-base64 encoding. - * @param s the string to decode - * @param maxolen the maximum number of bytes to decode - * @return an array containing the decoded bytes - * @throws IllegalArgumentException if maxolen is invalid - */ - static byte[] decode_base64(String s, int maxolen) throws IllegalArgumentException { - ByteArrayOutputStream out = new ByteArrayOutputStream(maxolen); - int off = 0, slen = s.length(), olen = 0; - byte c1, c2, c3, c4, o; - - if (maxolen <= 0) { - throw new IllegalArgumentException("Invalid maxolen"); - } - - while (off < slen - 1 && olen < maxolen) { - c1 = char64(s.charAt(off++)); - c2 = char64(s.charAt(off++)); - if (c1 == -1 || c2 == -1) { - break; - } - o = (byte) (c1 << 2); - o |= (c2 & 0x30) >> 4; - out.write(o); - if (++olen >= maxolen || off >= slen) { - break; - } - c3 = char64(s.charAt(off++)); - if (c3 == -1) { - break; - } - o = (byte) ((c2 & 0x0f) << 4); - o |= (c3 & 0x3c) >> 2; - out.write(o); - if (++olen >= maxolen || off >= slen) { - break; - } - c4 = char64(s.charAt(off++)); - o = (byte) ((c3 & 0x03) << 6); - o |= c4; - out.write(o); - ++olen; - } - - return out.toByteArray(); - } - - /** - * Blowfish encipher a single 64-bit block encoded as two 32-bit halves - * @param lr an array containing the two 32-bit half blocks - * @param off the position in the array of the blocks - */ - private final void encipher(int lr[], int off) { - int i, n, l = lr[off], r = lr[off + 1]; - - l ^= P[0]; - for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2;) { - // Feistel substitution on left word - n = S[(l >> 24) & 0xff]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[++i]; - - // Feistel substitution on right word - n = S[(r >> 24) & 0xff]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[++i]; - } - lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; - lr[off + 1] = l; - } - - /** - * Cycically extract a word of key material - * @param data the string to extract the data from - * @param offp a "pointer" (as a one-entry array) to the current offset into data - * @return the next word of material from data - */ - private static int streamtoword(byte data[], int offp[]) { - int i; - int word = 0; - int off = offp[0]; - - for (i = 0; i < 4; i++) { - word = (word << 8) | (data[off] & 0xff); - off = (off + 1) % data.length; - } - - offp[0] = off; - return word; - } - - /** - * Initialise the Blowfish key schedule - */ - private void init_key() { - P = (int[]) P_orig.clone(); - S = (int[]) S_orig.clone(); - } - - /** - * Key the Blowfish cipher - * @param key an array containing the key - */ - private void key(byte key[]) { - int i; - int koffp[] = { 0 }; - int lr[] = { 0, 0 }; - int plen = P.length, slen = S.length; - - for (i = 0; i < plen; i++) { - P[i] = P[i] ^ streamtoword(key, koffp); - } - - for (i = 0; i < plen; i += 2) { - encipher(lr, 0); - P[i] = lr[0]; - P[i + 1] = lr[1]; - } - - for (i = 0; i < slen; i += 2) { - encipher(lr, 0); - S[i] = lr[0]; - S[i + 1] = lr[1]; - } - } - - /** - * Perform the "enhanced key schedule" step described by Provos and Mazieres in - * "A Future-Adaptable Password Scheme" https://www.openbsd.org/papers/bcrypt-paper.ps - * @param data salt information - * @param key password information - */ - private void ekskey(byte data[], byte key[]) { - int i; - int koffp[] = { 0 }, doffp[] = { 0 }; - int lr[] = { 0, 0 }; - int plen = P.length, slen = S.length; - - for (i = 0; i < plen; i++) { - P[i] = P[i] ^ streamtoword(key, koffp); - } - - for (i = 0; i < plen; i += 2) { - lr[0] ^= streamtoword(data, doffp); - lr[1] ^= streamtoword(data, doffp); - encipher(lr, 0); - P[i] = lr[0]; - P[i + 1] = lr[1]; - } - - for (i = 0; i < slen; i += 2) { - lr[0] ^= streamtoword(data, doffp); - lr[1] ^= streamtoword(data, doffp); - encipher(lr, 0); - S[i] = lr[0]; - S[i + 1] = lr[1]; - } - } - - static long roundsForLogRounds(int log_rounds) { - if (log_rounds < 4 || log_rounds > 31) { - throw new IllegalArgumentException("Bad number of rounds"); - } - return 1L << log_rounds; - } - - /** - * Perform the central password hashing step in the bcrypt scheme - * @param password the password to hash - * @param salt the binary salt to hash with the password - * @param log_rounds the binary logarithm of the number of rounds of hashing to apply - * @return an array containing the binary hashed password - */ - private byte[] crypt_raw(byte password[], byte salt[], int log_rounds) { - int cdata[] = (int[]) bf_crypt_ciphertext.clone(); - int clen = cdata.length; - byte ret[]; - - long rounds = roundsForLogRounds(log_rounds); - - init_key(); - ekskey(salt, password); - for (long i = 0; i < rounds; i++) { - key(password); - key(salt); - } - - for (int i = 0; i < 64; i++) { - for (int j = 0; j < (clen >> 1); j++) { - encipher(cdata, j << 1); - } - } - - ret = new byte[clen * 4]; - for (int i = 0, j = 0; i < clen; i++) { - ret[j++] = (byte) ((cdata[i] >> 24) & 0xff); - ret[j++] = (byte) ((cdata[i] >> 16) & 0xff); - ret[j++] = (byte) ((cdata[i] >> 8) & 0xff); - ret[j++] = (byte) (cdata[i] & 0xff); - } - return ret; - } - - /** - * Hash a password using the OpenBSD bcrypt scheme - * @param password the password to hash - * @param salt the salt to hash with (perhaps generated using BCrypt.gensalt) - * @return the hashed password - * @throws IllegalArgumentException if invalid salt is passed - */ - public static String hashpw(String password, String salt) throws IllegalArgumentException { - BCrypt B; - String real_salt; - byte passwordb[], saltb[], hashed[]; - char minor = (char) 0; - int rounds, off = 0; - StringBuilder rs = new StringBuilder(); - - if (salt == null) { - throw new IllegalArgumentException("salt cannot be null"); - } - - int saltLength = salt.length(); - - if (saltLength < 28) { - throw new IllegalArgumentException("Invalid salt"); - } - - if (salt.charAt(0) != '$' || salt.charAt(1) != '2') { - throw new IllegalArgumentException("Invalid salt version"); - } - if (salt.charAt(2) == '$') { - off = 3; - } - else { - minor = salt.charAt(2); - if (minor != 'a' || salt.charAt(3) != '$') { - throw new IllegalArgumentException("Invalid salt revision"); - } - off = 4; - } - - if (saltLength - off < 25) { - throw new IllegalArgumentException("Invalid salt"); - } - - // Extract number of rounds - if (salt.charAt(off + 2) > '$') { - throw new IllegalArgumentException("Missing salt rounds"); - } - rounds = Integer.parseInt(salt.substring(off, off + 2)); - - real_salt = salt.substring(off + 3, off + 25); - try { - passwordb = (password + (minor >= 'a' ? "\000" : "")).getBytes("UTF-8"); - } - catch (UnsupportedEncodingException uee) { - throw new AssertionError("UTF-8 is not supported"); - } - - saltb = decode_base64(real_salt, BCRYPT_SALT_LEN); - - B = new BCrypt(); - hashed = B.crypt_raw(passwordb, saltb, rounds); - - rs.append("$2"); - if (minor >= 'a') { - rs.append(minor); - } - rs.append("$"); - if (rounds < 10) { - rs.append("0"); - } - rs.append(rounds); - rs.append("$"); - encode_base64(saltb, saltb.length, rs); - encode_base64(hashed, bf_crypt_ciphertext.length * 4 - 1, rs); - return rs.toString(); - } - - /** - * Generate a salt for use with the BCrypt.hashpw() method - * @param log_rounds the log2 of the number of rounds of hashing to apply - the work - * factor therefore increases as 2**log_rounds. Minimum 4, maximum 31. - * @param random an instance of SecureRandom to use - * @return an encoded salt value - */ - public static String gensalt(int log_rounds, SecureRandom random) { - if (log_rounds < MIN_LOG_ROUNDS || log_rounds > MAX_LOG_ROUNDS) { - throw new IllegalArgumentException("Bad number of rounds"); - } - StringBuilder rs = new StringBuilder(); - byte rnd[] = new byte[BCRYPT_SALT_LEN]; - - random.nextBytes(rnd); - - rs.append("$2a$"); - if (log_rounds < 10) { - rs.append("0"); - } - rs.append(log_rounds); - rs.append("$"); - encode_base64(rnd, rnd.length, rs); - return rs.toString(); - } - - /** - * Generate a salt for use with the BCrypt.hashpw() method - * @param log_rounds the log2 of the number of rounds of hashing to apply - the work - * factor therefore increases as 2**log_rounds. Minimum 4, maximum 31. - * @return an encoded salt value - */ - public static String gensalt(int log_rounds) { - return gensalt(log_rounds, new SecureRandom()); - } - - /** - * Generate a salt for use with the BCrypt.hashpw() method, selecting a reasonable - * default for the number of hashing rounds to apply - * @return an encoded salt value - */ - public static String gensalt() { - return gensalt(GENSALT_DEFAULT_LOG2_ROUNDS); - } - - /** - * Check that a plaintext password matches a previously hashed one - * @param plaintext the plaintext password to verify - * @param hashed the previously-hashed password - * @return true if the passwords match, false otherwise - */ - public static boolean checkpw(String plaintext, String hashed) { - return equalsNoEarlyReturn(hashed, hashpw(plaintext, hashed)); - } - - static boolean equalsNoEarlyReturn(String a, String b) { - char[] caa = a.toCharArray(); - char[] cab = b.toCharArray(); - - if (caa.length != cab.length) { - return false; - } - - byte ret = 0; - for (int i = 0; i < caa.length; i++) { - ret |= caa[i] ^ cab[i]; - } - return ret == 0; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/passwordEncoder/BCryptPasswordEncoderUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/passwordEncoder/BCryptPasswordEncoderUtils.java deleted file mode 100644 index 0be3f5b..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/passwordEncoder/BCryptPasswordEncoderUtils.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.arm.equipment.system.data.util.passwordEncoder; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.security.SecureRandom; -import java.util.regex.Pattern; -/** - * - * - * @author: admin - * @time: 2022/9/16 11:20 - */ -public class BCryptPasswordEncoderUtils { - - private Pattern BCRYPT_PATTERN = Pattern - .compile("\\A\\$2a?\\$\\d\\d\\$[./0-9A-Za-z]{53}"); - private final Log logger = LogFactory.getLog(getClass()); - - private final int strength; - - private final SecureRandom random; - - public BCryptPasswordEncoderUtils() { - this(-1); - } - - /** - * @param strength the log rounds to use, between 4 and 31 - */ - public BCryptPasswordEncoderUtils(int strength) { - this(strength, null); - } - - /** - * @param strength the log rounds to use, between 4 and 31 - * @param random the secure random instance to use - */ - public BCryptPasswordEncoderUtils(int strength, SecureRandom random) { - if (strength != -1 && (strength < BCrypt.MIN_LOG_ROUNDS || strength > BCrypt.MAX_LOG_ROUNDS)) { - throw new IllegalArgumentException("Bad strength"); - } - this.strength = strength; - this.random = random; - } - - public static void main(String[] args) { - BCryptPasswordEncoderUtils da=new BCryptPasswordEncoderUtils(); - System.out.println(da.encode("123123")); - } - - public String encode(CharSequence rawPassword) { - String salt; - if (strength > 0) { - if (random != null) { - salt = BCrypt.gensalt(strength, random); - } else { - salt = BCrypt.gensalt(strength); - } - } else { - salt = BCrypt.gensalt(); - } - return BCrypt.hashpw(rawPassword.toString(), salt); - } - - public boolean matches(CharSequence rawPassword, String encodedPassword) { - if (encodedPassword == null || encodedPassword.length() == 0) { - logger.warn("Empty encoded password"); - return false; - } - - if (!BCRYPT_PATTERN.matcher(encodedPassword).matches()) { - logger.warn("Encoded password does not look like BCrypt"); - return false; - } - - return BCrypt.checkpw(rawPassword.toString(), encodedPassword); - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/RespJSON.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/RespJSON.java deleted file mode 100644 index b8eb20c..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/RespJSON.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.arm.equipment.system.data.vo; - - -import java.io.Serializable; - -/** - * action ajax封装json数据的对象 - * - * @author admin - */ -public class RespJSON implements Serializable { - - private static final long serialVersionUID = -1793734311569686636L; - - /** - * 结果代码 - */ - private Integer code; - - /** - * 结果描述 - */ - private String message; - - /** - * 数据 - */ - private Object data; - - /** - * 不允许外部new对象 - */ - private RespJSON() { - } - - /** - * 取得返回JsonResult对象 - * - * @param returnCode - * @return - */ - public static RespJSON returnCode(ReturnCode returnCode) { - RespJSON respJSON = new RespJSON(); - respJSON.setCode(returnCode.getCode()); - respJSON.setMessage(returnCode.getMsg()); - return respJSON; - } - - /** - * 返回成功的数据 - * - * @return - */ - public static RespJSON success() { - ReturnCode returnCode = ReturnCode.CODE_OK; - RespJSON respJSON = new RespJSON(); - respJSON.setCode(returnCode.getCode()); - respJSON.setMessage(returnCode.getMsg()); - return respJSON; - } - - /** - * 返回成功的数据 - * - * @param data - * @return - */ - public static RespJSON success(Object data) { - ReturnCode returnCode = ReturnCode.CODE_OK; - RespJSON respJSON = new RespJSON(); - respJSON.setCode(returnCode.getCode()); - respJSON.setMessage(returnCode.getMsg()); - respJSON.setData(data); - return respJSON; - } - - /** - * 返回自定义code以及message - */ - public static RespJSON returnCustomCodeWithMessage(Integer code, String message) { - RespJSON respJSON = new RespJSON(); - respJSON.setCode(code); - respJSON.setMessage(message); - return respJSON; - } - - /** - * 取得返回JsonResult对象 - * - * @param - * @param data - * @return - */ - public static RespJSON returnCode(ReturnCode returnCode, Object data) { - RespJSON respJSON = new RespJSON(); - respJSON.setCode(returnCode.getCode()); - respJSON.setMessage(returnCode.getMsg()); - respJSON.setData(data); - return respJSON; - } - - /** - * 取得返回JsonResult对象 - * - * @param returnCode - * @param msgData - * @return 返回信息的动态数据 - */ - public static RespJSON returnCodeWithMessage(ReturnCode returnCode, Object... msgData) { - RespJSON respJSON = new RespJSON(); - respJSON.setCode(returnCode.getCode()); - if (msgData != null && msgData.length > 0 && returnCode.getMsg() != null) { - respJSON.setMessage(String.format(returnCode.getMsg(), msgData)); - } else { - respJSON.setMessage(returnCode.getMsg()); - } - return respJSON; - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - /** - * 获取 数据 - * - * @return - */ - public Object getData() { - return data; - } - - /** - * 设置 数据 - * - * @param data - */ - public void setData(Object data) { - this.data = data; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/ReturnCode.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/ReturnCode.java deleted file mode 100644 index ee33809..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/ReturnCode.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.arm.equipment.system.data.vo; - -/** - * 返回错误码,对外接口一定要设置错误码 错误码按照顺序递增,不要重复 - */ -public enum ReturnCode { - - CODE_OK(200, "成功"), - - OPEN_API_CODE_OK(0, "成功"), - - SYS_ERROR(1, "系统繁忙,请联系管理员。"), - - LOGIN_TIMEOUT_ERROR(2, "登录已超时,请重新登录。"), - - PERMISSION_DENY(3, "当前用户,没有权限。"), - - PARAM_ERROR(4, "参数错误"), - - CUSTOM_EXCEPTION(5, "自定义异常"), - - SYS_PARAM_IS_NULL_ERROR(6, "入参%s不能为空"), - - PARSE_ERROR(7, "数据解析错误"), - - CUSTOM_MESSAGE(8, "%s"), - - NOT_LOGIN_ERROR(9, "用户未登录"), - - TOKEN_EXPIRATION_ERROR(9, "token过期"), - - INVALID_USER_ERROR(9, "无效用户"), - - VERSION_NEED_UPGRADE(10, "APP版本需要升级"), - - LOGON_USER(11, "该账户已注销"), - - /** - * The success. - */ - SUCCESS(0, "成功"), - - /** - * The fail. - */ - FAIL(-1, "系统繁忙,请稍后再试"), - ; - - private Integer code; - private String msg; - - ReturnCode(Integer code, String msg) { - this.code = code; - this.msg = msg; - } - - public Integer getCode() { - return this.code; - } - - public String getMsg() { - return this.msg; - } - - @Override - public String toString() { - return "code:" + code + ", msg:" + msg; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/dict/DictVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/dict/DictVO.java deleted file mode 100644 index 302c39e..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/dict/DictVO.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.arm.equipment.system.data.vo.dict; - -import java.io.Serializable; - -/** - * 字典、枚举数据封装对象 - * @author admin - */ -public class DictVO implements Serializable { - - private String code; - private String text; - private Integer index; - - public DictVO() { - } - - public DictVO(String code, String text) { - this.code = code; - this.text = text; - } - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - public Integer getIndex() { - return index; - } - - public void setIndex(Integer index) { - this.index = index; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/file/FileResLibVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/file/FileResLibVO.java deleted file mode 100644 index 037638b..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/file/FileResLibVO.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.arm.equipment.system.data.vo.file; - -/** - * 资源文件信息VO - * - * @author: admin - * @time: 2021/11/17 17:25 - */ -public class FileResLibVO { - /**文件路径*/ - private String path; - /**文件类型 1 图片 2 视频*/ - private Integer type; - /**文件大小*/ - private Long fileSize; - /** 时长(秒) */ - private Double duration; - /**图片高*/ - private Integer imgHeight; - /**图片宽*/ - private Integer imgWidth; - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - public Long getFileSize() { - return fileSize; - } - - public void setFileSize(Long fileSize) { - this.fileSize = fileSize; - } - - public Double getDuration() { - return duration; - } - - public void setDuration(Double duration) { - this.duration = duration; - } - - public Integer getImgHeight() { - return imgHeight; - } - - public void setImgHeight(Integer imgHeight) { - this.imgHeight = imgHeight; - } - - public Integer getImgWidth() { - return imgWidth; - } - - public void setImgWidth(Integer imgWidth) { - this.imgWidth = imgWidth; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/file/UploadFileVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/file/UploadFileVO.java deleted file mode 100644 index c546284..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/file/UploadFileVO.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.arm.equipment.system.data.vo.file; - -/** - * 文件上传VO - */ -public class UploadFileVO { - private String fileName; - private Long fileSize; - private String key; - private String suffix; - private String hash; - private Float width; - private Float height; - - public UploadFileVO() { - } - - public UploadFileVO(String fileName, String key) { - this.fileName = fileName; - this.key = key; - } - - public String getSuffix() { - return suffix; - } - - public void setSuffix(String suffix) { - this.suffix = suffix; - } - - public String getFileName() { - return fileName; - } - - public void setFileName(String fileName) { - this.fileName = fileName; - } - - public Long getFileSize() { - return fileSize; - } - - public void setFileSize(Long fileSize) { - this.fileSize = fileSize; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getHash() { - return hash; - } - - public void setHash(String hash) { - this.hash = hash; - } - - public Float getWidth() { - return width; - } - - public void setWidth(Float width) { - this.width = width; - } - - public Float getHeight() { - return height; - } - - public void setHeight(Float height) { - this.height = height; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/res/VideoVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/res/VideoVO.java deleted file mode 100644 index 3ae6d45..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/res/VideoVO.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.arm.equipment.system.data.vo.res; - -/** - * - * - * @author: admin - * @time: 2022/9/16 15:00 - */ -public class VideoVO { - - private static final long serialVersionUID = 1231130572193539013L; - /** 视频地址 */ - private String path; - /** 时长(单位:秒) */ - private double duration; - /** 文章大小(单位:byte) */ - private long size; - - public VideoVO() { - } - - /** - * Gets path. - * - * @return the path - */ - public String getPath() { - return path; - } - - /** - * Sets path. - * - * @param path the path - */ - public void setPath(String path) { - this.path = path; - } - - /** - * Gets duration. - * - * @return the duration - */ - public double getDuration() { - return duration; - } - - /** - * Sets duration. - * - * @param duration the duration - */ - public void setDuration(double duration) { - this.duration = duration; - } - - /** - * Gets size. - * - * @return the size - */ - public long getSize() { - return size; - } - - /** - * Sets size. - * - * @param size the size - */ - public void setSize(long size) { - this.size = size; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/AddRoleVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/AddRoleVO.java deleted file mode 100644 index 83544ff..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/AddRoleVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.arm.equipment.system.data.vo.system; - -import java.util.List; -/** - * - * - * @author: admin - * @time: 2022/9/16 11:20 - */ -public class AddRoleVO { - - private List newRole; - - private Long userId; - - public Long getUserId() { - return userId; - } - - public void setUserId(Long userId) { - this.userId = userId; - } - - public List getNewRole() { - return newRole; - } - - public void setNewRole(List newRole) { - this.newRole = newRole; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/SysDeptUserVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/SysDeptUserVO.java deleted file mode 100644 index a4be16f..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/SysDeptUserVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.arm.equipment.system.data.vo.system; - -import java.util.List; - -/** - * - * - * @author: admin - * @time: 2021/10/20 15:49 - */ -public class SysDeptUserVO { - - private Long id; - private String name; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public SysDeptUserVO(Long id, String name) { - this.id = id; - this.name = name; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/SysRoleResourceVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/SysRoleResourceVO.java deleted file mode 100644 index bedb4c3..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/SysRoleResourceVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.arm.equipment.system.data.vo.system; - -import java.util.List; - -/** - * - * - * @author: admin - * @time: 2021/10/20 15:49 - */ -public class SysRoleResourceVO { - - private List resourcesIds; - - private Long roleId; - - public SysRoleResourceVO() { - } - - public Long getRoleId() { - return roleId; - } - - public void setRoleId(Long roleId) { - this.roleId = roleId; - } - - public List getResourcesIds() { - return resourcesIds; - } - - public void setResourcesIds(List resourcesIds) { - this.resourcesIds = resourcesIds; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/VerifyCodeVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/VerifyCodeVO.java deleted file mode 100644 index ec13d9f..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/vo/system/VerifyCodeVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.arm.equipment.system.data.vo.system; - - -import com.arm.equipment.system.data.domain.BaseDomain; - -/** - * 验证码VO - * - * @author ousei - * @date 2020年8月6日14:33:42 - */ -public class VerifyCodeVO extends BaseDomain { - /** 二维码 */ - private String code; - /** 图片数组 */ - private byte[] imgBytes; - /** 过期时间 */ - private long expireTime; - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public byte[] getImgBytes() { - return imgBytes; - } - - public void setImgBytes(byte[] imgBytes) { - this.imgBytes = imgBytes; - } - - public long getExpireTime() { - return expireTime; - } - - public void setExpireTime(long expireTime) { - this.expireTime = expireTime; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/application.yml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/application.yml deleted file mode 100644 index e69de29..0000000 diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/appUserMapper.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/appUserMapper.xml deleted file mode 100644 index d2f3d09..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/appUserMapper.xml +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - - - - - - id,nickname,username,password,phone,status,login_time,create_time,update_time,remark - - - - - - AND id = #{id,jdbcType=BIGINT} - - - AND nickname = #{nickname,jdbcType=VARCHAR} - - - AND username = #{username,jdbcType=VARCHAR} - - - AND password = #{password,jdbcType=VARCHAR} - - - AND phone = #{phone,jdbcType=VARCHAR} - - - - AND status = #{status,jdbcType=INTEGER} - - - AND status != -9 - - - - AND login_time = #{loginTime,jdbcType=TIMESTAMP} - - - AND create_time = #{createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{remark,jdbcType=VARCHAR} - - - - - - - - SELECT - - FROM app_user - - - - - INSERT INTO app_user - - - id, - - - nickname, - - - username, - - - password, - - - phone, - - - status, - - - login_time, - - create_time, - update_time, - - remark, - - - - - #{id,jdbcType=BIGINT}, - - - #{nickname,jdbcType=VARCHAR}, - - - #{username,jdbcType=VARCHAR}, - - - #{password,jdbcType=VARCHAR}, - - - #{phone,jdbcType=VARCHAR}, - - - #{status,jdbcType=INTEGER}, - - - #{loginTime,jdbcType=TIMESTAMP}, - - now(3), - now(3), - - #{remark,jdbcType=VARCHAR}, - - - - - - UPDATE app_user - - - nickname = #{param1.nickname,jdbcType=VARCHAR}, - - - username = #{param1.username,jdbcType=VARCHAR}, - - - password = #{param1.password,jdbcType=VARCHAR}, - - - phone = #{param1.phone,jdbcType=VARCHAR}, - - - status = #{param1.status,jdbcType=INTEGER}, - - - login_time = #{param1.loginTime,jdbcType=TIMESTAMP}, - - update_time = now(3), - - remark = #{param1.remark,jdbcType=VARCHAR}, - - - - - AND id = #{param2.id,jdbcType=BIGINT} - - - AND nickname = #{param2.nickname,jdbcType=VARCHAR} - - - AND username = #{param2.username,jdbcType=VARCHAR} - - - AND password = #{param2.password,jdbcType=VARCHAR} - - - AND phone = #{param2.phone,jdbcType=VARCHAR} - - - AND status = #{param2.status,jdbcType=INTEGER} - - - AND login_time = #{param2.loginTime,jdbcType=TIMESTAMP} - - - AND create_time = #{param2.createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{param2.updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{param2.remark,jdbcType=VARCHAR} - - - - - - - - - - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysBaseParamMapper.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysBaseParamMapper.xml deleted file mode 100644 index fd0e6bf..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysBaseParamMapper.xml +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - - - - - - - - - - - id,uni_code,value,description,operator,status,create_time,update_time,remark - - - - - - AND id = #{id,jdbcType=BIGINT} - - - AND uni_code = #{uniCode,jdbcType=VARCHAR} - - - AND value = #{value,jdbcType=VARCHAR} - - - AND description = #{description,jdbcType=VARCHAR} - - - AND operator = #{operator,jdbcType=VARCHAR} - - - AND status = #{status,jdbcType=INTEGER} - - - AND create_time = #{createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{remark,jdbcType=VARCHAR} - - - - - - SELECT - - FROM sys_base_param - - - - - INSERT INTO sys_base_param - - - id, - - - uni_code, - - - value, - - - description, - - - operator, - - - status, - - create_time, - update_time, - - remark, - - - - - #{id,jdbcType=BIGINT}, - - - #{uniCode,jdbcType=VARCHAR}, - - - #{value,jdbcType=VARCHAR}, - - - #{description,jdbcType=VARCHAR}, - - - #{operator,jdbcType=VARCHAR}, - - - #{status,jdbcType=INTEGER}, - - now(3), - now(3), - - #{remark,jdbcType=VARCHAR}, - - - - - - UPDATE sys_base_param - - - uni_code = #{param1.uniCode,jdbcType=VARCHAR}, - - - value = #{param1.value,jdbcType=VARCHAR}, - - - description = #{param1.description,jdbcType=VARCHAR}, - - - operator = #{param1.operator,jdbcType=VARCHAR}, - - - status = #{param1.status,jdbcType=INTEGER}, - - update_time = now(3), - - remark = #{param1.remark,jdbcType=VARCHAR}, - - - - - AND id = #{param2.id,jdbcType=BIGINT} - - - AND uni_code = #{param2.uniCode,jdbcType=VARCHAR} - - - AND value = #{param2.value,jdbcType=VARCHAR} - - - AND description = #{param2.description,jdbcType=VARCHAR} - - - AND operator = #{param2.operator,jdbcType=VARCHAR} - - - AND status = #{param2.status,jdbcType=INTEGER} - - - AND create_time = #{param2.createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{param2.updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{param2.remark,jdbcType=VARCHAR} - - - - - - - - - - - - - - DELETE FROM sys_base_param WHERE id = #{id, jdbcType=VARCHAR} - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysLogMapper.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysLogMapper.xml deleted file mode 100644 index d28a120..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysLogMapper.xml +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - id,type,title,remote_addr,user_agent,request_uri,method,params,exception,status,operator,create_time,update_time,remark - - - - - - AND id = #{id,jdbcType=BIGINT} - - - AND type = #{type,jdbcType=INTEGER} - - - AND title = #{title,jdbcType=VARCHAR} - - - AND remote_addr = #{remoteAddr,jdbcType=VARCHAR} - - - AND user_agent = #{userAgent,jdbcType=VARCHAR} - - - AND request_uri = #{requestUri,jdbcType=VARCHAR} - - - AND method = #{method,jdbcType=VARCHAR} - - - AND params = #{params,jdbcType=VARCHAR} - - - AND exception = #{exception,jdbcType=VARCHAR} - - - - AND status = #{status,jdbcType=INTEGER} - - - AND status != -9 - - - - AND operator = #{operator,jdbcType=VARCHAR} - - - AND create_time = #{createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{remark,jdbcType=VARCHAR} - - - - - - - - SELECT - - FROM sys_log - - - - - INSERT INTO sys_log - - - id, - - - type, - - - title, - - - remote_addr, - - - user_agent, - - - request_uri, - - - method, - - - params, - - - exception, - - - status, - - - operator, - - create_time, - update_time, - - remark, - - - - - #{id,jdbcType=BIGINT}, - - - #{type,jdbcType=INTEGER}, - - - #{title,jdbcType=VARCHAR}, - - - #{remoteAddr,jdbcType=VARCHAR}, - - - #{userAgent,jdbcType=VARCHAR}, - - - #{requestUri,jdbcType=VARCHAR}, - - - #{method,jdbcType=VARCHAR}, - - - #{params,jdbcType=VARCHAR}, - - - #{exception,jdbcType=VARCHAR}, - - - #{status,jdbcType=INTEGER}, - - - #{operator,jdbcType=VARCHAR}, - - now(3), - now(3), - - #{remark,jdbcType=VARCHAR}, - - - - - - UPDATE sys_log - - - type = #{param1.type,jdbcType=INTEGER}, - - - title = #{param1.title,jdbcType=VARCHAR}, - - - remote_addr = #{param1.remoteAddr,jdbcType=VARCHAR}, - - - user_agent = #{param1.userAgent,jdbcType=VARCHAR}, - - - request_uri = #{param1.requestUri,jdbcType=VARCHAR}, - - - method = #{param1.method,jdbcType=VARCHAR}, - - - params = #{param1.params,jdbcType=VARCHAR}, - - - exception = #{param1.exception,jdbcType=VARCHAR}, - - - status = #{param1.status,jdbcType=INTEGER}, - - - operator = #{param1.operator,jdbcType=VARCHAR}, - - update_time = now(3), - - remark = #{param1.remark,jdbcType=VARCHAR}, - - - - - AND id = #{param2.id,jdbcType=BIGINT} - - - AND type = #{param2.type,jdbcType=INTEGER} - - - AND title = #{param2.title,jdbcType=VARCHAR} - - - AND remote_addr = #{param2.remoteAddr,jdbcType=VARCHAR} - - - AND user_agent = #{param2.userAgent,jdbcType=VARCHAR} - - - AND request_uri = #{param2.requestUri,jdbcType=VARCHAR} - - - AND method = #{param2.method,jdbcType=VARCHAR} - - - AND params = #{param2.params,jdbcType=VARCHAR} - - - AND exception = #{param2.exception,jdbcType=VARCHAR} - - - AND status = #{param2.status,jdbcType=INTEGER} - - - AND operator = #{param2.operator,jdbcType=VARCHAR} - - - AND create_time = #{param2.createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{param2.updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{param2.remark,jdbcType=VARCHAR} - - - - - - - - - - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysResourceMapper.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysResourceMapper.xml deleted file mode 100644 index 7ba75f1..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysResourceMapper.xml +++ /dev/null @@ -1,290 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - id,name,url,parent_id,icon,sort,type,identity,is_show,status,operator,create_time,update_time,remark,root_path - - - - - - AND id = #{id,jdbcType=BIGINT} - - - AND name = #{name,jdbcType=VARCHAR} - - - AND url = #{url,jdbcType=VARCHAR} - - - AND parent_id = #{parentId,jdbcType=VARCHAR} - - - AND icon = #{icon,jdbcType=VARCHAR} - - - AND sort = #{sort,jdbcType=INTEGER} - - - AND type = #{type,jdbcType=INTEGER} - - - AND identity = #{identity,jdbcType=VARCHAR} - - - AND is_show = #{isShow,jdbcType=INTEGER} - - - AND status = #{status,jdbcType=INTEGER} - - - AND operator = #{operator,jdbcType=VARCHAR} - - - AND create_time = #{createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{remark,jdbcType=VARCHAR} - - - AND root_path = #{rootPath,jdbcType=VARCHAR} - - - AND id IN - - #{id,jdbcType=VARCHAR} - - - - - - - SELECT - - FROM sys_resource - - - - - INSERT INTO sys_resource - - - id, - - - name, - - - url, - - - parent_id, - - - icon, - - - sort, - - - type, - - - identity, - - - is_show, - - - status, - - - operator, - - create_time, - update_time, - - remark, - - - root_path, - - - - - #{id,jdbcType=BIGINT}, - - - #{name,jdbcType=VARCHAR}, - - - #{url,jdbcType=VARCHAR}, - - - #{parentId,jdbcType=VARCHAR}, - - - #{icon,jdbcType=VARCHAR}, - - - #{sort,jdbcType=INTEGER}, - - - #{type,jdbcType=INTEGER}, - - - #{identity,jdbcType=VARCHAR}, - - - #{isShow,jdbcType=INTEGER}, - - - #{status,jdbcType=INTEGER}, - - - #{operator,jdbcType=VARCHAR}, - - now(3), - now(3), - - #{remark,jdbcType=VARCHAR}, - - - #{rootPath,jdbcType=VARCHAR}, - - - - - - UPDATE sys_resource - - - name = #{param1.name,jdbcType=VARCHAR}, - - - url = #{param1.url,jdbcType=VARCHAR}, - - - parent_id = #{param1.parentId,jdbcType=VARCHAR}, - - - icon = #{param1.icon,jdbcType=VARCHAR}, - - - sort = #{param1.sort,jdbcType=INTEGER}, - - - type = #{param1.type,jdbcType=INTEGER}, - - - identity = #{param1.identity,jdbcType=VARCHAR}, - - - is_show = #{param1.isShow,jdbcType=INTEGER}, - - - status = #{param1.status,jdbcType=INTEGER}, - - - operator = #{param1.operator,jdbcType=VARCHAR}, - - update_time = now(3), - - remark = #{param1.remark,jdbcType=VARCHAR}, - - - root_path = #{param1.rootPath,jdbcType=VARCHAR}, - - - - - AND id = #{param2.id,jdbcType=BIGINT} - - - AND name = #{param2.name,jdbcType=VARCHAR} - - - AND url = #{param2.url,jdbcType=VARCHAR} - - - AND parent_id = #{param2.parentId,jdbcType=VARCHAR} - - - AND icon = #{param2.icon,jdbcType=VARCHAR} - - - AND sort = #{param2.sort,jdbcType=INTEGER} - - - AND type = #{param2.type,jdbcType=INTEGER} - - - AND identity = #{param2.identity,jdbcType=VARCHAR} - - - AND is_show = #{param2.isShow,jdbcType=INTEGER} - - - AND status = #{param2.status,jdbcType=INTEGER} - - - AND operator = #{param2.operator,jdbcType=VARCHAR} - - - AND create_time = #{param2.createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{param2.updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{param2.remark,jdbcType=VARCHAR} - - - AND root_path = #{param2.rootPath,jdbcType=VARCHAR} - - - - - - - - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysRoleMapper.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysRoleMapper.xml deleted file mode 100644 index 65da52c..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysRoleMapper.xml +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - - - - - - - - id,name,description,status,operator,create_time,update_time,remark - - - - - - AND id = #{id,jdbcType=BIGINT} - - - AND name = #{name,jdbcType=VARCHAR} - - - AND description = #{description,jdbcType=VARCHAR} - - - AND status = #{status,jdbcType=INTEGER} - - - AND operator = #{operator,jdbcType=VARCHAR} - - - AND create_time = #{createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{remark,jdbcType=VARCHAR} - - - AND id IN - - #{id, jdbcType=VARCHAR} - - - - - - - SELECT - - FROM sys_role - - - - - INSERT INTO sys_role - - - id, - - - name, - - - description, - - - status, - - - operator, - - create_time, - update_time, - - remark, - - - - - #{id,jdbcType=BIGINT}, - - - #{name,jdbcType=VARCHAR}, - - - #{description,jdbcType=VARCHAR}, - - - #{status,jdbcType=INTEGER}, - - - #{operator,jdbcType=VARCHAR}, - - now(3), - now(3), - - #{remark,jdbcType=VARCHAR}, - - - - - - UPDATE sys_role - - - name = #{param1.name,jdbcType=VARCHAR}, - - - description = #{param1.description,jdbcType=VARCHAR}, - - - status = #{param1.status,jdbcType=INTEGER}, - - - operator = #{param1.operator,jdbcType=VARCHAR}, - - update_time = now(3), - - remark = #{param1.remark,jdbcType=VARCHAR}, - - - - - AND id = #{param2.id,jdbcType=BIGINT} - - - AND name = #{param2.name,jdbcType=VARCHAR} - - - AND description = #{param2.description,jdbcType=VARCHAR} - - - AND status = #{param2.status,jdbcType=INTEGER} - - - AND operator = #{param2.operator,jdbcType=VARCHAR} - - - AND create_time = #{param2.createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{param2.updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{param2.remark,jdbcType=VARCHAR} - - - - - - - - - - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysRoleResourceMapper.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysRoleResourceMapper.xml deleted file mode 100644 index 861076e..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysRoleResourceMapper.xml +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - - - - - - id,sys_role_id,sys_resource_id,status,operator,create_time,update_time,remark - - - - - - AND id = #{id,jdbcType=BIGINT} - - - AND sys_role_id = #{sysRoleId,jdbcType=BIGINT} - - - AND sys_resource_id = #{sysResourceId,jdbcType=BIGINT} - - - AND status = #{status,jdbcType=INTEGER} - - - AND operator = #{operator,jdbcType=VARCHAR} - - - AND create_time = #{createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{remark,jdbcType=VARCHAR} - - - - - - SELECT - - FROM sys_role_resource - - - - - INSERT INTO sys_role_resource - - - id, - - - sys_role_id, - - - sys_resource_id, - - - status, - - - operator, - - create_time, - update_time, - - remark, - - - - - #{id,jdbcType=BIGINT}, - - - #{sysRoleId,jdbcType=VARCHAR}, - - - #{sysResourceId,jdbcType=BIGINT}, - - - #{status,jdbcType=INTEGER}, - - - #{operator,jdbcType=VARCHAR}, - - now(3), - now(3), - - #{remark,jdbcType=VARCHAR}, - - - - - - UPDATE sys_role_resource - - - sys_role_id = #{param1.sysRoleId,jdbcType=BIGINT}, - - - sys_resource_id = #{param1.sysResourceId,jdbcType=BIGINT}, - - - status = #{param1.status,jdbcType=INTEGER}, - - - operator = #{param1.operator,jdbcType=VARCHAR}, - - update_time = now(3), - - remark = #{param1.remark,jdbcType=VARCHAR}, - - - - - AND id = #{param2.id,jdbcType=BIGINT} - - - AND sys_role_id = #{param2.sysRoleId,jdbcType=BIGINT} - - - AND sys_resource_id = #{param2.sysResourceId,jdbcType=BIGINT} - - - AND status = #{param2.status,jdbcType=INTEGER} - - - AND operator = #{param2.operator,jdbcType=VARCHAR} - - - AND create_time = #{param2.createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{param2.updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{param2.remark,jdbcType=VARCHAR} - - - - - - - - - - - - - - - delete from sys_role_resource - where sys_role_id = #{roleId,jdbcType=BIGINT} - - - - insert into sys_role_resource (id,sys_role_id,sys_resource_id,status,operator,create_time,update_time) - values - - ( - #{item.id,jdbcType=BIGINT}, #{item.sysRoleId,jdbcType=BIGINT}, #{item.sysResourceId,jdbcType=BIGINT}, - #{item.status,jdbcType=INTEGER}, #{item.operator,jdbcType=VARCHAR},now(3),now(3) - ) - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysUserMapper.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysUserMapper.xml deleted file mode 100644 index 78d0268..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysUserMapper.xml +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - id,username,password,phone,name,email,tag,status,operator,create_time,update_time,remark,is_second_landing - - - - - - AND id = #{id,jdbcType=BIGINT} - - - AND username = #{username,jdbcType=VARCHAR} - - - AND password = #{password,jdbcType=VARCHAR} - - - AND phone = #{phone,jdbcType=VARCHAR} - - - AND name = #{name,jdbcType=VARCHAR} - - - AND email = #{email,jdbcType=VARCHAR} - - - AND tag = #{tag,jdbcType=VARCHAR} - - - AND status = #{status,jdbcType=INTEGER} - - - AND operator = #{operator,jdbcType=VARCHAR} - - - AND create_time = #{createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{remark,jdbcType=VARCHAR} - - - AND is_second_landing = #{isSecondLanding,jdbcType=INTEGER} - - - - - - - SELECT - - FROM sys_user - - - - - INSERT INTO sys_user - - - id, - - - username, - - - password, - - - phone, - - - name, - - - email, - - - tag, - - - status, - - - operator, - - create_time, - update_time, - - remark, - - - is_second_landing, - - - - - #{id,jdbcType=BIGINT}, - - - #{username,jdbcType=VARCHAR}, - - - #{password,jdbcType=VARCHAR}, - - - #{phone,jdbcType=VARCHAR}, - - - #{name,jdbcType=VARCHAR}, - - - #{email,jdbcType=VARCHAR}, - - - #{tag,jdbcType=VARCHAR}, - - - #{status,jdbcType=INTEGER}, - - - #{operator,jdbcType=VARCHAR}, - - now(3), - now(3), - - #{remark,jdbcType=VARCHAR}, - - - #{isSecondLanding,jdbcType=INTEGER}, - - - - - - UPDATE sys_user - - - username = #{param1.username,jdbcType=VARCHAR}, - - - password = #{param1.password,jdbcType=VARCHAR}, - - - phone = #{param1.phone,jdbcType=VARCHAR}, - - - name = #{param1.name,jdbcType=VARCHAR}, - - - email = #{param1.email,jdbcType=VARCHAR}, - - - tag = #{param1.tag,jdbcType=VARCHAR}, - - - status = #{param1.status,jdbcType=INTEGER}, - - - operator = #{param1.operator,jdbcType=VARCHAR}, - - update_time = now(3), - - remark = #{param1.remark,jdbcType=VARCHAR}, - - - is_second_landing = #{param1.isSecondLanding,jdbcType=INTEGER}, - - - - - AND id = #{param2.id,jdbcType=BIGINT} - - - AND username = #{param2.username,jdbcType=VARCHAR} - - - AND password = #{param2.password,jdbcType=VARCHAR} - - - AND phone = #{param2.phone,jdbcType=VARCHAR} - - - AND name = #{param2.name,jdbcType=VARCHAR} - - - AND email = #{param2.email,jdbcType=VARCHAR} - - - AND tag = #{param2.tag,jdbcType=VARCHAR} - - - AND status = #{param2.status,jdbcType=INTEGER} - - - AND operator = #{param2.operator,jdbcType=VARCHAR} - - - AND create_time = #{param2.createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{param2.updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{param2.remark,jdbcType=VARCHAR} - - - AND is_second_landing = #{param2.isSecondLanding,jdbcType=INTEGER} - - - - - - - - - - - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysUserRoleMapper.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysUserRoleMapper.xml deleted file mode 100644 index 4769cb7..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/system/sysUserRoleMapper.xml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - id,sys_role_id,sys_user_id,status,operator,create_time,update_time,remark - - - - - - AND id = #{id,jdbcType=BIGINT} - - - AND sys_role_id = #{sysRoleId,jdbcType=BIGINT} - - - AND sys_user_id = #{sysUserId,jdbcType=BIGINT} - - - AND status = #{status,jdbcType=INTEGER} - - - AND operator = #{operator,jdbcType=VARCHAR} - - - AND create_time = #{createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{remark,jdbcType=VARCHAR} - - - - - - SELECT - - FROM sys_user_role - - - - - INSERT INTO sys_user_role - - - id, - - - sys_role_id, - - - sys_user_id, - - - status, - - - operator, - - create_time, - update_time, - - remark, - - - - - #{id,jdbcType=BIGINT}, - - - #{sysRoleId,jdbcType=BIGINT}, - - - #{sysUserId,jdbcType=BIGINT}, - - - #{status,jdbcType=INTEGER}, - - - #{operator,jdbcType=VARCHAR}, - - now(3), - now(3), - - #{remark,jdbcType=VARCHAR}, - - - - - - UPDATE sys_user_role - - - sys_role_id = #{param1.sysRoleId,jdbcType=BIGINT}, - - - sys_user_id = #{param1.sysUserId,jdbcType=BIGINT}, - - - status = #{param1.status,jdbcType=INTEGER}, - - - operator = #{param1.operator,jdbcType=VARCHAR}, - - update_time = now(3), - - remark = #{param1.remark,jdbcType=VARCHAR}, - - - - - AND id = #{param2.id,jdbcType=BIGINT} - - - AND sys_role_id = #{param2.sysRoleId,jdbcType=BIGINT} - - - AND sys_user_id = #{param2.sysUserId,jdbcType=BIGINT} - - - AND status = #{param2.status,jdbcType=INTEGER} - - - AND operator = #{param2.operator,jdbcType=VARCHAR} - - - AND create_time = #{param2.createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{param2.updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{param2.remark,jdbcType=VARCHAR} - - - - - - - - - - - - - - DELETE FROM sys_user_role WHERE sys_user_id = #{userId,jdbcType=BIGINT} - - - - INSERT INTO sys_user_role - (sys_role_id,sys_user_id,status,operator,create_time,update_time) - VALUES - - ( - #{newRole,jdbcType=BIGINT}, - #{userId,jdbcType=BIGINT}, - 0, - #{operator,jdbcType=VARCHAR}, - now(3), - now(3) - ) - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryLendRecordMapper.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryLendRecordMapper.xml deleted file mode 100644 index aee499f..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryLendRecordMapper.xml +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - - - - - - id,weaponry_id,weaponry_name,num,return_time,return_status,status,create_time,update_time,remark - - - - - - AND id = #{id,jdbcType=BIGINT} - - - AND weaponry_id = #{weaponryId,jdbcType=BIGINT} - - - AND weaponry_name = #{weaponryName,jdbcType=VARCHAR} - - - AND num = #{num,jdbcType=INTEGER} - - - AND return_time = #{returnTime,jdbcType=TIMESTAMP} - - - AND return_status = #{returnStatus,jdbcType=INTEGER} - - - - AND status = #{status,jdbcType=INTEGER} - - - AND status != -9 - - - - AND create_time = #{createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{remark,jdbcType=VARCHAR} - - - - - - - - SELECT - - FROM weaponry_lend_record - - - - - INSERT INTO weaponry_lend_record - - - id, - - - weaponry_id, - - - weaponry_name, - - - num, - - - return_time, - - - return_status, - - - status, - - create_time, - update_time, - - remark, - - - - - #{id,jdbcType=BIGINT}, - - - #{weaponryId,jdbcType=BIGINT}, - - - #{weaponryName,jdbcType=VARCHAR}, - - - #{num,jdbcType=INTEGER}, - - - #{returnTime,jdbcType=TIMESTAMP}, - - - #{returnStatus,jdbcType=INTEGER}, - - - #{status,jdbcType=INTEGER}, - - now(3), - now(3), - - #{remark,jdbcType=VARCHAR}, - - - - - - UPDATE weaponry_lend_record - - - weaponry_id = #{param1.weaponryId,jdbcType=BIGINT}, - - - weaponry_name = #{param1.weaponryName,jdbcType=VARCHAR}, - - - num = #{param1.num,jdbcType=INTEGER}, - - - return_time = #{param1.returnTime,jdbcType=TIMESTAMP}, - - - return_status = #{param1.returnStatus,jdbcType=INTEGER}, - - - status = #{param1.status,jdbcType=INTEGER}, - - update_time = now(3), - - remark = #{param1.remark,jdbcType=VARCHAR}, - - - - - AND id = #{param2.id,jdbcType=BIGINT} - - - AND weaponry_id = #{param2.weaponryId,jdbcType=BIGINT} - - - AND weaponry_name = #{param2.weaponryName,jdbcType=VARCHAR} - - - AND num = #{param2.num,jdbcType=INTEGER} - - - AND return_time = #{param2.returnTime,jdbcType=TIMESTAMP} - - - AND return_status = #{param2.returnStatus,jdbcType=INTEGER} - - - AND status = #{param2.status,jdbcType=INTEGER} - - - AND create_time = #{param2.createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{param2.updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{param2.remark,jdbcType=VARCHAR} - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryMapper.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryMapper.xml deleted file mode 100644 index 2a62ae4..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryMapper.xml +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - id,name,img_path,cartridge_capacity,bullet_caliber,effective_range,total_inventory,lock_inventory,status,create_time,update_time,remark - - - - - - AND id = #{id,jdbcType=BIGINT} - - - AND name = #{name,jdbcType=VARCHAR} - - - AND img_path = #{imgPath,jdbcType=VARCHAR} - - - AND cartridge_capacity = #{cartridgeCapacity,jdbcType=INTEGER} - - - AND bullet_caliber = #{bulletCaliber,jdbcType=DOUBLE} - - - AND effective_range = #{effectiveRange,jdbcType=INTEGER} - - - AND total_inventory = #{totalInventory,jdbcType=INTEGER} - - - AND lock_inventory = #{lockInventory,jdbcType=INTEGER} - - - - AND status = #{status,jdbcType=INTEGER} - - - AND status != -9 - - - - AND create_time = #{createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{remark,jdbcType=VARCHAR} - - - AND lock_inventory >= #{lockInventoryStart,jdbcType=INTEGER} - - - - - - - SELECT - - FROM weaponry - - - - - INSERT INTO weaponry - - - id, - - - name, - - - img_path, - - - cartridge_capacity, - - - bullet_caliber, - - - effective_range, - - - total_inventory, - - - lock_inventory, - - - status, - - create_time, - update_time, - - remark, - - - - - #{id,jdbcType=BIGINT}, - - - #{name,jdbcType=VARCHAR}, - - - #{imgPath,jdbcType=VARCHAR}, - - - #{cartridgeCapacity,jdbcType=INTEGER}, - - - #{bulletCaliber,jdbcType=DOUBLE}, - - - #{effectiveRange,jdbcType=INTEGER}, - - - #{totalInventory,jdbcType=INTEGER}, - - - #{lockInventory,jdbcType=INTEGER}, - - - #{status,jdbcType=INTEGER}, - - now(3), - now(3), - - #{remark,jdbcType=VARCHAR}, - - - - - - UPDATE weaponry - - - name = #{param1.name,jdbcType=VARCHAR}, - - - img_path = #{param1.imgPath,jdbcType=VARCHAR}, - - - cartridge_capacity = #{param1.cartridgeCapacity,jdbcType=INTEGER}, - - - bullet_caliber = #{param1.bulletCaliber,jdbcType=DOUBLE}, - - - effective_range = #{param1.effectiveRange,jdbcType=INTEGER}, - - - total_inventory = #{param1.totalInventory,jdbcType=INTEGER}, - - - lock_inventory = #{param1.lockInventory,jdbcType=INTEGER}, - - - status = #{param1.status,jdbcType=INTEGER}, - - update_time = now(3), - - remark = #{param1.remark,jdbcType=VARCHAR}, - - - - - AND id = #{param2.id,jdbcType=BIGINT} - - - AND name = #{param2.name,jdbcType=VARCHAR} - - - AND img_path = #{param2.imgPath,jdbcType=VARCHAR} - - - AND cartridge_capacity = #{param2.cartridgeCapacity,jdbcType=INTEGER} - - - AND bullet_caliber = #{param2.bulletCaliber,jdbcType=DOUBLE} - - - AND effective_range = #{param2.effectiveRange,jdbcType=INTEGER} - - - AND total_inventory = #{param2.totalInventory,jdbcType=INTEGER} - - - AND lock_inventory = #{param2.lockInventory,jdbcType=INTEGER} - - - AND status = #{param2.status,jdbcType=INTEGER} - - - AND create_time = #{param2.createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{param2.updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{param2.remark,jdbcType=VARCHAR} - - - - - - - - - - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryReturnRecordMapper.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryReturnRecordMapper.xml deleted file mode 100644 index 748e395..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/resources/mybatis/weaponryReturnRecordMapper.xml +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - - - - - - id,weaponry_id,weaponry_name,lend_record_id,num,return_time,status,create_time,update_time,remark - - - - - - AND id = #{id,jdbcType=BIGINT} - - - AND weaponry_id = #{weaponryId,jdbcType=BIGINT} - - - AND weaponry_name = #{weaponryName,jdbcType=VARCHAR} - - - AND lend_record_id = #{lendRecordId,jdbcType=BIGINT} - - - AND num = #{num,jdbcType=INTEGER} - - - AND return_time = #{returnTime,jdbcType=TIMESTAMP} - - - - AND status = #{status,jdbcType=INTEGER} - - - AND status != -9 - - - - AND create_time = #{createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{remark,jdbcType=VARCHAR} - - - - - - - - SELECT - - FROM weaponry_return_record - - - - - INSERT INTO weaponry_return_record - - - id, - - - weaponry_id, - - - weaponry_name, - - - lend_record_id, - - - num, - - - return_time, - - - status, - - create_time, - update_time, - - remark, - - - - - #{id,jdbcType=BIGINT}, - - - #{weaponryId,jdbcType=BIGINT}, - - - #{weaponryName,jdbcType=VARCHAR}, - - - #{lendRecordId,jdbcType=BIGINT}, - - - #{num,jdbcType=INTEGER}, - - - #{returnTime,jdbcType=TIMESTAMP}, - - - #{status,jdbcType=INTEGER}, - - now(3), - now(3), - - #{remark,jdbcType=VARCHAR}, - - - - - - UPDATE weaponry_return_record - - - weaponry_id = #{param1.weaponryId,jdbcType=BIGINT}, - - - weaponry_name = #{param1.weaponryName,jdbcType=VARCHAR}, - - - lend_record_id = #{param1.lendRecordId,jdbcType=BIGINT}, - - - num = #{param1.num,jdbcType=INTEGER}, - - - return_time = #{param1.returnTime,jdbcType=TIMESTAMP}, - - - status = #{param1.status,jdbcType=INTEGER}, - - update_time = now(3), - - remark = #{param1.remark,jdbcType=VARCHAR}, - - - - - AND id = #{param2.id,jdbcType=BIGINT} - - - AND weaponry_id = #{param2.weaponryId,jdbcType=BIGINT} - - - AND weaponry_name = #{param2.weaponryName,jdbcType=VARCHAR} - - - AND lend_record_id = #{param2.lendRecordId,jdbcType=BIGINT} - - - AND num = #{param2.num,jdbcType=INTEGER} - - - AND return_time = #{param2.returnTime,jdbcType=TIMESTAMP} - - - AND status = #{param2.status,jdbcType=INTEGER} - - - AND create_time = #{param2.createTime,jdbcType=TIMESTAMP} - - - AND update_time = #{param2.updateTime,jdbcType=TIMESTAMP} - - - AND remark = #{param2.remark,jdbcType=VARCHAR} - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/Generator.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/Generator.java deleted file mode 100644 index 63f5dcc..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/Generator.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.arm.equipment.system.data.generator; - - -import com.arm.equipment.system.data.generator.domain.ConnectInfo; -import com.arm.equipment.system.data.generator.domain.DoMain; -import com.arm.equipment.system.data.generator.domain.DoMainProperty; -import com.arm.equipment.system.data.generator.domain.FileInfo; -import com.arm.equipment.system.data.generator.util.JDBCUtil; -import com.arm.equipment.system.data.generator.util.StringUtil; -import org.apache.commons.lang3.StringUtils; -import org.junit.jupiter.api.Test; - -import java.io.File; -import java.util.*; - -/** - * 自动在com.xxx.entity.后追加。 - *

如:设置为equip,则会在com.xxx.domain.equip包下生成实体类 - *

其他文件类似,具体可以参考genConnectInfo方法中的设置 - *

多级目录用.分割,如: a.b.c. 则会在com.xxx.domain.a.b.c包下生成实体类 - *

实体类的类名根据表名生成。如:generator_test,则实体类名:GeneratorTest - */ -public class Generator { - /////////////////////////////////////一般只需修改下面两个参数///////////////////////////////////////////// - /** - * todo 修改包名 todo 修改包名 todo 修改包名 - */ - private static final String PACKAGE = "weaponry"; - - /** - * todo 修改表名 todo 修改表名 todo 修改表名 - */ - private static final String TABLE_NAME = "weaponry_return_record"; - /** - * 生成器类型 mysql es - * TODO 注意在这里放开下面注释 - */ - private static final String GENERATOR_TYPE = "mysql"; - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - //sql1获取表信息: 第一列:表名,第二列:表注释 - private static String sql_table; - //sql2获取字段信息: 第一列:字段名称,第二列:字段注释,第三列:字段类型,第四列:varchar长度,第五列:是否可空 - private static String sql_fields; - //本地工程目录,如果不设置,则根据默认的target目录,来生成 - private static String projectPath; - //允许的数据库类型及映射关系 - private static Map dataTypeMap; - - static { - //有序 - dataTypeMap = new LinkedHashMap<>(); - //mysql - dataTypeMap.put("varchar", new String[]{"String", "VARCHAR"}); - dataTypeMap.put("text", new String[]{"String", "VARCHAR"}); - dataTypeMap.put("datetime", new String[]{"Date", "TIMESTAMP"}); - dataTypeMap.put("double", new String[]{"Double", "DOUBLE"}); - dataTypeMap.put("int", new String[]{"Integer", "INTEGER"}); - dataTypeMap.put("bigint", new String[]{"Long", "BIGINT"}); - dataTypeMap.put("time", new String[]{"LocalTime", "TIMESTAMP"}); - dataTypeMap.put("decimal", new String[]{"BigDecimal", "DECIMAL"}); - dataTypeMap.put("date", new String[]{"Date", "TIMESTAMP"}); - dataTypeMap.put("tinyint", new String[]{"Boolean", "TINYINT"}); - dataTypeMap.put("bit", new String[]{"Integer", "INTEGER"}); - } - - @Test - public void test() throws Exception { - - DoMain doMain = new DoMain(); - doMain.setGeneratorType(GENERATOR_TYPE); - JDBCUtil jdbcUtil = new JDBCUtil(genConnectInfo(doMain)); - List> executeSQL; - //第一次查询表信息 - executeSQL = jdbcUtil.executeSQL(sql_table); - - for (List list : executeSQL) { - //0 名称 - doMain.setClassName(StringUtil.getClassName(list.get(0))); - doMain.setNickName(StringUtil.makeFirstCharLow(doMain.getClassName())); - //1 注释 - String tableNote = list.get(1); - if (StringUtils.isEmpty(tableNote)) { - throw new Exception("表注释不能为空"); - } - doMain.setClassNote(tableNote); - doMain.setTableName(TABLE_NAME); - } - //第二次查询字段信息 - executeSQL = jdbcUtil.executeSQL(sql_fields); - jdbcUtil.closeConnection(); - - //检查主键 - StringUtil.checkPrimaryKey(executeSQL.get(0), doMain.getOracle()); - //获取主键类型 - doMain.setIdJavaType(StringUtil.getPrimaryKeyType(executeSQL.get(0), doMain.getOracle())); - - List doMainProperties = new ArrayList<>(); - for (List list : executeSQL) { - DoMainProperty doMainProperty = new DoMainProperty(); - //0 名称 - String colName = list.get(0); - doMainProperty.setColumnName(colName); - doMainProperty.setPropertyName(StringUtil.initCap(colName)); - //1 注释 - String columnNote = list.get(1); - if (StringUtils.isEmpty(columnNote)) { - throw new Exception(colName + "的字段注释不能为空"); - } - doMainProperty.setColumnNote(columnNote); - doMainProperty.setTerProperty(StringUtil.makeFirstCharUp(doMainProperty.getPropertyName())); - //2 类型 - String columnType = list.get(2); - for (String key : dataTypeMap.keySet()) { - if (columnType.startsWith(key)) { - doMainProperty.setJavaType(dataTypeMap.get(key)[0]); - doMainProperty.setJdbcType(dataTypeMap.get(key)[1]); - } - } - if (StringUtils.isEmpty(doMainProperty.getJavaType()) - && StringUtils.isEmpty(doMainProperty.getJdbcType())) { - throw new Exception(colName + "的数据库类型错误,请参照《开发规范》"); - } - //3字符串长度 - String stringMaxLength = list.get(3); - if (StringUtils.isNotEmpty(stringMaxLength)) { - doMainProperty.setStringMaxLength(Integer.valueOf(stringMaxLength)); - } - //4是否可空 - doMainProperty.setNullAble(true); - if (list.get(4).startsWith("N")) { - doMainProperty.setNullAble(false); - } - - - doMainProperties.add(doMainProperty); - } - doMain.setDoMainProperties(doMainProperties); - - if (StringUtils.isEmpty(projectPath)) { - projectPath = new File(Generator.class.getResource("/").toURI()).getParentFile().getParentFile().getPath(); - } - genFiles(doMain, projectPath); - - System.exit(0); - } - - /** - * 生成连接信息 - * - * @param doMain doMain - * @return ConnectInfo - * @throws Exception Exception - */ - private static ConnectInfo genConnectInfo(DoMain doMain) throws Exception { - if (StringUtil.isMysql(TABLE_NAME)) { - doMain.setOracle(false); - } else { - doMain.setOracle(true); - } - //各种包名 - StringBuilder daoPackage = new StringBuilder("com.arm.equipment.system.data.mapper"); - StringBuilder esPackage = new StringBuilder("com.arm.equipment.system.data.es"); - StringBuilder mapperPackage = new StringBuilder("mybatis"); - StringBuilder domainPackage = new StringBuilder("com.arm.equipment.system.data.domain"); - StringBuilder servicePackage = new StringBuilder("com.arm.equipment.system.data.service"); - StringBuilder controllerPackage = new StringBuilder("com.arm.equipment.system.admin.controller"); - if (StringUtils.isEmpty(PACKAGE)) { - throw new Exception("包名不能为空"); - } - ConnectInfo connectInfo = new ConnectInfo(); - //数据库名称 - String DBName = "arm-equipment-system"; - String url = "jdbc:mysql://127.0.0.1:3306/arm-equipment-system?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull"; - //查询准备 - connectInfo.setClassPath("/mysql-connector-java-6.0.6.jar"); - connectInfo.setDriverClass("com.mysql.jdbc.Driver"); - connectInfo.setUrl(url); - connectInfo.setUserName("root"); - connectInfo.setPassword(""); - - sql_table = "select table_name,table_comment from information_schema.TABLES " + - "where table_schema = '" + DBName + "' and table_name='" + TABLE_NAME + "'"; - sql_fields = "select column_name,column_comment,column_type,character_maximum_length,is_nullable " + - "from information_schema.COLUMNS where table_schema = '" + DBName + "' and table_name='" + - TABLE_NAME + "' ORDER BY ordinal_position ASC"; - //设置对应包名 - daoPackage.append(".").append(PACKAGE); - mapperPackage.append(".").append(PACKAGE); - esPackage.append(".").append(PACKAGE); - domainPackage.append(".").append(PACKAGE); - servicePackage.append(".").append(PACKAGE); - controllerPackage.append(".").append(PACKAGE); - - doMain.setPackageName(domainPackage.toString()); - doMain.setSimplePackageName(PACKAGE); - doMain.setDaoPackageName(daoPackage.toString()); - doMain.setEsPackageName(esPackage.toString()); - doMain.setMapperPackageName(mapperPackage.toString()); - doMain.setServicePackageName(servicePackage.toString()); - doMain.setControllerPackageName(controllerPackage.toString()); - return connectInfo; - } - - /** - * 生成对应的文件 - * - * @param doMain vm参数信息 - * @param projectPath 工程目录 - * @throws Exception Exception - */ - private static void genFiles(DoMain doMain, String projectPath) throws Exception { - Map paramMap = new HashMap<>(); - paramMap.put("doMain", doMain); - - //实体类 - FileInfo fileInfo = new FileInfo(); - fileInfo.setTargetProject(projectPath + "/src/main/java"); - fileInfo.setTargetPackage(doMain.getPackageName().toLowerCase()); - StringUtil.genTemplateFile("DoMain.vm", paramMap, fileInfo.toString() + "/" + doMain.getClassName() + ".java", true); - //DAO接口 - fileInfo.setTargetProject(projectPath + "/src/main/java"); - fileInfo.setTargetPackage(doMain.getDaoPackageName().toLowerCase()); - StringUtil.genTemplateFile("IDao.vm", paramMap, fileInfo.toString() + "/I" + doMain.getClassName() + "Mapper.java"); - - if ("mysql".equalsIgnoreCase(GENERATOR_TYPE)) { - //mapper - fileInfo.setTargetProject(projectPath + "/src/main/resources"); - fileInfo.setTargetPackage("/mybatis/"); - StringUtil.genTemplateFile("Mapper.vm", paramMap, fileInfo.toString() + "/" + doMain.getNickName() + "Mapper.xml", true); - } - -// Service - fileInfo.setTargetProject(projectPath + "/src/main/java"); - fileInfo.setTargetPackage(doMain.getServicePackageName().toLowerCase()); -// StringUtil.genTemplateFile("IService.vm", paramMap, fileInfo.toString() + "/I" + doMain.getClassName() + "Service.java"); - //Service impl -// StringUtil.genTemplateFile("IServiceImpl.vm", paramMap, fileInfo.toString() + "/impl/" + doMain.getClassName() + "ServiceImpl.java"); - - - // Controller - fileInfo.setTargetProject(new File(projectPath).getParentFile() + "/admin/src/main/java"); - fileInfo.setTargetPackage(doMain.getControllerPackageName().toLowerCase()); -// StringUtil.genTemplateFile("Controller.vm", paramMap, fileInfo.toString() + "/" + doMain.getClassName() + "Controller.java"); -//// // List vue -// StringUtil.genTemplateFile("List.vm", paramMap, fileInfo.toString() + "/" + doMain.getNickName() + "List.vue"); - - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/ConnectInfo.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/ConnectInfo.java deleted file mode 100644 index 1ac090e..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/ConnectInfo.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.arm.equipment.system.data.generator.domain; - -public class ConnectInfo { - private String classPath; - private String driverClass; - private String url; - private String userName; - private String password; - - public String getClassPath() { - return classPath; - } - - public void setClassPath(String classPath) { - this.classPath = classPath; - } - - public String getDriverClass() { - return driverClass; - } - - public void setDriverClass(String driverClass) { - this.driverClass = driverClass; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/DoMain.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/DoMain.java deleted file mode 100644 index 0b89a9d..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/DoMain.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.arm.equipment.system.data.generator.domain; - -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; - -public class DoMain { - private Boolean oracle; - private String tableName;//表名 - private String packageName; - private String simplePackageName; - private String daoPackageName; - private String esPackageName; - private String mapperPackageName; - private String servicePackageName; - private String controllerPackageName; - private String className;//实体类 类名 - private String nickName;//className 首字母小写 - private String classNote;//表注释 - private String idJavaType;//主键类型 - private String author = System.getProperty("user.name");//作者 - private String date = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());//创建日期 - private List doMainProperties; - private String limitStatement = "LIMIT #{startIndex, jdbcType=INTEGER}, #{pageSize, jdbcType=INTEGER}"; - // 代码生成器类型 mysql es - private String generatorType; - - public String getGeneratorType() { - return generatorType; - } - - public void setGeneratorType(String generatorType) { - this.generatorType = generatorType; - } - - public String getEsPackageName() { - return esPackageName; - } - - public void setEsPackageName(String esPackageName) { - this.esPackageName = esPackageName; - } - - public String getLimitStatement() { - return limitStatement; - } - - public void setLimitStatement(String limitStatement) { - this.limitStatement = limitStatement; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } - - public String getDate() { - return date; - } - - public void setDate(String date) { - this.date = date; - } - - public String getIdJavaType() { - return idJavaType; - } - - public void setIdJavaType(String idJavaType) { - this.idJavaType = idJavaType; - } - - public String getSimplePackageName() { - return simplePackageName; - } - - public void setSimplePackageName(String simplePackageName) { - this.simplePackageName = simplePackageName; - } - - public String getControllerPackageName() { - return controllerPackageName; - } - - public void setControllerPackageName(String controllerPackageName) { - this.controllerPackageName = controllerPackageName; - } - - public Boolean getOracle() { - return oracle; - } - - public void setOracle(Boolean oracle) { - this.oracle = oracle; - } - - public String getTableName() { - return tableName; - } - - public void setTableName(String tableName) { - this.tableName = tableName; - } - - public String getPackageName() { - return packageName; - } - - public void setPackageName(String packageName) { - this.packageName = packageName; - } - - public String getDaoPackageName() { - return daoPackageName; - } - - public void setDaoPackageName(String daoPackageName) { - this.daoPackageName = daoPackageName; - } - - public String getMapperPackageName() { - return mapperPackageName; - } - - public void setMapperPackageName(String mapperPackageName) { - this.mapperPackageName = mapperPackageName; - } - - public String getServicePackageName() { - return servicePackageName; - } - - public void setServicePackageName(String servicePackageName) { - this.servicePackageName = servicePackageName; - } - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - - public String getNickName() { - return nickName; - } - - public void setNickName(String nickName) { - this.nickName = nickName; - } - - public String getClassNote() { - return classNote; - } - - public void setClassNote(String classNote) { - this.classNote = classNote; - } - - public List getDoMainProperties() { - return doMainProperties; - } - - public void setDoMainProperties(List doMainProperties) { - this.doMainProperties = doMainProperties; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/DoMainProperty.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/DoMainProperty.java deleted file mode 100644 index dee493e..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/DoMainProperty.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.arm.equipment.system.data.generator.domain; - -public class DoMainProperty { - - private String columnName;//列名称 - private String columnNote;//列注释 - private String jdbcType; - private String propertyName;//实体类成员变量名称 - private String javaType; - private String terProperty;//实体类成员变量名称,首字母大写 - private Integer stringMaxLength;//字符串的最大长度(数据库中的字符串最好设置成字符,不要设置成字节) - private Boolean nullAble;//字段是否可空 - - public Integer getStringMaxLength() { - return stringMaxLength; - } - - public void setStringMaxLength(Integer stringMaxLength) { - this.stringMaxLength = stringMaxLength; - } - - public Boolean getNullAble() { - return nullAble; - } - - public void setNullAble(Boolean nullAble) { - this.nullAble = nullAble; - } - - public String getColumnName() { - return columnName; - } - - public void setColumnName(String columnName) { - this.columnName = columnName; - } - - public String getColumnNote() { - return columnNote; - } - - public void setColumnNote(String columnNote) { - this.columnNote = columnNote; - } - - public String getJdbcType() { - return jdbcType; - } - - public void setJdbcType(String jdbcType) { - this.jdbcType = jdbcType; - } - - public String getPropertyName() { - return propertyName; - } - - public void setPropertyName(String propertyName) { - this.propertyName = propertyName; - } - - public String getJavaType() { - return javaType; - } - - public void setJavaType(String javaType) { - this.javaType = javaType; - } - - public String getTerProperty() { - return terProperty; - } - - public void setTerProperty(String terProperty) { - this.terProperty = terProperty; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/FileInfo.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/FileInfo.java deleted file mode 100644 index 394d509..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/domain/FileInfo.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.arm.equipment.system.data.generator.domain; - -public class FileInfo { - private String targetProject; - - private String targetPackage; - - public String getTargetProject() { - return targetProject; - } - - public void setTargetProject(String targetProject) { - this.targetProject = targetProject; - } - - public String getTargetPackage() { - return targetPackage; - } - - public void setTargetPackage(String targetPackage) { - this.targetPackage = targetPackage; - } - - @Override - public String toString() { - return targetProject + "/" + targetPackage.replaceAll("\\.", "/"); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/util/JDBCUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/util/JDBCUtil.java deleted file mode 100644 index 2b8d828..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/util/JDBCUtil.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.arm.equipment.system.data.generator.util; - - -import com.arm.equipment.system.data.generator.domain.ConnectInfo; - -import java.io.File; -import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; -import java.sql.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - - -public class JDBCUtil { - - private Connection connection; - - public JDBCUtil(ConnectInfo connectInfo) throws Exception { - connection = getConnection(connectInfo); - } - - private Connection getConnection(ConnectInfo connectInfo) throws Exception { - ClassLoader loader = new URLClassLoader(new URL[]{new File(connectInfo.getClassPath()).toURI().toURL()}); - Class loadClass = loader.loadClass(connectInfo.getDriverClass()); - Properties info = new Properties(); - info.put("user", connectInfo.getUserName()); - info.put("password", connectInfo.getPassword()); - Driver driver = (Driver) loadClass.newInstance(); - Method connectMethod = null; - // 本类中没有找到方法,去父类中找 - while (loadClass != null) { - try { - connectMethod = loadClass.getDeclaredMethod("connect", String.class, Properties.class); - connectMethod.setAccessible(true); - break; - } catch (NoSuchMethodException e) { - loadClass = loadClass.getSuperclass(); - } - } - assert connectMethod != null; - return (Connection) connectMethod.invoke(driver, connectInfo.getUrl(), info); - } - - public List> executeSQL(String sql) throws Exception { - PreparedStatement prepareStatement = connection.prepareStatement(sql); - ResultSet resultSet = prepareStatement.executeQuery(); - List> listList = new ArrayList<>(); - while (resultSet.next()) { - List list = new ArrayList<>(); - // 特殊: 从1 开始 - for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) { - list.add(resultSet.getString(i)); - } - listList.add(list); - } - if (listList.size() < 1) { - throw new Exception("查询结果为空,请检查表是否存在"); - } - return listList; - } - - public void closeConnection() throws SQLException { - connection.close(); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/util/StringUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/util/StringUtil.java deleted file mode 100644 index 8614adc..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/java/com/arm/equipment/system/data/generator/util/StringUtil.java +++ /dev/null @@ -1,210 +0,0 @@ -package com.arm.equipment.system.data.generator.util; - -import org.apache.commons.lang.StringUtils; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.Velocity; -import org.apache.velocity.app.VelocityEngine; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.FileWriter; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -public class StringUtil { - private final static Logger LOGGER = LoggerFactory.getLogger(StringUtil.class); - - private static VelocityEngine engine; - - static { - engine = new VelocityEngine(); - Properties properties = new Properties(); - properties.setProperty(Velocity.RESOURCE_LOADER, "class"); - properties.setProperty("class.resource.loader.class", - "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); - - properties.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8"); - properties.setProperty(Velocity.INPUT_ENCODING, "UTF-8"); - //不生成日志文件 - properties.setProperty(Velocity.RUNTIME_LOG, ""); - try { - engine.init(properties); - } catch (Exception e) { - LOGGER.error(e.getMessage(), e); - } - } - - private StringUtil() { - } - - /** - * 通过模版生成文件,不覆盖之前的文件 - * - * @param vmFileName 模版文件名字 - * @param map 参数 - * @param outFileName 输出文件名字 - * @throws Exception 异常 - */ - public static void genTemplateFile(String vmFileName, Map map, String outFileName) throws Exception { - genTemplateFile(vmFileName, map, outFileName, true); - } - - /** - * 通过模版生成文件 - * - * @param vmFileName 模版文件名字 - * @param map 参数 - * @param outFileName 输出文件名字 - * @param override 是否覆盖 - * @throws Exception 异常 - */ - public static void genTemplateFile(String vmFileName, Map map, String outFileName, boolean override) throws Exception { - File file = new File(outFileName); - // 如果文件父路径不存在 - if (!file.getParentFile().exists()) { - if (!file.getParentFile().mkdirs()) { - throw new Exception("创建文件父路径失败,请检查"); - } - } - if (file.createNewFile()) { - System.out.println("创建文件成功" + file); - } else { - if (!override) { - System.out.println(file + "文件已存在,不更改任何内容"); - return; - } - System.out.println("覆盖!覆盖!覆盖!原文件成功" + file); - } - - Template template = engine.getTemplate("generator/" + vmFileName, "utf-8"); -// Template template = engine.getTemplate("file:C:/howjoy/IdeaWorkSpaces/flash-card-parent/data/src/test/resource/generator/DoMain.vm", "utf-8"); - VelocityContext ctx = new VelocityContext(); - for (String key : map.keySet()) { - ctx.put(key, map.get(key)); - } - try (FileWriter fileWriter = new FileWriter(file)) { - template.merge(ctx, fileWriter); - } - } - - /** - * 将带有 _ 的字符串 驼峰规范化 - * - * @param string 字符串 - * @return 规范化后的字符串 - */ - public static String initCap(String string) { - String[] split = string.toLowerCase().split("_"); - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < split.length; i++) { - if (i == 0) { - builder.append(split[i]); - } else { - builder.append(makeFirstCharUp(split[i])); - } - } - return builder.toString(); - } - - /** - * 获取实体类的className - * - * @param string 表名 - * @return className - * @throws Exception 表命名不规范 - */ - public static String getClassName(String string) throws Exception { - String[] split = string.toLowerCase().split("_"); - StringBuilder builder = new StringBuilder(); - for (String aSplit : split) { - if ("hj".equalsIgnoreCase(aSplit)) { - continue; - } - builder.append(makeFirstCharUp(aSplit)); - } - return builder.toString(); - - } - - public static String makeFirstCharUp(String string) { - char[] ch = string.toCharArray(); - if (ch[0] >= 'a' && ch[0] <= 'z') { - ch[0] = (char) (ch[0] - 32); - } - return new String(ch); - } - - public static String makeFirstCharLow(String string) { - char[] ch = string.toCharArray(); - if (ch[0] >= 'A' && ch[0] <= 'Z') { - ch[0] = (char) (ch[0] + 32); - } - return new String(ch); - } - - /** - * 根据表名判断数据库 - * - * @param tableName 表名 - */ - public static boolean isMysql(String tableName) throws Exception { - if (StringUtils.isEmpty(tableName)) { - throw new Exception("表名不能为空"); - } - char[] chars = tableName.replaceAll("_", "").toCharArray(); - boolean flag = false; - if (Character.isUpperCase(chars[0])) { - //判断后面的字符是否和首字母大写一致 - for (char aChar : chars) { - if (Character.isLowerCase(aChar)) { - throw new Exception("表名不符合规范"); - } - } - } else if (Character.isLowerCase(chars[0])) { - //判断后面的字符是否和首字母小写一致 - for (char aChar : chars) { - if (Character.isUpperCase(aChar)) { - throw new Exception("表名不符合规范"); - } - } - flag = true; - } else { - throw new Exception("表名不符合规范"); - } - return flag; - } - - /** - * 检查主键 - * - * @param firstColumn 查询出的第一列 - * @param oracle 数据库类型 - */ - public static void checkPrimaryKey(List firstColumn, boolean oracle) throws Exception { - if (!oracle) { - if (!firstColumn.get(0).equals("id")) { - throw new Exception("MYSQL表的第一列列名必须是:id"); - } - if (!(firstColumn.get(2).startsWith("bigint") || firstColumn.get(2).startsWith("varchar"))) { - throw new Exception("MYSQL表的第一列id类型必须是:bigint或者varchar"); - } - }else { - if (!(firstColumn.get(2).startsWith("NUMBER") || firstColumn.get(2).startsWith("VARCHAR2"))) { - throw new Exception("MYSQL表的第一列id类型必须是:NUMBER或者VARCHAR2"); - } - } - } - - /** - * 获取主键类型 - * - * @param firstColumn 查询出的第一列 - * @param oracle 数据库类型 - */ - public static String getPrimaryKeyType(List firstColumn, boolean oracle) { - return "String"; - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/BaseEsDao.vm b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/BaseEsDao.vm deleted file mode 100644 index 90568f0..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/BaseEsDao.vm +++ /dev/null @@ -1,14 +0,0 @@ -package ${doMain.esPackageName}; - - -import ${doMain.packageName}.${doMain.className}; -import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; - -/** -* $!{doMain.classNote} -* @author $!{doMain.author} -* @date $!{doMain.date} -*/ -public interface Base$!{doMain.className}EsDao extends ElasticsearchRepository<${doMain.className}, String> { - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/Controller.vm b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/Controller.vm deleted file mode 100644 index 9d91600..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/Controller.vm +++ /dev/null @@ -1,98 +0,0 @@ -package ${doMain.controllerPackageName}; - -import com.arm.equipment.system.admin.controller.BaseController; -import com.arm.equipment.system.admin.util.CurrentUserUtils; -import com.arm.equipment.system.data.domain.PageResult; -import com.arm.equipment.system.data.domain.system.SysUser; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.vo.RespJSON; -import ${doMain.packageName}.${doMain.className}; -import ${doMain.servicePackageName}.I${doMain.className}Service; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.ArrayList; - -/** - * ${doMain.classNote} - * - * @author ${doMain.author} - * @date ${doMain.date} - */ -@RestController -@RequestMapping("/${doMain.simplePackageName}/${doMain.nickName}") -public class ${doMain.className}Controller extends BaseController { - - @Autowired - private I${doMain.className}Service ${doMain.nickName}Service; - - /** - * 保存或更新 - * - * @param ${doMain.nickName}Req ${doMain.nickName}Req - * @return RespJSON - */ - @PostMapping("/save") - public RespJSON save(@RequestBody ${doMain.className} ${doMain.nickName}Req, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - ${doMain.nickName}Service.save(${doMain.nickName}Req, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 分页查询 - * - * @param ${doMain.nickName}Req ${doMain.nickName}Req - * @return RespJSON - */ - @PostMapping("/getPageList") - public RespJSON getPageList(@RequestBody ${doMain.className} ${doMain.nickName}Req) { - int count = ${doMain.nickName}Service.getCount(${doMain.nickName}Req); - List<${doMain.className}> list = new ArrayList<>(); - if (count > 0) { - list = ${doMain.nickName}Service.getPageList(${doMain.nickName}Req); - } - PageResult result = new PageResult(${doMain.nickName}Req.getPageNo(), ${doMain.nickName}Req.getPageSize(), count, list); - return RespJSON.success(result); - } - - /** - * 主键查询 - * - * @param id id - * @return RespJSON - */ - @RequestMapping("/getOneById") - public RespJSON getOneById(Long id) { - return RespJSON.success(${doMain.nickName}Service.getOneById(id)); - } - - /** - * 审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/audit") - @ResponseBody - public RespJSON audit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - ${doMain.nickName}Service.audit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - - /** - * 取消审核 - * - * @param id id - * @return RespJSON - */ - @PostMapping("/unaudit") - @ResponseBody - public RespJSON unaudit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) { - WJAssert.notNull(id, "ID 不合法"); - ${doMain.nickName}Service.unaudit(id, loginSysUser.getUsername()); - return RespJSON.success(); - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/DoMain.vm b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/DoMain.vm deleted file mode 100644 index d1cdab4..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/DoMain.vm +++ /dev/null @@ -1,36 +0,0 @@ -package $!{doMain.packageName}; - -import com.arm.equipment.system.data.domain.BaseDomain; - -import java.util.Date; - -/** - * $!{doMain.classNote} - * - * @author $!{doMain.author} - * @date $!{doMain.date} - */ -#if($!{doMain.generatorType} == "es" || $!{doMain.generatorType} == "ES" ) -@Document(indexName = "$!{doMain.tableName}") -#end -public class $!{doMain.className} extends BaseDomain { -#foreach( $elem in $doMain.doMainProperties) -#if($!{elem.propertyName}!="id" && $!{elem.propertyName}!="createTime" && $!{elem.propertyName}!="updateTime" && $!{elem.propertyName}!="remark" && $!{elem.propertyName}!="operator" ) - /** $!{elem.columnNote} */ - private $elem.javaType $elem.propertyName; -#end -#end -#foreach( $elem in $doMain.doMainProperties) -#if($!{elem.propertyName}!="id" && $!{elem.propertyName}!="createTime" && $!{elem.propertyName}!="updateTime" && $!{elem.propertyName}!="remark" && $!{elem.propertyName}!="operator" ) - - public $elem.javaType get${elem.terProperty}() { - return $elem.propertyName; - } - - public void set${elem.terProperty}(${elem.javaType} ${elem.propertyName}) { - this.${elem.propertyName} = ${elem.propertyName}; - } - -#end -#end -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/EsDao.vm b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/EsDao.vm deleted file mode 100644 index bad3e3e..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/EsDao.vm +++ /dev/null @@ -1,157 +0,0 @@ -package ${doMain.esPackageName}; - - -import com.arm.equipment.system.data.enums.dict.EnumEsSortType; -import BusinessException; -import $!{doMain.packageName}.$!{doMain.className}; -import $!{doMain.daoPackageName}.I$!{doMain.className}Mapper; -import org.apache.commons.lang3.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.sort.SortBuilder; -import org.elasticsearch.search.sort.SortBuilders; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; -import org.springframework.data.elasticsearch.core.SearchHit; -import org.springframework.data.elasticsearch.core.SearchHits; -import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.data.elasticsearch.core.query.Query; -import org.springframework.stereotype.Component; - -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; - -/** -* $!{doMain.classNote} -* @author $!{doMain.author} -* @date $!{doMain.date} -*/ -@Component -public class $!{doMain.className}EsDao implements I$!{doMain.className}Mapper { - - @Autowired - private Base$!{doMain.className}EsDao $!{doMain.nickName}EsDao; - - @Autowired - private ElasticsearchRestTemplate elasticsearchRestTemplate; - - @Override - public int insertSelective($!{doMain.className} req) { - req.setCreateTime(new Date()); - req.setUpdateTime(req.getCreateTime()); - $!{doMain.nickName}EsDao.save(req); - return 1; - } - - @Override - public int updateSelective($!{doMain.className} setParam, $!{doMain.className} whereParam) { - $!{doMain.className} updateReq = buildUpdateCondition(setParam); - updateReq.setId(whereParam.getId()); - $!{doMain.nickName}EsDao.save(updateReq); - return 1; - } - - @Override - public int getCount($!{doMain.className} req) { - BoolQueryBuilder queryBuilder = buildQueryBuilder(req); - //组合构建语句 - Query searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).build(); - long count = elasticsearchRestTemplate.count(searchQuery, $!{doMain.className}.class); - return Math.toIntExact(count); - } - - @Override - public $!{doMain.className} getOne($!{doMain.className} req) { - BoolQueryBuilder queryBuilder = buildQueryBuilder(req); - //组合构建语句 - Query searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).build(); - SearchHits<$!{doMain.className}> hits = elasticsearchRestTemplate.search(searchQuery, $!{doMain.className}.class); - $!{doMain.className} $!{doMain.nickName} = null; - if (hits.getTotalHits() > 0) { - $!{doMain.nickName} = hits.stream().map(SearchHit::getContent).findFirst().orElse(null); - } - return $!{doMain.nickName}; - } - - @Override - public List<$!{doMain.className}> getList($!{doMain.className} req) { - //构建排序条件 - SortBuilder sortBuilder = buildSortBuilder(req); - BoolQueryBuilder queryBuilder = buildQueryBuilder(req); - //组合构建语句 - Query searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).withSort(sortBuilder).build(); - SearchHits<$!{doMain.className}> hits = elasticsearchRestTemplate.search(searchQuery, $!{doMain.className}.class); - return hits.stream().map(SearchHit::getContent).collect(Collectors.toList()); - } - - @Override - public List<$!{doMain.className}> getPageList($!{doMain.className} req) { - //构建排序条件 - SortBuilder sortBuilder = buildSortBuilder(req); - BoolQueryBuilder queryBuilder = buildQueryBuilder(req); - //分页 - Pageable pageable = PageRequest.of(req.getPageNo() - 1, req.getPageSize()); - //组合构建语句 - Query searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).withSort(sortBuilder).withPageable(pageable).build(); - SearchHits<$!{doMain.className}> hits = elasticsearchRestTemplate.search(searchQuery, $!{doMain.className}.class); - return hits.stream().map(SearchHit::getContent).collect(Collectors.toList()); - } - - /** - * 构建查询条件 - * 注意: 生成代码字符串都为模糊查询,如果需要精确查询需要换为(QueryBuilders.termQuery("字段名.keyword")) - * @param req - * @return - */ - private BoolQueryBuilder buildQueryBuilder($!{doMain.className} req) { - BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); - -#foreach( $elem in $doMain.doMainProperties) -#if(${elem.javaType}=='String') - if (StringUtils.isNotBlank(req.get${elem.terProperty}())) { - queryBuilder.must(QueryBuilders.matchQuery("${elem.propertyName}", req.get${elem.terProperty}())); - } -#else - if (req.get${elem.terProperty}() != null) { - queryBuilder.must(QueryBuilders.termQuery("${elem.propertyName}", req.get${elem.terProperty}())); - } -#end -#end - return queryBuilder; - } - - /** - * 构建排序字段 - */ - private SortBuilder buildSortBuilder($!{doMain.className} req) { - //构建默认排序条件 - SortBuilder sortBuilder = SortBuilders.fieldSort(EnumEsSortType.UPDATE_TIME_DESC.getField()).order(EnumEsSortType.UPDATE_TIME_DESC.getSort()); - return sortBuilder; - } - - /** - * 构建更新字段 - * (理论上这里可以用BeanUtils.copyProperties(), 暂时先不用)) - * @param condition - */ - private $!{doMain.className} buildUpdateCondition($!{doMain.className} condition) { - $!{doMain.className} update = $!{doMain.nickName}EsDao.findById(condition.getId()).orElseThrow(() -> new BusinessException("数据不存在")); - update.setUpdateTime(new Date()); -#foreach( $elem in $doMain.doMainProperties) -#if(${elem.javaType}=='String') - if (StringUtils.isNotBlank(condition.get${elem.terProperty}())) { - update.set${elem.terProperty}(condition.get${elem.terProperty}()); - } -#else - if (condition.get${elem.terProperty}() != null) { - update.set${elem.terProperty}(condition.get${elem.terProperty}()); - } -#end -#end - return update; - } - -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IDao.vm b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IDao.vm deleted file mode 100644 index aa1e79f..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IDao.vm +++ /dev/null @@ -1,64 +0,0 @@ -package $!{doMain.daoPackageName}; - -import $!{doMain.packageName}.$!{doMain.className}; - -import java.util.List; - -/** - * $!{doMain.classNote} - * - * @author $!{doMain.author} - * @date $!{doMain.date} - */ -public interface I$!{doMain.className}Mapper { - - /** - * 插入 - * - * @param $!{doMain.nickName} $!{doMain.nickName} - * @return int - */ - int insertSelective($!{doMain.className} $!{doMain.nickName}); - - /** - * 更新 - * - * @param setParam setParam - * @param whereParam whereParam - * @return int - */ - int updateSelective($!{doMain.className} setParam, $!{doMain.className} whereParam); - - /** - * 数量 - * - * @param $!{doMain.nickName} $!{doMain.nickName} - * @return int - */ - int getCount($!{doMain.className} $!{doMain.nickName}); - - /** - * 单条 - * - * @param $!{doMain.nickName} $!{doMain.nickName} - * @return $!{doMain.className} - */ - $!{doMain.className} getOne($!{doMain.className} $!{doMain.nickName}); - - /** - * 多条 - * - * @param $!{doMain.nickName} $!{doMain.nickName} - * @return List<$!{doMain.className}> - */ - List<$!{doMain.className}> getList($!{doMain.className} $!{doMain.nickName}); - - /** - * 分页 - * - * @param $!{doMain.nickName} $!{doMain.nickName} - * @return List<$!{doMain.className}> - */ - List<$!{doMain.className}> getPageList($!{doMain.className} $!{doMain.nickName}); - -} \ No newline at end of file diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IService.vm b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IService.vm deleted file mode 100644 index 4b00b1b..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IService.vm +++ /dev/null @@ -1,88 +0,0 @@ -package $!{doMain.servicePackageName}; - -import $!{doMain.packageName}.$!{doMain.className}; - -import java.util.List; - -/** - * $!{doMain.classNote} - * - * @author $!{doMain.author} - * @date $!{doMain.date} - */ -public interface I$!{doMain.className}Service { - /** - * 保存或更新 - * @param req - */ - void save($!{doMain.className} req, String operator); - - /** - * 插入 - * - * @param $!{doMain.nickName} $!{doMain.nickName} - * @return int - */ - int insertSelective($!{doMain.className} $!{doMain.nickName}); - - /** - * 主键更新 - * - * @param $!{doMain.nickName} $!{doMain.nickName} - * @return int - */ - int updateSelectiveById($!{doMain.className} $!{doMain.nickName}); - - /** - * 数量 - * - * @param $!{doMain.nickName} $!{doMain.nickName} - * @return int - */ - int getCount($!{doMain.className} $!{doMain.nickName}); - - /** - * 主键查询 - * - * @param id id - * @return $!{doMain.className} - */ - $!{doMain.className} getOneById(Long id); - - /** - * 多条 - * - * @param $!{doMain.nickName} $!{doMain.nickName} - * @return List<$!{doMain.className}> - */ - List<$!{doMain.className}> getList($!{doMain.className} $!{doMain.nickName}); - - /** - * 分页 - * - * @param $!{doMain.nickName} $!{doMain.nickName} - * @return List<$!{doMain.className}> - */ - List<$!{doMain.className}> getPageList($!{doMain.className} $!{doMain.nickName}); - - /** - * 审核 - * @param id - * @param operator - */ - void audit(Long id, String operator); - - /** - * 取消审核 - * @param id - * @param operator - */ - void unaudit(Long id, String operator); - - /** - * 删除 - * @param id - * @param operator - */ - void delete(Long id, String operator); -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IServiceImpl.vm b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IServiceImpl.vm deleted file mode 100644 index a51d44e..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/IServiceImpl.vm +++ /dev/null @@ -1,130 +0,0 @@ -package $!{doMain.servicePackageName}.impl; - -import com.arm.equipment.system.data.enums.dict.EnumStatus; -import com.arm.equipment.system.data.util.WJAssert; -import com.arm.equipment.system.data.service.common.IIdWorkerService; -import $!{doMain.daoPackageName}.I$!{doMain.className}Mapper; -import $!{doMain.packageName}.$!{doMain.className}; -import $!{doMain.servicePackageName}.I$!{doMain.className}Service; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * $!{doMain.classNote} - * - * @author $!{doMain.author} - * @date $!{doMain.date} - */ -@Service -public class $!{doMain.className}ServiceImpl implements I$!{doMain.className}Service { - @Autowired -#if($!{doMain.generatorType} == "es" || $!{doMain.generatorType} == "ES" ) - @Qualifier("$!{doMain.nickName}EsDao") -#end - private I$!{doMain.className}Mapper $!{doMain.nickName}Mapper; - @Autowired - private IIdWorkerService idWorkerService; - - @Override - public void save($!{doMain.className} req, String operator) { - req.setOperator(operator); - if (null == req.getId()) { - insertSelective(req); - } else { - updateSelectiveById(req); - } - } - - @Override - public int insertSelective($!{doMain.className} req) { - req.setId(idWorkerService.getNextId()); - req.setStatus(EnumStatus.NEW.getCode()); - checkStringLength(req, false); - return $!{doMain.nickName}Mapper.insertSelective(req); - } - - @Override - public int updateSelectiveById($!{doMain.className} $!{doMain.nickName}) { - WJAssert.notNull($!{doMain.nickName}, "入参对象不能为空"); - WJAssert.notNull($!{doMain.nickName}.getId(), "id参数错误"); - $!{doMain.className} where = new $!{doMain.className}(); - where.setId($!{doMain.nickName}.getId()); - return $!{doMain.nickName}Mapper.updateSelective($!{doMain.nickName}, where); - } - - @Override - public int getCount($!{doMain.className} $!{doMain.nickName}) { - checkStringLength($!{doMain.nickName}, true); - return $!{doMain.nickName}Mapper.getCount($!{doMain.nickName}); - } - - @Override - public $!{doMain.className} getOneById(Long id) { - WJAssert.notNull(id, "id参数错误"); - $!{doMain.className} where = new $!{doMain.className}(); - where.setId(id); - return $!{doMain.nickName}Mapper.getOne(where); - } - - @Override - public List<$!{doMain.className}> getList($!{doMain.className} $!{doMain.nickName}) { - checkStringLength($!{doMain.nickName}, true); - return $!{doMain.nickName}Mapper.getList($!{doMain.nickName}); - } - - @Override - public List<$!{doMain.className}> getPageList($!{doMain.className} $!{doMain.nickName}) { - checkStringLength($!{doMain.nickName}, true); - return $!{doMain.nickName}Mapper.getPageList($!{doMain.nickName}); - } - - @Override - public void audit(Long id, String operator) { - $!{doMain.className} req = new $!{doMain.className}(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.AUDIT.getCode()); - updateSelectiveById(req); - } - - @Override - public void unaudit(Long id, String operator) { - $!{doMain.className} req = new $!{doMain.className}(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.NEW.getCode()); - updateSelectiveById(req); - } - - @Override - public void delete(Long id, String operator) { - $!{doMain.className} req = new $!{doMain.className}(); - req.setId(id); - req.setOperator(operator); - req.setStatus(EnumStatus.DEL.getCode()); - updateSelectiveById(req); - } - - /** - * 参数校验注解默认使用的方法 - */ - private void checkStringLength($!{doMain.className} $!{doMain.nickName}, boolean nullAble) { - WJAssert.notNull($!{doMain.nickName}, "入参对象不能为空"); -#foreach( $elem in $doMain.doMainProperties) -#if(${elem.propertyName}=='id'|| ${elem.propertyName}=='createTime' -|| ${elem.propertyName}=='updateTime') -#else -#if(${elem.javaType}=='String') - #if(${elem.nullAble}) - WJAssert.limitMaxLength($!{doMain.nickName}.get$!{elem.terProperty}(), true, $!{elem.stringMaxLength}, "$!{elem.columnNote}不合法!"); -#else - WJAssert.limitMaxLength($!{doMain.nickName}.get$!{elem.terProperty}(), nullAble, $!{elem.stringMaxLength}, "$!{elem.columnNote}不合法!"); -#end -#end -#end -#end - } -} diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/List.vm b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/List.vm deleted file mode 100644 index c9c000e..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/List.vm +++ /dev/null @@ -1,208 +0,0 @@ - - - - - diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/Mapper.vm b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/Mapper.vm deleted file mode 100644 index b3aae53..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/test/resources/generator/Mapper.vm +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - #foreach( $elem in $doMain.doMainProperties) - - #end - - - - #foreach( $elem in $doMain.doMainProperties)#if($velocityCount != $!{doMain.doMainProperties.size()})#if(($velocityCount - 1)%5!=0)${elem.columnName},#else${elem.columnName},#end#else$elem.columnName#end#end - - - - - - #foreach( $elem in $doMain.doMainProperties) - #if(${elem.propertyName}=='status') - - - AND status = #{status,jdbcType=INTEGER} - - - AND status != -9 - - - #else - #if(${elem.javaType}=='String') - - #else - - #end - AND ${elem.columnName} = #{${elem.propertyName},jdbcType=${elem.jdbcType}} - - #end - #end - - - - - - - SELECT - - FROM $!{doMain.tableName} - - - - - INSERT INTO $!{doMain.tableName} - - #foreach( $elem in $doMain.doMainProperties) - #if(${elem.propertyName}=='createTime'|| ${elem.propertyName}=='updateTime') - ${elem.columnName}, - #else#if(${elem.javaType}=='String') - - #else - - #end ${elem.columnName}, - - #end - #end - - - #foreach( $elem in $doMain.doMainProperties) - #if(${elem.propertyName}=='createTime'|| ${elem.propertyName}=='updateTime')now(3), - #else#if(${elem.javaType}=='String') - #else - - #end - #{${elem.propertyName},jdbcType=${elem.jdbcType}}, - - #end - #end - - - - - UPDATE $!{doMain.tableName} - -#foreach( $elem in $doMain.doMainProperties) -#if(!(${elem.propertyName}=='id'||${elem.propertyName}=='createTime')) -#if(${elem.propertyName}=='updateTime') - ${elem.columnName} = now(3), -#else -#if(${elem.javaType}=='String') -#if(${elem.nullAble}) - -#else - -#end -#else - -#end - ${elem.columnName} = #{param1.${elem.propertyName},jdbcType=${elem.jdbcType}}, - -#end -#end -#end - - - #foreach( $elem in $doMain.doMainProperties) - #if(${elem.javaType}=='String') - - #else - - #end - AND ${elem.columnName} = #{param2.${elem.propertyName},jdbcType=${elem.jdbcType}} - - #end - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/pom.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/pom.xml deleted file mode 100644 index 25664ca..0000000 --- a/src/arm-equipment-system-parent/arm-equipment-system-parent/pom.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.7.5 - - pom - com.arm.equipment.system - arm-equipment-system-parent - 0.0.1-SNAPSHOT - arm-equipment-system-parent - - - UTF-8 - UTF-8 - 1.8 - - - - - - - com.alibaba - fastjson - 1.2.83 - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - 1.3.1 - - - mysql - mysql-connector-java - 8.0.18 - - - org.apache.commons - commons-lang3 - 3.7 - - - - javax.servlet - javax.servlet-api - 4.0.1 - - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - data - admin - api - -