From abcf8619ee5e3e4cf5c5874a5ce95f3f0404838c Mon Sep 17 00:00:00 2001 From: wu Date: Thu, 1 Aug 2024 17:59:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B7=A5=E4=BD=9C=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 38 +- pom.xml | 57 +- ruoyi-admin/pom.xml | 30 +- .../com/ruoyi/RuoYiServletInitializer.java | 8 +- .../jjh/common/entity/BaseInfoEntity.java | 10 +- .../component/TimingRemindImpl.java | 4 +- .../component/TimingRemindService.java | 1 + .../controller/BmsApprovalInfoController.java | 10 +- .../BmsDeclarationRecordsController.java | 23 +- .../BmsEnterpriseBasicInfoController.java | 38 +- .../BmsEnterpriseDirectoryController.java | 12 +- .../BmsEnterpriseFillController.java | 4 +- .../controller/BmsProcessInfoController.java | 10 +- .../controller/BmsTemplateInfoController.java | 18 +- .../BmsTemplateRecordController.java | 24 +- .../declaration/entity/BmsApprovalInfo.java | 2 - .../entity/BmsDeclarationRecords.java | 4 - .../entity/BmsEnterpriseBasicInfo.java | 18 +- .../declaration/entity/BmsTemplateInfo.java | 4 +- .../declaration/entity/BmsTemplateRecord.java | 7 +- .../ApprovalDeclarationRecordsQueryDto.java | 1 + .../entity/dto/BmsApprovalInfoUpdateDto.java | 20 +- .../dto/BmsDeclarationRecordsAddDto.java | 27 +- .../entity/dto/BmsDeclarationRecordsDto.java | 10 +- .../dto/BmsEnterpriseBasicInfoAddDto.java | 2 +- .../entity/dto/BmsTemplateInfoAddDto.java | 2 +- .../entity/dto/BmsTemplateQueryDto.java | 4 +- .../entity/dto/BmsTemplateRecordAddDto.java | 2 +- .../entity/dto/BmsTemplateRecordQueryDto.java | 14 +- .../dto/BmsTemplateRecordUpdateDto.java | 2 +- .../request/EnterpriseFileResquest.java | 1 + .../request/EnterpriseFillResquest.java | 2 +- .../request/EnterpriseInfoWorkRequest.java | 1 + .../entity/vo/BmsApprovalInfoQueryVo.java | 27 +- .../vo/BmsDeclarationRecordsQueryVo.java | 2 - .../entity/vo/BmsTemplateRecordQueryVo.java | 2 +- .../entity/vo/DeclarationRecordsVo.java | 3 +- .../mapper/BmsApprovalInfoMapper.java | 14 +- .../mapper/BmsDeclarationRecordsMapper.java | 24 +- .../mapper/BmsEnterpriseDirectoryMapper.java | 14 +- .../mapper/BmsProcessInfoMapper.java | 14 +- .../mapper/BmsTemplateInfoMapper.java | 14 +- .../mapper/BmsTemplateRecordMapper.java | 11 +- .../declaration/regular/SmsEnterChange.java | 22 +- .../jjh/declaration/regular/TimeChange.java | 26 +- .../service/IBmsApprovalInfoService.java | 14 +- .../IBmsDeclarationRecordsService.java | 16 +- .../IBmsEnterpriseBasicInfoService.java | 9 +- .../IBmsEnterpriseDirectoryService.java | 14 +- .../service/IBmsEnterpriseFillService.java | 4 +- .../service/IBmsProcessInfoService.java | 14 +- .../service/IBmsTemplateInfoService.java | 12 +- .../service/IBmsTemplateRecordService.java | 15 +- .../declaration/service/ICommonService.java | 10 +- .../impl/BmsApprovalInfoServiceImpl.java | 16 +- .../BmsDeclarationRecordsServiceImpl.java | 15 +- .../BmsEnterpriseBasicInfoServiceImpl.java | 10 +- .../BmsEnterpriseDirectoryServiceImpl.java | 16 +- .../impl/BmsEnterpriseFillServiceImpl.java | 15 +- .../impl/BmsProcessInfoServiceImpl.java | 16 +- .../impl/BmsTemplateInfoServiceImpl.java | 3 +- .../impl/BmsTemplateRecordServiceImpl.java | 44 +- .../service/impl/CommonServiceImpl.java | 12 +- .../dto/request/UserInfoRequestDTO.java | 1 + .../single/dto/response/ChiefResponse.java | 3 +- .../response/OrganizationsOtherResponse.java | 1 + .../dto/response/OrganizationsResponse.java | 1 + .../single/dto/response/SettingsResponse.java | 1 + .../dto/response/ThirdUserInfoResponse.java | 1 + .../single/dto/response/UserResponse.java | 3 +- .../single/util/HMAC256Config.java | 8 +- .../ent/controller/JContactsController.java | 9 +- .../ent/controller/JDataScreenController.java | 6 + .../JDevelopmentReportController.java | 7 +- .../JEnterpriseContactController.java | 30 +- .../JHeadQuartersRevenueController.java | 7 +- .../ent/controller/JMemorandumController.java | 7 - .../ent/controller/JPolicyFileController.java | 8 +- .../ent/controller/JProjectController.java | 13 +- .../controller/JServicesListController.java | 16 +- .../controller/JSmartRemindersController.java | 26 +- .../jjh/ent/entity/HomeRequestSmart.java | 3 +- .../com/ruoyi/jjh/ent/entity/JContacts.java | 12 +- .../jjh/ent/entity/JDevelopmentReport.java | 1 + .../jjh/ent/entity/JEnterpriseContact.java | 11 +- .../jjh/ent/entity/JHeadQuartersRevenue.java | 1 + .../com/ruoyi/jjh/ent/entity/JMemorandum.java | 10 +- .../com/ruoyi/jjh/ent/entity/JPolicyFile.java | 15 +- .../com/ruoyi/jjh/ent/entity/JProject.java | 8 +- .../ruoyi/jjh/ent/entity/JServicesList.java | 4 +- .../jjh/ent/entity/JSmartDeclaration.java | 1 + .../ruoyi/jjh/ent/entity/JSmartReminders.java | 9 +- .../jjh/ent/entity/request/JAddJobSmart.java | 3 +- .../ent/entity/request/JContactsRequest.java | 2 +- .../request/JEnterpriseContactRequest.java | 2 +- .../request/JHeadQuartersRevenueRequest.java | 1 + .../entity/request/JPolicyFileRequest.java | 1 + .../entity/request/JServicesListRequest.java | 1 + .../ent/entity/request/JSmartRemindersDq.java | 3 +- .../entity/request/JSmartRemindersNDq.java | 4 +- .../ent/entity/response/HonorResponse.java | 1 + .../entity/response/JAllIndustryResponse.java | 33 +- .../response/JBigMiddleIndustryResponse.java | 2 +- .../ent/entity/response/JHqCountResponse.java | 1 + .../response/JIndustryDepthResponse.java | 1 + .../response/JServicesDevelopResponse.java | 1 + .../response/JServicesListCountResponse.java | 1 + .../response/JTemplateMetricsResponse.java | 1 + .../response/ProjectTrackingResponse.java | 1 + .../ruoyi/jjh/ent/mapper/JContactsMapper.java | 6 +- .../jjh/ent/mapper/JDataScreenMapper.java | 13 +- .../ent/mapper/JDevelopmentReportMapper.java | 1 + .../ent/mapper/JEnterpriseContactMapper.java | 5 +- .../mapper/JHeadQuartersRevenueMapper.java | 9 +- .../jjh/ent/mapper/JMemorandumMapper.java | 3 +- .../jjh/ent/mapper/JPolicyFileMapper.java | 5 +- .../ruoyi/jjh/ent/mapper/JProjectMapper.java | 5 +- .../jjh/ent/mapper/JServicesListMapper.java | 8 +- .../ent/mapper/JSmartDeclarationMapper.java | 2 +- .../jjh/ent/mapper/JSmartRemindersMapper.java | 6 +- .../jjh/ent/service/JContactsService.java | 4 +- .../jjh/ent/service/JDataScreenService.java | 12 +- .../service/JDevelopmentReportService.java | 1 + .../service/JEnterpriseContactService.java | 5 +- .../service/JHeadQuartersRevenueService.java | 6 +- .../jjh/ent/service/JMemorandumService.java | 5 +- .../jjh/ent/service/JPolicyFileService.java | 5 +- .../jjh/ent/service/JProjectService.java | 7 +- .../jjh/ent/service/JServicesListService.java | 5 +- .../ent/service/JSmartDeclarationService.java | 3 +- .../ent/service/JSmartRemindersService.java | 6 +- .../jjh/ent/service/SmsAlertsService.java | 6 +- .../jjh/ent/service/impl/JContactsImpl.java | 8 +- .../jjh/ent/service/impl/JDataScreenImpl.java | 7 +- .../impl/JDevelopmentReportServiceImpl.java | 1 + .../service/impl/JEnterpriseContactImpl.java | 5 +- .../impl/JHeadQuartersRevenueServiceImpl.java | 6 +- .../service/impl/JMemorandumServiceImpl.java | 6 +- .../service/impl/JPolicyFileServiceImpl.java | 5 +- .../ent/service/impl/JProjectServiceImpl.java | 25 +- .../impl/JServicesListServiceImpl.java | 6 +- .../impl/JSmartDeclarationServiceImpl.java | 4 +- .../impl/JSmartRemindersServiceImpl.java | 27 +- .../service/impl/SmsAlertsServiceImpl.java | 14 +- .../controller/common/CaptchaController.java | 49 +- .../controller/monitor/CacheController.java | 51 +- .../controller/monitor/ServerController.java | 12 +- .../monitor/SysLogininforController.java | 40 +- .../monitor/SysOperlogController.java | 37 +- .../monitor/SysUserOnlineController.java | 48 +- .../system/SysConfigController.java | 58 +- .../controller/system/SysDeptController.java | 64 +- .../system/SysDictDataController.java | 7 +- .../system/SysDictTypeController.java | 58 +- .../controller/system/SysIndexController.java | 9 +- .../controller/system/SysLoginController.java | 45 +- .../controller/system/SysMenuController.java | 71 +- .../system/SysNoticeController.java | 39 +- .../controller/system/SysPostController.java | 65 +- .../system/SysProfileController.java | 58 +- .../system/SysRegisterController.java | 19 +- .../controller/system/SysRoleController.java | 97 +- .../controller/system/SysUserController.java | 105 +- .../ruoyi/workflow/WfCategoryController.java | 117 ++ .../ruoyi/workflow/WfDeployController.java | 108 ++ .../com/ruoyi/workflow/WfFormController.java | 114 ++ .../ruoyi/workflow/WfInstanceController.java | 77 + .../com/ruoyi/workflow/WfModelController.java | 184 +++ .../ruoyi/workflow/WfProcessController.java | 240 ++++ .../com/ruoyi/workflow/WfTaskController.java | 183 +++ .../main/resources/application-internet.yml | 4 +- .../src/main/resources/application.yml | 2 +- .../main/resources/i18n/messages.properties | 5 - ruoyi-admin/src/main/resources/logback.xml | 92 +- .../jjh/declaration/BmsApprovalInfoMapper.xml | 2 +- .../BmsDeclarationRecordsMapper.xml | 59 +- .../BmsEnterpriseBasicInfoMapper.xml | 16 +- .../BmsEnterpriseDirectoryMapper.xml | 47 +- .../jjh/declaration/BmsTemplateInfoMapper.xml | 6 +- .../declaration/BmsTemplateRecordMapper.xml | 35 +- .../mapper/jjh/ent/JDataScreenMapper.xml | 143 +- .../jjh/ent/JDevelopmentReportMapper.xml | 80 +- .../jjh/ent/JEnterpriseContactMapper.xml | 2 +- .../jjh/ent/JHeadQuartersRevenueMapper.xml | 48 +- .../mapper/jjh/ent/JMemorandumMapper.xml | 2 +- .../mapper/jjh/ent/JProjectMapper.xml | 44 +- .../mapper/jjh/ent/JServicesListMapper.xml | 37 +- .../mapper/jjh/ent/JSmartRemindersMapper.xml | 19 +- .../main/resources/mybatis/mybatis-config.xml | 20 +- ruoyi-common/pom.xml | 20 +- .../ruoyi/common/annotation/Anonymous.java | 7 +- .../ruoyi/common/annotation/CellMerge.java | 28 + .../ruoyi/common/annotation/DataScope.java | 5 +- .../ruoyi/common/annotation/DataSource.java | 10 +- .../com/ruoyi/common/annotation/Excel.java | 30 +- .../common/annotation/ExcelDictFormat.java | 36 + .../common/annotation/ExcelEnumFormat.java | 34 + .../com/ruoyi/common/annotation/Excels.java | 5 +- .../java/com/ruoyi/common/annotation/Log.java | 13 +- .../ruoyi/common/annotation/RateLimiter.java | 10 +- .../ruoyi/common/annotation/RepeatSubmit.java | 6 +- .../com/ruoyi/common/config/RuoYiConfig.java | 118 +- .../ruoyi/common/constant/CacheConstants.java | 5 +- .../com/ruoyi/common/constant/Constants.java | 16 +- .../ruoyi/common/constant/GenConstants.java | 187 ++- .../com/ruoyi/common/constant/HttpStatus.java | 5 +- .../common/constant/ScheduleConstants.java | 34 +- .../ruoyi/common/constant/UserConstants.java | 75 +- .../common/convert/ExcelBigNumberConvert.java | 52 + .../common/convert/ExcelDictConvert.java | 73 + .../common/convert/ExcelEnumConvert.java | 75 + .../core/controller/BaseController.java | 91 +- .../controller/FlowableBaseController.java | 40 + .../ruoyi/common/core/domain/AjaxResult.java | 115 +- .../ruoyi/common/core/domain/BaseEntity.java | 85 +- .../ruoyi/common/core/domain/PageQuery.java | 106 ++ .../java/com/ruoyi/common/core/domain/R.java | 86 +- .../ruoyi/common/core/domain/TreeEntity.java | 55 +- .../core/domain/entity/SysDictData.java | 141 +- .../core/domain/entity/SysDictType.java | 80 +- .../common/core/domain/entity/SysMenu.java | 220 +-- .../common/core/domain/entity/SysUser.java | 62 +- .../common/core/domain/model/LoginBody.java | 29 +- .../common/core/domain/model/LoginUser.java | 130 +- .../core/domain/model/RegisterBody.java | 5 +- .../common/core/mapper/BaseMapperPlus.java | 192 +++ .../ruoyi/common/core/page/PageDomain.java | 74 +- .../ruoyi/common/core/page/TableDataInfo.java | 80 +- .../ruoyi/common/core/page/TableSupport.java | 11 +- .../ruoyi/common/core/redis/RedisCache.java | 109 +- .../common/core/service/DictService.java | 57 + .../common/core/service/UserService.java | 26 + .../ruoyi/common/core/text/CharsetKit.java | 67 +- .../com/ruoyi/common/core/text/Convert.java | 491 +++---- .../ruoyi/common/core/text/StrFormatter.java | 46 +- .../ruoyi/common/core/validate/AddGroup.java | 9 + .../ruoyi/common/core/validate/EditGroup.java | 9 + .../common/core/validate/QueryGroup.java | 9 + .../ruoyi/common/enums/BusinessStatus.java | 6 +- .../com/ruoyi/common/enums/BusinessType.java | 7 +- .../ruoyi/common/enums/DataSourceType.java | 5 +- .../com/ruoyi/common/enums/HttpMethod.java | 18 +- .../com/ruoyi/common/enums/LimitType.java | 3 +- .../com/ruoyi/common/enums/OperatorType.java | 5 +- .../com/ruoyi/common/enums/UserStatus.java | 14 +- .../ruoyi/common/excel/CellMergeStrategy.java | 114 ++ .../common/excel/DefaultExcelListener.java | 106 ++ .../common/excel/DefaultExcelResult.java | 73 + .../com/ruoyi/common/excel/ExcelListener.java | 14 + .../com/ruoyi/common/excel/ExcelResult.java | 26 + .../common/exception/DemoModeException.java | 8 +- .../common/exception/GlobalException.java | 25 +- .../common/exception/ServiceException.java | 41 +- .../ruoyi/common/exception/UtilException.java | 14 +- .../common/exception/base/BaseException.java | 41 +- .../common/exception/file/FileException.java | 8 +- .../FileNameLengthLimitExceededException.java | 10 +- .../file/FileSizeLimitExceededException.java | 10 +- .../exception/file/FileUploadException.java | 29 +- .../file/InvalidExtensionException.java | 41 +- .../common/exception/job/TaskException.java | 17 +- .../exception/user/BlackListException.java | 8 +- .../exception/user/CaptchaException.java | 8 +- .../user/CaptchaExpireException.java | 8 +- .../common/exception/user/UserException.java | 8 +- .../user/UserNotExistsException.java | 8 +- .../user/UserPasswordNotMatchException.java | 8 +- ...UserPasswordRetryLimitExceedException.java | 10 +- .../filter/PropertyPreExcludeFilter.java | 14 +- .../ruoyi/common/filter/RepeatableFilter.java | 31 +- .../filter/RepeatedlyRequestWrapper.java | 45 +- .../com/ruoyi/common/filter/XssFilter.java | 40 +- .../filter/XssHttpServletRequestWrapper.java | 64 +- .../java/com/ruoyi/common/utils/Arith.java | 55 +- .../com/ruoyi/common/utils/BeanCopyUtils.java | 204 +++ .../com/ruoyi/common/utils/DateUtils.java | 103 +- .../com/ruoyi/common/utils/DictUtils.java | 113 +- .../com/ruoyi/common/utils/ExceptionUtil.java | 18 +- .../com/ruoyi/common/utils/JsonUtils.java | 112 ++ .../java/com/ruoyi/common/utils/LogUtils.java | 11 +- .../com/ruoyi/common/utils/MessageUtils.java | 10 +- .../com/ruoyi/common/utils/PageUtils.java | 11 +- .../com/ruoyi/common/utils/SecurityUtils.java | 110 +- .../com/ruoyi/common/utils/ServletUtils.java | 115 +- .../com/ruoyi/common/utils/StreamUtils.java | 259 ++++ .../com/ruoyi/common/utils/StringUtils.java | 379 ++--- .../java/com/ruoyi/common/utils/Threads.java | 66 +- .../ruoyi/common/utils/ValidatorUtils.java | 29 + .../ruoyi/common/utils/bean/BeanUtils.java | 58 +- .../common/utils/bean/BeanValidators.java | 13 +- .../common/utils/file/FileTypeUtils.java | 40 +- .../common/utils/file/FileUploadUtils.java | 122 +- .../ruoyi/common/utils/file/ImageUtils.java | 63 +- .../common/utils/file/MimeTypeUtils.java | 25 +- .../ruoyi/common/utils/html/EscapeUtil.java | 87 +- .../ruoyi/common/utils/html/HTMLFilter.java | 237 ++-- .../ruoyi/common/utils/http/HttpHelper.java | 41 +- .../ruoyi/common/utils/http/HttpUtils.java | 171 +-- .../ruoyi/common/utils/ip/AddressUtils.java | 32 +- .../com/ruoyi/common/utils/ip/IpUtils.java | 196 +-- .../common/utils/poi/ExcelHandlerAdapter.java | 14 +- .../com/ruoyi/common/utils/poi/ExcelUtil.java | 1234 +++++++---------- .../common/utils/poi/ExcelUtilAiLiBaBa.java | 329 +++++ .../common/utils/poi/ProjectExcelUtil.java | 14 +- .../common/utils/reflect/ReflectUtils.java | 239 ++-- .../com/ruoyi/common/utils/sign/Base64.java | 130 +- .../com/ruoyi/common/utils/sign/Md5Utils.java | 42 +- .../common/utils/spring/SpringUtils.java | 71 +- .../com/ruoyi/common/utils/sql/SqlUtil.java | 39 +- .../com/ruoyi/common/utils/uuid/IdUtils.java | 25 +- .../java/com/ruoyi/common/utils/uuid/Seq.java | 43 +- .../com/ruoyi/common/utils/uuid/UUID.java | 227 ++- .../main/java/com/ruoyi/common/xss/Xss.java | 11 +- .../com/ruoyi/common/xss/XssValidator.java | 30 +- ruoyi-flowable/pom.xml | 47 + .../common/constant/ProcessConstants.java | 82 ++ .../common/constant/TaskConstants.java | 23 + .../flowable/common/enums/FlowComment.java | 44 + .../ruoyi/flowable/common/enums/FormType.java | 33 + .../flowable/common/enums/ProcessStatus.java | 44 + .../config/GlobalEventListenerConfig.java | 28 + .../config/MyDefaultProcessDiagramCanvas.java | 94 ++ .../com/ruoyi/flowable/core/FormConf.java | 65 + .../flowable/core/domain/ProcessQuery.java | 41 + .../flowable/factory/FlowServiceFactory.java | 52 + .../flow/CustomProcessDiagramCanvas.java | 378 +++++ .../flow/CustomProcessDiagramGenerator.java | 416 ++++++ .../ruoyi/flowable/flow/FindNextNodeUtil.java | 234 ++++ .../ruoyi/flowable/flow/FlowableConfig.java | 23 + .../ruoyi/flowable/flow/FlowableUtils.java | 733 ++++++++++ .../listener/GlobalEventListener.java | 38 + .../flowable/listener/UserTaskListener.java | 26 + .../com/ruoyi/flowable/utils/ModelUtils.java | 399 ++++++ .../flowable/utils/ProcessFormUtils.java | 50 + .../ruoyi/flowable/utils/ProcessUtils.java | 115 ++ .../com/ruoyi/flowable/utils/TaskUtils.java | 41 + ruoyi-framework/pom.xml | 6 +- .../framework/aspectj/DataScopeAspect.java | 121 +- .../framework/aspectj/DataSourceAspect.java | 36 +- .../ruoyi/framework/aspectj/LogAspect.java | 155 +-- .../framework/aspectj/RateLimiterAspect.java | 49 +- .../framework/config/ApplicationConfig.java | 9 +- .../ruoyi/framework/config/DruidConfig.java | 82 +- .../config/FastJson2JsonRedisSerializer.java | 27 +- .../ruoyi/framework/config/FilterConfig.java | 26 +- .../ruoyi/framework/config/I18nConfig.java | 16 +- .../framework/config/KaptchaTextCreator.java | 34 +- .../ruoyi/framework/config/MyBatisConfig.java | 61 +- .../framework/config/MyMetaObjectHandler.java | 4 +- .../ruoyi/framework/config/RedisConfig.java | 16 +- .../framework/config/ResourcesConfig.java | 26 +- .../framework/config/SecurityConfig.java | 33 +- .../ruoyi/framework/config/ServerConfig.java | 28 +- .../framework/config/ThreadPoolConfig.java | 16 +- .../config/properties/DruidProperties.java | 14 +- .../properties/PermitAllUrlProperties.java | 37 +- .../datasource/DynamicDataSource.java | 16 +- .../DynamicDataSourceContextHolder.java | 24 +- .../interceptor/RepeatSubmitInterceptor.java | 34 +- .../impl/SameUrlDataInterceptor.java | 47 +- .../ruoyi/framework/manager/AsyncManager.java | 28 +- .../framework/manager/ShutdownManager.java | 17 +- .../manager/factory/AsyncFactory.java | 47 +- .../context/AuthenticationContextHolder.java | 14 +- .../context/PermissionContextHolder.java | 21 +- .../filter/JwtAuthenticationTokenFilter.java | 30 +- .../handle/AuthenticationEntryPointImpl.java | 23 +- .../handle/LogoutSuccessHandlerImpl.java | 30 +- .../ruoyi/framework/web/domain/Server.java | 127 +- .../framework/web/domain/server/Cpu.java | 41 +- .../framework/web/domain/server/Jvm.java | 56 +- .../framework/web/domain/server/Mem.java | 26 +- .../framework/web/domain/server/Sys.java | 35 +- .../framework/web/domain/server/SysFile.java | 47 +- .../web/exception/GlobalExceptionHandler.java | 48 +- .../web/service/PermissionService.java | 83 +- .../web/service/SysPermissionService.java | 52 +- .../web/service/SysRegisterService.java | 64 +- .../framework/web/service/TokenService.java | 90 +- .../web/service/UserDetailsServiceImpl.java | 36 +- ruoyi-generator/pom.xml | 4 +- .../com/ruoyi/generator/config/GenConfig.java | 47 +- .../generator/controller/GenController.java | 98 +- .../com/ruoyi/generator/domain/GenTable.java | 311 ++--- .../generator/domain/GenTableColumn.java | 331 ++--- .../mapper/GenTableColumnMapper.java | 20 +- .../generator/mapper/GenTableMapper.java | 26 +- .../service/GenTableColumnServiceImpl.java | 70 +- .../service/GenTableServiceImpl.java | 293 ++-- .../service/IGenTableColumnService.java | 16 +- .../generator/service/IGenTableService.java | 36 +- .../com/ruoyi/generator/util/GenUtils.java | 130 +- .../generator/util/VelocityInitializer.java | 20 +- .../ruoyi/generator/util/VelocityUtils.java | 200 +-- .../mapper/generator/GenTableColumnMapper.xml | 144 +- .../mapper/generator/GenTableMapper.xml | 341 ++--- .../main/resources/vm/java/controller.java.vm | 53 +- .../src/main/resources/vm/java/domain.java.vm | 130 +- .../src/main/resources/vm/java/mapper.java.vm | 70 +- .../main/resources/vm/java/service.java.vm | 20 +- .../resources/vm/java/serviceImpl.java.vm | 182 ++- .../main/resources/vm/java/sub-domain.java.vm | 113 +- .../src/main/resources/vm/js/api.js.vm | 46 +- .../main/resources/vm/vue/index-tree.vue.vm | 968 +++++++------ .../src/main/resources/vm/vue/index.vue.vm | 1222 ++++++++-------- .../resources/vm/vue/v3/index-tree.vue.vm | 892 ++++++------ .../src/main/resources/vm/vue/v3/index.vue.vm | 1171 +++++++++------- .../src/main/resources/vm/xml/mapper.xml.vm | 219 +-- ruoyi-quartz/pom.xml | 4 +- .../quartz/controller/SysJobController.java | 100 +- .../controller/SysJobLogController.java | 42 +- .../java/com/ruoyi/quartz/domain/SysJob.java | 132 +- .../com/ruoyi/quartz/domain/SysJobLog.java | 124 +- .../ruoyi/quartz/mapper/SysJobLogMapper.java | 18 +- .../com/ruoyi/quartz/mapper/SysJobMapper.java | 22 +- .../quartz/service/ISysJobLogService.java | 18 +- .../ruoyi/quartz/service/ISysJobService.java | 32 +- .../service/impl/SysJobLogServiceImpl.java | 40 +- .../service/impl/SysJobServiceImpl.java | 123 +- .../java/com/ruoyi/quartz/task/RyTask.java | 16 +- .../ruoyi/quartz/util/AbstractQuartzJob.java | 48 +- .../java/com/ruoyi/quartz/util/CronUtils.java | 32 +- .../com/ruoyi/quartz/util/JobInvokeUtil.java | 101 +- .../QuartzDisallowConcurrentExecution.java | 11 +- .../ruoyi/quartz/util/QuartzJobExecution.java | 11 +- .../com/ruoyi/quartz/util/ScheduleUtils.java | 55 +- .../mapper/quartz/SysJobLogMapper.xml | 170 +-- .../resources/mapper/quartz/SysJobMapper.xml | 209 +-- ruoyi-system/pom.xml | 20 +- .../com/ruoyi/system/domain/SysCache.java | 54 +- .../com/ruoyi/system/domain/SysNotice.java | 100 +- .../com/ruoyi/system/domain/SysOperLog.java | 178 +-- .../java/com/ruoyi/system/domain/SysPost.java | 102 +- .../com/ruoyi/system/domain/SysRoleDept.java | 35 +- .../com/ruoyi/system/domain/SysRoleMenu.java | 35 +- .../ruoyi/system/domain/SysUserOnline.java | 85 +- .../com/ruoyi/system/domain/SysUserPost.java | 35 +- .../com/ruoyi/system/domain/SysUserRole.java | 35 +- .../com/ruoyi/system/domain/vo/MetaVo.java | 47 +- .../ruoyi/system/mapper/SysDeptMapper.java | 38 +- .../system/mapper/SysDictDataMapper.java | 32 +- .../system/mapper/SysDictTypeMapper.java | 26 +- .../system/mapper/SysLogininforMapper.java | 16 +- .../ruoyi/system/mapper/SysMenuMapper.java | 14 +- .../ruoyi/system/mapper/SysNoticeMapper.java | 20 +- .../ruoyi/system/mapper/SysOperLogMapper.java | 16 +- .../ruoyi/system/mapper/SysPostMapper.java | 30 +- .../system/mapper/SysRoleDeptMapper.java | 16 +- .../ruoyi/system/mapper/SysRoleMapper.java | 32 +- .../system/mapper/SysRoleMenuMapper.java | 16 +- .../ruoyi/system/mapper/SysUserMapper.java | 36 +- .../system/mapper/SysUserPostMapper.java | 16 +- .../system/mapper/SysUserRoleMapper.java | 24 +- .../system/service/ISysConfigService.java | 24 +- .../ruoyi/system/service/ISysDeptService.java | 36 +- .../system/service/ISysDictDataService.java | 22 +- .../system/service/ISysDictTypeService.java | 26 +- .../system/service/ISysLogininforService.java | 14 +- .../system/service/ISysNoticeService.java | 22 +- .../system/service/ISysOperLogService.java | 16 +- .../ruoyi/system/service/ISysPostService.java | 30 +- .../ruoyi/system/service/ISysRoleService.java | 54 +- .../system/service/ISysUserOnlineService.java | 21 +- .../ruoyi/system/service/ISysUserService.java | 60 +- .../service/impl/SysDeptServiceImpl.java | 154 +- .../service/impl/SysDictDataServiceImpl.java | 53 +- .../service/impl/SysDictTypeServiceImpl.java | 154 +- .../impl/SysLogininforServiceImpl.java | 30 +- .../service/impl/SysNoticeServiceImpl.java | 42 +- .../service/impl/SysOperLogServiceImpl.java | 35 +- .../service/impl/SysPostServiceImpl.java | 79 +- .../service/impl/SysRoleServiceImpl.java | 185 +-- .../impl/SysUserOnlineServiceImpl.java | 50 +- .../service/impl/SysUserServiceImpl.java | 274 ++-- .../com/ruoyi/workflow/domain/WfCategory.java | 50 + .../com/ruoyi/workflow/domain/WfCopy.java | 74 + .../ruoyi/workflow/domain/WfDeployForm.java | 46 + .../com/ruoyi/workflow/domain/WfForm.java | 41 + .../ruoyi/workflow/domain/bo/WfCopyBo.java | 75 + .../workflow/domain/bo/WfDesignerBo.java | 36 + .../ruoyi/workflow/domain/bo/WfFormBo.java | 45 + .../ruoyi/workflow/domain/bo/WfModelBo.java | 58 + .../ruoyi/workflow/domain/bo/WfTaskBo.java | 64 + .../workflow/domain/dto/WfCommentDto.java | 25 + .../workflow/domain/dto/WfMetaInfoDto.java | 30 + .../ruoyi/workflow/domain/dto/WfNextDto.java | 26 + .../workflow/domain/vo/WfCategoryVo.java | 45 + .../domain/vo/WfClaimTaskExportVo.java | 57 + .../ruoyi/workflow/domain/vo/WfCommentVo.java | 32 + .../ruoyi/workflow/domain/vo/WfCopyVo.java | 93 ++ .../workflow/domain/vo/WfDefinitionVo.java | 84 ++ .../workflow/domain/vo/WfDeployFormVo.java | 45 + .../ruoyi/workflow/domain/vo/WfDeployVo.java | 80 ++ .../ruoyi/workflow/domain/vo/WfDetailVo.java | 48 + .../domain/vo/WfFinishedTaskExportVo.java | 70 + .../ruoyi/workflow/domain/vo/WfFormVo.java | 42 + .../workflow/domain/vo/WfModelExportVo.java | 59 + .../ruoyi/workflow/domain/vo/WfModelVo.java | 59 + .../workflow/domain/vo/WfOwnTaskExportVo.java | 75 + .../workflow/domain/vo/WfProcNodeVo.java | 67 + .../ruoyi/workflow/domain/vo/WfTaskVo.java | 132 ++ .../domain/vo/WfTodoTaskExportVo.java | 57 + .../ruoyi/workflow/domain/vo/WfViewerVo.java | 41 + .../handler/MultiInstanceHandler.java | 62 + .../workflow/mapper/WfCategoryMapper.java | 15 + .../ruoyi/workflow/mapper/WfCopyMapper.java | 15 + .../workflow/mapper/WfDeployFormMapper.java | 15 + .../ruoyi/workflow/mapper/WfFormMapper.java | 21 + .../workflow/service/IWfCategoryService.java | 67 + .../workflow/service/IWfCopyService.java | 50 + .../service/IWfDeployFormService.java | 40 + .../workflow/service/IWfDeployService.java | 24 + .../workflow/service/IWfFormService.java | 65 + .../workflow/service/IWfInstanceService.java | 53 + .../workflow/service/IWfModelService.java | 71 + .../workflow/service/IWfProcessService.java | 126 ++ .../workflow/service/IWfTaskService.java | 122 ++ .../service/impl/WfCategoryServiceImpl.java | 93 ++ .../service/impl/WfCopyServiceImpl.java | 114 ++ .../service/impl/WfDeployFormServiceImpl.java | 135 ++ .../service/impl/WfDeployServiceImpl.java | 146 ++ .../service/impl/WfFormServiceImpl.java | 118 ++ .../service/impl/WfInstanceServiceImpl.java | 216 +++ .../service/impl/WfModelServiceImpl.java | 360 +++++ .../service/impl/WfProcessServiceImpl.java | 1001 +++++++++++++ .../service/impl/WfTaskServiceImpl.java | 637 +++++++++ .../mapper/system/SysConfigMapper.xml | 18 +- .../resources/mapper/system/SysDeptMapper.xml | 48 +- .../mapper/system/SysDictDataMapper.xml | 24 +- .../mapper/system/SysLogininforMapper.xml | 4 +- .../resources/mapper/system/SysMenuMapper.xml | 118 +- .../mapper/system/SysNoticeMapper.xml | 18 +- .../mapper/system/SysOperLogMapper.xml | 40 +- .../resources/mapper/system/SysPostMapper.xml | 22 +- .../resources/mapper/system/SysRoleMapper.xml | 30 +- .../resources/mapper/system/SysUserMapper.xml | 83 +- .../mapper/system/SysUserRoleMapper.xml | 2 +- .../mapper/workflow/WfCategoryMapper.xml | 19 + .../mapper/workflow/WfCopyMapper.xml | 23 + .../mapper/workflow/WfDeployFormMapper.xml | 15 + .../mapper/workflow/WfFormMapper.xml | 27 + 541 files changed, 22141 insertions(+), 12594 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/workflow/WfCategoryController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/workflow/WfDeployController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/workflow/WfFormController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/workflow/WfInstanceController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/workflow/WfModelController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/workflow/WfProcessController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/workflow/WfTaskController.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/CellMerge.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelEnumFormat.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelBigNumberConvert.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FlowableBaseController.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/service/DictService.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/validate/AddGroup.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/validate/EditGroup.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/validate/QueryGroup.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/excel/CellMergeStrategy.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelResult.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/excel/ExcelListener.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/excel/ExcelResult.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/StreamUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtilAiLiBaBa.java create mode 100644 ruoyi-flowable/pom.xml create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/ProcessConstants.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/TaskConstants.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/FlowComment.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/FormType.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/ProcessStatus.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/config/GlobalEventListenerConfig.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/config/MyDefaultProcessDiagramCanvas.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/core/FormConf.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/core/domain/ProcessQuery.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/factory/FlowServiceFactory.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/CustomProcessDiagramCanvas.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/CustomProcessDiagramGenerator.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FindNextNodeUtil.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FlowableConfig.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FlowableUtils.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/GlobalEventListener.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/UserTaskListener.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ModelUtils.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ProcessFormUtils.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ProcessUtils.java create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/TaskUtils.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/WfCategory.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/WfCopy.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/WfDeployForm.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/WfForm.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/bo/WfCopyBo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/bo/WfDesignerBo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/bo/WfFormBo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/bo/WfModelBo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/bo/WfTaskBo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/dto/WfCommentDto.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/dto/WfMetaInfoDto.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/dto/WfNextDto.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfCategoryVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfClaimTaskExportVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfCommentVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfCopyVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDefinitionVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDeployFormVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDeployVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDetailVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfFinishedTaskExportVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfFormVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfModelExportVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfModelVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfOwnTaskExportVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfProcNodeVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfTaskVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfTodoTaskExportVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfViewerVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/handler/MultiInstanceHandler.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/mapper/WfCategoryMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/mapper/WfCopyMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/mapper/WfDeployFormMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/mapper/WfFormMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfCategoryService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfCopyService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfDeployFormService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfDeployService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfFormService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfInstanceService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfModelService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfTaskService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfCategoryServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfCopyServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfDeployFormServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfDeployServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfFormServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfInstanceServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfModelServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java create mode 100644 ruoyi-system/src/main/resources/mapper/workflow/WfCategoryMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/workflow/WfCopyMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/workflow/WfDeployFormMapper.xml create mode 100644 ruoyi-system/src/main/resources/mapper/workflow/WfFormMapper.xml diff --git a/README.md b/README.md index c984586..754a881 100644 --- a/README.md +++ b/README.md @@ -18,23 +18,29 @@ * 权限认证使用Jwt,支持多终端认证系统。 * 支持加载动态权限菜单,多方式轻松权限控制。 * 高效率开发,使用代码生成器可以一键生成前后端代码。 -* 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://github.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。 -* 提供了单应用版本[RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast),Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。 -* 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) +* +提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev) +)版本[RuoYi-Vue3](https://github.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。 +* 提供了单应用版本[RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast) + ,Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。 +* 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi) + ,微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) * 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)   -* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)   +* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link) + ,腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console) +    ## 内置功能 -1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 -2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 -3. 岗位管理:配置系统用户所属担任职务。 -4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 -5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 -6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 -7. 参数管理:对系统动态配置常用参数。 -8. 通知公告:系统通知公告信息发布维护。 -9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 +1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 +2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 +3. 岗位管理:配置系统用户所属担任职务。 +4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 +5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 +6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 +7. 参数管理:对系统动态配置常用参数。 +8. 通知公告:系统通知公告信息发布维护。 +9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 10. 登录日志:系统登录日志记录查询包含登录异常。 11. 在线用户:当前系统中活跃用户状态监控。 12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 @@ -47,7 +53,7 @@ ## 在线体验 -- admin/admin123 +- admin/admin123 - 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 演示地址:http://vue.ruoyi.vip @@ -90,7 +96,7 @@ - ## 若依前后端分离交流群 -QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/已满-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![加入QQ群](https://img.shields.io/badge/已满-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![加入QQ群](https://img.shields.io/badge/已满-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![加入QQ群](https://img.shields.io/badge/已满-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![加入QQ群](https://img.shields.io/badge/已满-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![加入QQ群](https://img.shields.io/badge/已满-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![加入QQ群](https://img.shields.io/badge/已满-136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [![加入QQ群](https://img.shields.io/badge/已满-143961921-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [![加入QQ群](https://img.shields.io/badge/已满-174951577-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [![加入QQ群](https://img.shields.io/badge/已满-161281055-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [![加入QQ群](https://img.shields.io/badge/138988063-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) 点击按钮入群。 \ No newline at end of file +QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/已满-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![加入QQ群](https://img.shields.io/badge/已满-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![加入QQ群](https://img.shields.io/badge/已满-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![加入QQ群](https://img.shields.io/badge/已满-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![加入QQ群](https://img.shields.io/badge/已满-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![加入QQ群](https://img.shields.io/badge/已满-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![加入QQ群](https://img.shields.io/badge/已满-136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [![加入QQ群](https://img.shields.io/badge/已满-143961921-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [![加入QQ群](https://img.shields.io/badge/已满-174951577-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [![加入QQ群](https://img.shields.io/badge/已满-161281055-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [![加入QQ群](https://img.shields.io/badge/138988063-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) +点击按钮入群。 \ No newline at end of file diff --git a/pom.xml b/pom.xml index c907459..dc0aa2e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,9 +1,9 @@ - - 4.0.0 - + 4.0.0 + com.ruoyi ruoyi 3.8.7 @@ -11,7 +11,7 @@ ruoyi http://www.ruoyi.vip 金鸡湖服务管理系统 - + 3.8.7 UTF-8 @@ -28,11 +28,51 @@ 4.1.2 2.3 0.9.1 + 6.8.0 + 0.8.3 + 3.2.1 + + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + com.alibaba + easyexcel + ${easyexcel.version} + + + org.apache.poi + poi-ooxml-schemas + + + + + + + org.flowable + flowable-spring-boot-starter-process + ${flowable.version} + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 3.0.3 + + org.springframework.boot @@ -148,6 +188,13 @@ ${ruoyi.version} + + + com.ruoyi + ruoyi-flowable + ${ruoyi.version} + + diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 3ede565..2552c89 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -1,6 +1,6 @@ - ruoyi @@ -16,11 +16,7 @@ - - cn.hutool - hutool-all - 5.8.23 - + com.github.xiaoymin knife4j-openapi2-spring-boot-starter @@ -32,7 +28,7 @@ spring-boot-devtools true - + mysql mysql-connector-java @@ -50,6 +46,12 @@ ruoyi-quartz + + + com.ruoyi + ruoyi-flowable + + com.ruoyi @@ -79,15 +81,15 @@ - - org.apache.maven.plugins - maven-war-plugin - 3.1.0 + + org.apache.maven.plugins + maven-war-plugin + 3.1.0 false ${project.artifactId} - - + + ${project.artifactId} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java index 6de67dc..70cb1b3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java @@ -5,14 +5,12 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer /** * web容器中进行部署 - * + * * @author ruoyi */ -public class RuoYiServletInitializer extends SpringBootServletInitializer -{ +public class RuoYiServletInitializer extends SpringBootServletInitializer { @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) - { + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(RuoYiApplication.class); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/common/entity/BaseInfoEntity.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/common/entity/BaseInfoEntity.java index 6c49198..adf4a8d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/common/entity/BaseInfoEntity.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/common/entity/BaseInfoEntity.java @@ -22,14 +22,14 @@ public class BaseInfoEntity implements Serializable { /** * 创建者 */ - @JSONField(serialize=false) + @JSONField(serialize = false) @TableField(fill = FieldFill.INSERT) private String createBy; /** * 创建时间 */ - @JSONField(serialize=false) + @JSONField(serialize = false) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT) private Date createTime; @@ -37,14 +37,14 @@ public class BaseInfoEntity implements Serializable { /** * 更新者 */ - @JSONField(serialize=false) + @JSONField(serialize = false) @TableField(fill = FieldFill.UPDATE) private String updateBy; /** * 更新时间 */ - @JSONField(serialize=false) + @JSONField(serialize = false) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; @@ -52,7 +52,7 @@ public class BaseInfoEntity implements Serializable { /** * 备注 */ - @JSONField(serialize=false) + @JSONField(serialize = false) private String remark; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/component/TimingRemindImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/component/TimingRemindImpl.java index e6e081f..37789f8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/component/TimingRemindImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/component/TimingRemindImpl.java @@ -26,7 +26,7 @@ import java.util.List; * @since 2024/7/18 9:55 */ @Component("TimingRemind") -public class TimingRemindImpl implements TimingRemindService{ +public class TimingRemindImpl implements TimingRemindService { private static final Logger log = LoggerFactory.getLogger(TimingRemindImpl.class); /** @@ -78,7 +78,7 @@ public class TimingRemindImpl implements TimingRemindService{ sd.setSmartRemindersId(id); sd.setTyshxydm(x.getTyshxydm()); listAdd.add(sd); - getContact( x.getTyshxydm(), "您有1个全局自定义通知,请前往系统首页查看"); + getContact(x.getTyshxydm(), "您有1个全局自定义通知,请前往系统首页查看"); }); jSmartDeclarationService.saveBatch(listAdd); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/component/TimingRemindService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/component/TimingRemindService.java index 62493fe..4c09c36 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/component/TimingRemindService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/component/TimingRemindService.java @@ -2,6 +2,7 @@ package com.ruoyi.jjh.declaration.component; /** * 企业或者政务自定义定时提醒组件 + * * @author du * @since 2024/7/19 9:50 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsApprovalInfoController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsApprovalInfoController.java index 1f64b53..00ab6c3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsApprovalInfoController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsApprovalInfoController.java @@ -1,19 +1,17 @@ package com.ruoyi.jjh.declaration.controller; -import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.jjh.declaration.entity.BmsApprovalInfo; import com.ruoyi.jjh.declaration.service.IBmsApprovalInfoService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -23,7 +21,7 @@ import java.util.List; /** * 审批记录信息Controller - * + * * @author farben * @date 2023-09-09 */ @@ -90,7 +88,7 @@ public class BmsApprovalInfoController extends BaseController { */ // @RequiresPermissions("system:approvalInfo:remove") @Log(title = "审批记录信息", businessType = BusinessType.DELETE) - @PostMapping("/{ids}") + @PostMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(bmsApprovalInfoService.deleteBmsApprovalInfoByIds(ids)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsDeclarationRecordsController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsDeclarationRecordsController.java index 7da1956..3c30279 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsDeclarationRecordsController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsDeclarationRecordsController.java @@ -26,7 +26,13 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; @@ -60,9 +66,9 @@ public class BmsDeclarationRecordsController extends BaseController { @Resource private BmsDeclarationRecordsMapper bmsDeclarationRecordsMapper; + /** * 审核列表 - * */ @ApiOperation(value = "审核列表") @PreAuthorize("@ss.hasAnyRoles('admin,gov,other-gov')") @@ -95,10 +101,10 @@ public class BmsDeclarationRecordsController extends BaseController { try { admin = SecurityUtils.isAdmin(SecurityUtils.getUserId()); b = SecurityUtils.hasRole("ent"); - str =SecurityUtils.getUsername(); + str = SecurityUtils.getUsername(); } catch (Exception ignored) { } - if(!admin && b){ + if (!admin && b) { bmsDeclarationRecordsDto.setCreditCode(str); } startPage(); @@ -118,15 +124,15 @@ public class BmsDeclarationRecordsController extends BaseController { String fatherFile = fileAddress + "/" + "项目压缩文件"; FileUtil.mkdir(fatherFile); for (BmsDeclarationRecordsQueryVo item : rd) { - String itemsFileName = fatherFile + "/" +item.getProjectName()+item.getEnterpriseName(); + String itemsFileName = fatherFile + "/" + item.getProjectName() + item.getEnterpriseName(); FileUtil.mkdir(itemsFileName); List splitList = bmsDeclarationRecordsService.getAllFile(item.getTemplateJson()); for (String s : splitList) { // 下载文件 try { - HttpUtil.downloadFile("http://localhost:"+ port + s, itemsFileName); + HttpUtil.downloadFile("http://localhost:" + port + s, itemsFileName); } catch (Exception e) { - throw new RuntimeException(itemsFileName+"某文件下载失败"); + throw new RuntimeException(itemsFileName + "某文件下载失败"); } } } @@ -142,7 +148,7 @@ public class BmsDeclarationRecordsController extends BaseController { // 设置响应头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); - headers.setContentDispositionFormData("attachment", URLEncoder.encode("项目压缩文件.zip","UTF-8")); + headers.setContentDispositionFormData("attachment", URLEncoder.encode("项目压缩文件.zip", "UTF-8")); // 删除压缩之前的文件夹 FileUtil.del(zipFilePath); // 删除压缩包 @@ -162,7 +168,6 @@ public class BmsDeclarationRecordsController extends BaseController { } - /** * 导出在线申报记录列表 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseBasicInfoController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseBasicInfoController.java index 07ef5b6..62bcad2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseBasicInfoController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseBasicInfoController.java @@ -1,25 +1,27 @@ package com.ruoyi.jjh.declaration.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.jjh.declaration.entity.BmsEnterpriseBasicInfo; import com.ruoyi.jjh.declaration.entity.request.EnterpriseInfoWorkRequest; -import com.ruoyi.jjh.declaration.mapper.BmsEnterpriseBasicInfoMapper; import com.ruoyi.jjh.declaration.service.IBmsEnterpriseBasicInfoService; -import com.ruoyi.jjh.ent.entity.JMemorandum; -import com.ruoyi.jjh.ent.entity.JProject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; @@ -27,7 +29,7 @@ import java.util.List; /** * 企业基础信息Controller - * + * * @author farben * @date 2023-08-25 */ @@ -46,7 +48,7 @@ public class BmsEnterpriseBasicInfoController extends BaseController { @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @ApiOperation(value = "查询企业基础信息列表", response = BmsEnterpriseBasicInfo.class) @GetMapping("/list") - public AjaxResult list(Page page,BmsEnterpriseBasicInfo bmsEnterpriseBasicInfo) { + public AjaxResult list(Page page, BmsEnterpriseBasicInfo bmsEnterpriseBasicInfo) { return success(bmsEnterpriseBasicInfoService.page(page, bmsEnterpriseBasicInfo)); } @@ -54,7 +56,7 @@ public class BmsEnterpriseBasicInfoController extends BaseController { * 作业台查询企业信息 */ @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") - @ApiOperation(value = "作业台查询企业信息" ,response = BmsEnterpriseBasicInfo.class) + @ApiOperation(value = "作业台查询企业信息", response = BmsEnterpriseBasicInfo.class) @GetMapping("/workSearch") public AjaxResult workSearch(EnterpriseInfoWorkRequest enterpriseInfoWorkRequest) { return AjaxResult.success(bmsEnterpriseBasicInfoService.workSearch(enterpriseInfoWorkRequest)); @@ -80,7 +82,7 @@ public class BmsEnterpriseBasicInfoController extends BaseController { @ApiOperation(value = "导入企业基础信息列表") @Log(title = "导入企业基础信息列表", businessType = BusinessType.IMPORT) @PostMapping(value = "/importEnterprise", consumes = "multipart/form-data") - public AjaxResult importEnterprise(@RequestPart("file")MultipartFile file) throws Exception{ + public AjaxResult importEnterprise(@RequestPart("file") MultipartFile file) throws Exception { List allList = bmsEnterpriseBasicInfoService.list(); ExcelUtil util = new ExcelUtil<>(BmsEnterpriseBasicInfo.class); List proList = util.importExcel(file.getInputStream()); @@ -98,7 +100,7 @@ public class BmsEnterpriseBasicInfoController extends BaseController { /** * 根据信用代码获取该企业id */ - @ApiOperation(value = "根据信用代码获取该企业id" ,response = BmsEnterpriseBasicInfo.class) + @ApiOperation(value = "根据信用代码获取该企业id", response = BmsEnterpriseBasicInfo.class) @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov,ent')") @GetMapping(value = "/getCreditCode") public AjaxResult getCreditCode(@RequestParam String getCreditCode) { @@ -109,11 +111,11 @@ public class BmsEnterpriseBasicInfoController extends BaseController { try { admin = SecurityUtils.isAdmin(SecurityUtils.getUserId()); b = SecurityUtils.hasRole("ent"); - str =SecurityUtils.getUsername(); + str = SecurityUtils.getUsername(); } catch (Exception ignored) { } - if(!admin && b){ - getCreditCode=str; + if (!admin && b) { + getCreditCode = str; } return success(bmsEnterpriseBasicInfoService.selectGetCreditCode(getCreditCode)); } @@ -121,7 +123,7 @@ public class BmsEnterpriseBasicInfoController extends BaseController { /** * 获取企业基础信息详细信息 */ - @ApiOperation(value = "获取企业基础信息详细信息" ,response = BmsEnterpriseBasicInfo.class) + @ApiOperation(value = "获取企业基础信息详细信息", response = BmsEnterpriseBasicInfo.class) @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov,ent')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseDirectoryController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseDirectoryController.java index ad5024a..efda543 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseDirectoryController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseDirectoryController.java @@ -1,21 +1,19 @@ package com.ruoyi.jjh.declaration.controller; -import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.jjh.declaration.entity.BmsEnterpriseDirectory; import com.ruoyi.jjh.declaration.service.IBmsEnterpriseDirectoryService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -25,7 +23,7 @@ import java.util.List; /** * 企业名录Controller - * + * * @author farben * @date 2023-08-31 */ @@ -55,7 +53,7 @@ public class BmsEnterpriseDirectoryController extends BaseController { @ApiOperation(value = "导出企业名录列表") @Log(title = "企业名录", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(HttpServletResponse response,@RequestBody BmsEnterpriseDirectory bmsEnterpriseDirectory) { + public void export(HttpServletResponse response, @RequestBody BmsEnterpriseDirectory bmsEnterpriseDirectory) { List list = bmsEnterpriseDirectoryService.selectBmsEnterpriseDirectoryList(bmsEnterpriseDirectory); ExcelUtil util = new ExcelUtil(BmsEnterpriseDirectory.class); util.exportExcel(response, list, "企业名录数据"); @@ -95,7 +93,7 @@ public class BmsEnterpriseDirectoryController extends BaseController { */ // @RequiresPermissions("system:enterpriseDirectory:remove") @Log(title = "企业名录", businessType = BusinessType.DELETE) - @PostMapping("/{ids}") + @PostMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(bmsEnterpriseDirectoryService.deleteBmsEnterpriseDirectoryByIds(ids)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseFillController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseFillController.java index 30ceba1..6f6ffb8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseFillController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsEnterpriseFillController.java @@ -18,13 +18,14 @@ import javax.validation.Valid; /** * 企业填报控制层 + * * @author du * @since 2024/7/24 13:43 */ @Api(tags = "企业填报") @RestController @RequestMapping("/system/fill") -public class BmsEnterpriseFillController extends BaseController { +public class BmsEnterpriseFillController extends BaseController { @Autowired private IBmsEnterpriseFillService iBmsEnterpriseFillService; @@ -42,6 +43,7 @@ public class BmsEnterpriseFillController extends BaseController { //企业填报之后要新增一条审批记录 //政务端审批之后也要新增一条 //被驳回之后也要新增一条审批记录 + /** * 初审驳回之后企业重新填报的接口 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsProcessInfoController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsProcessInfoController.java index d02b419..abf199c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsProcessInfoController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsProcessInfoController.java @@ -1,19 +1,17 @@ package com.ruoyi.jjh.declaration.controller; -import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.jjh.declaration.entity.BmsProcessInfo; import com.ruoyi.jjh.declaration.service.IBmsProcessInfoService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -23,7 +21,7 @@ import java.util.List; /** * 审批流程Controller - * + * * @author farben * @date 2023-09-09 */ @@ -90,7 +88,7 @@ public class BmsProcessInfoController extends BaseController { */ // @RequiresPermissions("system:processInfo:remove") @Log(title = "审批流程", businessType = BusinessType.DELETE) - @PostMapping("/{ids}") + @PostMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(bmsProcessInfoService.deleteBmsProcessInfoByIds(ids)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsTemplateInfoController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsTemplateInfoController.java index 4a997c6..1c06a9e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsTemplateInfoController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsTemplateInfoController.java @@ -15,8 +15,12 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.core.parameters.P; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -26,7 +30,7 @@ import java.util.List; /** * 申报模板信息Controller - * + * * @author farben * @date 2023-08-25 */ @@ -46,7 +50,7 @@ public class BmsTemplateInfoController extends BaseController { @GetMapping("/list") @ApiOperation(value = "查询申报模板信息列表", response = BmsTemplateInfo.class) public AjaxResult list(Page page, BmsTemplateInfo bmsTemplateInfo) { - return success(bmsTemplateInfoService.selectBmsTemplateInfoList(page,bmsTemplateInfo)); + return success(bmsTemplateInfoService.selectBmsTemplateInfoList(page, bmsTemplateInfo)); } /** @@ -80,8 +84,8 @@ public class BmsTemplateInfoController extends BaseController { @Log(title = "导出模板表单", businessType = BusinessType.EXPORT) @ApiOperation(value = "导出模板表单") @GetMapping(value = "/exportTemplate/{id}") - public void exportTemplate(HttpServletRequest request, HttpServletResponse response,@PathVariable("id")Long id){ - bmsTemplateInfoService.exportTemplate(request,response,id); + public void exportTemplate(HttpServletRequest request, HttpServletResponse response, @PathVariable("id") Long id) { + bmsTemplateInfoService.exportTemplate(request, response, id); } /** @@ -127,7 +131,7 @@ public class BmsTemplateInfoController extends BaseController { @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @Log(title = "申报模板信息", businessType = BusinessType.DELETE) @ApiOperation(value = "删除申报模板信息") - @PostMapping("/{ids}") + @PostMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(bmsTemplateInfoService.deleteBmsTemplateInfoByIds(ids)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsTemplateRecordController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsTemplateRecordController.java index 063b474..0dd6bc8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsTemplateRecordController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/controller/BmsTemplateRecordController.java @@ -4,10 +4,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.jjh.declaration.entity.dto.BmsTemplateQueryDto; import com.ruoyi.jjh.declaration.entity.dto.BmsTemplateRecordAddDto; import com.ruoyi.jjh.declaration.entity.dto.BmsTemplateRecordQueryDto; import com.ruoyi.jjh.declaration.entity.dto.BmsTemplateRecordUpdateDto; @@ -15,18 +13,21 @@ import com.ruoyi.jjh.declaration.entity.vo.BmsTemplateRecordQueryVo; import com.ruoyi.jjh.declaration.service.IBmsTemplateRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * 在线模板Controller - * + * * @author farben * @date 2023-09-07 */ @@ -42,9 +43,9 @@ public class BmsTemplateRecordController extends BaseController { */ @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @GetMapping("/list") - @ApiOperation(value = "分页查询在线模板列表",response = BmsTemplateRecordQueryVo.class) - public AjaxResult list(Page page,BmsTemplateRecordQueryDto bmsTemplateRecordQueryDto) { - return success(bmsTemplateRecordService.selectBmsTemplateRecordList(page,bmsTemplateRecordQueryDto)); + @ApiOperation(value = "分页查询在线模板列表", response = BmsTemplateRecordQueryVo.class) + public AjaxResult list(Page page, BmsTemplateRecordQueryDto bmsTemplateRecordQueryDto) { + return success(bmsTemplateRecordService.selectBmsTemplateRecordList(page, bmsTemplateRecordQueryDto)); } // /** @@ -63,12 +64,13 @@ public class BmsTemplateRecordController extends BaseController { /** * 补录 + * * @param bmsTemplateRecordUpdateDto * @return */ @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @ApiOperation(value = "补录") - @PostMapping ("/supplementation") + @PostMapping("/supplementation") public AjaxResult supplementation(@RequestBody BmsTemplateRecordUpdateDto bmsTemplateRecordUpdateDto) { return toAjax(bmsTemplateRecordService.supplementation(bmsTemplateRecordUpdateDto)); } @@ -125,7 +127,7 @@ public class BmsTemplateRecordController extends BaseController { @ApiOperation(value = "删除在线模板") @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @Log(title = "在线模板", businessType = BusinessType.DELETE) - @PostMapping("/{ids}") + @PostMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(bmsTemplateRecordService.deleteBmsTemplateRecordByIds(ids)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsApprovalInfo.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsApprovalInfo.java index 15c53e0..1092f55 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsApprovalInfo.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsApprovalInfo.java @@ -6,8 +6,6 @@ import com.ruoyi.common.annotation.Excel; import com.ruoyi.jjh.common.entity.BaseInfoEntity; import lombok.Data; import lombok.EqualsAndHashCode; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import java.util.Date; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsDeclarationRecords.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsDeclarationRecords.java index d834c75..2e5b022 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsDeclarationRecords.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsDeclarationRecords.java @@ -8,8 +8,6 @@ import com.ruoyi.jjh.common.entity.BaseInfoEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; /** * 在线申报记录对象 bms_declaration_records @@ -105,8 +103,6 @@ public class BmsDeclarationRecords extends BaseInfoEntity { private String creditCode; - - /** * 审批状态 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsEnterpriseBasicInfo.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsEnterpriseBasicInfo.java index cb0bd69..619e846 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsEnterpriseBasicInfo.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsEnterpriseBasicInfo.java @@ -1,19 +1,14 @@ package com.ruoyi.jjh.declaration.entity; import com.alibaba.fastjson2.annotation.JSONField; -import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.ruoyi.common.annotation.Excel; import com.ruoyi.jjh.common.entity.BaseInfoEntity; -import io.swagger.annotations.Api; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; /** * 企业基础信息对象 bms_enterprise_basic_info @@ -30,22 +25,22 @@ public class BmsEnterpriseBasicInfo extends BaseInfoEntity { /** * 主键id */ - @JSONField(serialize=false) + @JSONField(serialize = false) @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 有几个法人 */ - @JSONField(serialize=false) + @JSONField(serialize = false) private Integer multiple; /** * 分类 1.规上 2规下 */ @ApiModelProperty("分类 1.规上服务业 2其他") - @JSONField(serialize=false) - @Excel(name = "分类",readConverterExp = "1=规上服务业,2=其他") + @JSONField(serialize = false) + @Excel(name = "分类", readConverterExp = "1=规上服务业,2=其他") private Integer type; @@ -397,10 +392,9 @@ public class BmsEnterpriseBasicInfo extends BaseInfoEntity { * 是否删除:0,未删除;1,已删除 */ @ApiModelProperty("是否删除:0,未删除;1,已删除") - @JSONField(serialize=false) - @Excel(name = "是否删除",readConverterExp = "0=未删除,1=已删除") + @JSONField(serialize = false) + @Excel(name = "是否删除", readConverterExp = "0=未删除,1=已删除") private Long isDeleted; - } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsTemplateInfo.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsTemplateInfo.java index 1db18e8..b6fda6f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsTemplateInfo.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsTemplateInfo.java @@ -7,8 +7,6 @@ import com.ruoyi.common.annotation.Excel; import com.ruoyi.jjh.common.entity.BaseInfoEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotBlank; @@ -126,7 +124,7 @@ public class BmsTemplateInfo extends BaseInfoEntity { /** * 状态 0=过期,1=有效 */ - @Excel(name = "状态 0=过期,1=有效" , readConverterExp = "0=过期,1=有效") + @Excel(name = "状态 0=过期,1=有效", readConverterExp = "0=过期,1=有效") @ApiModelProperty("状态 0=过期,1=有效") private Integer status; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsTemplateRecord.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsTemplateRecord.java index d4a7dfc..bfcb9c6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsTemplateRecord.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/BmsTemplateRecord.java @@ -9,7 +9,6 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import javax.validation.constraints.Size; import java.time.LocalDate; /** @@ -75,16 +74,16 @@ public class BmsTemplateRecord extends BaseInfoEntity { /** * 状态 0=未开始 1=过期 2=有效 3长期有效 */ - @Excel(name = "状态 0=未开始 1=过期 2=有效 3长期有效" , readConverterExp = "0=未开始,1=过期,2=有效,3=长期有效") + @Excel(name = "状态 0=未开始 1=过期 2=有效 3长期有效", readConverterExp = "0=未开始,1=过期,2=有效,3=长期有效") @ApiModelProperty("状态 0=未开始 1=过期 2=有效 3长期有效") private Integer status; - @Excel(name = "是否限时" , readConverterExp = "0=限时,1=不限时") + @Excel(name = "是否限时", readConverterExp = "0=限时,1=不限时") @ApiModelProperty(value = "是否限时,0:限时,1:不限时") private Integer isTime; - @Excel(name = "是否需要审批" , readConverterExp = "0=不需要审批,1=需要审批") + @Excel(name = "是否需要审批", readConverterExp = "0=不需要审批,1=需要审批") @ApiModelProperty(value = "0=不需要审批,1=需要审批") private Integer isApproval; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/ApprovalDeclarationRecordsQueryDto.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/ApprovalDeclarationRecordsQueryDto.java index 93fa778..69bbfde 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/ApprovalDeclarationRecordsQueryDto.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/ApprovalDeclarationRecordsQueryDto.java @@ -9,6 +9,7 @@ import java.util.List; /** * 审核申报记录查询 + * * @author du * @since 2024/7/24 13:43 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsApprovalInfoUpdateDto.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsApprovalInfoUpdateDto.java index d4fe4f8..231b9bb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsApprovalInfoUpdateDto.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsApprovalInfoUpdateDto.java @@ -1,9 +1,6 @@ package com.ruoyi.jjh.declaration.entity.dto; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import com.ruoyi.common.annotation.Excel; -import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -11,7 +8,7 @@ import java.io.Serializable; /** * 审批记录信息对象 bms_approval_info - * + * * @author farben * @date 2023-09-09 */ @@ -20,21 +17,26 @@ public class BmsApprovalInfoUpdateDto implements Serializable { private static final long serialVersionUID = 1L; - - /** 申报记录id */ + /** + * 申报记录id + */ @Excel(name = "申报记录id") private Long declarationRecordsId; -// /** 审批状态(0=待审核.1=审批通过,2=审批驳回) */ + // /** 审批状态(0=待审核.1=审批通过,2=审批驳回) */ @ApiModelProperty("审批状态(1=审批通过,2=审批驳回,3=初审退回修改)") @Excel(name = "审批状态(1=审批通过,2=审批驳回,3=初审退回修改)") private Integer approvalStatus; - /** 审批意见 */ + /** + * 审批意见 + */ @Excel(name = "审批意见") private String approvalOpinions; - /** 审批附件 */ + /** + * 审批附件 + */ @Excel(name = "审批附件") private String approvalAttachment; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsDeclarationRecordsAddDto.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsDeclarationRecordsAddDto.java index b2d691f..6ae39b1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsDeclarationRecordsAddDto.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsDeclarationRecordsAddDto.java @@ -5,11 +5,10 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.util.List; /** * 在线申报记录对象 bms_declaration_records - * + * * @author farben * @date 2023-08-28 */ @@ -18,7 +17,9 @@ public class BmsDeclarationRecordsAddDto implements Serializable { private static final long serialVersionUID = 1L; - /** 项目名称 */ + /** + * 项目名称 + */ @ApiModelProperty(value = "项目名称") @Excel(name = "项目名称") private String projectName; @@ -29,24 +30,34 @@ public class BmsDeclarationRecordsAddDto implements Serializable { @ApiModelProperty(value = "提交事项") private Long matter; - /** 企业id */ + /** + * 企业id + */ @ApiModelProperty(value = "企业id") private Long enterpriseId; - /** 年份 */ + /** + * 年份 + */ @ApiModelProperty(value = "年份") @Excel(name = "年份") private String year; - /** 模板id */ + /** + * 模板id + */ @ApiModelProperty(value = "模板id") private Long templateId; - /** 申报模版类型 */ + /** + * 申报模版类型 + */ @ApiModelProperty(value = "申报模版类型") private Long declarationTemplateType; - /** 详情id:对应详情id */ + /** + * 详情id:对应详情id + */ @ApiModelProperty(value = "详情id:对应详情id") private Long detailId; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsDeclarationRecordsDto.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsDeclarationRecordsDto.java index 25745fb..fc59872 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsDeclarationRecordsDto.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsDeclarationRecordsDto.java @@ -31,7 +31,9 @@ public class BmsDeclarationRecordsDto extends BmsDeclarationRecords { @Excel(name = "申报单位") private String enterpriseName; - /** 级别 0:本级,1:省级 */ + /** + * 级别 0:本级,1:省级 + */ @ApiModelProperty(value = "级别 0:本级,1:省级") @Excel(name = "级别", readConverterExp = "0=本级,1=省级") private Long level; @@ -41,7 +43,9 @@ public class BmsDeclarationRecordsDto extends BmsDeclarationRecords { // @Excel(name = "申报类型", readConverterExp = "0=/,1=试点区域,2=龙头型,3=创新型") // private Long type; - /** 责任单位 0:经发委:1:规建委:2:行审局:3:市监局 */ + /** + * 责任单位 0:经发委:1:规建委:2:行审局:3:市监局 + */ @ApiModelProperty(value = "责任单位 0:经发委:1:规建委:2:行审局:3:市监局") @Excel(name = "责任单位", readConverterExp = "0=经发委,1=规建委,2=行审局,3=市监局") private Long responsibilityUnit; @@ -50,7 +54,7 @@ public class BmsDeclarationRecordsDto extends BmsDeclarationRecords { private String templateName; @ApiModelProperty(value = "0=待填报,1=初审中,2=复审中,3=终审中,5=评审通过,6=已填报,7=复审不通过,8=初审不通过,9=终审不通过,10=初审驳回") - @Excel(name = "审批状态",readConverterExp = "0=待填报,1=初审中,2=复审中,3=终审中,5=评审通过,6=已填报,7=复审不通过,8=初审不通过,9=终审不通过,10=初审驳回") + @Excel(name = "审批状态", readConverterExp = "0=待填报,1=初审中,2=复审中,3=终审中,5=评审通过,6=已填报,7=复审不通过,8=初审不通过,9=终审不通过,10=初审驳回") private List statusStr; @ApiModelProperty(value = "0=未填报,1=已填报") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsEnterpriseBasicInfoAddDto.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsEnterpriseBasicInfoAddDto.java index 06e37cd..69e2ada 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsEnterpriseBasicInfoAddDto.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsEnterpriseBasicInfoAddDto.java @@ -9,7 +9,7 @@ import java.util.Date; /** * 企业基础信息对象 bms_enterprise_basic_info - * + * * @author farben * @date 2023-08-25 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateInfoAddDto.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateInfoAddDto.java index 1a8adf9..61e47c0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateInfoAddDto.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateInfoAddDto.java @@ -10,7 +10,7 @@ import java.util.List; /** * 申报模板信息对象 bms_template_info - * + * * @author farben * @date 2023-08-25 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateQueryDto.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateQueryDto.java index e94af88..9bdfc9d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateQueryDto.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateQueryDto.java @@ -8,7 +8,7 @@ import java.io.Serializable; /** * 申报模板信息对象 bms_template_info - * + * * @author farben * @date 2023-08-25 */ @@ -24,7 +24,7 @@ public class BmsTemplateQueryDto implements Serializable { private String creditCode; @ApiModelProperty(value = "责任单位 0:经发委:1:规建委:2:行审局:3:市监局") - @Excel(name = "责任单位",readConverterExp = "0=经发委,1=规建委,2=行审局,3=市监局") + @Excel(name = "责任单位", readConverterExp = "0=经发委,1=规建委,2=行审局,3=市监局") private Long responsibilityUnit; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordAddDto.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordAddDto.java index 3835ff7..b37634c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordAddDto.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordAddDto.java @@ -10,7 +10,7 @@ import java.util.List; /** * 在线模板对象 bms_template_record - * + * * @author farben * @date 2023-09-07 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordQueryDto.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordQueryDto.java index e73c9b9..838a85d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordQueryDto.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordQueryDto.java @@ -1,7 +1,7 @@ package com.ruoyi.jjh.declaration.entity.dto; -import com.ruoyi.common.annotation.Excel; import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,7 +10,7 @@ import java.util.Date; /** * 申报模板信息对象 bms_template_info - * + * * @author farben * @date 2023-08-25 */ @@ -26,24 +26,26 @@ public class BmsTemplateRecordQueryDto implements Serializable { private Long templateId; @ApiModelProperty(value = "级别 0:本级,1:省级") - @Excel(name = "级别 ",readConverterExp = "0=本级,1=省级") + @Excel(name = "级别 ", readConverterExp = "0=本级,1=省级") private Integer level; @ApiModelProperty(value = "申报途径,0:系统申报,1:补录") - @Excel(name = "申报途径",readConverterExp = "0=系统申报,1=补录") + @Excel(name = "申报途径", readConverterExp = "0=系统申报,1=补录") private Long road; @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "开放开始时间", width = 30, dateFormat = "yyyy-MM-dd") private Date startTime; - /** 开放结束时间 */ + /** + * 开放结束时间 + */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "开放结束时间", width = 30, dateFormat = "yyyy-MM-dd") private Date endTime; @ApiModelProperty(value = "责任单位 0:经发委:1:规建委:2:行审局:3:市监局") - @Excel(name = "责任单位",readConverterExp = "0=经发委,1=规建委,2=行审局,3=市监局") + @Excel(name = "责任单位", readConverterExp = "0=经发委,1=规建委,2=行审局,3=市监局") private Long responsibilityUnit; @ApiModelProperty(value = "模板名称") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordUpdateDto.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordUpdateDto.java index e3bf538..d6f3294 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordUpdateDto.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/dto/BmsTemplateRecordUpdateDto.java @@ -11,7 +11,7 @@ import java.util.List; /** * 在线模板对象 bms_template_record - * + * * @author farben * @date 2023-09-07 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseFileResquest.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseFileResquest.java index 2be4ddd..bb7529c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseFileResquest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseFileResquest.java @@ -9,6 +9,7 @@ import javax.validation.constraints.NotNull; /** * 企业填报文件请求体 + * * @author du * @since 2024/7/24 13:48 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseFillResquest.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseFillResquest.java index 2819ba3..99d5ea6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseFillResquest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseFillResquest.java @@ -1,6 +1,5 @@ package com.ruoyi.jjh.declaration.entity.request; -import com.alibaba.fastjson2.annotation.JSONField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,6 +9,7 @@ import javax.validation.constraints.NotNull; /** * 企业填报请求体 + * * @author du * @since 2024/7/24 13:48 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseInfoWorkRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseInfoWorkRequest.java index 1735100..1aad66e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseInfoWorkRequest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/request/EnterpriseInfoWorkRequest.java @@ -6,6 +6,7 @@ import lombok.Data; /** * 作业台企业请求体 + * * @author du * @since 2024/5/28 8:55 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsApprovalInfoQueryVo.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsApprovalInfoQueryVo.java index 6fed2cb..9106333 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsApprovalInfoQueryVo.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsApprovalInfoQueryVo.java @@ -3,7 +3,6 @@ package com.ruoyi.jjh.declaration.entity.vo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.ruoyi.common.annotation.Excel; -import io.swagger.annotations.Api; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -12,7 +11,7 @@ import java.io.Serializable; /** * 审批记录信息对象 bms_approval_info - * + * * @author farben * @date 2023-09-09 */ @@ -21,7 +20,9 @@ import java.io.Serializable; public class BmsApprovalInfoQueryVo implements Serializable { private static final long serialVersionUID = 1L; - /** 主键id */ + /** + * 主键id + */ @TableId(value = "id", type = IdType.AUTO) @ApiModelProperty("主键Id") private Long id; @@ -38,22 +39,30 @@ public class BmsApprovalInfoQueryVo implements Serializable { @Excel(name = "默认审批人") private String approvalByName; - /** 审批状态(0=待审核.1=审批通过,2=审批驳回) */ + /** + * 审批状态(0=待审核.1=审批通过,2=审批驳回) + */ @ApiModelProperty("审批状态(0=待审核.1=审批通过,2=审批驳回)") @Excel(name = "审批状态(0=待审核.1=审批通过,2=审批驳回)") private Integer approvalStatus; - /** 审批意见 */ + /** + * 审批意见 + */ @ApiModelProperty("审批意见") @Excel(name = "审批意见") private String approvalOpinions; - /** 审批附件 */ + /** + * 审批附件 + */ @ApiModelProperty("审批附件") @Excel(name = "审批附件") private String approvalAttachment; - /** 是否可审核(0=是,1=否,2=结束) */ + /** + * 是否可审核(0=是,1=否,2=结束) + */ @ApiModelProperty("是否可审核(0=是,1=否,2=结束)") @Excel(name = "是否可审核(0=是,1=否,2=结束)") private Integer isReview; @@ -62,7 +71,9 @@ public class BmsApprovalInfoQueryVo implements Serializable { @Excel(name = "是否为拒绝前数据,0:否,1:是") private Integer isBeforeData; - /** 排序 */ + /** + * 排序 + */ @ApiModelProperty("排序") @Excel(name = "排序") private Integer sort; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsDeclarationRecordsQueryVo.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsDeclarationRecordsQueryVo.java index 0fd2b87..d689902 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsDeclarationRecordsQueryVo.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsDeclarationRecordsQueryVo.java @@ -1,6 +1,5 @@ package com.ruoyi.jjh.declaration.entity.vo; -import com.alibaba.fastjson2.annotation.JSONField; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModelProperty; @@ -101,7 +100,6 @@ public class BmsDeclarationRecordsQueryVo implements Serializable { private Long status; - /** * 对应模板json */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsTemplateRecordQueryVo.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsTemplateRecordQueryVo.java index 5c10b72..64b3cbb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsTemplateRecordQueryVo.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/BmsTemplateRecordQueryVo.java @@ -79,7 +79,7 @@ public class BmsTemplateRecordQueryVo implements Serializable { /** * 状态 0=未开始 1=过期 2=有效 */ - @Excel(name = "状态 0=未开始 1=过期 2=有效" , readConverterExp = "0=未开始,1=过期,2=有效") + @Excel(name = "状态 0=未开始 1=过期 2=有效", readConverterExp = "0=未开始,1=过期,2=有效") @ApiModelProperty("状态 0=未开始 1=过期 2=有效") private Integer status; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/DeclarationRecordsVo.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/DeclarationRecordsVo.java index d0a0ff8..e26110f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/DeclarationRecordsVo.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/entity/vo/DeclarationRecordsVo.java @@ -1,6 +1,7 @@ package com.ruoyi.jjh.declaration.entity.vo; -import com.ruoyi.jjh.declaration.entity.*; +import com.ruoyi.jjh.declaration.entity.BmsDeclarationRecords; +import com.ruoyi.jjh.declaration.entity.BmsEnterpriseBasicInfo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsApprovalInfoMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsApprovalInfoMapper.java index bd78c0e..a6b7e7a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsApprovalInfoMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsApprovalInfoMapper.java @@ -8,14 +8,14 @@ import java.util.List; /** * 审批记录信息Mapper接口 - * + * * @author farben * @date 2023-09-09 */ public interface BmsApprovalInfoMapper extends BaseMapper { /** * 查询审批记录信息 - * + * * @param id 审批记录信息主键 * @return 审批记录信息 */ @@ -23,7 +23,7 @@ public interface BmsApprovalInfoMapper extends BaseMapper { /** * 查询审批记录信息列表 - * + * * @param bmsApprovalInfo 审批记录信息 * @return 审批记录信息集合 */ @@ -31,7 +31,7 @@ public interface BmsApprovalInfoMapper extends BaseMapper { /** * 新增审批记录信息 - * + * * @param bmsApprovalInfo 审批记录信息 * @return 结果 */ @@ -39,7 +39,7 @@ public interface BmsApprovalInfoMapper extends BaseMapper { /** * 修改审批记录信息 - * + * * @param bmsApprovalInfo 审批记录信息 * @return 结果 */ @@ -47,7 +47,7 @@ public interface BmsApprovalInfoMapper extends BaseMapper { /** * 删除审批记录信息 - * + * * @param id 审批记录信息主键 * @return 结果 */ @@ -55,7 +55,7 @@ public interface BmsApprovalInfoMapper extends BaseMapper { /** * 批量删除审批记录信息 - * + * * @param ids 需要删除的数据主键集合 * @return 结果 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsDeclarationRecordsMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsDeclarationRecordsMapper.java index f1e9fac..ae32e04 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsDeclarationRecordsMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsDeclarationRecordsMapper.java @@ -4,24 +4,24 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.jjh.declaration.entity.BmsDeclarationRecords; import com.ruoyi.jjh.declaration.entity.dto.ApprovalDeclarationRecordsQueryDto; import com.ruoyi.jjh.declaration.entity.dto.BmsDeclarationRecordsDto; -import com.ruoyi.jjh.ent.entity.JProject; -import com.ruoyi.jjh.ent.entity.JSmartDeclaration; import com.ruoyi.jjh.declaration.entity.vo.ApprovalDeclarationRecordsQueryVo; import com.ruoyi.jjh.declaration.entity.vo.BmsDeclarationRecordsQueryVo; +import com.ruoyi.jjh.ent.entity.JProject; +import com.ruoyi.jjh.ent.entity.JSmartDeclaration; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 在线申报记录Mapper接口 - * + * * @author farben * @date 2023-08-28 */ public interface BmsDeclarationRecordsMapper extends BaseMapper { /** * 查询在线申报记录 - * + * * @param id 在线申报记录主键 * @return 在线申报记录 */ @@ -29,7 +29,7 @@ public interface BmsDeclarationRecordsMapper extends BaseMapper approvalList(ApprovalDeclarationRecordsQueryDto approvalDeclarationRecordsQueryDto); /** * 新增在线申报记录 - * + * * @param bmsDeclarationRecords 在线申报记录 * @return 结果 */ @@ -54,7 +53,7 @@ public interface BmsDeclarationRecordsMapper extends BaseMapper selectDeclarationRecordsToIdList(@Param("list") List list); /** * 根据企业id和模板id查询 + * * @return */ List selectET(@Param("templateId") Long templateId, @Param("list") List list); @@ -98,12 +98,14 @@ public interface BmsDeclarationRecordsMapper extends BaseMapper allNoLimited(); /** * 获取某个在线记录id可以添加到项目库的数据 + * * @return */ JProject getAddProject(Long id); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsEnterpriseDirectoryMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsEnterpriseDirectoryMapper.java index 4327792..96bb3bd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsEnterpriseDirectoryMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsEnterpriseDirectoryMapper.java @@ -7,14 +7,14 @@ import java.util.List; /** * 企业名录Mapper接口 - * + * * @author farben * @date 2023-08-31 */ public interface BmsEnterpriseDirectoryMapper extends BaseMapper { /** * 查询企业名录 - * + * * @param id 企业名录主键 * @return 企业名录 */ @@ -22,7 +22,7 @@ public interface BmsEnterpriseDirectoryMapper extends BaseMapper { /** * 查询审批流程 - * + * * @param id 审批流程主键 * @return 审批流程 */ @@ -22,7 +22,7 @@ public interface BmsProcessInfoMapper extends BaseMapper { /** * 查询审批流程列表 - * + * * @param bmsProcessInfo 审批流程 * @return 审批流程集合 */ @@ -30,7 +30,7 @@ public interface BmsProcessInfoMapper extends BaseMapper { /** * 新增审批流程 - * + * * @param bmsProcessInfo 审批流程 * @return 结果 */ @@ -38,7 +38,7 @@ public interface BmsProcessInfoMapper extends BaseMapper { /** * 修改审批流程 - * + * * @param bmsProcessInfo 审批流程 * @return 结果 */ @@ -46,7 +46,7 @@ public interface BmsProcessInfoMapper extends BaseMapper { /** * 删除审批流程 - * + * * @param id 审批流程主键 * @return 结果 */ @@ -54,7 +54,7 @@ public interface BmsProcessInfoMapper extends BaseMapper { /** * 批量删除审批流程 - * + * * @param ids 需要删除的数据主键集合 * @return 结果 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsTemplateInfoMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsTemplateInfoMapper.java index 7536319..5f71c1b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsTemplateInfoMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsTemplateInfoMapper.java @@ -9,7 +9,7 @@ import java.util.List; /** * 申报模板信息Mapper接口 - * + * * @author farben * @date 2023-08-25 */ @@ -21,7 +21,7 @@ public interface BmsTemplateInfoMapper extends BaseMapper { * @param bmsTemplateInfo 申报模板信息 * @return 申报模板信息集合 */ - Page templateInfoList(Page page,@Param("req") BmsTemplateInfo bmsTemplateInfo); + Page templateInfoList(Page page, @Param("req") BmsTemplateInfo bmsTemplateInfo); /** * 新增项目时查询所有模板信息 @@ -29,7 +29,7 @@ public interface BmsTemplateInfoMapper extends BaseMapper { * @param bmsTemplateInfo 申报模板信息 * @return 申报模板信息集合 */ - List templateInfoList(@Param("req") BmsTemplateInfo bmsTemplateInfo); + List templateInfoList(@Param("req") BmsTemplateInfo bmsTemplateInfo); /** * 查询单个模板 @@ -40,17 +40,17 @@ public interface BmsTemplateInfoMapper extends BaseMapper { /** * 删除申报模板信息 - * + * * @param id 申报模板信息主键 * @return 结果 */ - int deleteBmsTemplateInfoById(Long id); + int deleteBmsTemplateInfoById(Long id); /** * 批量删除申报模板信息 - * + * * @param ids 需要删除的数据主键集合 * @return 结果 */ - int deleteBmsTemplateInfoByIds(Long[] ids); + int deleteBmsTemplateInfoByIds(Long[] ids); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsTemplateRecordMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsTemplateRecordMapper.java index 56170c8..d54c4e8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsTemplateRecordMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/mapper/BmsTemplateRecordMapper.java @@ -3,7 +3,6 @@ package com.ruoyi.jjh.declaration.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.jjh.declaration.entity.BmsTemplateRecord; -import com.ruoyi.jjh.declaration.entity.dto.BmsTemplateQueryDto; import com.ruoyi.jjh.declaration.entity.dto.BmsTemplateRecordQueryDto; import com.ruoyi.jjh.declaration.entity.vo.BmsTemplateRecordQueryVo; import com.ruoyi.jjh.declaration.entity.vo.BmsTemplateRecordVo; @@ -13,7 +12,7 @@ import java.util.List; /** * 在线模板Mapper接口 - * + * * @author farben * @date 2023-09-07 */ @@ -34,10 +33,9 @@ public interface BmsTemplateRecordMapper extends BaseMapper { public List selectTemplateRecordVo(@Param("req") BmsTemplateRecordQueryDto bmsTemplateRecordQueryDto); - /** * 删除在线模板 - * + * * @param id 在线模板主键 * @return 结果 */ @@ -45,21 +43,20 @@ public interface BmsTemplateRecordMapper extends BaseMapper { /** * 批量删除在线模板 - * + * * @param ids 需要删除的数据主键集合 * @return 结果 */ public int deleteBmsTemplateRecordByIds(Long[] ids); - /** * 分页查询在线模板列表 * * @param bmsTemplateRecordQueryDto 在线模板 * @return 在线模板集合 */ - public Page selectTemplateRecordVo(Page page,@Param("req")BmsTemplateRecordQueryDto bmsTemplateRecordQueryDto); + public Page selectTemplateRecordVo(Page page, @Param("req") BmsTemplateRecordQueryDto bmsTemplateRecordQueryDto); // /** // * 企业端选择表单模板列表 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/regular/SmsEnterChange.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/regular/SmsEnterChange.java index e8b2708..23c078b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/regular/SmsEnterChange.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/regular/SmsEnterChange.java @@ -15,6 +15,7 @@ import java.util.List; /** * 发送短信定时任务 + * * @author du * @since 2024/7/17 10:30 */ @@ -33,41 +34,42 @@ public class SmsEnterChange { @Value("${isTiming}") private Boolean isTiming; + // 每三小时执行一次 @Scheduled(cron = "0 0 */12 * * *") private void runTask() { - if(isTiming){ + if (isTiming) { //查询初审的所有用户 SysUser user = new SysUser(); user.setDeptId(105L); Long count = iBmsDeclarationRecordsService.lambdaQuery().eq(BmsDeclarationRecords::getStatus, 1).count(); - if(count>0){ + if (count > 0) { List list1 = sysUserMapper.selectUserList(user); - list1.removeIf(x-> x.getPhonenumber().isEmpty()); + list1.removeIf(x -> x.getPhonenumber().isEmpty()); for (SysUser items : list1) { - smsAlertsService.enterSms("政府人员-"+items.getNickName(),"您有"+count+"个新的申报审核任务[待初审]",items.getPhonenumber()); + smsAlertsService.enterSms("政府人员-" + items.getNickName(), "您有" + count + "个新的申报审核任务[待初审]", items.getPhonenumber()); } } //查询复审的所有用户 SysUser user1 = new SysUser(); user1.setDeptId(101L); Long count1 = iBmsDeclarationRecordsService.lambdaQuery().eq(BmsDeclarationRecords::getStatus, 2).count(); - if(count1>0){ + if (count1 > 0) { List list2 = sysUserMapper.selectUserList(user1); - list2.removeIf(x-> x.getPhonenumber().isEmpty()); + list2.removeIf(x -> x.getPhonenumber().isEmpty()); for (SysUser items : list2) { - smsAlertsService.enterSms("政府人员-"+items.getNickName(),"您有"+count1+"个新的申报审核任务[待复审]",items.getPhonenumber()); + smsAlertsService.enterSms("政府人员-" + items.getNickName(), "您有" + count1 + "个新的申报审核任务[待复审]", items.getPhonenumber()); } } //查询终审的所有用户 SysUser user2 = new SysUser(); user2.setDeptId(103L); Long count2 = iBmsDeclarationRecordsService.lambdaQuery().eq(BmsDeclarationRecords::getStatus, 3).count(); - if(count2>0){ + if (count2 > 0) { List list3 = sysUserMapper.selectUserList(user2); - list3.removeIf(x-> x.getPhonenumber().isEmpty()); + list3.removeIf(x -> x.getPhonenumber().isEmpty()); for (SysUser items : list3) { - smsAlertsService.enterSms("政府人员-"+items.getNickName(),"您有"+count2+"个新的申报审核任务[待终审]",items.getPhonenumber()); + smsAlertsService.enterSms("政府人员-" + items.getNickName(), "您有" + count2 + "个新的申报审核任务[待终审]", items.getPhonenumber()); } } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/regular/TimeChange.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/regular/TimeChange.java index c17dbf2..752b0c5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/regular/TimeChange.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/regular/TimeChange.java @@ -18,7 +18,11 @@ import com.ruoyi.jjh.ent.entity.JContacts; import com.ruoyi.jjh.ent.entity.JProject; import com.ruoyi.jjh.ent.entity.JSmartDeclaration; import com.ruoyi.jjh.ent.entity.JSmartReminders; -import com.ruoyi.jjh.ent.service.*; +import com.ruoyi.jjh.ent.service.JContactsService; +import com.ruoyi.jjh.ent.service.JProjectService; +import com.ruoyi.jjh.ent.service.JSmartDeclarationService; +import com.ruoyi.jjh.ent.service.JSmartRemindersService; +import com.ruoyi.jjh.ent.service.SmsAlertsService; import com.ruoyi.quartz.service.ISysJobService; import com.ruoyi.system.mapper.SysUserMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -113,6 +117,11 @@ public class TimeChange { @Resource private TimingRemindService timingRemindImpl; + /** + * 项目表 + */ + @Resource + private JProjectService jProjectService; /** * 根据每天的日期修改模板的状态 @@ -126,12 +135,6 @@ public class TimeChange { bmsTemplateInfoService.updateBatchById(list); } - /** - * 项目表 - */ - @Resource - private JProjectService jProjectService; - public void getTime(BmsTemplateRecord items) { LocalDate currentDate = LocalDate.now(); LocalDate startDate = LocalDate.of(items.getStartTime().getYear(), items.getStartTime().getMonth(), items.getStartTime().getDayOfMonth()); @@ -239,7 +242,6 @@ public class TimeChange { } - /** * 定时不定期提醒 */ @@ -260,10 +262,10 @@ public class TimeChange { y.setSmartRemindersId(1L); y.setIsRead(1); y.setAlertTime(y.getEndTime().minusDays(qy.getDaysAdvance())); - if(y.getTyshxydm()!=null){ - if(isTiming){ + if (y.getTyshxydm() != null) { + if (isTiming) { //发送短信 - timingRemindImpl.getContact(y.getTyshxydm(),"您有1个申报任务即将结束,请前往系统首页查看"); + timingRemindImpl.getContact(y.getTyshxydm(), "您有1个申报任务即将结束,请前往系统首页查看"); } } }); @@ -284,7 +286,7 @@ public class TimeChange { y.setProjectId(x.getId()); y.setZwId(o.getUserId()); bmsDeclarationRecords.add(y); - if(isTiming){ + if (isTiming) { smsAlertsService.enterSms("政府人员-" + o.getNickName(), "您有1个项目即将建设完成,请前往工作台查看。", o.getPhonenumber()); } }); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsApprovalInfoService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsApprovalInfoService.java index c637829..df56192 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsApprovalInfoService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsApprovalInfoService.java @@ -8,14 +8,14 @@ import java.util.List; /** * 审批记录信息Service接口 - * + * * @author farben * @date 2023-09-09 */ public interface IBmsApprovalInfoService extends IService { /** * 查询审批记录信息 - * + * * @param id 审批记录信息主键 * @return 审批记录信息 */ @@ -23,7 +23,7 @@ public interface IBmsApprovalInfoService extends IService { /** * 查询审批记录信息列表 - * + * * @param bmsApprovalInfo 审批记录信息 * @return 审批记录信息集合 */ @@ -31,7 +31,7 @@ public interface IBmsApprovalInfoService extends IService { /** * 新增审批记录信息 - * + * * @param bmsApprovalInfo 审批记录信息 * @return 结果 */ @@ -39,7 +39,7 @@ public interface IBmsApprovalInfoService extends IService { /** * 修改审批记录信息 - * + * * @param bmsApprovalInfo 审批记录信息 * @return 结果 */ @@ -47,7 +47,7 @@ public interface IBmsApprovalInfoService extends IService { /** * 批量删除审批记录信息 - * + * * @param ids 需要删除的审批记录信息主键集合 * @return 结果 */ @@ -59,7 +59,7 @@ public interface IBmsApprovalInfoService extends IService { /** * 删除审批记录信息信息 - * + * * @param id 审批记录信息主键 * @return 结果 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsDeclarationRecordsService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsDeclarationRecordsService.java index 1a40f49..04999ca 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsDeclarationRecordsService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsDeclarationRecordsService.java @@ -2,12 +2,14 @@ package com.ruoyi.jjh.declaration.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.jjh.declaration.entity.BmsDeclarationRecords; -import com.ruoyi.jjh.declaration.entity.dto.*; -import com.ruoyi.jjh.ent.entity.JProject; -import com.ruoyi.jjh.ent.entity.JSmartDeclaration; +import com.ruoyi.jjh.declaration.entity.dto.ApprovalDeclarationRecordsQueryDto; +import com.ruoyi.jjh.declaration.entity.dto.BmsApprovalInfoUpdateDto; +import com.ruoyi.jjh.declaration.entity.dto.BmsDeclarationRecordsDto; import com.ruoyi.jjh.declaration.entity.vo.ApprovalDeclarationRecordsQueryVo; import com.ruoyi.jjh.declaration.entity.vo.BmsDeclarationRecordsQueryVo; import com.ruoyi.jjh.declaration.entity.vo.DeclarationRecordsVo; +import com.ruoyi.jjh.ent.entity.JProject; +import com.ruoyi.jjh.ent.entity.JSmartDeclaration; import java.util.List; @@ -37,10 +39,8 @@ public interface IBmsDeclarationRecordsService extends IService selectBmsDeclarationRecordsZwList(BmsDeclarationRecordsDto bmsDeclarationRecordsDto); - /** * 审核列表 - * */ public List approvalList(ApprovalDeclarationRecordsQueryDto approvalDeclarationRecordsQueryDto); @@ -85,7 +85,6 @@ public interface IBmsDeclarationRecordsService extends IService selectET(Long templateId,List list); + List selectET(Long templateId, List list); /** * 申报模板不限时并且未填报的 + * * @return */ List allNoLimited(); @@ -106,6 +107,7 @@ public interface IBmsDeclarationRecordsService extends IService page(Page page, BmsEnterpriseBasicInfo bmsEnterpriseBasicInfo); + Page page(Page page, BmsEnterpriseBasicInfo bmsEnterpriseBasicInfo); /** * 查询企业基础信息列表所有 @@ -30,10 +30,11 @@ public interface IBmsEnterpriseBasicInfoService extends IService page( BmsEnterpriseBasicInfo bmsEnterpriseBasicInfo); + List page(BmsEnterpriseBasicInfo bmsEnterpriseBasicInfo); List workSearch(EnterpriseInfoWorkRequest enterpriseInfoWorkRequest); + /** * 根据信用代码获取该企业id */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsEnterpriseDirectoryService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsEnterpriseDirectoryService.java index e327545..7b853df 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsEnterpriseDirectoryService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsEnterpriseDirectoryService.java @@ -7,14 +7,14 @@ import java.util.List; /** * 企业名录Service接口 - * + * * @author farben * @date 2023-08-31 */ public interface IBmsEnterpriseDirectoryService extends IService { /** * 查询企业名录 - * + * * @param id 企业名录主键 * @return 企业名录 */ @@ -22,7 +22,7 @@ public interface IBmsEnterpriseDirectoryService extends IService parseJson(String json); + Map parseJson(String json); /** * 初审驳回之后企业重新填报的接口 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsProcessInfoService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsProcessInfoService.java index c2ea2c1..3ec76cd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsProcessInfoService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsProcessInfoService.java @@ -7,14 +7,14 @@ import java.util.List; /** * 审批流程Service接口 - * + * * @author farben * @date 2023-09-09 */ public interface IBmsProcessInfoService extends IService { /** * 查询审批流程 - * + * * @param id 审批流程主键 * @return 审批流程 */ @@ -22,7 +22,7 @@ public interface IBmsProcessInfoService extends IService { /** * 查询审批流程列表 - * + * * @param bmsProcessInfo 审批流程 * @return 审批流程集合 */ @@ -30,7 +30,7 @@ public interface IBmsProcessInfoService extends IService { /** * 新增审批流程 - * + * * @param bmsProcessInfo 审批流程 * @return 结果 */ @@ -38,7 +38,7 @@ public interface IBmsProcessInfoService extends IService { /** * 修改审批流程 - * + * * @param bmsProcessInfo 审批流程 * @return 结果 */ @@ -46,7 +46,7 @@ public interface IBmsProcessInfoService extends IService { /** * 批量删除审批流程 - * + * * @param ids 需要删除的审批流程主键集合 * @return 结果 */ @@ -54,7 +54,7 @@ public interface IBmsProcessInfoService extends IService { /** * 删除审批流程信息 - * + * * @param id 审批流程主键 * @return 结果 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsTemplateInfoService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsTemplateInfoService.java index c7ebc01..26ceec2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsTemplateInfoService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsTemplateInfoService.java @@ -10,7 +10,7 @@ import java.util.List; /** * 申报模板信息Service接口 - * + * * @author farben * @date 2023-08-25 */ @@ -19,11 +19,11 @@ public interface IBmsTemplateInfoService extends IService { /** * 查询申报模板信息列表 - * + * * @param bmsTemplateInfo 申报模板信息 * @return 申报模板信息集合 */ - public Page selectBmsTemplateInfoList(Page page, BmsTemplateInfo bmsTemplateInfo); + public Page selectBmsTemplateInfoList(Page page, BmsTemplateInfo bmsTemplateInfo); /** * 新增项目时查询所有模板信息 @@ -31,7 +31,7 @@ public interface IBmsTemplateInfoService extends IService { * @param bmsTemplateInfo 申报模板信息 * @return 申报模板信息集合 */ - public List selectBmsTemplateInfoList( BmsTemplateInfo bmsTemplateInfo); + public List selectBmsTemplateInfoList(BmsTemplateInfo bmsTemplateInfo); /** * 导出模板表单 @@ -64,7 +64,7 @@ public interface IBmsTemplateInfoService extends IService { /** * 批量删除申报模板信息 - * + * * @param ids 需要删除的申报模板信息主键集合 * @return 结果 */ @@ -72,7 +72,7 @@ public interface IBmsTemplateInfoService extends IService { /** * 删除申报模板信息信息 - * + * * @param id 申报模板信息主键 * @return 结果 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsTemplateRecordService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsTemplateRecordService.java index d94e04d..7504833 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsTemplateRecordService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/IBmsTemplateRecordService.java @@ -3,7 +3,6 @@ package com.ruoyi.jjh.declaration.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.jjh.declaration.entity.BmsTemplateRecord; -import com.ruoyi.jjh.declaration.entity.dto.BmsTemplateQueryDto; import com.ruoyi.jjh.declaration.entity.dto.BmsTemplateRecordAddDto; import com.ruoyi.jjh.declaration.entity.dto.BmsTemplateRecordQueryDto; import com.ruoyi.jjh.declaration.entity.dto.BmsTemplateRecordUpdateDto; @@ -14,7 +13,7 @@ import java.util.List; /** * 在线模板Service接口 - * + * * @author farben * @date 2023-09-07 */ @@ -26,7 +25,7 @@ public interface IBmsTemplateRecordService extends IService { * @param bmsTemplateRecordQueryDto 在线模板 * @return 在线模板集合 */ - public Page selectBmsTemplateRecordList(Page page,BmsTemplateRecordQueryDto bmsTemplateRecordQueryDto); + public Page selectBmsTemplateRecordList(Page page, BmsTemplateRecordQueryDto bmsTemplateRecordQueryDto); // /** // * 企业端选择表单模板列表 @@ -38,6 +37,7 @@ public interface IBmsTemplateRecordService extends IService { /** * 补录 + * * @param bmsTemplateRecordAddDto * @return */ @@ -49,7 +49,7 @@ public interface IBmsTemplateRecordService extends IService { * @param bmsTemplateRecordQueryDto 在线模板 * @return 在线模板 */ - public List selectBmsTemplateRecordList(BmsTemplateRecordQueryDto bmsTemplateRecordQueryDto); + public List selectBmsTemplateRecordList(BmsTemplateRecordQueryDto bmsTemplateRecordQueryDto); /** * 获取在线模板详细信息 @@ -65,9 +65,6 @@ public interface IBmsTemplateRecordService extends IService { public int insertBmsTemplateRecord(BmsTemplateRecordAddDto bmsTemplateRecordAddDto); - - - // /** // * 修改在线模板 // * @@ -78,7 +75,7 @@ public interface IBmsTemplateRecordService extends IService { /** * 批量删除在线模板 - * + * * @param ids 需要删除的在线模板主键集合 * @return 结果 */ @@ -86,7 +83,7 @@ public interface IBmsTemplateRecordService extends IService { /** * 删除在线模板信息 - * + * * @param id 在线模板主键 * @return 结果 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/ICommonService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/ICommonService.java index eaac563..0e30ec7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/ICommonService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/ICommonService.java @@ -11,15 +11,15 @@ package com.ruoyi.jjh.declaration.service; */ public interface ICommonService { - public Long checkEnterprise(String creditCode,int templateRecordId); + public Long checkEnterprise(String creditCode, int templateRecordId); - public void checkDeclaration(String creditCode,int templateRecordId); + public void checkDeclaration(String creditCode, int templateRecordId); - public void checkEnterprise(Long enterpriseId,Long templateId); + public void checkEnterprise(Long enterpriseId, Long templateId); - public void insertAuditRecord(Long declarationRecordId,Integer approvalType); + public void insertAuditRecord(Long declarationRecordId, Integer approvalType); - public void updateAuditRecord(Long declarationRecordId,Integer approvalType); + public void updateAuditRecord(Long declarationRecordId, Integer approvalType); // public int insertOpenInterfaceApplyAddDto(OpenInterfaceApplyAddDto openInterfaceApplyAddDto); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/BmsApprovalInfoServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/BmsApprovalInfoServiceImpl.java index 95ee5ab..5fc81af 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/BmsApprovalInfoServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/BmsApprovalInfoServiceImpl.java @@ -12,17 +12,17 @@ import java.util.List; /** * 审批记录信息Service业务层处理 - * + * * @author farben * @date 2023-09-09 */ @Service -public class BmsApprovalInfoServiceImpl extends ServiceImpl implements IBmsApprovalInfoService { +public class BmsApprovalInfoServiceImpl extends ServiceImpl implements IBmsApprovalInfoService { /** * 查询审批记录信息 - * + * * @param id 审批记录信息主键 * @return 审批记录信息 */ @@ -33,7 +33,7 @@ public class BmsApprovalInfoServiceImpl extends ServiceImpl implements IBmsEnterpriseBasicInfoService { +public class BmsEnterpriseBasicInfoServiceImpl extends ServiceImpl implements IBmsEnterpriseBasicInfoService { /** * 查询企业基础信息列表 - * + * * @param bmsEnterpriseBasicInfo 企业基础信息 * @return 企业基础信息 */ @Override public Page page(Page page, BmsEnterpriseBasicInfo bmsEnterpriseBasicInfo) { - return baseMapper.page(page,bmsEnterpriseBasicInfo); + return baseMapper.page(page, bmsEnterpriseBasicInfo); } /** @@ -48,6 +47,7 @@ public class BmsEnterpriseBasicInfoServiceImpl extends ServiceImpl workSearch(EnterpriseInfoWorkRequest enterpriseInfoWorkRequest) { return baseMapper.workSearch(enterpriseInfoWorkRequest); } + /** * 根据信用代码获取该企业id */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/BmsEnterpriseDirectoryServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/BmsEnterpriseDirectoryServiceImpl.java index ea57213..1fcfb1a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/BmsEnterpriseDirectoryServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/BmsEnterpriseDirectoryServiceImpl.java @@ -11,16 +11,16 @@ import java.util.List; /** * 企业名录Service业务层处理 - * + * * @author farben * @date 2023-08-31 */ @Service -public class BmsEnterpriseDirectoryServiceImpl extends ServiceImpl implements IBmsEnterpriseDirectoryService { +public class BmsEnterpriseDirectoryServiceImpl extends ServiceImpl implements IBmsEnterpriseDirectoryService { /** * 查询企业名录 - * + * * @param id 企业名录主键 * @return 企业名录 */ @@ -31,7 +31,7 @@ public class BmsEnterpriseDirectoryServiceImpl extends ServiceImpl implements IBmsProcessInfoService { +public class BmsProcessInfoServiceImpl extends ServiceImpl implements IBmsProcessInfoService { /** * 查询审批流程 - * + * * @param id 审批流程主键 * @return 审批流程 */ @@ -31,7 +31,7 @@ public class BmsProcessInfoServiceImpl extends ServiceImpl selectBmsTemplateInfoList(Page page, BmsTemplateInfo bmsTemplateInfo) { - return baseMapper.templateInfoList(page,bmsTemplateInfo); + return baseMapper.templateInfoList(page, bmsTemplateInfo); } /** @@ -95,7 +95,6 @@ public class BmsTemplateInfoServiceImpl extends ServiceImpl list.stream().anyMatch(entityB -> entityB.getCreditCode().equals(entityA.getCreditCode()))); - enterpriseDirectoryList.forEach(x->{ + enterpriseDirectoryList.forEach(x -> { x.setTemplateRecordId(bmsTemplateRecordUpdateDto.getId()); getDeclarationRecordsList(bmsTemplateRecordUpdateDto, drlist, x.getCreditCode(), tp.getTemplateJson()); }); @@ -194,22 +198,22 @@ public class BmsTemplateRecordServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("enterprise_directory", bmsTemplateRecordAddDto.getEnterpriseDirectory()); List isFlag = baseMapper.selectList(queryWrapper); - if(!isFlag.isEmpty()){ + if (!isFlag.isEmpty()) { throw new ServiceException("该申报任务标题已经存在"); } //如果不限时 - if(bmsTemplateRecordAddDto.getIsTime()==null){ + if (bmsTemplateRecordAddDto.getIsTime() == null) { throw new ServiceException("请选择是否限时"); - } else if(bmsTemplateRecordAddDto.getIsTime() == 1){ + } else if (bmsTemplateRecordAddDto.getIsTime() == 1) { bmsTemplateRecordAddDto.setStatus(3); - }else { + } else { //新增的时候根据当前时间判断状态是否有效 tiTimeChange.getTime(bmsTemplateRecordAddDto); } @@ -223,7 +227,7 @@ public class BmsTemplateRecordServiceImpl extends ServiceImpl 0) { enterpriseDirectoryList.forEach(x -> { - getDeclarationRecordsList(bmsTemplateRecordAddDto, drlist, x.getCreditCode(),tp.getTemplateJson()); + getDeclarationRecordsList(bmsTemplateRecordAddDto, drlist, x.getCreditCode(), tp.getTemplateJson()); x.setTemplateRecordId(bmsTemplateRecordAddDto.getId()); }); enterpriseDirectoryService.saveBatch(enterpriseDirectoryList); @@ -236,17 +240,17 @@ public class BmsTemplateRecordServiceImpl extends ServiceImpl list = enterpriseDirectoryService.lambdaQuery().eq(BmsEnterpriseDirectory::getTemplateRecordId, bmsTemplateRecordAddDto.getId()).list(); for (BmsEnterpriseDirectory x : list) { - timingRemindImpl.getContact(x.getCreditCode(),"您有1个新的申报任务[待填报]"); + timingRemindImpl.getContact(x.getCreditCode(), "您有1个新的申报任务[待填报]"); } } return num; @@ -255,7 +259,7 @@ public class BmsTemplateRecordServiceImpl extends ServiceImpl drlist, String creditCode,String json) { + private void getDeclarationRecordsList(BmsTemplateRecord bmsTemplateRecordAddDto, List drlist, String creditCode, String json) { BmsDeclarationRecords drItems = new BmsDeclarationRecords(); drItems.setProjectName(bmsTemplateRecordAddDto.getEnterpriseDirectory()); drItems.setYear(String.valueOf(Year.now().getValue())); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/CommonServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/CommonServiceImpl.java index b9f5d94..8e834d8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/CommonServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/service/impl/CommonServiceImpl.java @@ -7,7 +7,13 @@ import com.ruoyi.jjh.declaration.entity.BmsApprovalInfo; import com.ruoyi.jjh.declaration.entity.BmsEnterpriseBasicInfo; import com.ruoyi.jjh.declaration.entity.BmsEnterpriseDirectory; import com.ruoyi.jjh.declaration.entity.BmsTemplateRecord; -import com.ruoyi.jjh.declaration.service.*; +import com.ruoyi.jjh.declaration.service.IBmsApprovalInfoService; +import com.ruoyi.jjh.declaration.service.IBmsDeclarationRecordsService; +import com.ruoyi.jjh.declaration.service.IBmsEnterpriseBasicInfoService; +import com.ruoyi.jjh.declaration.service.IBmsEnterpriseDirectoryService; +import com.ruoyi.jjh.declaration.service.IBmsProcessInfoService; +import com.ruoyi.jjh.declaration.service.IBmsTemplateRecordService; +import com.ruoyi.jjh.declaration.service.ICommonService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -82,7 +88,7 @@ public class CommonServiceImpl implements ICommonService { BmsTemplateRecord templateRecord = iBmsTemplateRecordService.getById(templateRecordId); if (templateRecord.getStatus() == 0) { throw new ServiceException("该申请还未到填报时间"); - }else if(templateRecord.getStatus() == 1){ + } else if (templateRecord.getStatus() == 1) { throw new ServiceException("该申请已经过期"); } // BmsTemplateRecord templateRecord = iBmsTemplateRecordService.lambdaQuery().eq(BmsTemplateRecord::getId, templateRecordId).le(BmsTemplateRecord::getStartTime, LocalDate.now()).ge(BmsTemplateRecord::getEndTime, LocalDate.now()).one(); @@ -139,6 +145,7 @@ public class CommonServiceImpl implements ICommonService { bmsApprovalInfo.setIsReview(0); iBmsApprovalInfoService.save(bmsApprovalInfo); } + @Override @Transactional(rollbackFor = Exception.class) public void updateAuditRecord(Long declarationRecordId, Integer approvalType) { @@ -146,7 +153,6 @@ public class CommonServiceImpl implements ICommonService { } - // @Override // public int insertOpenInterfaceApplyAddDto(OpenInterfaceApplyAddDto openInterfaceApplyAddDto) { // int num = 0; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/request/UserInfoRequestDTO.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/request/UserInfoRequestDTO.java index 24579ef..69b3e47 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/request/UserInfoRequestDTO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/request/UserInfoRequestDTO.java @@ -4,6 +4,7 @@ import lombok.Data; /** * 获取用户信息请求类 + * * @author du * @since 2024/6/20 11:20 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/ChiefResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/ChiefResponse.java index 80c6b67..82af0e1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/ChiefResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/ChiefResponse.java @@ -8,6 +8,7 @@ import java.util.List; /** * 政务端用户 + * * @author du * @since 2024/6/4 11:05 */ @@ -36,7 +37,7 @@ public class ChiefResponse { private String workAddress; private String state; private String description; -// private String post; + // private String post; private String secondaryEmail; private String hasDomainAccount; private SettingsResponse settings; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/OrganizationsOtherResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/OrganizationsOtherResponse.java index 113fc29..403e144 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/OrganizationsOtherResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/OrganizationsOtherResponse.java @@ -5,6 +5,7 @@ import lombok.Data; /** * organizations其他响应类 + * * @author du * @since 2024/6/4 14:42 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/OrganizationsResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/OrganizationsResponse.java index 65e3a96..014d1ca 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/OrganizationsResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/OrganizationsResponse.java @@ -5,6 +5,7 @@ import lombok.Data; /** * organizations响应类 + * * @author du * @since 2024/6/4 14:40 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/SettingsResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/SettingsResponse.java index af3a929..bf8d139 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/SettingsResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/SettingsResponse.java @@ -5,6 +5,7 @@ import lombok.Data; /** * settings响应类 + * * @author du * @since 2024/6/4 11:07 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/ThirdUserInfoResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/ThirdUserInfoResponse.java index 80d8646..118c138 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/ThirdUserInfoResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/ThirdUserInfoResponse.java @@ -4,6 +4,7 @@ import lombok.Data; /** * 经济大脑(政务端)获取用户信息接口返回类 + * * @author du * @since 2024/6/20 13:38 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/UserResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/UserResponse.java index e5dad6e..850476d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/UserResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/dto/response/UserResponse.java @@ -66,7 +66,6 @@ public class UserResponse implements Serializable { private String token; - @ApiModelProperty(value = "企业机构代码") - private UserMainResponse main; + private UserMainResponse main; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/util/HMAC256Config.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/util/HMAC256Config.java index 4fec291..232e621 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/util/HMAC256Config.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/declaration/single/util/HMAC256Config.java @@ -10,6 +10,7 @@ import java.nio.charset.StandardCharsets; /** * 签名验证 + * * @author du * @since 2024/6/20 10:15 */ @@ -23,14 +24,15 @@ public class HMAC256Config { /** * 加解密方式 */ - private final static String ALGORITHM = "AES"; + private final static String ALGORITHM = "AES"; /** - *加密模式及填充方式 + * 加密模式及填充方式 */ private final static String PATTERN = "AES/CBC/pkcs5padding"; //AES解密 + /** * @param content 密文 * @param key aes密钥 @@ -57,7 +59,7 @@ public class HMAC256Config { return new String(bytes); } - public static byte[] HmacSHA256(String data,String key) throws Exception { + public static byte[] HmacSHA256(String data, String key) throws Exception { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); sha256_HMAC.init(secret_key); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JContactsController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JContactsController.java index cf74ece..dc59e49 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JContactsController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JContactsController.java @@ -1,6 +1,5 @@ package com.ruoyi.jjh.ent.controller; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.SecurityUtils; @@ -10,11 +9,13 @@ import com.ruoyi.jjh.ent.service.JContactsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.io.Serializable; -import java.util.Arrays; /** * 企业联系人信息(存在多个)(j_contacts)表控制层 @@ -39,7 +40,7 @@ public class JContactsController extends BaseController { @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov,ent')") @ApiOperation(value = "分页查询联络人数据", response = JContacts.class) @GetMapping - public AjaxResult selectAll( JContactsRequest jContacts) { + public AjaxResult selectAll(JContactsRequest jContacts) { // 获取当前登录用户是否是企业端 boolean admin = false; boolean b = false; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDataScreenController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDataScreenController.java index e0dd040..ecffeb6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDataScreenController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDataScreenController.java @@ -33,8 +33,10 @@ public class JDataScreenController extends BaseController { @Resource private SmsAlertsService sms; + /** * 荣誉情况 + * * @return 所有数据 */ @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @@ -46,6 +48,7 @@ public class JDataScreenController extends BaseController { /** * 项目追踪情况 + * * @return 所有数据 */ @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @@ -57,6 +60,7 @@ public class JDataScreenController extends BaseController { /** * 服务业发展总览 + * * @return 所有数据 */ @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @@ -73,6 +77,7 @@ public class JDataScreenController extends BaseController { /** * 行业纵深情况 + * * @return 所有数据 */ @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @@ -84,6 +89,7 @@ public class JDataScreenController extends BaseController { /** * 所有分行业汇总 + * * @return 所有数据 */ @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDevelopmentReportController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDevelopmentReportController.java index f3d180f..07c192c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDevelopmentReportController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDevelopmentReportController.java @@ -8,12 +8,17 @@ import com.ruoyi.jjh.ent.service.JDevelopmentReportService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * 服务业发展报告(j_template_metrics)表控制层 + * * @author du * @since 2024/7/31 15:09 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JEnterpriseContactController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JEnterpriseContactController.java index f9ee72e..7bcc456 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JEnterpriseContactController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JEnterpriseContactController.java @@ -13,15 +13,20 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.io.Serializable; import java.util.Arrays; -import java.util.Objects; /** * 企业端信息维护(j_enterprise_contact)表控制层 + * * @author du * @since 2024/5/13 9:56 */ @@ -38,10 +43,11 @@ public class JEnterpriseContactController extends BaseController { @Resource private SmsAlertsService smsAlertsService; + /** * 分页查询所有数据 * - * @param page 分页对象 + * @param page 分页对象 * @param jEnterpriseContactRequest 查询实体 * @return 所有数据 */ @@ -56,17 +62,17 @@ public class JEnterpriseContactController extends BaseController { try { admin = SecurityUtils.isAdmin(SecurityUtils.getUserId()); b = SecurityUtils.hasRole("ent"); - str =SecurityUtils.getLoginUser().getUser(); + str = SecurityUtils.getLoginUser().getUser(); } catch (Exception ignored) { } - if(!admin && b){ + if (!admin && b) { jEnterpriseContactRequest.setEnterpriseName(str.getNickName()); jEnterpriseContactRequest.setEnterpriseCode(str.getUserName()); } - if(page.getCurrent() >=1 & page.getSize() >=1){ - return success(jEnterpriseContactService.page(page, jEnterpriseContactRequest)); - }else { - return success(jEnterpriseContactService.page(jEnterpriseContactRequest)); + if (page.getCurrent() >= 1 & page.getSize() >= 1) { + return success(jEnterpriseContactService.page(page, jEnterpriseContactRequest)); + } else { + return success(jEnterpriseContactService.page(jEnterpriseContactRequest)); } } @@ -94,7 +100,7 @@ public class JEnterpriseContactController extends BaseController { @ApiOperation(value = "新增数据") @PostMapping public AjaxResult insert(@RequestBody JEnterpriseContact jEnterpriseContact) { - if(isTiming){ + if (isTiming) { smsAlertsService.addSsmPhone(jEnterpriseContact.getContactPhone()); } return success(jEnterpriseContactService.save(jEnterpriseContact)); @@ -110,7 +116,7 @@ public class JEnterpriseContactController extends BaseController { @ApiOperation(value = "修改数据") @PostMapping("/edit") public AjaxResult update(@RequestBody JEnterpriseContact jEnterpriseContact) { - if(isTiming){ + if (isTiming) { smsAlertsService.addSsmPhone(jEnterpriseContact.getContactPhone()); } return success(jEnterpriseContactService.updateById(jEnterpriseContact)); @@ -125,7 +131,7 @@ public class JEnterpriseContactController extends BaseController { @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov,ent')") @ApiOperation(value = "删除数据") @PostMapping("/{ids}") - public AjaxResult delete( @PathVariable Long[] ids) { + public AjaxResult delete(@PathVariable Long[] ids) { return success(jEnterpriseContactService.removeByIds(Arrays.asList(ids))); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JHeadQuartersRevenueController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JHeadQuartersRevenueController.java index 23358d2..b499098 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JHeadQuartersRevenueController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JHeadQuartersRevenueController.java @@ -2,7 +2,6 @@ package com.ruoyi.jjh.ent.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.R; import com.ruoyi.jjh.ent.entity.JHeadQuartersRevenue; import com.ruoyi.jjh.ent.entity.request.JHeadQuartersRevenueRequest; import com.ruoyi.jjh.ent.entity.response.JHqCountResponse; @@ -20,6 +19,7 @@ import static com.ruoyi.common.core.domain.AjaxResult.success; /** * 总部企业(j_headquarters_revenue)表控制层 + * * @author du * @since 2024/7/29 13:09 */ @@ -34,15 +34,16 @@ public class JHeadQuartersRevenueController { /** * 分页查询总部企业 + * * @param page 分页参数 - * @param js 请求参数 + * @param js 请求参数 * @return 数据 */ @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @ApiOperation(value = "分页查询总部企业", response = JHeadQuartersRevenue.class) @GetMapping public AjaxResult page(Page page, JHeadQuartersRevenueRequest js) { - return success(jHeadQuartersRevenueService.page(page,js)); + return success(jHeadQuartersRevenueService.page(page, js)); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JMemorandumController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JMemorandumController.java index c0c8b5d..5931ac8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JMemorandumController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JMemorandumController.java @@ -8,27 +8,22 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.jjh.declaration.entity.BmsEnterpriseBasicInfo; import com.ruoyi.jjh.declaration.regular.TimeChange; import com.ruoyi.jjh.ent.entity.JMemorandum; import com.ruoyi.jjh.ent.entity.request.JMemorandumRequest; import com.ruoyi.jjh.ent.service.JMemorandumService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.Serializable; -import java.util.Date; import java.util.List; /** @@ -78,8 +73,6 @@ public class JMemorandumController extends BaseController { } - - /** * 根据关联项目库ID或者企业库ID查询该ID下的备忘录 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JPolicyFileController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JPolicyFileController.java index 19ffde2..17f91de 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JPolicyFileController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JPolicyFileController.java @@ -9,13 +9,19 @@ import com.ruoyi.jjh.ent.service.JPolicyFileService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.io.Serializable; /** * 政策文件(j_policy_file)表控制层 + * * @author du * @since 2024/5/6 11:16 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JProjectController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JProjectController.java index 610bf15..c340b2b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JProjectController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JProjectController.java @@ -18,7 +18,14 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; @@ -99,8 +106,8 @@ public class JProjectController extends BaseController { @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @ApiOperation(value = "作业台查询所有项目(政务端)", response = JProject.class) @GetMapping("/selectAll") - public AjaxResult selectAll(@RequestParam String name,@RequestParam(required = false) Integer status) { - return success(jProjectService.selectAll(name,status)); + public AjaxResult selectAll(@RequestParam String name, @RequestParam(required = false) Integer status) { + return success(jProjectService.selectAll(name, status)); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JServicesListController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JServicesListController.java index 58265d3..60a4142 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JServicesListController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JServicesListController.java @@ -3,29 +3,18 @@ package com.ruoyi.jjh.ent.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.R; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.jjh.ent.entity.JContacts; -import com.ruoyi.jjh.ent.entity.JEnterpriseContact; import com.ruoyi.jjh.ent.entity.JServicesList; -import com.ruoyi.jjh.ent.entity.request.JContactsRequest; import com.ruoyi.jjh.ent.entity.request.JServicesListRequest; import com.ruoyi.jjh.ent.entity.response.JServicesListCountResponse; -import com.ruoyi.jjh.ent.service.JContactsService; import com.ruoyi.jjh.ent.service.JServicesListService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.boot.SpringBootVersion; -import org.springframework.core.SpringVersion; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import java.io.Serializable; -import java.util.List; /** * 服务业企业名单(j_services_list)表控制层 @@ -43,15 +32,16 @@ public class JServicesListController extends BaseController { /** * 分页查询服务业企业名单 + * * @param page 分页参数 - * @param js 请求体 + * @param js 请求体 * @return 分页数据 */ @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @ApiOperation(value = "分页查询服务业企业名单", response = JServicesList.class) @GetMapping public AjaxResult selectAll(Page page, JServicesListRequest js) { - return success(jServicesListService.page(page,js)); + return success(jServicesListService.page(page, js)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JSmartRemindersController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JSmartRemindersController.java index 1f664f3..e22f41f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JSmartRemindersController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JSmartRemindersController.java @@ -22,7 +22,13 @@ import io.swagger.annotations.ApiOperation; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.validation.Valid; @@ -116,7 +122,7 @@ public class JSmartRemindersController extends BaseController { if (admin) { userId = null; } - return success(jSmartDeclarationService.chiefAll(userId,projectId)); + return success(jSmartDeclarationService.chiefAll(userId, projectId)); } /** @@ -173,9 +179,9 @@ public class JSmartRemindersController extends BaseController { @ApiOperation(value = "新增定期提醒数据(政务端和企业端)") @PostMapping public AjaxResult insertDs(@RequestBody @Valid JSmartRemindersDq jSmartRemindersDq) throws SchedulerException, TaskException { - if(jSmartRemindersDq.getProjectId()!=null){ + if (jSmartRemindersDq.getProjectId() != null) { jSmartRemindersDq.setAlertType(4); - }else { + } else { jSmartRemindersDq.setAlertType(1); } return success(jSmartRemindersService.add(jSmartRemindersDq)); @@ -192,9 +198,9 @@ public class JSmartRemindersController extends BaseController { @ApiOperation(value = "修改定期提醒数据") @PostMapping("/updateDq") public AjaxResult updateDq(@RequestBody @Valid JSmartRemindersDq dq) throws SchedulerException, TaskException { - if(dq.getAlertType() == 1 || dq.getAlertType()==4){ + if (dq.getAlertType() == 1 || dq.getAlertType() == 4) { return success(jSmartRemindersService.updateDq(dq)); - }else { + } else { throw new ServiceException("请选择正确类型!"); } } @@ -209,9 +215,9 @@ public class JSmartRemindersController extends BaseController { @ApiOperation(value = "修改不定期提醒数据") @PostMapping("/updateNdq") public AjaxResult updateNdq(@RequestBody @Valid JSmartRemindersNDq ndq) { - if(ndq.getAlertType()==2 || ndq.getAlertType()==3){ + if (ndq.getAlertType() == 2 || ndq.getAlertType() == 3) { return success(jSmartRemindersService.updateNdq(ndq)); - }else { + } else { throw new ServiceException("请选择正确类型!"); } } @@ -226,13 +232,13 @@ public class JSmartRemindersController extends BaseController { @PreAuthorize("@ss.hasAnyRoles('admin,other-gov,gov')") @ApiOperation(value = "删除数据") @PostMapping("/{id}") - public AjaxResult delete( @PathVariable Long id) throws SchedulerException { + public AjaxResult delete(@PathVariable Long id) throws SchedulerException { JSmartReminders js = jSmartRemindersService.getById(id); if (js.getAlertManner() == 2) { throw new ServiceException("不定期提醒不允许删除"); } JAddJobSmart jAddJobSmart = jSmartRemindersMapper.selectJobSmart(id); - if(jAddJobSmart.getJobId()!=null){ + if (jAddJobSmart.getJobId() != null) { SysJob sysJob = new SysJob(); sysJob.setJobId(jAddJobSmart.getJobId()); jobService.deleteJob(sysJob); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/HomeRequestSmart.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/HomeRequestSmart.java index a37745e..a203e8d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/HomeRequestSmart.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/HomeRequestSmart.java @@ -1,7 +1,5 @@ package com.ruoyi.jjh.ent.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -12,6 +10,7 @@ import java.time.LocalDateTime; /** * 首页智能提醒数据返回体 + * * @author du * @since 2024/7/1 19:29 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JContacts.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JContacts.java index 32a33db..0dab92e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JContacts.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JContacts.java @@ -1,7 +1,10 @@ package com.ruoyi.jjh.ent.entity; import com.alibaba.fastjson2.annotation.JSONField; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.annotation.Excel; import com.ruoyi.jjh.common.entity.BaseInfoEntity; import io.swagger.annotations.ApiModel; @@ -10,6 +13,7 @@ import lombok.Data; /** * 企业联系人信息(存在多个)(j_contacts)表控制层 + * * @author du * @since 2024/5/13 9:49 */ @@ -28,14 +32,14 @@ public class JContacts extends BaseInfoEntity { /** * 创建id */ - @JSONField(serialize=false) + @JSONField(serialize = false) @TableField(fill = FieldFill.INSERT) private Long createId; /** * 更新id */ - @JSONField(serialize=false) + @JSONField(serialize = false) @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateId; @@ -148,8 +152,6 @@ public class JContacts extends BaseInfoEntity { private String dwTimestamp; - - /** * 来源机构 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JDevelopmentReport.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JDevelopmentReport.java index 60dda27..e0e79cb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JDevelopmentReport.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JDevelopmentReport.java @@ -10,6 +10,7 @@ import lombok.Data; /** * 服务业发展报告(j_template_metrics)表实体类 + * * @author du * @since 2024/7/31 15:13 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JEnterpriseContact.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JEnterpriseContact.java index 4a67b3a..1cb958e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JEnterpriseContact.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JEnterpriseContact.java @@ -1,7 +1,11 @@ package com.ruoyi.jjh.ent.entity; import com.alibaba.fastjson2.annotation.JSONField; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.annotation.Excel; import com.ruoyi.jjh.common.entity.BaseInfoEntity; import io.swagger.annotations.ApiModel; @@ -10,6 +14,7 @@ import lombok.Data; /** * 企业联系人(j_enterprise_contact)表实体类 + * * @author du * @since 2024/5/13 9:49 */ @@ -71,14 +76,14 @@ public class JEnterpriseContact extends BaseInfoEntity { /** * 创建id */ - @JSONField(serialize=false) + @JSONField(serialize = false) @TableField(fill = FieldFill.INSERT) private Long createId; /** * 更新id */ - @JSONField(serialize=false) + @JSONField(serialize = false) @TableField(fill = FieldFill.UPDATE) private Long updateId; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JHeadQuartersRevenue.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JHeadQuartersRevenue.java index 4016e72..492b410 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JHeadQuartersRevenue.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JHeadQuartersRevenue.java @@ -7,6 +7,7 @@ import lombok.Data; /** * 总部企业返回体 + * * @author du * @since 2024/7/29 13:01 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JMemorandum.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JMemorandum.java index 92bd8f8..59b744e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JMemorandum.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JMemorandum.java @@ -1,6 +1,10 @@ package com.ruoyi.jjh.ent.entity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModel; @@ -35,7 +39,7 @@ public class JMemorandum { /** * 分类 */ - @Excel(name = "分类",readConverterExp = "1=企业信息,2=项目") + @Excel(name = "分类", readConverterExp = "1=企业信息,2=项目") @ApiModelProperty("名字,1=企业信息库的id,2=项目库对应的id") private String type; @@ -77,7 +81,7 @@ public class JMemorandum { /** * 创建时间 */ - @Excel(name = "创建时间",dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "创建时间", dateFormat = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("创建时间") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JPolicyFile.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JPolicyFile.java index 0f4dd36..a141e59 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JPolicyFile.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JPolicyFile.java @@ -1,7 +1,11 @@ package com.ruoyi.jjh.ent.entity; import com.alibaba.fastjson2.annotation.JSONField; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import com.ruoyi.jjh.common.entity.BaseInfoEntity; @@ -14,13 +18,14 @@ import java.util.Date; /** * 政策文件(j_policy_file)表实体类 + * * @author du * @since 2024/5/6 14:15 */ @Data @ApiModel("政策文件表") @TableName(value = "j_policy_file") -public class JPolicyFile extends BaseInfoEntity { +public class JPolicyFile extends BaseInfoEntity { /** * Id @@ -53,7 +58,7 @@ public class JPolicyFile extends BaseInfoEntity { /** * 政策等级 */ - @Excel(name = "政策等级",readConverterExp = "1=国家级,2=江苏省级,3=苏州市级,4=园区本级") + @Excel(name = "政策等级", readConverterExp = "1=国家级,2=江苏省级,3=苏州市级,4=园区本级") @ApiModelProperty("政策等级 1国家级、2江苏省级、3苏州市级、4园区本级") private Integer policyLevel; @@ -77,14 +82,14 @@ public class JPolicyFile extends BaseInfoEntity { /** * 创建id */ - @JSONField(serialize=false) + @JSONField(serialize = false) @TableField(fill = FieldFill.INSERT) private Long createId; /** * 更新id */ - @JSONField(serialize=false) + @JSONField(serialize = false) @TableField(fill = FieldFill.UPDATE) private Long updateId; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JProject.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JProject.java index 82c69c6..a89ee15 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JProject.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JProject.java @@ -1,6 +1,10 @@ package com.ruoyi.jjh.ent.entity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModel; @@ -20,7 +24,7 @@ import java.util.Date; @ApiModel("项目表") @TableName(value = "j_project") @Data -public class JProject{ +public class JProject { /** * Id */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JServicesList.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JServicesList.java index 823aefe..955e460 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JServicesList.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JServicesList.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.ruoyi.common.annotation.Excel; import com.ruoyi.jjh.common.entity.BaseInfoEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -12,13 +11,14 @@ import lombok.Data; /** * 服务业企业名单(j_services_list)表实体类 + * * @author du * @since 2024/7/26 15:29 */ @Data @ApiModel("服务业企业名单") @TableName(value = "j_services_list") -public class JServicesList extends BaseInfoEntity { +public class JServicesList extends BaseInfoEntity { /** * Id diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JSmartDeclaration.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JSmartDeclaration.java index 5b5d5f3..c55c9f7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JSmartDeclaration.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JSmartDeclaration.java @@ -12,6 +12,7 @@ import java.time.LocalDateTime; /** * 企业端首页智能提醒数据返回体 + * * @author du * @since 2024/7/1 19:29 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JSmartReminders.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JSmartReminders.java index e2bd2db..ac9e74f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JSmartReminders.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JSmartReminders.java @@ -1,6 +1,10 @@ package com.ruoyi.jjh.ent.entity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.jjh.common.entity.BaseInfoEntity; import io.swagger.annotations.ApiModel; @@ -12,6 +16,7 @@ import java.time.LocalDateTime; /** * 智能提醒(j_smart_reminders)表实体类 + * * @author du * @since 2024/7/1 13:33 */ @@ -36,7 +41,7 @@ public class JSmartReminders extends BaseInfoEntity { /** * 企业名称 */ - @TableField(exist=false) + @TableField(exist = false) @ApiModelProperty("企业名称") private String qymc; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JAddJobSmart.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JAddJobSmart.java index 170d05e..75a405e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JAddJobSmart.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JAddJobSmart.java @@ -3,10 +3,9 @@ package com.ruoyi.jjh.ent.entity.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.validation.constraints.NotNull; - /** * 定时任务和定时提醒关联新增 + * * @author du * @since 2024/7/18 17:14 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JContactsRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JContactsRequest.java index 5e67c69..f1a24ad 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JContactsRequest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JContactsRequest.java @@ -1,6 +1,5 @@ package com.ruoyi.jjh.ent.entity.request; -import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -8,6 +7,7 @@ import javax.validation.constraints.NotNull; /** * 分页查询法人库-企业联络人员(统一社会信用代码) + * * @author du * @since 2024/6/28 11:18 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JEnterpriseContactRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JEnterpriseContactRequest.java index c320653..279aef0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JEnterpriseContactRequest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JEnterpriseContactRequest.java @@ -1,12 +1,12 @@ package com.ruoyi.jjh.ent.entity.request; -import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 企业联系人请求类 + * * @author du * @since 2024/5/13 10:06 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JHeadQuartersRevenueRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JHeadQuartersRevenueRequest.java index 191c727..3cffcb0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JHeadQuartersRevenueRequest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JHeadQuartersRevenueRequest.java @@ -6,6 +6,7 @@ import lombok.Data; /** * 总部企业请求体 + * * @author du * @since 2024/7/29 13:14 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JPolicyFileRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JPolicyFileRequest.java index e2670f2..324707d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JPolicyFileRequest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JPolicyFileRequest.java @@ -7,6 +7,7 @@ import lombok.Data; /** * 政策文件请求类 + * * @author du * @since 2024/5/6 14:34 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JServicesListRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JServicesListRequest.java index a0726f2..ca0faad 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JServicesListRequest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JServicesListRequest.java @@ -6,6 +6,7 @@ import lombok.Data; /** * 服务业企业名单请求体 + * * @author du * @since 2024/7/26 15:45 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JSmartRemindersDq.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JSmartRemindersDq.java index 6acabb2..45afec9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JSmartRemindersDq.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JSmartRemindersDq.java @@ -1,7 +1,5 @@ package com.ruoyi.jjh.ent.entity.request; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -14,6 +12,7 @@ import java.time.LocalDateTime; /** * 定期提醒实体类 + * * @author du * @since 2024/7/1 15:56 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JSmartRemindersNDq.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JSmartRemindersNDq.java index 120368b..ec9e27a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JSmartRemindersNDq.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/request/JSmartRemindersNDq.java @@ -1,17 +1,15 @@ package com.ruoyi.jjh.ent.entity.request; -import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; /** * 不定期提醒实体类 + * * @author du * @since 2024/7/1 15:56 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/HonorResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/HonorResponse.java index aedf8ee..e009597 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/HonorResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/HonorResponse.java @@ -6,6 +6,7 @@ import lombok.Data; /** * 荣誉情况返回体 + * * @author du * @since 2024/7/15 15:04 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JAllIndustryResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JAllIndustryResponse.java index fd277ce..f115f09 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JAllIndustryResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JAllIndustryResponse.java @@ -17,55 +17,48 @@ import java.util.Objects; @Data public class JAllIndustryResponse { - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - JAllIndustryResponse that = (JAllIndustryResponse) o; - return Objects.equals(nameType, that.nameType) && Objects.equals(children, that.children) && Objects.equals(yearRevenue, that.yearRevenue) && Objects.equals(addValue, that.addValue) && Objects.equals(growth, that.growth) && Objects.equals(gdpProportion, that.gdpProportion); - } - - @Override - public int hashCode() { - return Objects.hash(nameType, children, yearRevenue, addValue, growth, gdpProportion); - } - /** * 行业类别名称 */ @ApiModelProperty("行业类别名称") private String nameType; - /** * 子类 */ @ApiModelProperty("子类") private List children; - - /** * 全年营收(亿元) */ @ApiModelProperty("全年营收(亿元)") private String yearRevenue; - /** * 增加值(亿元) */ @ApiModelProperty("增加值(亿元)") private String addValue; - - /** * 增加值增速(按不变价) */ @ApiModelProperty("增加值增速(按不变价)%") private String growth; - /** * 增加值占GDP比重 */ @ApiModelProperty("增加值占GDP比重 %") private String gdpProportion; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + JAllIndustryResponse that = (JAllIndustryResponse) o; + return Objects.equals(nameType, that.nameType) && Objects.equals(children, that.children) && Objects.equals(yearRevenue, that.yearRevenue) && Objects.equals(addValue, that.addValue) && Objects.equals(growth, that.growth) && Objects.equals(gdpProportion, that.gdpProportion); + } + + @Override + public int hashCode() { + return Objects.hash(nameType, children, yearRevenue, addValue, growth, gdpProportion); + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JBigMiddleIndustryResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JBigMiddleIndustryResponse.java index a1401f1..8b1f118 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JBigMiddleIndustryResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JBigMiddleIndustryResponse.java @@ -6,6 +6,7 @@ import lombok.Data; /** * 行业大类中类返回实体类 + * * @author du * @since 2024/7/25 18:09 */ @@ -27,7 +28,6 @@ public class JBigMiddleIndustryResponse { private String nameType; - /** * 全年营收(亿元) */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JHqCountResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JHqCountResponse.java index e0c1c69..980979e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JHqCountResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JHqCountResponse.java @@ -6,6 +6,7 @@ import lombok.Data; /** * 总部企业分小类数量 + * * @author du * @since 2024/7/29 15:02 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JIndustryDepthResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JIndustryDepthResponse.java index 51e9801..0c21c9e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JIndustryDepthResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JIndustryDepthResponse.java @@ -6,6 +6,7 @@ import lombok.Data; /** * 行业纵深情况返回类 + * * @author du * @since 2024/7/25 14:16 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JServicesDevelopResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JServicesDevelopResponse.java index a487a1a..16e956a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JServicesDevelopResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JServicesDevelopResponse.java @@ -6,6 +6,7 @@ import lombok.Data; /** * 服务业发展总览返回类 + * * @author du * @since 2024/7/25 10:33 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JServicesListCountResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JServicesListCountResponse.java index b67846a..197aa86 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JServicesListCountResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JServicesListCountResponse.java @@ -6,6 +6,7 @@ import lombok.Data; /** * 首页服务业数据统计返回体 + * * @author du * @since 2024/7/29 9:17 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JTemplateMetricsResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JTemplateMetricsResponse.java index 237757c..ea446eb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JTemplateMetricsResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/JTemplateMetricsResponse.java @@ -6,6 +6,7 @@ import lombok.Data; /** * 模板指标自定义选择返回体 + * * @author du * @since 2024/7/31 15:28 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/ProjectTrackingResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/ProjectTrackingResponse.java index 3b39fb5..5faaa2d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/ProjectTrackingResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/response/ProjectTrackingResponse.java @@ -10,6 +10,7 @@ import java.time.LocalDate; /** * 项目追踪情况返回体 + * * @author du * @since 2024/7/16 9:15 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JContactsMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JContactsMapper.java index 08d6374..857fa78 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JContactsMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JContactsMapper.java @@ -1,21 +1,19 @@ package com.ruoyi.jjh.ent.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.jjh.ent.entity.JContacts; -import com.ruoyi.jjh.ent.entity.JEnterpriseContact; import com.ruoyi.jjh.ent.entity.request.JContactsRequest; -import com.ruoyi.jjh.ent.entity.request.JEnterpriseContactRequest; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 企业联系人信息(存在多个)(j_contacts)表控制层 + * * @author du * @since 2024/5/6 13:57 */ public interface JContactsMapper extends BaseMapper { - List page( @Param("req") JContactsRequest jContacts); + List page(@Param("req") JContactsRequest jContacts); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JDataScreenMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JDataScreenMapper.java index daa90e5..a3ac230 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JDataScreenMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JDataScreenMapper.java @@ -1,6 +1,11 @@ package com.ruoyi.jjh.ent.mapper; -import com.ruoyi.jjh.ent.entity.response.*; +import com.ruoyi.jjh.ent.entity.response.HonorResponse; +import com.ruoyi.jjh.ent.entity.response.JAllIndustryResponse; +import com.ruoyi.jjh.ent.entity.response.JBigMiddleIndustryResponse; +import com.ruoyi.jjh.ent.entity.response.JIndustryDepthResponse; +import com.ruoyi.jjh.ent.entity.response.JServicesDevelopResponse; +import com.ruoyi.jjh.ent.entity.response.ProjectTrackingResponse; import java.util.List; @@ -29,18 +34,21 @@ public interface JDataScreenMapper { /** * 服务业发展总览 + * * @return 所有数据 */ - List servicesDevelop( Integer type); + List servicesDevelop(Integer type); /** * 行业纵深情况 + * * @return 所有数据 */ List getIndustryDepth(); /** * 获取中类数据 + * * @return 所有数据 */ List getMiddleIndustry(); @@ -48,6 +56,7 @@ public interface JDataScreenMapper { /** * 获取大类数据 + * * @return 所有数据 */ List getBigIndustry(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JDevelopmentReportMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JDevelopmentReportMapper.java index ab54fb5..866332f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JDevelopmentReportMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JDevelopmentReportMapper.java @@ -8,6 +8,7 @@ import java.util.List; /** * 服务业发展报告(j_template_metrics)表数据库访问层 + * * @author du * @since 2024/7/26 15:36 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JEnterpriseContactMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JEnterpriseContactMapper.java index 9397020..b38687b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JEnterpriseContactMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JEnterpriseContactMapper.java @@ -10,6 +10,7 @@ import java.util.List; /** * 企业联系人(j_enterprise_contact)表数据层 + * * @author du * @since 2024/5/6 13:57 */ @@ -19,11 +20,11 @@ public interface JEnterpriseContactMapper extends BaseMapper /** * 分页查询所有数据 * - * @param page 分页对象 + * @param page 分页对象 * @param jEnterpriseContactRequest 查询实体 * @return 所有数据 */ - Page page(Page page,@Param("req") JEnterpriseContactRequest jEnterpriseContactRequest); + Page page(Page page, @Param("req") JEnterpriseContactRequest jEnterpriseContactRequest); /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JHeadQuartersRevenueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JHeadQuartersRevenueMapper.java index 731ece6..5a39a30 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JHeadQuartersRevenueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JHeadQuartersRevenueMapper.java @@ -3,17 +3,13 @@ package com.ruoyi.jjh.ent.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.jjh.ent.entity.JHeadQuartersRevenue; -import com.ruoyi.jjh.ent.entity.JServicesList; import com.ruoyi.jjh.ent.entity.request.JHeadQuartersRevenueRequest; -import com.ruoyi.jjh.ent.entity.request.JServicesListRequest; import com.ruoyi.jjh.ent.entity.response.JHqCountResponse; -import com.ruoyi.jjh.ent.entity.response.JServicesListCountResponse; import org.apache.ibatis.annotations.Param; -import java.util.List; - /** * 总部企业(j_headquarters_revenue)表数据库访问层 + * * @author du * @since 2024/7/26 15:36 */ @@ -22,8 +18,9 @@ public interface JHeadQuartersRevenueMapper extends BaseMapper page(Page page, @Param("req") JHeadQuartersRevenueRequest js); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JMemorandumMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JMemorandumMapper.java index 53bc305..ce9592b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JMemorandumMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JMemorandumMapper.java @@ -19,13 +19,14 @@ public interface JMemorandumMapper extends BaseMapper { /** * 分页查询所有数据 * - * @param page 分页对象 + * @param page 分页对象 * @param jMemorandumRequest 查询实体 * @return 所有数据 */ Page page(Page page, @Param("req") JMemorandumRequest jMemorandumRequest); List page(@Param("req") JMemorandumRequest jMemorandumRequest); + /** * 根据关联项目库ID查询该ID下的备忘录 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JPolicyFileMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JPolicyFileMapper.java index 59f81ba..625c02e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JPolicyFileMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JPolicyFileMapper.java @@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Param; /** * 政策文件(j_policy_file)表数据层 + * * @author du * @since 2024/5/6 13:57 */ @@ -16,9 +17,9 @@ public interface JPolicyFileMapper extends BaseMapper { /** * 分页查询所有数据 * - * @param page 分页对象 + * @param page 分页对象 * @param jPolicyFileRequest 查询实体 * @return 所有数据 */ - Page page(Page page,@Param("req") JPolicyFileRequest jPolicyFileRequest); + Page page(Page page, @Param("req") JPolicyFileRequest jPolicyFileRequest); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JProjectMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JProjectMapper.java index 5850167..85f2dfd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JProjectMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JProjectMapper.java @@ -24,7 +24,7 @@ public interface JProjectMapper extends BaseMapper { * @param jProject 查询实体 * @return 所有数据 */ - Page page(Page page,@Param("req") JProject jProject); + Page page(Page page, @Param("req") JProject jProject); List page(@Param("req") JProject jProject); @@ -37,8 +37,7 @@ public interface JProjectMapper extends BaseMapper { List getApprovalInfoList(@Param("id") Serializable id); - - List selectAll(@Param("name") String name,@Param("status") Integer status); + List selectAll(@Param("name") String name, @Param("status") Integer status); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JServicesListMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JServicesListMapper.java index 82b1e6f..1ceaf3e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JServicesListMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JServicesListMapper.java @@ -2,9 +2,7 @@ package com.ruoyi.jjh.ent.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.jjh.ent.entity.JContacts; import com.ruoyi.jjh.ent.entity.JServicesList; -import com.ruoyi.jjh.ent.entity.request.JContactsRequest; import com.ruoyi.jjh.ent.entity.request.JServicesListRequest; import com.ruoyi.jjh.ent.entity.response.JServicesListCountResponse; import org.apache.ibatis.annotations.Param; @@ -13,6 +11,7 @@ import java.util.List; /** * 服务业企业名单(j_services_list)表数据库访问层 + * * @author du * @since 2024/7/26 15:36 */ @@ -20,11 +19,12 @@ public interface JServicesListMapper extends BaseMapper { /** * 分页查询服务业企业名单 + * * @param page 分页参数 - * @param js 请求体 + * @param js 请求体 * @return 分页数据 */ - Page page(Page page,@Param("req") JServicesListRequest js); + Page page(Page page, @Param("req") JServicesListRequest js); /** * 首页服务业数据统计 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JSmartDeclarationMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JSmartDeclarationMapper.java index d481dea..111a98c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JSmartDeclarationMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JSmartDeclarationMapper.java @@ -27,6 +27,6 @@ public interface JSmartDeclarationMapper extends BaseMapper { * * @return 所有数据 */ - List chiefAll(@Param("userId") Long userId,@Param("projectId") Long projectId); + List chiefAll(@Param("userId") Long userId, @Param("projectId") Long projectId); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JSmartRemindersMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JSmartRemindersMapper.java index 11a1888..35a8bea 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JSmartRemindersMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/mapper/JSmartRemindersMapper.java @@ -7,7 +7,6 @@ import com.ruoyi.jjh.ent.entity.request.JAddJobSmart; import org.apache.ibatis.annotations.Param; import java.io.Serializable; -import java.util.List; /** * 智能提醒(j_smart_reminders)表数据访问层 @@ -20,14 +19,13 @@ public interface JSmartRemindersMapper extends BaseMapper { /** * 分页查询所有数据 * - * @param page 分页对象 + * @param page 分页对象 * @param jSmartReminders 查询实体 * @return 所有数据 */ Page page(Page page, @Param("req") JSmartReminders jSmartReminders); - /** * 通过主键查询单条智能提醒规则数据 * @@ -39,7 +37,7 @@ public interface JSmartRemindersMapper extends BaseMapper { /** * 新增定时任务和定时提醒关联 */ - void addJobSmart(@Param("req") JAddJobSmart s); + void addJobSmart(@Param("req") JAddJobSmart s); /** * 查询单条定时任务和定时提醒关联数据 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JContactsService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JContactsService.java index 6552661..663ba84 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JContactsService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JContactsService.java @@ -1,6 +1,5 @@ package com.ruoyi.jjh.ent.service; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.jjh.ent.entity.JContacts; import com.ruoyi.jjh.ent.entity.request.JContactsRequest; @@ -9,6 +8,7 @@ import java.util.List; /** * 企业联系人信息(存在多个)(j_contacts)表控制层 + * * @author du * @since 2024/5/13 9:58 */ @@ -20,5 +20,5 @@ public interface JContactsService extends IService { * @param jContacts 查询实体 * @return 所有数据 */ - List page( JContactsRequest jContacts); + List page(JContactsRequest jContacts); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JDataScreenService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JDataScreenService.java index 3bf6d16..e104df4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JDataScreenService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JDataScreenService.java @@ -1,11 +1,16 @@ package com.ruoyi.jjh.ent.service; -import com.ruoyi.jjh.ent.entity.response.*; +import com.ruoyi.jjh.ent.entity.response.HonorResponse; +import com.ruoyi.jjh.ent.entity.response.JAllIndustryResponse; +import com.ruoyi.jjh.ent.entity.response.JIndustryDepthResponse; +import com.ruoyi.jjh.ent.entity.response.JServicesDevelopResponse; +import com.ruoyi.jjh.ent.entity.response.ProjectTrackingResponse; import java.util.List; /** * 数据大屏业务层 + * * @author du * @since 2024/5/13 9:58 */ @@ -13,12 +18,14 @@ public interface JDataScreenService { /** * 荣誉情况 + * * @return 所有数据 */ List getHonor(); /** * 项目追踪情况 + * * @return 所有数据 */ List getProjectTracking(); @@ -26,12 +33,14 @@ public interface JDataScreenService { /** * 服务业发展总览 + * * @return 所有数据 */ List servicesDevelop(Integer type); /** * 行业纵深情况 + * * @return 所有数据 */ List getIndustryDepth(); @@ -39,6 +48,7 @@ public interface JDataScreenService { /** * 所有分行业汇总 + * * @return 所有数据 */ List getAllIndustry(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JDevelopmentReportService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JDevelopmentReportService.java index cdab6bb..95f4bf2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JDevelopmentReportService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JDevelopmentReportService.java @@ -8,6 +8,7 @@ import java.util.List; /** * 服务业发展报告(j_template_metrics)表业务层 + * * @author du * @since 2024/7/31 15:16 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JEnterpriseContactService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JEnterpriseContactService.java index 322e144..dc528e5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JEnterpriseContactService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JEnterpriseContactService.java @@ -3,14 +3,13 @@ package com.ruoyi.jjh.ent.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.jjh.ent.entity.JEnterpriseContact; -import com.ruoyi.jjh.ent.entity.JPolicyFile; import com.ruoyi.jjh.ent.entity.request.JEnterpriseContactRequest; -import com.ruoyi.jjh.ent.entity.request.JPolicyFileRequest; import java.util.List; /** * 企业联系人(j_enterprise_contact)表业务层 + * * @author du * @since 2024/5/13 9:58 */ @@ -19,7 +18,7 @@ public interface JEnterpriseContactService extends IService /** * 分页查询所有数据 * - * @param page 分页对象 + * @param page 分页对象 * @param jEnterpriseContactRequest 查询实体 * @return 所有数据 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JHeadQuartersRevenueService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JHeadQuartersRevenueService.java index b18514b..2d97a3f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JHeadQuartersRevenueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JHeadQuartersRevenueService.java @@ -3,13 +3,12 @@ package com.ruoyi.jjh.ent.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.jjh.ent.entity.JHeadQuartersRevenue; -import com.ruoyi.jjh.ent.entity.JServicesList; import com.ruoyi.jjh.ent.entity.request.JHeadQuartersRevenueRequest; -import com.ruoyi.jjh.ent.entity.request.JServicesListRequest; import com.ruoyi.jjh.ent.entity.response.JHqCountResponse; /** * 总部企业(j_headquarters_revenue)表业务层 + * * @author du * @since 2024/7/29 13:11 */ @@ -17,8 +16,9 @@ public interface JHeadQuartersRevenueService extends IService page(Page page, JHeadQuartersRevenueRequest js); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JMemorandumService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JMemorandumService.java index 551b17d..1584635 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JMemorandumService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JMemorandumService.java @@ -18,13 +18,14 @@ public interface JMemorandumService extends IService { /** * 分页查询所有数据 * - * @param page 分页对象 + * @param page 分页对象 * @param jMemorandumRequest 查询实体 * @return 所有数据 */ Page page(Page page, JMemorandumRequest jMemorandumRequest); - List page( JMemorandumRequest jMemorandumRequest); + List page(JMemorandumRequest jMemorandumRequest); + /** * 根据关联项目库ID查询该ID下的备忘录 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JPolicyFileService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JPolicyFileService.java index d132f1b..867b1b0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JPolicyFileService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JPolicyFileService.java @@ -2,13 +2,12 @@ package com.ruoyi.jjh.ent.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import com.ruoyi.jjh.ent.entity.JMemorandum; import com.ruoyi.jjh.ent.entity.JPolicyFile; -import com.ruoyi.jjh.ent.entity.JProject; import com.ruoyi.jjh.ent.entity.request.JPolicyFileRequest; /** * 政策文件(j_policy_file)表业务层 + * * @author du * @since 2024/5/6 14:10 */ @@ -17,7 +16,7 @@ public interface JPolicyFileService extends IService { /** * 分页查询所有数据 * - * @param page 分页对象 + * @param page 分页对象 * @param jPolicyFileRequest 查询实体 * @return 所有数据 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JProjectService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JProjectService.java index 6287bb2..e79efa0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JProjectService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JProjectService.java @@ -35,21 +35,18 @@ public interface JProjectService extends IService { List getApprovalInfoList(Serializable id); - - - - /** * 作业台查询所有项目 * * @param jProject 查询实体 * @return 所有数据 */ - List selectAll(String jProject,Integer status); + List selectAll(String jProject, Integer status); /** * 改变没有信用代码的项目 + * * @return */ String changeTyshxydm(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JServicesListService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JServicesListService.java index adae9cb..3207beb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JServicesListService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JServicesListService.java @@ -2,7 +2,6 @@ package com.ruoyi.jjh.ent.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import com.ruoyi.jjh.ent.entity.JProject; import com.ruoyi.jjh.ent.entity.JServicesList; import com.ruoyi.jjh.ent.entity.request.JServicesListRequest; import com.ruoyi.jjh.ent.entity.response.JServicesListCountResponse; @@ -11,6 +10,7 @@ import java.util.List; /** * 服务业企业名单(j_services_list)表业务层 + * * @author du * @since 2024/7/26 15:35 */ @@ -18,8 +18,9 @@ public interface JServicesListService extends IService { /** * 分页查询服务业企业名单 + * * @param page 分页参数 - * @param js 请求体 + * @param js 请求体 * @return 分页数据 */ Page page(Page page, JServicesListRequest js); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JSmartDeclarationService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JSmartDeclarationService.java index 74d0985..af2bd3e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JSmartDeclarationService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JSmartDeclarationService.java @@ -9,6 +9,7 @@ import java.util.List; /** * 智能提醒关联表(j_smart_declaration)表业务层 + * * @author du * @since 2024/7/1 13:33 */ @@ -27,6 +28,6 @@ public interface JSmartDeclarationService extends IService { * * @return 所有数据 */ - List chiefAll(Long userId,Long projectId); + List chiefAll(Long userId, Long projectId); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JSmartRemindersService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JSmartRemindersService.java index ec94dbb..02be64a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JSmartRemindersService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/JSmartRemindersService.java @@ -14,6 +14,7 @@ import java.time.LocalDateTime; /** * 智能提醒(j_smart_reminders)表业务层 + * * @author du * @since 2024/7/1 13:33 */ @@ -21,7 +22,7 @@ public interface JSmartRemindersService extends IService { /** * 分页查询所有数据 * - * @param page 分页对象 + * @param page 分页对象 * @param jSmartReminders 查询实体 * @return 所有数据 */ @@ -37,6 +38,7 @@ public interface JSmartRemindersService extends IService { /** * 生成cron表达式 + * * @return cron表达式 */ String generateCron(LocalDateTime time); @@ -44,7 +46,7 @@ public interface JSmartRemindersService extends IService { /** * 修改或者新增定时任务 */ - void updateAndAdd(JSmartReminders s,Boolean a) throws SchedulerException, TaskException; + void updateAndAdd(JSmartReminders s, Boolean a) throws SchedulerException, TaskException; /** * 修改定期提醒数据 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/SmsAlertsService.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/SmsAlertsService.java index cb0b367..9810952 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/SmsAlertsService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/SmsAlertsService.java @@ -4,6 +4,7 @@ import java.util.HashMap; /** * 短信提醒业务层 + * * @author du * @since 2024/7/16 13:27 */ @@ -11,20 +12,23 @@ public interface SmsAlertsService { /** * 生成短信接口统一的请求头 + * * @return 请求头 */ HashMap getMap(); /** * 发送短信 + * * @param param1 * @param param2 * @return */ - String enterSms(String param1,String param2,String numbers); + String enterSms(String param1, String param2, String numbers); /** * 短信接收人号码新增 + * * @return 所有数据 */ String addSsmPhone(String nums); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JContactsImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JContactsImpl.java index 6d7979f..737adf3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JContactsImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JContactsImpl.java @@ -1,21 +1,17 @@ package com.ruoyi.jjh.ent.service.impl; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.jjh.ent.entity.JContacts; -import com.ruoyi.jjh.ent.entity.JEnterpriseContact; import com.ruoyi.jjh.ent.entity.request.JContactsRequest; -import com.ruoyi.jjh.ent.entity.request.JEnterpriseContactRequest; import com.ruoyi.jjh.ent.mapper.JContactsMapper; -import com.ruoyi.jjh.ent.mapper.JEnterpriseContactMapper; import com.ruoyi.jjh.ent.service.JContactsService; -import com.ruoyi.jjh.ent.service.JEnterpriseContactService; import org.springframework.stereotype.Service; import java.util.List; /** * 企业联系人信息(存在多个)(j_contacts)表控制层 + * * @author du * @since 2024/5/13 9:58 */ @@ -29,7 +25,7 @@ public class JContactsImpl extends ServiceImpl imple * @return 所有数据 */ @Override - public List page( JContactsRequest jContacts) { + public List page(JContactsRequest jContacts) { return baseMapper.page(jContacts); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JDataScreenImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JDataScreenImpl.java index bb9ed6a..854defe 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JDataScreenImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JDataScreenImpl.java @@ -4,7 +4,12 @@ import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.jjh.declaration.service.IBmsEnterpriseBasicInfoService; import com.ruoyi.jjh.ent.entity.JProject; -import com.ruoyi.jjh.ent.entity.response.*; +import com.ruoyi.jjh.ent.entity.response.HonorResponse; +import com.ruoyi.jjh.ent.entity.response.JAllIndustryResponse; +import com.ruoyi.jjh.ent.entity.response.JBigMiddleIndustryResponse; +import com.ruoyi.jjh.ent.entity.response.JIndustryDepthResponse; +import com.ruoyi.jjh.ent.entity.response.JServicesDevelopResponse; +import com.ruoyi.jjh.ent.entity.response.ProjectTrackingResponse; import com.ruoyi.jjh.ent.mapper.JDataScreenMapper; import com.ruoyi.jjh.ent.service.JContactsService; import com.ruoyi.jjh.ent.service.JDataScreenService; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JDevelopmentReportServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JDevelopmentReportServiceImpl.java index ac2a2f7..608816b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JDevelopmentReportServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JDevelopmentReportServiceImpl.java @@ -11,6 +11,7 @@ import java.util.List; /** * 服务业发展报告(j_template_metrics)表业务实现层 + * * @author du * @since 2024/7/31 15:19 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JEnterpriseContactImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JEnterpriseContactImpl.java index 40071c9..3e096fa 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JEnterpriseContactImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JEnterpriseContactImpl.java @@ -12,6 +12,7 @@ import java.util.List; /** * 企业联系人(j_enterprise_contact)表业务处理层 + * * @author du * @since 2024/5/13 9:58 */ @@ -21,7 +22,7 @@ public class JEnterpriseContactImpl extends ServiceImpl page(JEnterpriseContactRequest jEnterpriseContactRequest) { - return baseMapper.page(jEnterpriseContactRequest); + return baseMapper.page(jEnterpriseContactRequest); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JHeadQuartersRevenueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JHeadQuartersRevenueServiceImpl.java index 054dc35..0561032 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JHeadQuartersRevenueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JHeadQuartersRevenueServiceImpl.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Service; /** * 总部企业(j_headquarters_revenue)表业务实现层 + * * @author du * @since 2024/7/29 13:11 */ @@ -19,13 +20,14 @@ public class JHeadQuartersRevenueServiceImpl extends ServiceImpl page(Page page, JHeadQuartersRevenueRequest js) { - return baseMapper.page(page,js); + return baseMapper.page(page, js); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JMemorandumServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JMemorandumServiceImpl.java index f848ec5..0f47334 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JMemorandumServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JMemorandumServiceImpl.java @@ -2,9 +2,9 @@ package com.ruoyi.jjh.ent.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.jjh.ent.entity.JMemorandum; import com.ruoyi.jjh.ent.entity.request.JMemorandumRequest; import com.ruoyi.jjh.ent.mapper.JMemorandumMapper; -import com.ruoyi.jjh.ent.entity.JMemorandum; import com.ruoyi.jjh.ent.service.JMemorandumService; import org.springframework.stereotype.Service; @@ -22,13 +22,13 @@ public class JMemorandumServiceImpl extends ServiceImpl page(Page page, JMemorandumRequest jMemorandumRequest) { - return baseMapper.page(page,jMemorandumRequest); + return baseMapper.page(page, jMemorandumRequest); } @Override diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JPolicyFileServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JPolicyFileServiceImpl.java index 74f6cbf..5cf44d6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JPolicyFileServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JPolicyFileServiceImpl.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Service; /** * 政策文件(j_policy_file)表业务处理层 + * * @author du * @since 2024/5/6 14:12 */ @@ -19,12 +20,12 @@ public class JPolicyFileServiceImpl extends ServiceImpl page(Page page, JPolicyFileRequest jPolicyFileRequest) { - return baseMapper.page(page,jPolicyFileRequest); + return baseMapper.page(page, jPolicyFileRequest); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JProjectServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JProjectServiceImpl.java index 4170d05..fa7869f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JProjectServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JProjectServiceImpl.java @@ -35,6 +35,7 @@ public class JProjectServiceImpl extends ServiceImpl i @Resource private IBmsEnterpriseBasicInfoService iBmsEnterpriseBasicInfoService; + /** * 分页查询所有数据 * @@ -44,7 +45,7 @@ public class JProjectServiceImpl extends ServiceImpl i */ @Override public Page page(Page page, JProject jProject) { - return baseMapper.page(page,jProject); + return baseMapper.page(page, jProject); } /** @@ -59,17 +60,15 @@ public class JProjectServiceImpl extends ServiceImpl i } - - @Override - public List selectAll(String jProject,Integer status) { - return baseMapper.selectAll(jProject,status); + public List selectAll(String jProject, Integer status) { + return baseMapper.selectAll(jProject, status); } - /** * 改变没有信用代码的项目 + * * @return */ @Override @@ -77,11 +76,11 @@ public class JProjectServiceImpl extends ServiceImpl i List listE = iBmsEnterpriseBasicInfoService.list(); //获取项目库信用代码为空的企业 QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("credit_code",""); - List listJ= this.list(queryWrapper); - listJ.forEach(x->{ - listE.forEach(y->{ - if (x.getDeclareUnit().equals(y.getQymc())){ + queryWrapper.eq("credit_code", ""); + List listJ = this.list(queryWrapper); + listJ.forEach(x -> { + listE.forEach(y -> { + if (x.getDeclareUnit().equals(y.getQymc())) { JProject jp = new JProject(); jp.setId(x.getId()); jp.setCreditCode(y.getTyshxydm()); @@ -101,8 +100,8 @@ public class JProjectServiceImpl extends ServiceImpl i public String changeKh() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like("declare_unit", "("); - List listJ= this.list(queryWrapper); - listJ.forEach(x->{ + List listJ = this.list(queryWrapper); + listJ.forEach(x -> { String declareUnit = x.getDeclareUnit(); // 将英文括号替换为中文括号 String result = declareUnit.replaceAll("\\(", "(") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JServicesListServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JServicesListServiceImpl.java index 438f8b6..4433a37 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JServicesListServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JServicesListServiceImpl.java @@ -13,6 +13,7 @@ import java.util.List; /** * 服务业企业名单(j_services_list)表业务实现层 + * * @author du * @since 2024/7/26 15:36 */ @@ -21,13 +22,14 @@ public class JServicesListServiceImpl extends ServiceImpl page(Page page, JServicesListRequest js) { - return baseMapper.page(page,js); + return baseMapper.page(page, js); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JSmartDeclarationServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JSmartDeclarationServiceImpl.java index 0d03402..7347515 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JSmartDeclarationServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JSmartDeclarationServiceImpl.java @@ -34,8 +34,8 @@ public class JSmartDeclarationServiceImpl extends ServiceImpl chiefAll(Long userId,Long projectId) { - return baseMapper.chiefAll(userId,projectId); + public List chiefAll(Long userId, Long projectId) { + return baseMapper.chiefAll(userId, projectId); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JSmartRemindersServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JSmartRemindersServiceImpl.java index 842c9cd..f47878a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JSmartRemindersServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/JSmartRemindersServiceImpl.java @@ -22,7 +22,6 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.Serializable; -import java.time.LocalDate; import java.time.LocalDateTime; /** @@ -42,6 +41,7 @@ public class JSmartRemindersServiceImpl extends ServiceImpl selectWorkAll() { - //获取企业的不定时提醒 + //获取企业的不定时提醒 // 企业端 // JSmartReminders qy = getById(1); // String userName = null; @@ -189,7 +188,7 @@ public class JSmartRemindersServiceImpl extends ServiceImpl bmsDeclarationRecords = bmsDeclarationRecordsService.allNoLimited(userName); // //如果当前时间在该申报模板的结束时间前自定义的提前天数之前,就去掉 // bmsDeclarationRecords.removeIf(x -> LocalDateTime.now().isBefore(x.getEndTime().minusDays(qy.getDaysAdvance()))); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/SmsAlertsServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/SmsAlertsServiceImpl.java index d89a518..7d41e1e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/SmsAlertsServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/service/impl/SmsAlertsServiceImpl.java @@ -17,6 +17,7 @@ import java.util.Map; /** * 短信提醒业务处理层 + * * @author du * @since 2024/7/16 13:26 */ @@ -47,6 +48,7 @@ public class SmsAlertsServiceImpl implements SmsAlertsService { /** * 生成短信统一的请求头 + * * @return 请求头 */ @Override @@ -57,7 +59,7 @@ public class SmsAlertsServiceImpl implements SmsAlertsService { //请求头 HashMap headers = new HashMap<>();//存放请求头,可以存放多个请求头 headers.put("x-tif-paasid", paaSID); - headers.put("x-tif-signature", sha256.digestHex(timestamp+smsToken+str+timestamp).toUpperCase()); + headers.put("x-tif-signature", sha256.digestHex(timestamp + smsToken + str + timestamp).toUpperCase()); headers.put("x-tif-timestamp", timestamp); headers.put("x-tif-nonce", str); return headers; @@ -65,17 +67,18 @@ public class SmsAlertsServiceImpl implements SmsAlertsService { /** * 发送短信 + * * @param param1 * @param param2 * @return */ @Override - public String enterSms(String param1,String param2,String numbers) { + public String enterSms(String param1, String param2, String numbers) { JSONObject jsonObject = new JSONObject();//存放参数 //请求体 JSONObject params = new JSONObject();//存放参数 - params.set("param1",param1); - params.set("param2",param2); + params.set("param1", param1); + params.set("param2", param2); jsonObject.set("type", paramType); jsonObject.set("empowerCode", smsV); jsonObject.set("numbers", numbers); @@ -91,11 +94,12 @@ public class SmsAlertsServiceImpl implements SmsAlertsService { /** * 短信接收人号码新增 + * * @return 所有数据 */ @Override public String addSsmPhone(String nums) { - Map js1 = new HashMap<>();//存放参数 + Map js1 = new HashMap<>();//存放参数 js1.put("orderId", code); js1.put("nums", nums); HttpResponse response = HttpRequest.post(smsPhoneAdd) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java index d2d6e8c..8baf680 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java @@ -1,15 +1,5 @@ package com.ruoyi.web.controller.common; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.util.concurrent.TimeUnit; -import javax.annotation.Resource; -import javax.imageio.ImageIO; -import javax.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.FastByteArrayOutputStream; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; import com.google.code.kaptcha.Producer; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.CacheConstants; @@ -19,15 +9,25 @@ import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.sign.Base64; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.system.service.ISysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.FastByteArrayOutputStream; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.concurrent.TimeUnit; /** * 验证码操作处理 - * + * * @author ruoyi */ @RestController -public class CaptchaController -{ +public class CaptchaController { @Resource(name = "captchaProducer") private Producer captchaProducer; @@ -36,20 +36,19 @@ public class CaptchaController @Autowired private RedisCache redisCache; - + @Autowired private ISysConfigService configService; + /** * 生成验证码 */ @GetMapping("/captchaImage") - public AjaxResult getCode(HttpServletResponse response) throws IOException - { + public AjaxResult getCode(HttpServletResponse response) throws IOException { AjaxResult ajax = AjaxResult.success(); boolean captchaEnabled = configService.selectCaptchaEnabled(); ajax.put("captchaEnabled", captchaEnabled); - if (!captchaEnabled) - { + if (!captchaEnabled) { return ajax; } @@ -62,15 +61,12 @@ public class CaptchaController // 生成验证码 String captchaType = RuoYiConfig.getCaptchaType(); - if ("math".equals(captchaType)) - { + if ("math".equals(captchaType)) { String capText = captchaProducerMath.createText(); capStr = capText.substring(0, capText.lastIndexOf("@")); code = capText.substring(capText.lastIndexOf("@") + 1); image = captchaProducerMath.createImage(capStr); - } - else if ("char".equals(captchaType)) - { + } else if ("char".equals(captchaType)) { capStr = code = captchaProducer.createText(); image = captchaProducer.createImage(capStr); } @@ -78,12 +74,9 @@ public class CaptchaController redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); // 转换流信息写出 FastByteArrayOutputStream os = new FastByteArrayOutputStream(); - try - { + try { ImageIO.write(image, "jpg", os); - } - catch (IOException e) - { + } catch (IOException e) { return AjaxResult.error(e.getMessage()); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java index 9b0d08a..7bd2e7f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -1,5 +1,19 @@ package com.ruoyi.web.controller.monitor; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.domain.SysCache; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -7,29 +21,19 @@ import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisCallback; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; -import com.ruoyi.common.constant.CacheConstants; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.domain.SysCache; /** * 缓存监控 - * + * * @author ruoyi */ @RestController @RequestMapping("/monitor/cache") -public class CacheController -{ +public class CacheController { + private final static List caches = new ArrayList(); @Autowired private RedisTemplate redisTemplate; - private final static List caches = new ArrayList(); { caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息")); caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息")); @@ -42,8 +46,7 @@ public class CacheController @PreAuthorize("@ss.hasPermi('monitor:cache:list')") @GetMapping() - public AjaxResult getInfo() throws Exception - { + public AjaxResult getInfo() throws Exception { Properties info = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info()); Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); Object dbSize = redisTemplate.execute((RedisCallback) connection -> connection.dbSize()); @@ -66,23 +69,20 @@ public class CacheController @PreAuthorize("@ss.hasPermi('monitor:cache:list')") @GetMapping("/getNames") - public AjaxResult cache() - { + public AjaxResult cache() { return AjaxResult.success(caches); } @PreAuthorize("@ss.hasPermi('monitor:cache:list')") @GetMapping("/getKeys/{cacheName}") - public AjaxResult getCacheKeys(@PathVariable String cacheName) - { + public AjaxResult getCacheKeys(@PathVariable String cacheName) { Set cacheKeys = redisTemplate.keys(cacheName + "*"); return AjaxResult.success(cacheKeys); } @PreAuthorize("@ss.hasPermi('monitor:cache:list')") @GetMapping("/getValue/{cacheName}/{cacheKey}") - public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) - { + public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) { String cacheValue = redisTemplate.opsForValue().get(cacheKey); SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue); return AjaxResult.success(sysCache); @@ -90,8 +90,7 @@ public class CacheController @PreAuthorize("@ss.hasPermi('monitor:cache:list')") @PostMapping("/clearCacheName/{cacheName}") - public AjaxResult clearCacheName(@PathVariable String cacheName) - { + public AjaxResult clearCacheName(@PathVariable String cacheName) { Collection cacheKeys = redisTemplate.keys(cacheName + "*"); redisTemplate.delete(cacheKeys); return AjaxResult.success(); @@ -99,16 +98,14 @@ public class CacheController @PreAuthorize("@ss.hasPermi('monitor:cache:list')") @PostMapping("/clearCacheKey/{cacheKey}") - public AjaxResult clearCacheKey(@PathVariable String cacheKey) - { + public AjaxResult clearCacheKey(@PathVariable String cacheKey) { redisTemplate.delete(cacheKey); return AjaxResult.success(); } @PreAuthorize("@ss.hasPermi('monitor:cache:list')") @PostMapping("/clearCacheAll") - public AjaxResult clearCacheAll() - { + public AjaxResult clearCacheAll() { Collection cacheKeys = redisTemplate.keys("*"); redisTemplate.delete(cacheKeys); return AjaxResult.success(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java index cc805ad..89ee27d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java @@ -1,25 +1,23 @@ package com.ruoyi.web.controller.monitor; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.framework.web.domain.Server; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.framework.web.domain.Server; /** * 服务器监控 - * + * * @author ruoyi */ @RestController @RequestMapping("/monitor/server") -public class ServerController -{ +public class ServerController { @PreAuthorize("@ss.hasPermi('monitor:server:list')") @GetMapping() - public AjaxResult getInfo() throws Exception - { + public AjaxResult getInfo() throws Exception { Server server = new Server(); server.copyTo(); return AjaxResult.success(server); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java index 2911590..5d88915 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java @@ -1,15 +1,5 @@ package com.ruoyi.web.controller.monitor; -import java.util.List; -import javax.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -19,16 +9,25 @@ import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.service.SysPasswordService; import com.ruoyi.system.domain.SysLogininfor; import com.ruoyi.system.service.ISysLogininforService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; /** * 系统访问记录 - * + * * @author ruoyi */ @RestController @RequestMapping("/monitor/logininfor") -public class SysLogininforController extends BaseController -{ +public class SysLogininforController extends BaseController { @Autowired private ISysLogininforService logininforService; @@ -37,8 +36,7 @@ public class SysLogininforController extends BaseController @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") @GetMapping("/list") - public TableDataInfo list(SysLogininfor logininfor) - { + public TableDataInfo list(SysLogininfor logininfor) { startPage(); List list = logininforService.selectLogininforList(logininfor); return getDataTable(list); @@ -47,8 +45,7 @@ public class SysLogininforController extends BaseController @Log(title = "登录日志", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") @PostMapping("/export") - public void export(HttpServletResponse response, SysLogininfor logininfor) - { + public void export(HttpServletResponse response, SysLogininfor logininfor) { List list = logininforService.selectLogininforList(logininfor); ExcelUtil util = new ExcelUtil(SysLogininfor.class); util.exportExcel(response, list, "登录日志"); @@ -57,16 +54,14 @@ public class SysLogininforController extends BaseController @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") @Log(title = "登录日志", businessType = BusinessType.DELETE) @PostMapping("/{infoIds}") - public AjaxResult remove(@PathVariable Long[] infoIds) - { + public AjaxResult remove(@PathVariable Long[] infoIds) { return toAjax(logininforService.deleteLogininforByIds(infoIds)); } @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") @Log(title = "登录日志", businessType = BusinessType.CLEAN) @PostMapping("/clean") - public AjaxResult clean() - { + public AjaxResult clean() { logininforService.cleanLogininfor(); return success(); } @@ -74,8 +69,7 @@ public class SysLogininforController extends BaseController @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')") @Log(title = "账户解锁", businessType = BusinessType.OTHER) @GetMapping("/unlock/{userName}") - public AjaxResult unlock(@PathVariable("userName") String userName) - { + public AjaxResult unlock(@PathVariable("userName") String userName) { passwordService.clearLoginRecordCache(userName); return success(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java index c1cb564..607fef2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -1,15 +1,5 @@ package com.ruoyi.web.controller.monitor; -import java.util.List; -import javax.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -18,23 +8,31 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysOperLog; import com.ruoyi.system.service.ISysOperLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; /** * 操作日志记录 - * + * * @author ruoyi */ @RestController @RequestMapping("/monitor/operlog") -public class SysOperlogController extends BaseController -{ +public class SysOperlogController extends BaseController { @Autowired private ISysOperLogService operLogService; @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") @GetMapping("/list") - public TableDataInfo list(SysOperLog operLog) - { + public TableDataInfo list(SysOperLog operLog) { startPage(); List list = operLogService.selectOperLogList(operLog); return getDataTable(list); @@ -43,8 +41,7 @@ public class SysOperlogController extends BaseController @Log(title = "操作日志", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") @PostMapping("/export") - public void export(HttpServletResponse response, SysOperLog operLog) - { + public void export(HttpServletResponse response, SysOperLog operLog) { List list = operLogService.selectOperLogList(operLog); ExcelUtil util = new ExcelUtil(SysOperLog.class); util.exportExcel(response, list, "操作日志"); @@ -53,16 +50,14 @@ public class SysOperlogController extends BaseController @Log(title = "操作日志", businessType = BusinessType.DELETE) @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") @PostMapping("/{operIds}") - public AjaxResult remove(@PathVariable Long[] operIds) - { + public AjaxResult remove(@PathVariable Long[] operIds) { return toAjax(operLogService.deleteOperLogByIds(operIds)); } @Log(title = "操作日志", businessType = BusinessType.CLEAN) @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") @PostMapping("/clean") - public AjaxResult clean() - { + public AjaxResult clean() { operLogService.cleanOperLog(); return success(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java index 11d359a..737b01a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java @@ -1,12 +1,5 @@ package com.ruoyi.web.controller.monitor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.controller.BaseController; @@ -18,16 +11,27 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysUserOnline; import com.ruoyi.system.service.ISysUserOnlineService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; /** * 在线用户监控 - * + * * @author ruoyi */ @RestController @RequestMapping("/monitor/online") -public class SysUserOnlineController extends BaseController -{ +public class SysUserOnlineController extends BaseController { @Autowired private ISysUserOnlineService userOnlineService; @@ -36,27 +40,18 @@ public class SysUserOnlineController extends BaseController @PreAuthorize("@ss.hasPermi('monitor:online:list')") @GetMapping("/list") - public TableDataInfo list(String ipaddr, String userName) - { + public TableDataInfo list(String ipaddr, String userName) { Collection keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); List userOnlineList = new ArrayList(); - for (String key : keys) - { + for (String key : keys) { LoginUser user = redisCache.getCacheObject(key); - if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) - { + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); - } - else if (StringUtils.isNotEmpty(ipaddr)) - { + } else if (StringUtils.isNotEmpty(ipaddr)) { userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); - } - else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) - { + } else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) { userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); - } - else - { + } else { userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); } } @@ -71,8 +66,7 @@ public class SysUserOnlineController extends BaseController @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") @Log(title = "在线用户", businessType = BusinessType.FORCE) @PostMapping("/{tokenId}") - public AjaxResult forceLogout(@PathVariable String tokenId) - { + public AjaxResult forceLogout(@PathVariable String tokenId) { redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId); return success(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java index 1252887..d9bd7cf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java @@ -1,36 +1,34 @@ package com.ruoyi.web.controller.system; -import java.util.List; -import javax.servlet.http.HttpServletResponse; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.SysConfig; +import com.ruoyi.system.service.ISysConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.system.domain.SysConfig; -import com.ruoyi.system.service.ISysConfigService; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; /** * 参数配置 信息操作处理 - * + * * @author ruoyi */ @RestController @RequestMapping("/system/config") -public class SysConfigController extends BaseController -{ +public class SysConfigController extends BaseController { @Autowired private ISysConfigService configService; @@ -39,8 +37,7 @@ public class SysConfigController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:config:list')") @GetMapping("/list") - public TableDataInfo list(SysConfig config) - { + public TableDataInfo list(SysConfig config) { startPage(); List list = configService.selectConfigList(config); return getDataTable(list); @@ -49,8 +46,7 @@ public class SysConfigController extends BaseController @Log(title = "参数管理", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:config:export')") @PostMapping("/export") - public void export(HttpServletResponse response, SysConfig config) - { + public void export(HttpServletResponse response, SysConfig config) { List list = configService.selectConfigList(config); ExcelUtil util = new ExcelUtil(SysConfig.class); util.exportExcel(response, list, "参数数据"); @@ -61,8 +57,7 @@ public class SysConfigController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:config:query')") @GetMapping(value = "/{configId}") - public AjaxResult getInfo(@PathVariable Long configId) - { + public AjaxResult getInfo(@PathVariable Long configId) { return success(configService.selectConfigById(configId)); } @@ -70,8 +65,7 @@ public class SysConfigController extends BaseController * 根据参数键名查询参数值 */ @GetMapping(value = "/configKey/{configKey}") - public AjaxResult getConfigKey(@PathVariable String configKey) - { + public AjaxResult getConfigKey(@PathVariable String configKey) { return success(configService.selectConfigByKey(configKey)); } @@ -81,10 +75,8 @@ public class SysConfigController extends BaseController @PreAuthorize("@ss.hasPermi('system:config:add')") @Log(title = "参数管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysConfig config) - { - if (!configService.checkConfigKeyUnique(config)) - { + public AjaxResult add(@Validated @RequestBody SysConfig config) { + if (!configService.checkConfigKeyUnique(config)) { return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); } config.setCreateBy(getUsername()); @@ -97,10 +89,8 @@ public class SysConfigController extends BaseController @PreAuthorize("@ss.hasPermi('system:config:edit')") @Log(title = "参数管理", businessType = BusinessType.UPDATE) @PostMapping("/edit") - public AjaxResult edit(@Validated @RequestBody SysConfig config) - { - if (!configService.checkConfigKeyUnique(config)) - { + public AjaxResult edit(@Validated @RequestBody SysConfig config) { + if (!configService.checkConfigKeyUnique(config)) { return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); } config.setUpdateBy(getUsername()); @@ -113,8 +103,7 @@ public class SysConfigController extends BaseController @PreAuthorize("@ss.hasPermi('system:config:remove')") @Log(title = "参数管理", businessType = BusinessType.DELETE) @PostMapping("/{configIds}") - public AjaxResult remove(@PathVariable Long[] configIds) - { + public AjaxResult remove(@PathVariable Long[] configIds) { configService.deleteConfigByIds(configIds); return success(); } @@ -125,8 +114,7 @@ public class SysConfigController extends BaseController @PreAuthorize("@ss.hasPermi('system:config:remove')") @Log(title = "参数管理", businessType = BusinessType.CLEAN) @PostMapping("/refreshCache") - public AjaxResult refreshCache() - { + public AjaxResult refreshCache() { configService.resetConfigCache(); return success(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index 323e8bf..62e0d21 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -1,36 +1,34 @@ package com.ruoyi.web.controller.system; -import java.util.List; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysDeptService; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.constant.UserConstants; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.entity.SysDept; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.service.ISysDeptService; + +import java.util.List; /** * 部门信息 - * + * * @author ruoyi */ @RestController @RequestMapping("/system/dept") -public class SysDeptController extends BaseController -{ +public class SysDeptController extends BaseController { @Autowired private ISysDeptService deptService; @@ -39,8 +37,7 @@ public class SysDeptController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:dept:list')") @GetMapping("/list") - public AjaxResult list(SysDept dept) - { + public AjaxResult list(SysDept dept) { List depts = deptService.selectDeptList(dept); return success(depts); } @@ -50,8 +47,7 @@ public class SysDeptController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:dept:list')") @GetMapping("/list/exclude/{deptId}") - public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) - { + public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { List depts = deptService.selectDeptList(new SysDept()); depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); return success(depts); @@ -62,8 +58,7 @@ public class SysDeptController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:dept:query')") @GetMapping(value = "/{deptId}") - public AjaxResult getInfo(@PathVariable Long deptId) - { + public AjaxResult getInfo(@PathVariable Long deptId) { deptService.checkDeptDataScope(deptId); return success(deptService.selectDeptById(deptId)); } @@ -74,10 +69,8 @@ public class SysDeptController extends BaseController @PreAuthorize("@ss.hasPermi('system:dept:add')") @Log(title = "部门管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysDept dept) - { - if (!deptService.checkDeptNameUnique(dept)) - { + public AjaxResult add(@Validated @RequestBody SysDept dept) { + if (!deptService.checkDeptNameUnique(dept)) { return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); } dept.setCreateBy(getUsername()); @@ -90,20 +83,14 @@ public class SysDeptController extends BaseController @PreAuthorize("@ss.hasPermi('system:dept:edit')") @Log(title = "部门管理", businessType = BusinessType.UPDATE) @PostMapping("/edit") - public AjaxResult edit(@Validated @RequestBody SysDept dept) - { + public AjaxResult edit(@Validated @RequestBody SysDept dept) { Long deptId = dept.getDeptId(); deptService.checkDeptDataScope(deptId); - if (!deptService.checkDeptNameUnique(dept)) - { + if (!deptService.checkDeptNameUnique(dept)) { return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); - } - else if (dept.getParentId().equals(deptId)) - { + } else if (dept.getParentId().equals(deptId)) { return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); - } - else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) - { + } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) { return error("该部门包含未停用的子部门!"); } dept.setUpdateBy(getUsername()); @@ -116,14 +103,11 @@ public class SysDeptController extends BaseController @PreAuthorize("@ss.hasPermi('system:dept:remove')") @Log(title = "部门管理", businessType = BusinessType.DELETE) @PostMapping("/{deptId}") - public AjaxResult remove(@PathVariable Long deptId) - { - if (deptService.hasChildByDeptId(deptId)) - { + public AjaxResult remove(@PathVariable Long deptId) { + if (deptService.hasChildByDeptId(deptId)) { return warn("存在下级部门,不允许删除"); } - if (deptService.checkDeptExistUser(deptId)) - { + if (deptService.checkDeptExistUser(deptId)) { return warn("部门存在用户,不允许删除"); } deptService.checkDeptDataScope(deptId); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java index 0ace00b..10358be 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java @@ -13,7 +13,12 @@ import com.ruoyi.system.service.ISysDictTypeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java index 0a07009..d95471e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java @@ -1,43 +1,40 @@ package com.ruoyi.web.controller.system; -import java.util.List; -import javax.servlet.http.HttpServletResponse; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDictType; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.service.ISysDictTypeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.entity.SysDictType; -import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.system.service.ISysDictTypeService; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; /** * 数据字典信息 - * + * * @author ruoyi */ @RestController @RequestMapping("/system/dict/type") -public class SysDictTypeController extends BaseController -{ +public class SysDictTypeController extends BaseController { @Autowired private ISysDictTypeService dictTypeService; @PreAuthorize("@ss.hasPermi('system:dict:list')") @GetMapping("/list") - public TableDataInfo list(SysDictType dictType) - { + public TableDataInfo list(SysDictType dictType) { startPage(); List list = dictTypeService.selectDictTypeList(dictType); return getDataTable(list); @@ -46,8 +43,7 @@ public class SysDictTypeController extends BaseController @Log(title = "字典类型", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:dict:export')") @PostMapping("/export") - public void export(HttpServletResponse response, SysDictType dictType) - { + public void export(HttpServletResponse response, SysDictType dictType) { List list = dictTypeService.selectDictTypeList(dictType); ExcelUtil util = new ExcelUtil(SysDictType.class); util.exportExcel(response, list, "字典类型"); @@ -58,8 +54,7 @@ public class SysDictTypeController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:dict:query')") @GetMapping(value = "/{dictId}") - public AjaxResult getInfo(@PathVariable Long dictId) - { + public AjaxResult getInfo(@PathVariable Long dictId) { return success(dictTypeService.selectDictTypeById(dictId)); } @@ -69,10 +64,8 @@ public class SysDictTypeController extends BaseController @PreAuthorize("@ss.hasPermi('system:dict:add')") @Log(title = "字典类型", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysDictType dict) - { - if (!dictTypeService.checkDictTypeUnique(dict)) - { + public AjaxResult add(@Validated @RequestBody SysDictType dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); } dict.setCreateBy(getUsername()); @@ -85,10 +78,8 @@ public class SysDictTypeController extends BaseController @PreAuthorize("@ss.hasPermi('system:dict:edit')") @Log(title = "字典类型", businessType = BusinessType.UPDATE) @PostMapping("/edit") - public AjaxResult edit(@Validated @RequestBody SysDictType dict) - { - if (!dictTypeService.checkDictTypeUnique(dict)) - { + public AjaxResult edit(@Validated @RequestBody SysDictType dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); } dict.setUpdateBy(getUsername()); @@ -101,8 +92,7 @@ public class SysDictTypeController extends BaseController @PreAuthorize("@ss.hasPermi('system:dict:remove')") @Log(title = "字典类型", businessType = BusinessType.DELETE) @PostMapping("/{dictIds}") - public AjaxResult remove(@PathVariable Long[] dictIds) - { + public AjaxResult remove(@PathVariable Long[] dictIds) { dictTypeService.deleteDictTypeByIds(dictIds); return success(); } @@ -113,8 +103,7 @@ public class SysDictTypeController extends BaseController @PreAuthorize("@ss.hasPermi('system:dict:remove')") @Log(title = "字典类型", businessType = BusinessType.CLEAN) @PostMapping("/refreshCache") - public AjaxResult refreshCache() - { + public AjaxResult refreshCache() { dictTypeService.resetDictCache(); return success(); } @@ -123,8 +112,7 @@ public class SysDictTypeController extends BaseController * 获取字典选择框列表 */ @GetMapping("/optionselect") - public AjaxResult optionselect() - { + public AjaxResult optionselect() { List dictTypes = dictTypeService.selectDictTypeAll(); return success(dictTypes); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java index c41dad6..660c37c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java @@ -1,19 +1,12 @@ package com.ruoyi.web.controller.system; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.utils.StringUtils; - /** * 首页 * * @author ruoyi */ //@RestController -public class SysIndexController -{ +public class SysIndexController { // /** 系统基础配置 */ // @Autowired // private RuoYiConfig ruoyiConfig; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 09cd0ca..58f53b0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -1,39 +1,36 @@ package com.ruoyi.web.controller.system; -import java.util.List; -import java.util.Map; -import java.util.Set; - +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginBody; import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.web.service.SysLoginService; +import com.ruoyi.framework.web.service.SysPermissionService; import com.ruoyi.framework.web.service.TokenService; +import com.ruoyi.system.service.ISysMenuService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.entity.SysMenu; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.LoginBody; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.framework.web.service.SysLoginService; -import com.ruoyi.framework.web.service.SysPermissionService; -import com.ruoyi.system.service.ISysMenuService; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * 登录验证 - * + * * @author ruoyi */ @RestController -public class SysLoginController -{ +public class SysLoginController { @Autowired private SysLoginService loginService; @@ -48,25 +45,24 @@ public class SysLoginController /** * 登录方法 - * + * * @param loginBody 登录信息 * @return 结果 */ @PostMapping("/login") - public R login(@RequestBody LoginBody loginBody) { + public R login(@RequestBody LoginBody loginBody) { Map login = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), - loginBody.getUuid(),loginBody.getUserType()); + loginBody.getUuid(), loginBody.getUserType()); return R.ok(login); } /** * 获取用户信息 - * + * * @return 用户信息 */ @GetMapping("/system/user/getInfo") - public AjaxResult getInfo() - { + public AjaxResult getInfo() { SysUser user = SecurityUtils.getLoginUser().getUser(); // 角色集合 Set roles = permissionService.getRolePermission(user); @@ -81,12 +77,11 @@ public class SysLoginController /** * 获取路由信息 - * + * * @return 路由信息 */ @GetMapping("/system/menu/getRouters") - public AjaxResult getRouters() - { + public AjaxResult getRouters() { Long userId = SecurityUtils.getUserId(); List menus = menuService.selectMenuTreeByUserId(userId); return AjaxResult.success(menuService.buildMenus(menus)); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java index 9c183c0..a40863d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java @@ -1,35 +1,33 @@ package com.ruoyi.web.controller.system; -import java.util.List; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysMenuService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.constant.UserConstants; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.entity.SysMenu; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.service.ISysMenuService; + +import java.util.List; /** * 菜单信息 - * + * * @author ruoyi */ @RestController @RequestMapping("/system/menu") -public class SysMenuController extends BaseController -{ +public class SysMenuController extends BaseController { @Autowired private ISysMenuService menuService; @@ -38,8 +36,7 @@ public class SysMenuController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:menu:list')") @GetMapping("/list") - public AjaxResult list(SysMenu menu) - { + public AjaxResult list(SysMenu menu) { List menus = menuService.selectMenuList(menu, getUserId()); return success(menus); } @@ -49,8 +46,7 @@ public class SysMenuController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:menu:query')") @GetMapping(value = "/{menuId}") - public AjaxResult getInfo(@PathVariable Long menuId) - { + public AjaxResult getInfo(@PathVariable Long menuId) { return success(menuService.selectMenuById(menuId)); } @@ -58,8 +54,7 @@ public class SysMenuController extends BaseController * 获取菜单下拉树列表 */ @GetMapping("/treeselect") - public AjaxResult treeselect(SysMenu menu) - { + public AjaxResult treeselect(SysMenu menu) { List menus = menuService.selectMenuList(menu, getUserId()); return success(menuService.buildMenuTreeSelect(menus)); } @@ -68,8 +63,7 @@ public class SysMenuController extends BaseController * 加载对应角色菜单列表树 */ @GetMapping(value = "/roleMenuTreeselect/{roleId}") - public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) - { + public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) { List menus = menuService.selectMenuList(getUserId()); AjaxResult ajax = AjaxResult.success(); ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); @@ -83,14 +77,10 @@ public class SysMenuController extends BaseController @PreAuthorize("@ss.hasPermi('system:menu:add')") @Log(title = "菜单管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysMenu menu) - { - if (!menuService.checkMenuNameUnique(menu)) - { + public AjaxResult add(@Validated @RequestBody SysMenu menu) { + if (!menuService.checkMenuNameUnique(menu)) { return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); - } - else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) - { + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); } menu.setCreateBy(getUsername()); @@ -103,18 +93,12 @@ public class SysMenuController extends BaseController @PreAuthorize("@ss.hasPermi('system:menu:edit')") @Log(title = "菜单管理", businessType = BusinessType.UPDATE) @PostMapping("/edit") - public AjaxResult edit(@Validated @RequestBody SysMenu menu) - { - if (!menuService.checkMenuNameUnique(menu)) - { + public AjaxResult edit(@Validated @RequestBody SysMenu menu) { + if (!menuService.checkMenuNameUnique(menu)) { return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); - } - else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) - { + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); - } - else if (menu.getMenuId().equals(menu.getParentId())) - { + } else if (menu.getMenuId().equals(menu.getParentId())) { return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); } menu.setUpdateBy(getUsername()); @@ -127,14 +111,11 @@ public class SysMenuController extends BaseController @PreAuthorize("@ss.hasPermi('system:menu:remove')") @Log(title = "菜单管理", businessType = BusinessType.DELETE) @PostMapping("/{menuId}") - public AjaxResult remove(@PathVariable("menuId") Long menuId) - { - if (menuService.hasChildByMenuId(menuId)) - { + public AjaxResult remove(@PathVariable("menuId") Long menuId) { + if (menuService.hasChildByMenuId(menuId)) { return warn("存在子菜单,不允许删除"); } - if (menuService.checkMenuExistRole(menuId)) - { + if (menuService.checkMenuExistRole(menuId)) { return warn("菜单已分配,不允许删除"); } return toAjax(menuService.deleteMenuById(menuId)); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java index c5eb7d6..bc7fc05 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java @@ -1,34 +1,32 @@ package com.ruoyi.web.controller.system; -import java.util.List; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.system.domain.SysNotice; +import com.ruoyi.system.service.ISysNoticeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.system.domain.SysNotice; -import com.ruoyi.system.service.ISysNoticeService; + +import java.util.List; /** * 公告 信息操作处理 - * + * * @author ruoyi */ @RestController @RequestMapping("/system/notice") -public class SysNoticeController extends BaseController -{ +public class SysNoticeController extends BaseController { @Autowired private ISysNoticeService noticeService; @@ -37,8 +35,7 @@ public class SysNoticeController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:notice:list')") @GetMapping("/list") - public TableDataInfo list(SysNotice notice) - { + public TableDataInfo list(SysNotice notice) { startPage(); List list = noticeService.selectNoticeList(notice); return getDataTable(list); @@ -49,8 +46,7 @@ public class SysNoticeController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:notice:query')") @GetMapping(value = "/{noticeId}") - public AjaxResult getInfo(@PathVariable Long noticeId) - { + public AjaxResult getInfo(@PathVariable Long noticeId) { return success(noticeService.selectNoticeById(noticeId)); } @@ -60,8 +56,7 @@ public class SysNoticeController extends BaseController @PreAuthorize("@ss.hasPermi('system:notice:add')") @Log(title = "通知公告", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysNotice notice) - { + public AjaxResult add(@Validated @RequestBody SysNotice notice) { notice.setCreateBy(getUsername()); return toAjax(noticeService.insertNotice(notice)); } @@ -72,8 +67,7 @@ public class SysNoticeController extends BaseController @PreAuthorize("@ss.hasPermi('system:notice:edit')") @Log(title = "通知公告", businessType = BusinessType.UPDATE) @PostMapping("/edit") - public AjaxResult edit(@Validated @RequestBody SysNotice notice) - { + public AjaxResult edit(@Validated @RequestBody SysNotice notice) { notice.setUpdateBy(getUsername()); return toAjax(noticeService.updateNotice(notice)); } @@ -84,8 +78,7 @@ public class SysNoticeController extends BaseController @PreAuthorize("@ss.hasPermi('system:notice:remove')") @Log(title = "通知公告", businessType = BusinessType.DELETE) @PostMapping("/{noticeIds}") - public AjaxResult remove(@PathVariable Long[] noticeIds) - { + public AjaxResult remove(@PathVariable Long[] noticeIds) { return toAjax(noticeService.deleteNoticeByIds(noticeIds)); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java index 36f6b0c..723f887 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java @@ -1,36 +1,34 @@ package com.ruoyi.web.controller.system; -import java.util.List; -import javax.servlet.http.HttpServletResponse; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.SysPost; +import com.ruoyi.system.service.ISysPostService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.system.domain.SysPost; -import com.ruoyi.system.service.ISysPostService; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; /** * 岗位信息操作处理 - * + * * @author ruoyi */ @RestController @RequestMapping("/system/post") -public class SysPostController extends BaseController -{ +public class SysPostController extends BaseController { @Autowired private ISysPostService postService; @@ -39,18 +37,16 @@ public class SysPostController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:post:list')") @GetMapping("/list") - public TableDataInfo list(SysPost post) - { + public TableDataInfo list(SysPost post) { startPage(); List list = postService.selectPostList(post); return getDataTable(list); } - + @Log(title = "岗位管理", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:post:export')") @PostMapping("/export") - public void export(HttpServletResponse response, SysPost post) - { + public void export(HttpServletResponse response, SysPost post) { List list = postService.selectPostList(post); ExcelUtil util = new ExcelUtil(SysPost.class); util.exportExcel(response, list, "岗位数据"); @@ -61,8 +57,7 @@ public class SysPostController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:post:query')") @GetMapping(value = "/{postId}") - public AjaxResult getInfo(@PathVariable Long postId) - { + public AjaxResult getInfo(@PathVariable Long postId) { return success(postService.selectPostById(postId)); } @@ -72,14 +67,10 @@ public class SysPostController extends BaseController @PreAuthorize("@ss.hasPermi('system:post:add')") @Log(title = "岗位管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysPost post) - { - if (!postService.checkPostNameUnique(post)) - { + public AjaxResult add(@Validated @RequestBody SysPost post) { + if (!postService.checkPostNameUnique(post)) { return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); - } - else if (!postService.checkPostCodeUnique(post)) - { + } else if (!postService.checkPostCodeUnique(post)) { return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); } post.setCreateBy(getUsername()); @@ -92,14 +83,10 @@ public class SysPostController extends BaseController @PreAuthorize("@ss.hasPermi('system:post:edit')") @Log(title = "岗位管理", businessType = BusinessType.UPDATE) @PostMapping("/edit") - public AjaxResult edit(@Validated @RequestBody SysPost post) - { - if (!postService.checkPostNameUnique(post)) - { + public AjaxResult edit(@Validated @RequestBody SysPost post) { + if (!postService.checkPostNameUnique(post)) { return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); - } - else if (!postService.checkPostCodeUnique(post)) - { + } else if (!postService.checkPostCodeUnique(post)) { return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); } post.setUpdateBy(getUsername()); @@ -112,8 +99,7 @@ public class SysPostController extends BaseController @PreAuthorize("@ss.hasPermi('system:post:remove')") @Log(title = "岗位管理", businessType = BusinessType.DELETE) @PostMapping("/{postIds}") - public AjaxResult remove(@PathVariable Long[] postIds) - { + public AjaxResult remove(@PathVariable Long[] postIds) { return toAjax(postService.deletePostByIds(postIds)); } @@ -121,8 +107,7 @@ public class SysPostController extends BaseController * 获取岗位选择框列表 */ @GetMapping("/optionselect") - public AjaxResult optionselect() - { + public AjaxResult optionselect() { List posts = postService.selectPostAll(); return success(posts); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java index 480476a..479bc53 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -1,14 +1,5 @@ package com.ruoyi.web.controller.system; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.controller.BaseController; @@ -22,16 +13,23 @@ import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.MimeTypeUtils; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; /** * 个人信息 业务处理 - * + * * @author ruoyi */ @RestController @RequestMapping("/system/user/profile") -public class SysProfileController extends BaseController -{ +public class SysProfileController extends BaseController { @Autowired private ISysUserService userService; @@ -42,8 +40,7 @@ public class SysProfileController extends BaseController * 个人信息 */ @GetMapping - public AjaxResult profile() - { + public AjaxResult profile() { LoginUser loginUser = getLoginUser(); SysUser user = loginUser.getUser(); AjaxResult ajax = AjaxResult.success(user); @@ -57,24 +54,20 @@ public class SysProfileController extends BaseController */ @Log(title = "个人信息", businessType = BusinessType.UPDATE) @PostMapping("/edit") - public AjaxResult updateProfile(@RequestBody SysUser user) - { + public AjaxResult updateProfile(@RequestBody SysUser user) { LoginUser loginUser = getLoginUser(); SysUser currentUser = loginUser.getUser(); currentUser.setNickName(user.getNickName()); currentUser.setEmail(user.getEmail()); currentUser.setPhonenumber(user.getPhonenumber()); currentUser.setSex(user.getSex()); - if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser)) - { + if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser)) { return error("修改用户'" + loginUser.getUsername() + "'失败,手机号码已存在"); } - if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser)) - { + if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser)) { return error("修改用户'" + loginUser.getUsername() + "'失败,邮箱账号已存在"); } - if (userService.updateUserProfile(currentUser) > 0) - { + if (userService.updateUserProfile(currentUser) > 0) { // 更新缓存用户信息 tokenService.setLoginUser(loginUser); return success(); @@ -87,22 +80,18 @@ public class SysProfileController extends BaseController */ @Log(title = "个人信息", businessType = BusinessType.UPDATE) @PostMapping("/updatePwd") - public AjaxResult updatePwd(String oldPassword, String newPassword) - { + public AjaxResult updatePwd(String oldPassword, String newPassword) { LoginUser loginUser = getLoginUser(); String userName = loginUser.getUsername(); String password = loginUser.getPassword(); - if (!SecurityUtils.matchesPassword(oldPassword, password)) - { + if (!SecurityUtils.matchesPassword(oldPassword, password)) { return error("修改密码失败,旧密码错误"); } - if (SecurityUtils.matchesPassword(newPassword, password)) - { + if (SecurityUtils.matchesPassword(newPassword, password)) { return error("新密码不能与旧密码相同"); } newPassword = SecurityUtils.encryptPassword(newPassword); - if (userService.resetUserPwd(userName, newPassword) > 0) - { + if (userService.resetUserPwd(userName, newPassword) > 0) { // 更新缓存用户密码 loginUser.getUser().setPassword(newPassword); tokenService.setLoginUser(loginUser); @@ -116,14 +105,11 @@ public class SysProfileController extends BaseController */ @Log(title = "用户头像", businessType = BusinessType.UPDATE) @PostMapping("/avatar") - public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception - { - if (!file.isEmpty()) - { + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception { + if (!file.isEmpty()) { LoginUser loginUser = getLoginUser(); String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION); - if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) - { + if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) { AjaxResult ajax = AjaxResult.success(); ajax.put("imgUrl", avatar); // 更新缓存用户头像 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java index fe19249..916c954 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java @@ -1,24 +1,23 @@ package com.ruoyi.web.controller.system; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.model.RegisterBody; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.web.service.SysRegisterService; import com.ruoyi.system.service.ISysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; /** * 注册验证 - * + * * @author ruoyi */ @RestController -public class SysRegisterController extends BaseController -{ +public class SysRegisterController extends BaseController { @Autowired private SysRegisterService registerService; @@ -26,10 +25,8 @@ public class SysRegisterController extends BaseController private ISysConfigService configService; @PostMapping("/register") - public AjaxResult register(@RequestBody RegisterBody user) - { - if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) - { + public AjaxResult register(@RequestBody RegisterBody user) { + if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) { return error("当前系统没有开启注册功能!"); } String msg = registerService.register(user); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java index 4c091ba..2325a2f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -1,18 +1,5 @@ package com.ruoyi.web.controller.system; -import java.util.List; -import javax.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -30,16 +17,27 @@ import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; /** * 角色信息 - * + * * @author ruoyi */ @RestController @RequestMapping("/system/role") -public class SysRoleController extends BaseController -{ +public class SysRoleController extends BaseController { @Autowired private ISysRoleService roleService; @@ -57,8 +55,7 @@ public class SysRoleController extends BaseController @PreAuthorize("@ss.hasPermi('system:role:list')") @GetMapping("/list") - public TableDataInfo list(SysRole role) - { + public TableDataInfo list(SysRole role) { startPage(); List list = roleService.selectRoleList(role); return getDataTable(list); @@ -67,8 +64,7 @@ public class SysRoleController extends BaseController @Log(title = "角色管理", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:role:export')") @PostMapping("/export") - public void export(HttpServletResponse response, SysRole role) - { + public void export(HttpServletResponse response, SysRole role) { List list = roleService.selectRoleList(role); ExcelUtil util = new ExcelUtil(SysRole.class); util.exportExcel(response, list, "角色数据"); @@ -79,8 +75,7 @@ public class SysRoleController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:role:query')") @GetMapping(value = "/{roleId}") - public AjaxResult getInfo(@PathVariable Long roleId) - { + public AjaxResult getInfo(@PathVariable Long roleId) { roleService.checkRoleDataScope(roleId); return success(roleService.selectRoleById(roleId)); } @@ -91,14 +86,10 @@ public class SysRoleController extends BaseController @PreAuthorize("@ss.hasPermi('system:role:add')") @Log(title = "角色管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysRole role) - { - if (!roleService.checkRoleNameUnique(role)) - { + public AjaxResult add(@Validated @RequestBody SysRole role) { + if (!roleService.checkRoleNameUnique(role)) { return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); - } - else if (!roleService.checkRoleKeyUnique(role)) - { + } else if (!roleService.checkRoleKeyUnique(role)) { return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); } role.setCreateBy(getUsername()); @@ -112,26 +103,20 @@ public class SysRoleController extends BaseController @PreAuthorize("@ss.hasPermi('system:role:edit')") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PostMapping("/edit") - public AjaxResult edit(@Validated @RequestBody SysRole role) - { + public AjaxResult edit(@Validated @RequestBody SysRole role) { roleService.checkRoleAllowed(role); roleService.checkRoleDataScope(role.getRoleId()); - if (!roleService.checkRoleNameUnique(role)) - { + if (!roleService.checkRoleNameUnique(role)) { return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); - } - else if (!roleService.checkRoleKeyUnique(role)) - { + } else if (!roleService.checkRoleKeyUnique(role)) { return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); } role.setUpdateBy(getUsername()); - - if (roleService.updateRole(role) > 0) - { + + if (roleService.updateRole(role) > 0) { // 更新缓存用户权限 LoginUser loginUser = getLoginUser(); - if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) - { + if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) { loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser())); loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName())); tokenService.setLoginUser(loginUser); @@ -147,8 +132,7 @@ public class SysRoleController extends BaseController @PreAuthorize("@ss.hasPermi('system:role:edit')") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PostMapping("/dataScope") - public AjaxResult dataScope(@RequestBody SysRole role) - { + public AjaxResult dataScope(@RequestBody SysRole role) { roleService.checkRoleAllowed(role); roleService.checkRoleDataScope(role.getRoleId()); return toAjax(roleService.authDataScope(role)); @@ -160,8 +144,7 @@ public class SysRoleController extends BaseController @PreAuthorize("@ss.hasPermi('system:role:edit')") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PostMapping("/changeStatus") - public AjaxResult changeStatus(@RequestBody SysRole role) - { + public AjaxResult changeStatus(@RequestBody SysRole role) { roleService.checkRoleAllowed(role); roleService.checkRoleDataScope(role.getRoleId()); role.setUpdateBy(getUsername()); @@ -174,8 +157,7 @@ public class SysRoleController extends BaseController @PreAuthorize("@ss.hasPermi('system:role:remove')") @Log(title = "角色管理", businessType = BusinessType.DELETE) @PostMapping("/{roleIds}") - public AjaxResult remove(@PathVariable Long[] roleIds) - { + public AjaxResult remove(@PathVariable Long[] roleIds) { return toAjax(roleService.deleteRoleByIds(roleIds)); } @@ -184,8 +166,7 @@ public class SysRoleController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:role:query')") @GetMapping("/optionselect") - public AjaxResult optionselect() - { + public AjaxResult optionselect() { return success(roleService.selectRoleAll()); } @@ -194,8 +175,7 @@ public class SysRoleController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:role:list')") @GetMapping("/authUser/allocatedList") - public TableDataInfo allocatedList(SysUser user) - { + public TableDataInfo allocatedList(SysUser user) { startPage(); List list = userService.selectAllocatedList(user); return getDataTable(list); @@ -206,8 +186,7 @@ public class SysRoleController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:role:list')") @GetMapping("/authUser/unallocatedList") - public TableDataInfo unallocatedList(SysUser user) - { + public TableDataInfo unallocatedList(SysUser user) { startPage(); List list = userService.selectUnallocatedList(user); return getDataTable(list); @@ -219,8 +198,7 @@ public class SysRoleController extends BaseController @PreAuthorize("@ss.hasPermi('system:role:edit')") @Log(title = "角色管理", businessType = BusinessType.GRANT) @PostMapping("/authUser/cancel") - public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole) - { + public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole) { return toAjax(roleService.deleteAuthUser(userRole)); } @@ -230,8 +208,7 @@ public class SysRoleController extends BaseController @PreAuthorize("@ss.hasPermi('system:role:edit')") @Log(title = "角色管理", businessType = BusinessType.GRANT) @PostMapping("/authUser/cancelAll") - public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds) - { + public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds) { return toAjax(roleService.deleteAuthUsers(roleId, userIds)); } @@ -241,8 +218,7 @@ public class SysRoleController extends BaseController @PreAuthorize("@ss.hasPermi('system:role:edit')") @Log(title = "角色管理", businessType = BusinessType.GRANT) @PostMapping("/authUser/selectAll") - public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds) - { + public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds) { roleService.checkRoleDataScope(roleId); return toAjax(roleService.insertAuthUsers(roleId, userIds)); } @@ -252,8 +228,7 @@ public class SysRoleController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:role:query')") @GetMapping(value = "/deptTree/{roleId}") - public AjaxResult deptTree(@PathVariable("roleId") Long roleId) - { + public AjaxResult deptTree(@PathVariable("roleId") Long roleId) { AjaxResult ajax = AjaxResult.success(); ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); ajax.put("depts", deptService.selectDeptTreeList(new SysDept())); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index c53f596..bc2e2c0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -1,21 +1,5 @@ package com.ruoyi.web.controller.system; -import java.util.List; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -31,16 +15,30 @@ import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysPostService; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.stream.Collectors; /** * 用户信息 - * + * * @author ruoyi */ @RestController @RequestMapping("/system/user") -public class SysUserController extends BaseController -{ +public class SysUserController extends BaseController { @Autowired private ISysUserService userService; @@ -58,8 +56,7 @@ public class SysUserController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:user:list')") @GetMapping("/list") - public TableDataInfo list(SysUser user) - { + public TableDataInfo list(SysUser user) { startPage(); List list = userService.selectUserList(user); return getDataTable(list); @@ -68,8 +65,7 @@ public class SysUserController extends BaseController @Log(title = "用户管理", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:user:export')") @PostMapping("/export") - public void export(HttpServletResponse response, SysUser user) - { + public void export(HttpServletResponse response, SysUser user) { List list = userService.selectUserList(user); ExcelUtil util = new ExcelUtil(SysUser.class); util.exportExcel(response, list, "用户数据"); @@ -78,8 +74,7 @@ public class SysUserController extends BaseController @Log(title = "用户管理", businessType = BusinessType.IMPORT) @PreAuthorize("@ss.hasPermi('system:user:import')") @PostMapping("/importData") - public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception - { + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { ExcelUtil util = new ExcelUtil(SysUser.class); List userList = util.importExcel(file.getInputStream()); String operName = getUsername(); @@ -88,8 +83,7 @@ public class SysUserController extends BaseController } @PostMapping("/importTemplate") - public void importTemplate(HttpServletResponse response) - { + public void importTemplate(HttpServletResponse response) { ExcelUtil util = new ExcelUtil(SysUser.class); util.importTemplateExcel(response, "用户数据"); } @@ -98,16 +92,14 @@ public class SysUserController extends BaseController * 根据用户编号获取详细信息 */ @PreAuthorize("@ss.hasPermi('system:user:query')") - @GetMapping(value = { "/", "/{userId}" }) - public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) - { + @GetMapping(value = {"/", "/{userId}"}) + public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) { userService.checkUserDataScope(userId); AjaxResult ajax = AjaxResult.success(); List roles = roleService.selectRoleAll(); ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); ajax.put("posts", postService.selectPostAll()); - if (StringUtils.isNotNull(userId)) - { + if (StringUtils.isNotNull(userId)) { SysUser sysUser = userService.selectUserById(userId); ajax.put(AjaxResult.DATA_TAG, sysUser); ajax.put("postIds", postService.selectPostListByUserId(userId)); @@ -122,18 +114,12 @@ public class SysUserController extends BaseController @PreAuthorize("@ss.hasPermi('system:user:add')") @Log(title = "用户管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysUser user) - { - if (!userService.checkUserNameUnique(user)) - { + public AjaxResult add(@Validated @RequestBody SysUser user) { + if (!userService.checkUserNameUnique(user)) { return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); - } - else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) - { + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); - } - else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) - { + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } user.setCreateBy(getUsername()); @@ -147,20 +133,14 @@ public class SysUserController extends BaseController @PreAuthorize("@ss.hasPermi('system:user:edit')") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PostMapping("/edit") - public AjaxResult edit(@Validated @RequestBody SysUser user) - { + public AjaxResult edit(@Validated @RequestBody SysUser user) { userService.checkUserAllowed(user); userService.checkUserDataScope(user.getUserId()); - if (!userService.checkUserNameUnique(user)) - { + if (!userService.checkUserNameUnique(user)) { return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); - } - else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) - { + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); - } - else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) - { + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } user.setUpdateBy(getUsername()); @@ -173,10 +153,8 @@ public class SysUserController extends BaseController @PreAuthorize("@ss.hasPermi('system:user:remove')") @Log(title = "用户管理", businessType = BusinessType.DELETE) @PostMapping("/{userIds}") - public AjaxResult remove(@PathVariable Long[] userIds) - { - if (ArrayUtils.contains(userIds, getUserId())) - { + public AjaxResult remove(@PathVariable Long[] userIds) { + if (ArrayUtils.contains(userIds, getUserId())) { return error("当前用户不能删除"); } return toAjax(userService.deleteUserByIds(userIds)); @@ -188,8 +166,7 @@ public class SysUserController extends BaseController @PreAuthorize("@ss.hasPermi('system:user:resetPwd')") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PostMapping("/resetPwd") - public AjaxResult resetPwd(@RequestBody SysUser user) - { + public AjaxResult resetPwd(@RequestBody SysUser user) { userService.checkUserAllowed(user); userService.checkUserDataScope(user.getUserId()); user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); @@ -203,8 +180,7 @@ public class SysUserController extends BaseController @PreAuthorize("@ss.hasPermi('system:user:edit')") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PostMapping("/changeStatus") - public AjaxResult changeStatus(@RequestBody SysUser user) - { + public AjaxResult changeStatus(@RequestBody SysUser user) { userService.checkUserAllowed(user); userService.checkUserDataScope(user.getUserId()); user.setUpdateBy(getUsername()); @@ -216,8 +192,7 @@ public class SysUserController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:user:query')") @GetMapping("/authRole/{userId}") - public AjaxResult authRole(@PathVariable("userId") Long userId) - { + public AjaxResult authRole(@PathVariable("userId") Long userId) { AjaxResult ajax = AjaxResult.success(); SysUser user = userService.selectUserById(userId); List roles = roleService.selectRolesByUserId(userId); @@ -232,8 +207,7 @@ public class SysUserController extends BaseController @PreAuthorize("@ss.hasPermi('system:user:edit')") @Log(title = "用户管理", businessType = BusinessType.GRANT) @PostMapping("/authRole") - public AjaxResult insertAuthRole(Long userId, Long[] roleIds) - { + public AjaxResult insertAuthRole(Long userId, Long[] roleIds) { userService.checkUserDataScope(userId); userService.insertUserAuth(userId, roleIds); return success(); @@ -244,8 +218,7 @@ public class SysUserController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:user:list')") @GetMapping("/deptTree") - public AjaxResult deptTree(SysDept dept) - { + public AjaxResult deptTree(SysDept dept) { return success(deptService.selectDeptTreeList(dept)); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfCategoryController.java b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfCategoryController.java new file mode 100644 index 0000000..f865c04 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfCategoryController.java @@ -0,0 +1,117 @@ +package com.ruoyi.workflow; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.controller.FlowableBaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtilAiLiBaBa; +import com.ruoyi.workflow.domain.WfCategory; +import com.ruoyi.workflow.domain.vo.WfCategoryVo; +import com.ruoyi.workflow.service.IWfCategoryService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 流程分类Controller + * + * @author KonBAI + * @createTime 2022/3/10 00:12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/category") +public class WfCategoryController extends FlowableBaseController { + + private final IWfCategoryService categoryService; + + /** + * 查询流程分类列表 + */ + @GetMapping("/list") + public TableDataInfo list(WfCategory category, PageQuery pageQuery) { + return categoryService.queryPageList(category, pageQuery); + } + + /** + * 查询全部的流程分类列表 + */ + @GetMapping("/listAll") + public R> listAll(WfCategory category) { + return R.ok(categoryService.queryList(category)); + } + + /** + * 导出流程分类列表 + */ + @Log(title = "流程分类", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(@Validated WfCategory category, HttpServletResponse response) { + List list = categoryService.queryList(category); + ExcelUtilAiLiBaBa.exportExcel(list, "流程分类", WfCategoryVo.class, response); + } + + /** + * 获取流程分类详细信息 + * + * @param categoryId 分类主键 + */ + @GetMapping("/{categoryId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("categoryId") Long categoryId) { + return R.ok(categoryService.queryById(categoryId)); + } + + /** + * 新增流程分类 + */ + @Log(title = "流程分类", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated @RequestBody WfCategory category) { + if (!categoryService.checkCategoryCodeUnique(category)) { + return R.fail("新增流程分类'" + category.getCategoryName() + "'失败,流程编码已存在"); + } + return toAjax(categoryService.insertCategory(category)); + } + + /** + * 修改流程分类 + */ + @Log(title = "流程分类", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated @RequestBody WfCategory category) { + if (!categoryService.checkCategoryCodeUnique(category)) { + return R.fail("修改流程分类'" + category.getCategoryName() + "'失败,流程编码已存在"); + } + return toAjax(categoryService.updateCategory(category)); + } + + /** + * 删除流程分类 + * + * @param categoryIds 分类主键串 + */ + @Log(title = "流程分类", businessType = BusinessType.DELETE) + @DeleteMapping("/{categoryIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] categoryIds) { + return toAjax(categoryService.deleteWithValidByIds(Arrays.asList(categoryIds), true)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfDeployController.java b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfDeployController.java new file mode 100644 index 0000000..e1de05c --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfDeployController.java @@ -0,0 +1,108 @@ +package com.ruoyi.workflow; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.flowable.core.domain.ProcessQuery; +import com.ruoyi.workflow.domain.vo.WfFormVo; +import com.ruoyi.workflow.service.IWfDeployFormService; +import com.ruoyi.workflow.service.IWfDeployService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.NotEmpty; +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; + +/** + * 流程部署 + * + * @author KonBAI + * @createTime 2022/3/24 20:57 + */ +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/deploy") +public class WfDeployController extends BaseController { + + private final IWfDeployService deployService; + private final IWfDeployFormService deployFormService; + + /** + * 查询流程部署列表 + */ + @GetMapping("/list") + public TableDataInfo list(ProcessQuery processQuery, PageQuery pageQuery) { + return deployService.queryPageList(processQuery, pageQuery); + } + + /** + * 查询流程部署版本列表 + */ + @GetMapping("/publishList") + public TableDataInfo publishList(@RequestParam String processKey, PageQuery pageQuery) { + return deployService.queryPublishList(processKey, pageQuery); + } + + /** + * 激活或挂起流程 + * + * @param state 状态(active:激活 suspended:挂起) + * @param definitionId 流程定义ID + */ + @PutMapping(value = "/changeState") + public R changeState(@RequestParam String state, @RequestParam String definitionId) { + deployService.updateState(definitionId, state); + return R.ok(); + } + + /** + * 读取xml文件 + * + * @param definitionId 流程定义ID + * @return + */ + @GetMapping("/bpmnXml/{definitionId}") + public R getBpmnXml(@PathVariable(value = "definitionId") String definitionId) { + return R.ok(null, deployService.queryBpmnXmlById(definitionId)); + } + + /** + * 删除流程模型 + * + * @param deployIds 流程部署ids + */ + @Log(title = "删除流程部署", businessType = BusinessType.DELETE) + @DeleteMapping("/{deployIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable String[] deployIds) { + deployService.deleteByIds(Arrays.asList(deployIds)); + return R.ok(); + } + + /** + * 查询流程部署关联表单信息 + * + * @param deployId 流程部署id + */ + @GetMapping("/form/{deployId}") + public R start(@PathVariable(value = "deployId") String deployId) { + WfFormVo formVo = deployFormService.selectDeployFormByDeployId(deployId); + if (Objects.isNull(formVo)) { + return R.fail("请先配置流程表单"); + } + return R.ok(JsonUtils.parseObject(formVo.getContent(), Map.class)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfFormController.java b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfFormController.java new file mode 100644 index 0000000..0a6433f --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfFormController.java @@ -0,0 +1,114 @@ +package com.ruoyi.workflow; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.FlowableBaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtilAiLiBaBa; +import com.ruoyi.workflow.domain.WfDeployForm; +import com.ruoyi.workflow.domain.bo.WfFormBo; +import com.ruoyi.workflow.domain.vo.WfFormVo; +import com.ruoyi.workflow.service.IWfDeployFormService; +import com.ruoyi.workflow.service.IWfFormService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 流程表单Controller + * + * @author KonBAI + * @createTime 2022/3/7 22:07 + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/form") +public class WfFormController extends FlowableBaseController { + + private final IWfFormService formService; + + private final IWfDeployFormService deployFormService; + + /** + * 查询流程表单列表 + */ + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) WfFormBo bo, PageQuery pageQuery) { + return formService.queryPageList(bo, pageQuery); + } + + /** + * 导出流程表单列表 + */ + @Log(title = "流程表单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(@Validated WfFormBo bo, HttpServletResponse response) { + List list = formService.queryList(bo); + ExcelUtilAiLiBaBa.exportExcel(list, "流程表单", WfFormVo.class, response); + } + + /** + * 获取流程表单详细信息 + * + * @param formId 主键 + */ + @GetMapping(value = "/{formId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("formId") Long formId) { + return R.ok(formService.queryById(formId)); + } + + /** + * 新增流程表单 + */ + @Log(title = "流程表单", businessType = BusinessType.INSERT) + @PostMapping + public R add(@RequestBody WfFormBo bo) { + return toAjax(formService.insertForm(bo)); + } + + /** + * 修改流程表单 + */ + @Log(title = "流程表单", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@RequestBody WfFormBo bo) { + return toAjax(formService.updateForm(bo)); + } + + /** + * 删除流程表单 + * + * @param formIds 主键串 + */ + @Log(title = "流程表单", businessType = BusinessType.DELETE) + @DeleteMapping("/{formIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] formIds) { + return toAjax(formService.deleteWithValidByIds(Arrays.asList(formIds)) ? 1 : 0); + } + + + /** + * 挂载流程表单 + */ + @Log(title = "流程表单", businessType = BusinessType.INSERT) + @PostMapping("/addDeployForm") + public R addDeployForm(@RequestBody WfDeployForm deployForm) { + return toAjax(deployFormService.insertWfDeployForm(deployForm)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfInstanceController.java b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfInstanceController.java new file mode 100644 index 0000000..152c58d --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfInstanceController.java @@ -0,0 +1,77 @@ +package com.ruoyi.workflow; + + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.workflow.domain.bo.WfTaskBo; +import com.ruoyi.workflow.service.IWfInstanceService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 工作流流程实例管理 + * + * @author KonBAI + * @createTime 2022/3/10 00:12 + */ +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/instance") +public class WfInstanceController { + + private final IWfInstanceService instanceService; + + /** + * 激活或挂起流程实例 + * + * @param state 1:激活,2:挂起 + * @param instanceId 流程实例ID + */ + @PostMapping(value = "/updateState") + public R updateState(@RequestParam Integer state, @RequestParam String instanceId) { + instanceService.updateState(state, instanceId); + return R.ok(); + } + + /** + * 结束流程实例 + * + * @param bo 流程任务业务对象 + */ + @PostMapping(value = "/stopProcessInstance") + public R stopProcessInstance(@RequestBody WfTaskBo bo) { + instanceService.stopProcessInstance(bo); + return R.ok(); + } + + /** + * 删除流程实例 + * + * @param instanceId 流程实例ID + * @param deleteReason 删除原因 + */ + @Deprecated + @DeleteMapping(value = "/delete") + public R delete(@RequestParam String instanceId, String deleteReason) { + instanceService.delete(instanceId, deleteReason); + return R.ok(); + } + + /** + * 查询流程实例详情信息 + * + * @param procInsId 流程实例ID + * @param deployId 流程部署ID + */ + @GetMapping("/detail") + public R detail(String procInsId, String deployId) { + return R.ok(instanceService.queryDetailProcess(procInsId, deployId)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfModelController.java b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfModelController.java new file mode 100644 index 0000000..b33bc1d --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfModelController.java @@ -0,0 +1,184 @@ +package com.ruoyi.workflow; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.controller.FlowableBaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtilAiLiBaBa; +import com.ruoyi.workflow.domain.WfCategory; +import com.ruoyi.workflow.domain.bo.WfModelBo; +import com.ruoyi.workflow.domain.vo.WfCategoryVo; +import com.ruoyi.workflow.domain.vo.WfModelExportVo; +import com.ruoyi.workflow.domain.vo.WfModelVo; +import com.ruoyi.workflow.service.IWfCategoryService; +import com.ruoyi.workflow.service.IWfModelService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 工作流流程模型管理 + * + * @author KonBAI + * @createTime 2022/6/21 9:09 + */ +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/model") +public class WfModelController extends FlowableBaseController { + + private final IWfModelService modelService; + private final IWfCategoryService categoryService; + + /** + * 查询流程模型列表 + * + * @param modelBo 流程模型对象 + * @param pageQuery 分页参数 + */ + @GetMapping("/list") + public TableDataInfo list(WfModelBo modelBo, PageQuery pageQuery) { + return modelService.list(modelBo, pageQuery); + } + + /** + * 查询流程模型列表 + * + * @param modelBo 流程模型对象 + * @param pageQuery 分页参数 + */ + @GetMapping("/historyList") + public TableDataInfo historyList(WfModelBo modelBo, PageQuery pageQuery) { + return modelService.historyList(modelBo, pageQuery); + } + + /** + * 获取流程模型详细信息 + * + * @param modelId 模型主键 + */ + @GetMapping(value = "/{modelId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("modelId") String modelId) { + return R.ok(modelService.getModel(modelId)); + } + + /** + * 获取流程表单详细信息 + * + * @param modelId 模型主键 + */ + @GetMapping(value = "/bpmnXml/{modelId}") + public R getBpmnXml(@NotNull(message = "主键不能为空") @PathVariable("modelId") String modelId) { + return R.ok("操作成功", modelService.queryBpmnXmlById(modelId)); + } + + /** + * 新增流程模型 + */ + @Log(title = "流程模型", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody WfModelBo modelBo) { + modelService.insertModel(modelBo); + return R.ok(); + } + + /** + * 修改流程模型 + */ + @Log(title = "流程模型", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody WfModelBo modelBo) { + modelService.updateModel(modelBo); + return R.ok(); + } + + /** + * 保存流程模型 + */ + @Log(title = "保存流程模型", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/save") + public R save(@RequestBody WfModelBo modelBo) { + modelService.saveModel(modelBo); + return R.ok(); + } + + /** + * 设为最新流程模型 + * + * @param modelId + * @return + */ + @Log(title = "设为最新流程模型", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/latest") + public R latest(@RequestParam String modelId) { + modelService.latestModel(modelId); + return R.ok(); + } + + /** + * 删除流程模型 + * + * @param modelIds 流程模型主键串 + */ + @Log(title = "删除流程模型", businessType = BusinessType.DELETE) + @DeleteMapping("/{modelIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable String[] modelIds) { + modelService.deleteByIds(Arrays.asList(modelIds)); + return R.ok(); + } + + /** + * 部署流程模型 + * + * @param modelId 流程模型主键 + */ + @Log(title = "部署流程模型", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/deploy") + public R deployModel(@RequestParam String modelId) { + return toAjax(modelService.deployModel(modelId)); + } + + /** + * 导出流程模型数据 + */ + @Log(title = "导出流程模型数据", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WfModelBo modelBo, HttpServletResponse response) { + List list = modelService.list(modelBo); + List listVo = BeanUtil.copyToList(list, WfModelExportVo.class); + List categoryVos = categoryService.queryList(new WfCategory()); + Map categoryMap = categoryVos.stream() + .collect(Collectors.toMap(WfCategoryVo::getCode, WfCategoryVo::getCategoryName)); + for (WfModelExportVo exportVo : listVo) { + exportVo.setCategoryName(categoryMap.get(exportVo.getCategory())); + } + ExcelUtilAiLiBaBa.exportExcel(listVo, "流程模型数据", WfModelExportVo.class, response); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfProcessController.java b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfProcessController.java new file mode 100644 index 0000000..ee17b75 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfProcessController.java @@ -0,0 +1,240 @@ +package com.ruoyi.workflow; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.FlowableBaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.poi.ExcelUtilAiLiBaBa; +import com.ruoyi.flowable.core.domain.ProcessQuery; +import com.ruoyi.workflow.domain.bo.WfCopyBo; +import com.ruoyi.workflow.domain.vo.WfClaimTaskExportVo; +import com.ruoyi.workflow.domain.vo.WfCopyVo; +import com.ruoyi.workflow.domain.vo.WfDefinitionVo; +import com.ruoyi.workflow.domain.vo.WfFinishedTaskExportVo; +import com.ruoyi.workflow.domain.vo.WfOwnTaskExportVo; +import com.ruoyi.workflow.domain.vo.WfTaskVo; +import com.ruoyi.workflow.domain.vo.WfTodoTaskExportVo; +import com.ruoyi.workflow.service.IWfCopyService; +import com.ruoyi.workflow.service.IWfProcessService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 工作流流程管理 + * + * @author KonBAI + * @createTime 2022/3/24 18:54 + */ +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/process") +public class WfProcessController extends FlowableBaseController { + + private final IWfProcessService processService; + private final IWfCopyService copyService; + + /** + * 查询可发起流程列表 + * + * @param pageQuery 分页参数 + */ + @GetMapping(value = "/list") + public TableDataInfo startProcessList(ProcessQuery processQuery, PageQuery pageQuery) { + return processService.selectPageStartProcessList(processQuery, pageQuery); + } + + /** + * 我拥有的流程 + */ + @GetMapping(value = "/ownList") + public TableDataInfo ownProcessList(ProcessQuery processQuery, PageQuery pageQuery) { + return processService.selectPageOwnProcessList(processQuery, pageQuery); + } + + /** + * 获取待办列表 + */ + @GetMapping(value = "/todoList") + public TableDataInfo todoProcessList(ProcessQuery processQuery, PageQuery pageQuery) { + return processService.selectPageTodoProcessList(processQuery, pageQuery); + } + + /** + * 获取待签列表 + * + * @param processQuery 流程业务对象 + * @param pageQuery 分页参数 + */ + @GetMapping(value = "/claimList") + public TableDataInfo claimProcessList(ProcessQuery processQuery, PageQuery pageQuery) { + return processService.selectPageClaimProcessList(processQuery, pageQuery); + } + + /** + * 获取已办列表 + * + * @param pageQuery 分页参数 + */ + @GetMapping(value = "/finishedList") + public TableDataInfo finishedProcessList(ProcessQuery processQuery, PageQuery pageQuery) { + return processService.selectPageFinishedProcessList(processQuery, pageQuery); + } + + /** + * 获取抄送列表 + * + * @param copyBo 流程抄送对象 + * @param pageQuery 分页参数 + */ + @GetMapping(value = "/copyList") + public TableDataInfo copyProcessList(WfCopyBo copyBo, PageQuery pageQuery) { + copyBo.setUserId(SecurityUtils.getUserId()); + return copyService.selectPageList(copyBo, pageQuery); + } + + /** + * 导出可发起流程列表 + */ + @Log(title = "可发起流程", businessType = BusinessType.EXPORT) + @PostMapping("/startExport") + public void startExport(@Validated ProcessQuery processQuery, HttpServletResponse response) { + List list = processService.selectStartProcessList(processQuery); + ExcelUtilAiLiBaBa.exportExcel(list, "可发起流程", WfDefinitionVo.class, response); + } + + /** + * 导出我拥有流程列表 + */ + @Log(title = "我拥有流程", businessType = BusinessType.EXPORT) + @PostMapping("/ownExport") + public void ownExport(@Validated ProcessQuery processQuery, HttpServletResponse response) { + List list = processService.selectOwnProcessList(processQuery); + List listVo = BeanUtil.copyToList(list, WfOwnTaskExportVo.class); + for (WfOwnTaskExportVo exportVo : listVo) { + exportVo.setStatus(ObjectUtil.isNull(exportVo.getFinishTime()) ? "进行中" : "已完成"); + } + ExcelUtilAiLiBaBa.exportExcel(listVo, "我拥有流程", WfOwnTaskExportVo.class, response); + } + + /** + * 导出待办流程列表 + */ + @Log(title = "待办流程", businessType = BusinessType.EXPORT) + @PostMapping("/todoExport") + public void todoExport(@Validated ProcessQuery processQuery, HttpServletResponse response) { + List list = processService.selectTodoProcessList(processQuery); + List listVo = BeanUtil.copyToList(list, WfTodoTaskExportVo.class); + ExcelUtilAiLiBaBa.exportExcel(listVo, "待办流程", WfTodoTaskExportVo.class, response); + } + + /** + * 导出待签流程列表 + */ + @Log(title = "待签流程", businessType = BusinessType.EXPORT) + @PostMapping("/claimExport") + public void claimExport(@Validated ProcessQuery processQuery, HttpServletResponse response) { + List list = processService.selectClaimProcessList(processQuery); + List listVo = BeanUtil.copyToList(list, WfClaimTaskExportVo.class); + ExcelUtilAiLiBaBa.exportExcel(listVo, "待签流程", WfClaimTaskExportVo.class, response); + } + + /** + * 导出已办流程列表 + */ + @Log(title = "已办流程", businessType = BusinessType.EXPORT) + @PostMapping("/finishedExport") + public void finishedExport(@Validated ProcessQuery processQuery, HttpServletResponse response) { + List list = processService.selectFinishedProcessList(processQuery); + List listVo = BeanUtil.copyToList(list, WfFinishedTaskExportVo.class); + ExcelUtilAiLiBaBa.exportExcel(listVo, "已办流程", WfFinishedTaskExportVo.class, response); + } + + /** + * 导出抄送流程列表 + */ + @Log(title = "抄送流程", businessType = BusinessType.EXPORT) + @PostMapping("/copyExport") + public void copyExport(WfCopyBo copyBo, HttpServletResponse response) { + copyBo.setUserId(SecurityUtils.getUserId()); + List list = copyService.selectList(copyBo); + ExcelUtilAiLiBaBa.exportExcel(list, "抄送流程", WfCopyVo.class, response); + } + + /** + * 查询流程部署关联表单信息 + * + * @param definitionId 流程定义id + * @param deployId 流程部署id + */ + @GetMapping("/getProcessForm") + public R getForm(@RequestParam(value = "definitionId") String definitionId, + @RequestParam(value = "deployId") String deployId, + @RequestParam(value = "procInsId", required = false) String procInsId) { + return R.ok(processService.selectFormContent(definitionId, deployId, procInsId)); + } + + /** + * 根据流程定义id启动流程实例 + * + * @param processDefId 流程定义id + * @param variables 变量集合,json对象 + */ + @PostMapping("/start/{processDefId}") + public R start(@PathVariable(value = "processDefId") String processDefId, @RequestBody Map variables) { + processService.startProcessByDefId(processDefId, variables); + return R.ok("流程启动成功"); + + } + + /** + * 删除流程实例 + * + * @param instanceIds 流程实例ID串 + */ + @DeleteMapping("/instance/{instanceIds}") + public R delete(@PathVariable String[] instanceIds) { + processService.deleteProcessByIds(instanceIds); + return R.ok(); + } + + /** + * 读取xml文件 + * + * @param processDefId 流程定义ID + */ + @GetMapping("/bpmnXml/{processDefId}") + public R getBpmnXml(@PathVariable(value = "processDefId") String processDefId) { + return R.ok(null, processService.queryBpmnXmlById(processDefId)); + } + + /** + * 查询流程详情信息 + * + * @param procInsId 流程实例ID + * @param taskId 任务ID + */ + @GetMapping("/detail") + public R detail(String procInsId, String taskId) { + return R.ok(processService.queryProcessDetail(procInsId, taskId)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfTaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfTaskController.java new file mode 100644 index 0000000..1fa4f8c --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/workflow/WfTaskController.java @@ -0,0 +1,183 @@ +package com.ruoyi.workflow; + +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.workflow.domain.bo.WfTaskBo; +import com.ruoyi.workflow.service.IWfTaskService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * 工作流任务管理 + * + * @author KonBAI + * @createTime 2022/3/10 00:12 + */ +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/task") +public class WfTaskController { + + private final IWfTaskService flowTaskService; + + /** + * 取消流程 + */ + @PostMapping(value = "/stopProcess") + public R stopProcess(@RequestBody WfTaskBo bo) { + flowTaskService.stopProcess(bo); + return R.ok(); + } + + /** + * 撤回流程 + */ + @PostMapping(value = "/revokeProcess") + public R revokeProcess(@RequestBody WfTaskBo bo) { + flowTaskService.revokeProcess(bo); + return R.ok(); + } + + /** + * 获取流程变量 + * + * @param taskId 流程任务Id + */ + @GetMapping(value = "/processVariables/{taskId}") + public R processVariables(@PathVariable(value = "taskId") String taskId) { + return R.ok(flowTaskService.getProcessVariables(taskId)); + } + + /** + * 审批任务 + */ + @PostMapping(value = "/complete") + public R complete(@RequestBody WfTaskBo bo) { + flowTaskService.complete(bo); + return R.ok(); + } + + /** + * 拒绝任务 + */ + @PostMapping(value = "/reject") + public R taskReject(@RequestBody WfTaskBo taskBo) { + flowTaskService.taskReject(taskBo); + return R.ok(); + } + + /** + * 退回任务 + */ + @PostMapping(value = "/return") + public R taskReturn(@RequestBody WfTaskBo bo) { + flowTaskService.taskReturn(bo); + return R.ok(); + } + + /** + * 获取所有可回退的节点 + */ + @PostMapping(value = "/returnList") + public R findReturnTaskList(@RequestBody WfTaskBo bo) { + return R.ok(flowTaskService.findReturnTaskList(bo)); + } + + /** + * 删除任务 + */ + @DeleteMapping(value = "/delete") + public R delete(@RequestBody WfTaskBo bo) { + flowTaskService.deleteTask(bo); + return R.ok(); + } + + /** + * 认领/签收任务 + */ + @PostMapping(value = "/claim") + public R claim(@RequestBody WfTaskBo bo) { + flowTaskService.claim(bo); + return R.ok(); + } + + /** + * 取消认领/签收任务 + */ + @PostMapping(value = "/unClaim") + public R unClaim(@RequestBody WfTaskBo bo) { + flowTaskService.unClaim(bo); + return R.ok(); + } + + /** + * 委派任务 + */ + @PostMapping(value = "/delegate") + public R delegate(@RequestBody WfTaskBo bo) { + if (ObjectUtil.hasNull(bo.getTaskId(), bo.getUserId())) { + return R.fail("参数错误!"); + } + flowTaskService.delegateTask(bo); + return R.ok(); + } + + /** + * 转办任务 + */ + @PostMapping(value = "/transfer") + public R transfer(@RequestBody WfTaskBo bo) { + if (ObjectUtil.hasNull(bo.getTaskId(), bo.getUserId())) { + return R.fail("参数错误!"); + } + flowTaskService.transferTask(bo); + return R.ok(); + } + + /** + * 生成流程图 + * + * @param processId 任务ID + */ + @RequestMapping("/diagram/{processId}") + public void genProcessDiagram(HttpServletResponse response, + @PathVariable("processId") String processId) { + InputStream inputStream = flowTaskService.diagram(processId); + OutputStream os = null; + BufferedImage image = null; + try { + image = ImageIO.read(inputStream); + response.setContentType("image/png"); + os = response.getOutputStream(); + if (image != null) { + ImageIO.write(image, "png", os); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (os != null) { + os.flush(); + os.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/ruoyi-admin/src/main/resources/application-internet.yml b/ruoyi-admin/src/main/resources/application-internet.yml index 0df3f81..1fb54c6 100644 --- a/ruoyi-admin/src/main/resources/application-internet.yml +++ b/ruoyi-admin/src/main/resources/application-internet.yml @@ -110,8 +110,8 @@ spring: # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms knife4j: - #true会关闭文档 - production: false + #true会关闭文档 + production: false #自己客户端地址 returnUrl: https://idp.sipac.gov.cn/bms #定时任务更新企业信息和联系人的开启 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 88d67e1..f04e035 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -95,7 +95,7 @@ pagehelper: params: count=countSql knife4j: -# production: true + # production: true enable: true # 防止XSS攻击 xss: diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties index 93de005..dbd997b 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -11,12 +11,9 @@ user.blocked=用户已封禁,请联系管理员 role.blocked=角色已封禁,请联系管理员 login.blocked=很遗憾,访问IP已被列入系统黑名单 user.logout.success=退出成功 - length.not.valid=长度必须在{min}到{max}个字符之间 - user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 user.password.not.valid=* 5-50个字符 - user.email.not.valid=邮箱格式错误 user.mobile.phone.number.not.valid=手机号格式错误 user.login.success=登录成功 @@ -24,11 +21,9 @@ user.register.success=注册成功 user.notfound=请重新登录 user.forcelogout=管理员强制退出,请重新登录 user.unknown.error=未知错误,请重新登录 - ##文件上传消息 upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! upload.filename.exceed.length=上传的文件名最长{0}个字符 - ##权限 no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml index a360583..7793b8d 100644 --- a/ruoyi-admin/src/main/resources/logback.xml +++ b/ruoyi-admin/src/main/resources/logback.xml @@ -1,31 +1,31 @@ - + - + - - - - ${log.pattern} - - - - - - ${log.path}/sys-info.log + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log - + - ${log.path}/sys-info.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + INFO @@ -33,16 +33,16 @@ DENY - - - - ${log.path}/sys-error.log + + + + ${log.path}/sys-error.log ${log.path}/sys-error.%d{yyyy-MM-dd}.log - - 60 + + 60 ${log.pattern} @@ -50,16 +50,16 @@ ERROR - + ACCEPT - + DENY - - + + - ${log.path}/sys-user.log + ${log.path}/sys-user.log ${log.path}/sys-user.%d{yyyy-MM-dd}.log @@ -70,23 +70,23 @@ ${log.pattern} - - - - - - - - - - + + + + + + + + + + - - + + - - + + diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsApprovalInfoMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsApprovalInfoMapper.xml index 2ac17d4..fbc4f4c 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsApprovalInfoMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsApprovalInfoMapper.xml @@ -85,7 +85,7 @@ FROM bms_approval_info a inner join bms_declaration_records l on a.declaration_records_id = l.id - left join bms_enterprise_basic_info t on l.credit_code = t.tyshxydm + left join bms_enterprise_basic_info t on l.credit_code = t.tyshxydm INNER JOIN sys_dept b ON a.approval_dept = b.dept_id left JOIN sys_user c ON a.approval_by_id = c.user_id diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsDeclarationRecordsMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsDeclarationRecordsMapper.xml index fa7047e..0654d3c 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsDeclarationRecordsMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsDeclarationRecordsMapper.xml @@ -30,12 +30,24 @@ project_name, project_id, matter, - enterprise_id,jjh_project_id,credit_code, year, template_record_id,template_id, detail_id, status, is_deleted, create_by, create_time, update_by, update_time, remark + enterprise_id, + jjh_project_id, + credit_code, + year, + template_record_id, + template_id, + detail_id, + status, + is_deleted, + create_by, + create_time, + update_by, + update_time, + remark from bms_declaration_records - - insert into bms_declaration_records diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsEnterpriseBasicInfoMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsEnterpriseBasicInfoMapper.xml index 17fdfa1..2c07b2a 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsEnterpriseBasicInfoMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsEnterpriseBasicInfoMapper.xml @@ -1,15 +1,15 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> select * from bms_enterprise_basic_info - and type = #{req.type} - and qymc like concat('%', #{req.qymc}, '%') - and tyshxydm = #{req.tyshxydm} - and is_deleted = #{req.isDeleted} + and type = #{req.type} + and qymc like concat('%', #{req.qymc}, '%') + and tyshxydm = #{req.tyshxydm} + and is_deleted = #{req.isDeleted} diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsEnterpriseDirectoryMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsEnterpriseDirectoryMapper.xml index 9903af7..b4c2851 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsEnterpriseDirectoryMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsEnterpriseDirectoryMapper.xml @@ -1,19 +1,19 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - - - - - - - - - + + + + + + + + + @@ -29,21 +29,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from bms_enterprise_directory - - - and template_record_id = #{templateRecordId} - and enterprise_name like concat('%', #{enterpriseName}, '%') - and credit_code = #{creditCode} + + and template_record_id = #{templateRecordId} + and enterprise_name like concat('%', + #{enterpriseName}, '%') + + and credit_code = #{creditCode} - + - + insert into bms_enterprise_directory template_record_id, @@ -54,7 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_by, update_time, remark, - + #{templateRecordId}, #{enterpriseName}, @@ -64,7 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{updateBy}, #{updateTime}, #{remark}, - + diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsTemplateInfoMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsTemplateInfoMapper.xml index 5340dd2..f865704 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsTemplateInfoMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsTemplateInfoMapper.xml @@ -35,10 +35,8 @@ \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsTemplateRecordMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsTemplateRecordMapper.xml index 9c4267d..5b3547c 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsTemplateRecordMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/declaration/BmsTemplateRecordMapper.xml @@ -38,7 +38,8 @@ bms_template_record a INNER JOIN bms_template_info b ON a.template_id = b.id - and a.enterprise_directory like + and a.enterprise_directory + like concat('%', #{req.enterpriseDirectory}, '%') and b.id = #{req.templateId} @@ -73,27 +74,27 @@ a.update_time, a.remark, b.responsibility_unit, - b.project_big_type as projectBigType, + b.project_big_type as projectBigType, b.project_middle_type as projectMiddleType, - b.project_small_type as projectSmallType + b.project_small_type as projectSmallType FROM bms_template_record a inner JOIN bms_template_info b ON a.template_id = b.id where a.id = #{id} - - - - - - - - - - - - - - + + + + + + + + + + + + + + - SELECT a.dict_label AS projectBigName, - a.dict_value AS projectBigType, + SELECT a.dict_label AS projectBigName, + a.dict_value AS projectBigType, IFNULL(rs.count, '-') AS count1, - b.dict_label AS projectMiddleName, - b.dict_value AS projectMiddleType, + b.dict_label AS projectMiddleName, + b.dict_value AS projectMiddleType, IFNULL(ys.count, '-') AS count2, - c.dict_label AS projectSmallName, - c.dict_value AS projectSmallType, + c.dict_label AS projectSmallName, + c.dict_value AS projectSmallType, IFNULL(us.count, '-') AS count3, IFNULL(ns.count, '-') AS currentYearAdd FROM sys_dict_data a @@ -20,19 +20,19 @@ LEFT JOIN (SELECT project_big_type, IF ( - project_big_type = 1 + project_big_type = 1 OR project_big_type = 9, - COUNT(DISTINCT credit_code), - COUNT(*)) AS count + COUNT(DISTINCT credit_code), + COUNT(*)) AS count FROM j_project GROUP BY project_big_type) AS rs ON a.dict_value = rs.project_big_type LEFT JOIN (SELECT project_middle_type, IF ( - project_middle_type = 1 + project_middle_type = 1 OR project_middle_type = 9, - COUNT(DISTINCT credit_code), - COUNT(*)) AS count + COUNT(DISTINCT credit_code), + COUNT(*)) AS count FROM j_project GROUP BY project_middle_type) AS ys ON b.dict_value = ys.project_middle_type LEFT JOIN (SELECT project_small_type, @@ -45,34 +45,30 @@ WHERE YEAR( NOW()) = ns.project_year GROUP BY ns.project_small_type) AS ns ON c.dict_value = ns.project_small_type - WHERE a.dict_type = 'project_categories' and a.dict_value != 11 + WHERE a.dict_type = 'project_categories' + and a.dict_value != 11 ORDER BY CAST(c.dict_value AS UNSIGNED); diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JDevelopmentReportMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JDevelopmentReportMapper.xml index 1f53187..6b76b93 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JDevelopmentReportMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JDevelopmentReportMapper.xml @@ -5,37 +5,37 @@ diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JEnterpriseContactMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JEnterpriseContactMapper.xml index 7b93cda..8314baa 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JEnterpriseContactMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JEnterpriseContactMapper.xml @@ -20,6 +20,6 @@ and contact_office like concat('%',#{req.contactOffice},'%') - order by create_time desc + order by create_time desc diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JHeadQuartersRevenueMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JHeadQuartersRevenueMapper.xml index 3292b2e..ab830cf 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JHeadQuartersRevenueMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JHeadQuartersRevenueMapper.xml @@ -8,7 +8,9 @@ a.qymc, a.tyshxydm, CASE - WHEN a.hydm REGEXP '^(06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46)' THEN '制造业总部' + WHEN a.hydm REGEXP + '^(06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46)' + THEN '制造业总部' WHEN a.hydm REGEXP '^(47|48|49|50)' THEN '建筑业总部' WHEN a.hydm REGEXP '^(51|52|61|62)' THEN '批零住餐总部' ELSE '服务业总部' @@ -43,7 +45,8 @@ and a.years = #{req.years} - and a.hydm REGEXP '^(06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46)' + and a.hydm REGEXP + '^(06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46)' and a.hydm REGEXP '^(47|48|49|50)' @@ -54,7 +57,8 @@ - and a.hydm not REGEXP '^(51|52|61|62|47|48|49|50|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46)' + and a.hydm not REGEXP + '^(51|52|61|62|47|48|49|50|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46)' and a.project_small_type = #{req.projectSmallType} @@ -62,28 +66,20 @@ diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JMemorandumMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JMemorandumMapper.xml index 5892dec..80a7f30 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JMemorandumMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JMemorandumMapper.xml @@ -8,7 +8,7 @@ select * from j_memorandum - and name like concat('%',#{req.name},'%') or keywords like concat('%',#{req.name},'%') + and name like concat('%',#{req.name},'%') or keywords like concat('%',#{req.name},'%') and create_time >= #{req.startTime} diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JProjectMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JProjectMapper.xml index 8d8064d..8948a03 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JProjectMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JProjectMapper.xml @@ -8,7 +8,7 @@ select * from j_project - and credit_code = #{req.creditCode} + and credit_code = #{req.creditCode} and project_big_type = #{req.projectBigType} @@ -32,35 +32,31 @@ order by create_time desc ,project_year desc SELECT a.*, - IFNULL( ROUND( b.revenue/ 100000, 3 ), '-' ) - AS revenue, + IFNULL( ROUND( b.revenue/ 100000, 3 ), '-' ) + AS revenue, b.years FROM j_services_list a @@ -28,26 +28,21 @@ diff --git a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JSmartRemindersMapper.xml b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JSmartRemindersMapper.xml index edf992a..0e0d01f 100644 --- a/ruoyi-admin/src/main/resources/mapper/jjh/ent/JSmartRemindersMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/jjh/ent/JSmartRemindersMapper.xml @@ -12,9 +12,9 @@ select a.*, jp.project_small_type as projectSmallType, - jp.declare_unit as qymc - from j_smart_reminders a - left join j_project jp on a.project_id = jp.id - where a.id=#{id} + jp.declare_unit as qymc + from j_smart_reminders a + left join j_project jp on a.project_id = jp.id + where a.id = #{id} diff --git a/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml b/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml index ac47c03..b0c7ce7 100644 --- a/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml +++ b/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml @@ -1,20 +1,20 @@ + PUBLIC "-//mybatis.org//DTD Config 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-config.dtd"> - + - + - - - + + + - - - + + + diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index b742b50..0c1fb3e 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -1,6 +1,6 @@ - ruoyi @@ -140,6 +140,22 @@ javax.servlet-api + + cn.hutool + hutool-all + 5.8.25 + + + + org.projectlombok + lombok + + + + com.alibaba + easyexcel + + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java index 1d6d4f4..fe28100 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java @@ -8,12 +8,11 @@ import java.lang.annotation.Target; /** * 匿名访问不鉴权注解 - * + * * @author ruoyi */ -@Target({ ElementType.METHOD, ElementType.TYPE }) +@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented -public @interface Anonymous -{ +public @interface Anonymous { } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/CellMerge.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/CellMerge.java new file mode 100644 index 0000000..2e225d2 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/CellMerge.java @@ -0,0 +1,28 @@ +package com.ruoyi.common.annotation; + +import com.ruoyi.common.excel.CellMergeStrategy; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * excel 列单元格合并(合并列相同项) + *

+ * 需搭配 {@link CellMergeStrategy} 策略使用 + * + * @author Lion Li + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface CellMerge { + + /** + * col index + */ + int index() default -1; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java index be49c80..362e43e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java @@ -8,14 +8,13 @@ import java.lang.annotation.Target; /** * 数据权限过滤注解 - * + * * @author ruoyi */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented -public @interface DataScope -{ +public @interface DataScope { /** * 部门表的别名 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java index 79cd191..f7a2ab2 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java @@ -1,26 +1,26 @@ package com.ruoyi.common.annotation; +import com.ruoyi.common.enums.DataSourceType; + import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import com.ruoyi.common.enums.DataSourceType; /** * 自定义多数据源切换注解 - * + *

* 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 * * @author ruoyi */ -@Target({ ElementType.METHOD, ElementType.TYPE }) +@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited -public @interface DataSource -{ +public @interface DataSource { /** * 切换数据源名称 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java index 58a4bc6..a8844b8 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java @@ -1,23 +1,23 @@ package com.ruoyi.common.annotation; +import com.ruoyi.common.utils.poi.ExcelHandlerAdapter; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.math.BigDecimal; -import org.apache.poi.ss.usermodel.HorizontalAlignment; -import org.apache.poi.ss.usermodel.IndexedColors; -import com.ruoyi.common.utils.poi.ExcelHandlerAdapter; /** * 自定义导出Excel数据注解 - * + * * @author ruoyi */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) -public @interface Excel -{ +public @interface Excel { /** * 导出时在excel中排序 */ @@ -153,34 +153,28 @@ public @interface Excel */ Type type() default Type.ALL; - public enum Type - { + public enum Type { ALL(0), EXPORT(1), IMPORT(2); private final int value; - Type(int value) - { + Type(int value) { this.value = value; } - public int value() - { + public int value() { return this.value; } } - public enum ColumnType - { + public enum ColumnType { NUMERIC(0), STRING(1), IMAGE(2); private final int value; - ColumnType(int value) - { + ColumnType(int value) { this.value = value; } - public int value() - { + public int value() { return this.value; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java new file mode 100644 index 0000000..420012d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java @@ -0,0 +1,36 @@ +package com.ruoyi.common.annotation; + +import com.ruoyi.common.utils.StringUtils; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 字典格式化 + * + * @author Lion Li + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface ExcelDictFormat { + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + String dictType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + String separator() default StringUtils.SEPARATORSTR; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelEnumFormat.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelEnumFormat.java new file mode 100644 index 0000000..2387c80 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelEnumFormat.java @@ -0,0 +1,34 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 枚举格式化 + * + * @author Liang + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface ExcelEnumFormat { + + /** + * 字典枚举类型 + */ + Class> enumClass(); + + /** + * 字典枚举类中对应的code属性名称,默认为code + */ + String codeField() default "code"; + + /** + * 字典枚举类中对应的text属性名称,默认为text + */ + String textField() default "text"; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java index 1f1cc81..f5b80ec 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java @@ -7,12 +7,11 @@ import java.lang.annotation.Target; /** * Excel注解集 - * + * * @author ruoyi */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) -public @interface Excels -{ +public @interface Excels { public Excel[] value(); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java index 1eb8e49..1d599fb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java @@ -1,24 +1,23 @@ package com.ruoyi.common.annotation; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.enums.OperatorType; + import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.enums.OperatorType; /** * 自定义操作日志记录注解 - * - * @author ruoyi * + * @author ruoyi */ -@Target({ ElementType.PARAMETER, ElementType.METHOD }) +@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented -public @interface Log -{ +public @interface Log { /** * 模块 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java index 0f024c7..cc0eb23 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java @@ -1,23 +1,23 @@ package com.ruoyi.common.annotation; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.enums.LimitType; + import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import com.ruoyi.common.constant.CacheConstants; -import com.ruoyi.common.enums.LimitType; /** * 限流注解 - * + * * @author ruoyi */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented -public @interface RateLimiter -{ +public @interface RateLimiter { /** * 限流key */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java index b769748..01c4ea1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java @@ -9,16 +9,14 @@ import java.lang.annotation.Target; /** * 自定义注解防止表单重复提交 - * - * @author ruoyi * + * @author ruoyi */ @Inherited @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented -public @interface RepeatSubmit -{ +public @interface RepeatSubmit { /** * 间隔时间(ms),小于此时间视为重复提交 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java index 29281cf..72bee65 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java @@ -5,78 +5,50 @@ import org.springframework.stereotype.Component; /** * 读取项目相关配置 - * + * * @author ruoyi */ @Component @ConfigurationProperties(prefix = "ruoyi") -public class RuoYiConfig -{ - /** 项目名称 */ - private String name; - - /** 版本 */ - private String version; - - /** 版权年份 */ - private String copyrightYear; - - /** 上传路径 */ +public class RuoYiConfig { + /** + * 上传路径 + */ private static String profile; - - /** 获取地址开关 */ + /** + * 获取地址开关 + */ private static boolean addressEnabled; - - /** 验证码类型 */ + /** + * 验证码类型 + */ private static String captchaType; + /** + * 项目名称 + */ + private String name; + /** + * 版本 + */ + private String version; + /** + * 版权年份 + */ + private String copyrightYear; - public String getName() - { - return name; - } - - public void setName(String name) - { - this.name = name; - } - - public String getVersion() - { - return version; - } - - public void setVersion(String version) - { - this.version = version; - } - - public String getCopyrightYear() - { - return copyrightYear; - } - - public void setCopyrightYear(String copyrightYear) - { - this.copyrightYear = copyrightYear; - } - - public static String getProfile() - { + public static String getProfile() { return profile; } - public void setProfile(String profile) - { + public void setProfile(String profile) { RuoYiConfig.profile = profile; } - public static boolean isAddressEnabled() - { + public static boolean isAddressEnabled() { return addressEnabled; } - public void setAddressEnabled(boolean addressEnabled) - { + public void setAddressEnabled(boolean addressEnabled) { RuoYiConfig.addressEnabled = addressEnabled; } @@ -91,32 +63,52 @@ public class RuoYiConfig /** * 获取导入上传路径 */ - public static String getImportPath() - { + public static String getImportPath() { return getProfile() + "/import"; } /** * 获取头像上传路径 */ - public static String getAvatarPath() - { + public static String getAvatarPath() { return getProfile() + "/avatar"; } /** * 获取下载路径 */ - public static String getDownloadPath() - { + public static String getDownloadPath() { return getProfile() + "/download/"; } /** * 获取上传路径 */ - public static String getUploadPath() - { + public static String getUploadPath() { return getProfile() + "/upload"; } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getCopyrightYear() { + return copyrightYear; + } + + public void setCopyrightYear(String copyrightYear) { + this.copyrightYear = copyrightYear; + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java index 0080343..1d3f457 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -2,11 +2,10 @@ package com.ruoyi.common.constant; /** * 缓存的key 常量 - * + * * @author ruoyi */ -public class CacheConstants -{ +public class CacheConstants { /** * 登录用户 redis key */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index 325f204..cd61050 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -1,15 +1,15 @@ package com.ruoyi.common.constant; -import java.util.Locale; import io.jsonwebtoken.Claims; +import java.util.Locale; + /** * 通用常量信息 - * + * * @author ruoyi */ -public class Constants -{ +public class Constants { /** * 登录成功状态 */ @@ -167,16 +167,16 @@ public class Constants /** * 自动识别json对象白名单配置(仅允许解析的包名,范围越小越安全) */ - public static final String[] JSON_WHITELIST_STR = { "org.springframework", "com.ruoyi" }; + public static final String[] JSON_WHITELIST_STR = {"org.springframework", "com.ruoyi"}; /** * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) */ - public static final String[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task","com.ruoyi.jjh.declaration.component" }; + public static final String[] JOB_WHITELIST_STR = {"com.ruoyi.quartz.task", "com.ruoyi.jjh.declaration.component"}; /** * 定时任务违规的字符 */ - public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", - "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator" }; + public static final String[] JOB_ERROR_STR = {"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator"}; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java index 7d899d4..f7c9096 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java @@ -2,116 +2,185 @@ package com.ruoyi.common.constant; /** * 代码生成通用常量 - * + * * @author ruoyi */ -public class GenConstants -{ - /** 单表(增删改查) */ +public class GenConstants { + /** + * 单表(增删改查) + */ public static final String TPL_CRUD = "crud"; - /** 树表(增删改查) */ + /** + * 树表(增删改查) + */ public static final String TPL_TREE = "tree"; - /** 主子表(增删改查) */ + /** + * 主子表(增删改查) + */ public static final String TPL_SUB = "sub"; - /** 树编码字段 */ + /** + * 树编码字段 + */ public static final String TREE_CODE = "treeCode"; - /** 树父编码字段 */ + /** + * 树父编码字段 + */ public static final String TREE_PARENT_CODE = "treeParentCode"; - /** 树名称字段 */ + /** + * 树名称字段 + */ public static final String TREE_NAME = "treeName"; - /** 上级菜单ID字段 */ + /** + * 上级菜单ID字段 + */ public static final String PARENT_MENU_ID = "parentMenuId"; - /** 上级菜单名称字段 */ + /** + * 上级菜单名称字段 + */ public static final String PARENT_MENU_NAME = "parentMenuName"; - /** 数据库字符串类型 */ - public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; - - /** 数据库文本类型 */ - public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; - - /** 数据库时间类型 */ - public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; - - /** 数据库数字类型 */ - public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", - "bit", "bigint", "float", "double", "decimal" }; - - /** 页面不需要编辑字段 */ - public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; - - /** 页面不需要显示的列表字段 */ - public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by", - "update_time" }; - - /** 页面不需要查询字段 */ - public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by", - "update_time", "remark" }; - - /** Entity基类字段 */ - public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" }; - - /** Tree基类字段 */ - public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" }; - - /** 文本框 */ + /** + * 数据库字符串类型 + */ + public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2"}; + + /** + * 数据库文本类型 + */ + public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; + + /** + * 数据库时间类型 + */ + public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"}; + + /** + * 数据库数字类型 + */ + public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal"}; + + /** + * 页面不需要编辑字段 + */ + public static final String[] COLUMNNAME_NOT_EDIT = {"id", "create_by", "create_time", "del_flag"}; + + /** + * 页面不需要显示的列表字段 + */ + public static final String[] COLUMNNAME_NOT_LIST = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time"}; + + /** + * 页面不需要查询字段 + */ + public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark"}; + + /** + * Entity基类字段 + */ + public static final String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime", "remark"}; + + /** + * Tree基类字段 + */ + public static final String[] TREE_ENTITY = {"parentName", "parentId", "orderNum", "ancestors", "children"}; + + /** + * 文本框 + */ public static final String HTML_INPUT = "input"; - /** 文本域 */ + /** + * 文本域 + */ public static final String HTML_TEXTAREA = "textarea"; - /** 下拉框 */ + /** + * 下拉框 + */ public static final String HTML_SELECT = "select"; - /** 单选框 */ + /** + * 单选框 + */ public static final String HTML_RADIO = "radio"; - /** 复选框 */ + /** + * 复选框 + */ public static final String HTML_CHECKBOX = "checkbox"; - /** 日期控件 */ + /** + * 日期控件 + */ public static final String HTML_DATETIME = "datetime"; - /** 图片上传控件 */ + /** + * 图片上传控件 + */ public static final String HTML_IMAGE_UPLOAD = "imageUpload"; - /** 文件上传控件 */ + /** + * 文件上传控件 + */ public static final String HTML_FILE_UPLOAD = "fileUpload"; - /** 富文本控件 */ + /** + * 富文本控件 + */ public static final String HTML_EDITOR = "editor"; - /** 字符串类型 */ + /** + * 字符串类型 + */ public static final String TYPE_STRING = "String"; - /** 整型 */ + /** + * 整型 + */ public static final String TYPE_INTEGER = "Integer"; - /** 长整型 */ + /** + * 长整型 + */ public static final String TYPE_LONG = "Long"; - /** 浮点型 */ + /** + * 浮点型 + */ public static final String TYPE_DOUBLE = "Double"; - /** 高精度计算类型 */ + /** + * 高精度计算类型 + */ public static final String TYPE_BIGDECIMAL = "BigDecimal"; - /** 时间类型 */ + /** + * 时间类型 + */ public static final String TYPE_DATE = "Date"; - /** 模糊查询 */ + /** + * 模糊查询 + */ public static final String QUERY_LIKE = "LIKE"; - /** 相等查询 */ + /** + * 相等查询 + */ public static final String QUERY_EQ = "EQ"; - /** 需要 */ + /** + * 需要 + */ public static final String REQUIRE = "1"; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java index a983c77..54a2439 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java @@ -2,11 +2,10 @@ package com.ruoyi.common.constant; /** * 返回状态码 - * + * * @author ruoyi */ -public class HttpStatus -{ +public class HttpStatus { /** * 操作成功 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java index 62ad815..0af14ad 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java @@ -2,30 +2,38 @@ package com.ruoyi.common.constant; /** * 任务调度通用常量 - * + * * @author ruoyi */ -public class ScheduleConstants -{ +public class ScheduleConstants { public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; - /** 执行目标key */ + /** + * 执行目标key + */ public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; - /** 默认 */ + /** + * 默认 + */ public static final String MISFIRE_DEFAULT = "0"; - /** 立即触发执行 */ + /** + * 立即触发执行 + */ public static final String MISFIRE_IGNORE_MISFIRES = "1"; - /** 触发一次执行 */ + /** + * 触发一次执行 + */ public static final String MISFIRE_FIRE_AND_PROCEED = "2"; - /** 不触发立即执行 */ + /** + * 不触发立即执行 + */ public static final String MISFIRE_DO_NOTHING = "3"; - public enum Status - { + public enum Status { /** * 正常 */ @@ -37,13 +45,11 @@ public class ScheduleConstants private String value; - private Status(String value) - { + private Status(String value) { this.value = value; } - public String getValue() - { + public String getValue() { return value; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java index 6b7505b..0f67b50 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java @@ -2,65 +2,98 @@ package com.ruoyi.common.constant; /** * 用户常量信息 - * + * * @author ruoyi */ -public class UserConstants -{ +public class UserConstants { /** * 平台内系统用户的唯一标志 */ public static final String SYS_USER = "SYS_USER"; - /** 正常状态 */ + /** + * 正常状态 + */ public static final String NORMAL = "0"; - /** 异常状态 */ + /** + * 异常状态 + */ public static final String EXCEPTION = "1"; - /** 用户封禁状态 */ + /** + * 用户封禁状态 + */ public static final String USER_DISABLE = "1"; - /** 角色封禁状态 */ + /** + * 角色封禁状态 + */ public static final String ROLE_DISABLE = "1"; - /** 部门正常状态 */ + /** + * 部门正常状态 + */ public static final String DEPT_NORMAL = "0"; - /** 部门停用状态 */ + /** + * 部门停用状态 + */ public static final String DEPT_DISABLE = "1"; - /** 字典正常状态 */ + /** + * 字典正常状态 + */ public static final String DICT_NORMAL = "0"; - /** 是否为系统默认(是) */ + /** + * 是否为系统默认(是) + */ public static final String YES = "Y"; - /** 是否菜单外链(是) */ + /** + * 是否菜单外链(是) + */ public static final String YES_FRAME = "0"; - /** 是否菜单外链(否) */ + /** + * 是否菜单外链(否) + */ public static final String NO_FRAME = "1"; - /** 菜单类型(目录) */ + /** + * 菜单类型(目录) + */ public static final String TYPE_DIR = "M"; - /** 菜单类型(菜单) */ + /** + * 菜单类型(菜单) + */ public static final String TYPE_MENU = "C"; - /** 菜单类型(按钮) */ + /** + * 菜单类型(按钮) + */ public static final String TYPE_BUTTON = "F"; - /** Layout组件标识 */ + /** + * Layout组件标识 + */ public final static String LAYOUT = "Layout"; - - /** ParentView组件标识 */ + + /** + * ParentView组件标识 + */ public final static String PARENT_VIEW = "ParentView"; - /** InnerLink组件标识 */ + /** + * InnerLink组件标识 + */ public final static String INNER_LINK = "InnerLink"; - /** 校验是否唯一的返回标识 */ + /** + * 校验是否唯一的返回标识 + */ public final static boolean UNIQUE = true; public final static boolean NOT_UNIQUE = false; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelBigNumberConvert.java b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelBigNumberConvert.java new file mode 100644 index 0000000..432ab74 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelBigNumberConvert.java @@ -0,0 +1,52 @@ +package com.ruoyi.common.convert; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import lombok.extern.slf4j.Slf4j; + +import java.math.BigDecimal; + +/** + * 大数值转换 + * Excel 数值长度位15位 大于15位的数值转换位字符串 + * + * @author Lion Li + */ +@Slf4j +public class ExcelBigNumberConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Long.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Long convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + return Convert.toLong(cellData.getData()); + } + + @Override + public WriteCellData convertToExcelData(Long object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (ObjectUtil.isNotNull(object)) { + String str = Convert.toStr(object); + if (str.length() > 15) { + return new WriteCellData<>(str); + } + } + WriteCellData cellData = new WriteCellData<>(new BigDecimal(object)); + cellData.setType(CellDataTypeEnum.NUMBER); + return cellData; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java new file mode 100644 index 0000000..03dad1f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelDictConvert.java @@ -0,0 +1,73 @@ +package com.ruoyi.common.convert; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.core.service.DictService; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; + +/** + * 字典格式化转换处理 + * + * @author Lion Li + */ +@Slf4j +public class ExcelDictConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Object.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return null; + } + + @Override + public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + ExcelDictFormat anno = getAnnotation(contentProperty.getField()); + String type = anno.dictType(); + String label = cellData.getStringValue(); + String value; + if (StringUtils.isBlank(type)) { + value = ExcelUtil.reverseByExp(label, anno.readConverterExp(), anno.separator()); + } else { + value = SpringUtils.getBean(DictService.class).getDictValue(type, label, anno.separator()); + } + return Convert.convert(contentProperty.getField().getType(), value); + } + + @Override + public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (ObjectUtil.isNull(object)) { + return new WriteCellData<>(""); + } + ExcelDictFormat anno = getAnnotation(contentProperty.getField()); + String type = anno.dictType(); + String value = Convert.toStr(object); + String label; + if (StringUtils.isBlank(type)) { + label = ExcelUtil.convertByExp(value, anno.readConverterExp(), anno.separator()); + } else { + label = SpringUtils.getBean(DictService.class).getDictLabel(type, value, anno.separator()); + } + return new WriteCellData<>(label); + } + + private ExcelDictFormat getAnnotation(Field field) { + return AnnotationUtil.getAnnotation(field, ExcelDictFormat.class); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java new file mode 100644 index 0000000..c69d90c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java @@ -0,0 +1,75 @@ +package com.ruoyi.common.convert; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.ruoyi.common.annotation.ExcelEnumFormat; +import com.ruoyi.common.utils.reflect.ReflectUtils; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +/** + * 枚举格式化转换处理 + * + * @author Liang + */ +@Slf4j +public class ExcelEnumConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Object.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return null; + } + + @Override + public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + Object codeValue = cellData.getData(); + // 如果是空值 + if (ObjectUtil.isNull(codeValue)) { + return null; + } + Map enumValueMap = beforeConvert(contentProperty); + String textValue = enumValueMap.get(codeValue); + return Convert.convert(contentProperty.getField().getType(), textValue); + } + + @Override + public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (ObjectUtil.isNull(object)) { + return new WriteCellData<>(""); + } + Map enumValueMap = beforeConvert(contentProperty); + String value = Convert.toStr(enumValueMap.get(object), ""); + return new WriteCellData<>(value); + } + + private Map beforeConvert(ExcelContentProperty contentProperty) { + ExcelEnumFormat anno = getAnnotation(contentProperty.getField()); + Map enumValueMap = new HashMap<>(); + Enum[] enumConstants = anno.enumClass().getEnumConstants(); + for (Enum enumConstant : enumConstants) { + Object codeValue = ReflectUtils.invokeGetter(enumConstant, anno.codeField()); + String textValue = ReflectUtils.invokeGetter(enumConstant, anno.textField()); + enumValueMap.put(codeValue, textValue); + } + return enumValueMap; + } + + private ExcelEnumFormat getAnnotation(Field field) { + return AnnotationUtil.getAnnotation(field, ExcelEnumFormat.class); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java index a685e06..0931277 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java @@ -1,12 +1,5 @@ package com.ruoyi.common.core.controller; -import java.beans.PropertyEditorSupport; -import java.util.Date; -import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.annotation.InitBinder; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.ruoyi.common.constant.HttpStatus; @@ -20,28 +13,32 @@ import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.sql.SqlUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; + +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; /** * web层通用数据处理 - * + * * @author ruoyi */ -public class BaseController -{ +public class BaseController { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 将前台传递过来的日期格式的字符串,自动转化为Date类型 */ @InitBinder - public void initBinder(WebDataBinder binder) - { + public void initBinder(WebDataBinder binder) { // Date 类型转换 - binder.registerCustomEditor(Date.class, new PropertyEditorSupport() - { + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { @Override - public void setAsText(String text) - { + public void setAsText(String text) { setValue(DateUtils.parseDate(text)); } }); @@ -50,19 +47,16 @@ public class BaseController /** * 设置请求分页数据 */ - protected void startPage() - { + protected void startPage() { PageUtils.startPage(); } /** * 设置请求排序数据 */ - protected void startOrderBy() - { + protected void startOrderBy() { PageDomain pageDomain = TableSupport.buildPageRequest(); - if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) - { + if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) { String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); PageHelper.orderBy(orderBy); } @@ -71,17 +65,15 @@ public class BaseController /** * 清理分页的线程变量 */ - protected void clearPage() - { + protected void clearPage() { PageUtils.clearPage(); } /** * 响应请求分页数据 */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected TableDataInfo getDataTable(List list) - { + @SuppressWarnings({"rawtypes", "unchecked"}) + protected TableDataInfo getDataTable(List list) { TableDataInfo rspData = new TableDataInfo(); rspData.setCode(HttpStatus.SUCCESS); rspData.setMsg("查询成功"); @@ -93,110 +85,97 @@ public class BaseController /** * 返回成功 */ - public AjaxResult success() - { + public AjaxResult success() { return AjaxResult.success(); } /** * 返回失败消息 */ - public AjaxResult error() - { + public AjaxResult error() { return AjaxResult.error(); } /** * 返回成功消息 */ - public AjaxResult success(String message) - { + public AjaxResult success(String message) { return AjaxResult.success(message); } - + /** * 返回成功消息 */ - public AjaxResult success(Object data) - { + public AjaxResult success(Object data) { return AjaxResult.success(data); } /** * 返回失败消息 */ - public AjaxResult error(String message) - { + public AjaxResult error(String message) { return AjaxResult.error(message); } /** * 返回警告消息 */ - public AjaxResult warn(String message) - { + public AjaxResult warn(String message) { return AjaxResult.warn(message); } /** * 响应返回结果 - * + * * @param rows 影响行数 * @return 操作结果 */ - protected AjaxResult toAjax(int rows) - { + protected AjaxResult toAjax(int rows) { return rows > 0 ? AjaxResult.success() : AjaxResult.error(); } /** * 响应返回结果 - * + * * @param result 结果 * @return 操作结果 */ - protected AjaxResult toAjax(boolean result) - { + protected AjaxResult toAjax(boolean result) { return result ? success() : error(); } /** * 页面跳转 */ - public String redirect(String url) - { + public String redirect(String url) { return StringUtils.format("redirect:{}", url); } /** * 获取用户缓存信息 */ - public LoginUser getLoginUser() - { + public LoginUser getLoginUser() { return SecurityUtils.getLoginUser(); } /** * 获取登录用户id */ - public Long getUserId() - { + public Long getUserId() { return getLoginUser().getUserId(); } /** * 获取登录部门id */ - public Long getDeptId() - { + public Long getDeptId() { return getLoginUser().getDeptId(); } /** * 获取登录用户名 */ - public String getUsername() - { + public String getUsername() { return getLoginUser().getUsername(); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FlowableBaseController.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FlowableBaseController.java new file mode 100644 index 0000000..03c9fbe --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FlowableBaseController.java @@ -0,0 +1,40 @@ +package com.ruoyi.common.core.controller; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.StringUtils; + +/** + * web层通用数据处理 + * + * @author Lion Li + */ +public class FlowableBaseController { + + /** + * 响应返回结果 + * + * @param rows 影响行数 + * @return 操作结果 + */ + protected R toAjax(int rows) { + return rows > 0 ? R.ok() : R.fail(); + } + + /** + * 响应返回结果 + * + * @param result 结果 + * @return 操作结果 + */ + protected R toAjax(boolean result) { + return result ? R.ok() : R.fail(); + } + + /** + * 页面跳转 + */ + public String redirect(String url) { + return StringUtils.format("redirect:{}", url); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java index a7abfe4..86e78a7 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java @@ -1,104 +1,99 @@ package com.ruoyi.common.core.domain; -import java.util.HashMap; -import java.util.Objects; import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.utils.StringUtils; +import java.util.HashMap; +import java.util.Objects; + /** * 操作消息提醒 - * + * * @author ruoyi */ -public class AjaxResult extends HashMap -{ - private static final long serialVersionUID = 1L; - - /** 状态码 */ +public class AjaxResult extends HashMap { + /** + * 状态码 + */ public static final String CODE_TAG = "code"; - - /** 返回内容 */ + /** + * 返回内容 + */ public static final String MSG_TAG = "msg"; - - /** 数据对象 */ + /** + * 数据对象 + */ public static final String DATA_TAG = "data"; + private static final long serialVersionUID = 1L; /** * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 */ - public AjaxResult() - { + public AjaxResult() { } /** * 初始化一个新创建的 AjaxResult 对象 - * + * * @param code 状态码 - * @param msg 返回内容 + * @param msg 返回内容 */ - public AjaxResult(int code, String msg) - { + public AjaxResult(int code, String msg) { super.put(CODE_TAG, code); super.put(MSG_TAG, msg); } /** * 初始化一个新创建的 AjaxResult 对象 - * + * * @param code 状态码 - * @param msg 返回内容 + * @param msg 返回内容 * @param data 数据对象 */ - public AjaxResult(int code, String msg, Object data) - { + public AjaxResult(int code, String msg, Object data) { super.put(CODE_TAG, code); super.put(MSG_TAG, msg); - if (StringUtils.isNotNull(data)) - { + if (StringUtils.isNotNull(data)) { super.put(DATA_TAG, data); } } /** * 返回成功消息 - * + * * @return 成功消息 */ - public static AjaxResult success() - { + public static AjaxResult success() { return AjaxResult.success("操作成功"); } /** * 返回成功数据 - * + * * @return 成功消息 */ - public static AjaxResult success(Object data) - { + public static AjaxResult success(Object data) { return AjaxResult.success("操作成功", data); } /** * 返回成功消息 - * + * * @param msg 返回内容 * @return 成功消息 */ - public static AjaxResult success(String msg) - { + public static AjaxResult success(String msg) { return AjaxResult.success(msg, null); } /** * 返回成功消息 - * - * @param msg 返回内容 + * + * @param msg 返回内容 * @param data 数据对象 * @return 成功消息 */ - public static AjaxResult success(String msg, Object data) - { + public static AjaxResult success(String msg, Object data) { return new AjaxResult(HttpStatus.SUCCESS, msg, data); } @@ -108,65 +103,59 @@ public class AjaxResult extends HashMap * @param msg 返回内容 * @return 警告消息 */ - public static AjaxResult warn(String msg) - { + public static AjaxResult warn(String msg) { return AjaxResult.warn(msg, null); } /** * 返回警告消息 * - * @param msg 返回内容 + * @param msg 返回内容 * @param data 数据对象 * @return 警告消息 */ - public static AjaxResult warn(String msg, Object data) - { + public static AjaxResult warn(String msg, Object data) { return new AjaxResult(HttpStatus.WARN, msg, data); } /** * 返回错误消息 - * + * * @return 错误消息 */ - public static AjaxResult error() - { + public static AjaxResult error() { return AjaxResult.error("操作失败"); } /** * 返回错误消息 - * + * * @param msg 返回内容 * @return 错误消息 */ - public static AjaxResult error(String msg) - { + public static AjaxResult error(String msg) { return AjaxResult.error(msg, null); } /** * 返回错误消息 - * - * @param msg 返回内容 + * + * @param msg 返回内容 * @param data 数据对象 * @return 错误消息 */ - public static AjaxResult error(String msg, Object data) - { + public static AjaxResult error(String msg, Object data) { return new AjaxResult(HttpStatus.ERROR, msg, data); } /** * 返回错误消息 - * + * * @param code 状态码 - * @param msg 返回内容 + * @param msg 返回内容 * @return 错误消息 */ - public static AjaxResult error(int code, String msg) - { + public static AjaxResult error(int code, String msg) { return new AjaxResult(code, msg, null); } @@ -175,8 +164,7 @@ public class AjaxResult extends HashMap * * @return 结果 */ - public boolean isSuccess() - { + public boolean isSuccess() { return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG)); } @@ -185,8 +173,7 @@ public class AjaxResult extends HashMap * * @return 结果 */ - public boolean isWarn() - { + public boolean isWarn() { return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG)); } @@ -195,21 +182,19 @@ public class AjaxResult extends HashMap * * @return 结果 */ - public boolean isError() - { + public boolean isError() { return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG)); } /** * 方便链式调用 * - * @param key 键 + * @param key 键 * @param value 值 * @return 数据对象 */ @Override - public AjaxResult put(String key, Object value) - { + public AjaxResult put(String key, Object value) { super.put(key, value); return this; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java index 15bf66b..f259fe0 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java @@ -1,118 +1,117 @@ package com.ruoyi.common.core.domain; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; + import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.Map; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; /** * Entity基类 - * + * * @author ruoyi */ -public class BaseEntity implements Serializable -{ +public class BaseEntity implements Serializable { private static final long serialVersionUID = 1L; - /** 搜索值 */ + /** + * 搜索值 + */ @JsonIgnore private String searchValue; - /** 创建者 */ + /** + * 创建者 + */ private String createBy; - /** 创建时间 */ + /** + * 创建时间 + */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; - /** 更新者 */ + /** + * 更新者 + */ private String updateBy; - /** 更新时间 */ + /** + * 更新时间 + */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; - /** 备注 */ + /** + * 备注 + */ private String remark; - /** 请求参数 */ + /** + * 请求参数 + */ @JsonInclude(JsonInclude.Include.NON_EMPTY) private Map params; - public String getSearchValue() - { + public String getSearchValue() { return searchValue; } - public void setSearchValue(String searchValue) - { + public void setSearchValue(String searchValue) { this.searchValue = searchValue; } - public String getCreateBy() - { + public String getCreateBy() { return createBy; } - public void setCreateBy(String createBy) - { + public void setCreateBy(String createBy) { this.createBy = createBy; } - public Date getCreateTime() - { + public Date getCreateTime() { return createTime; } - public void setCreateTime(Date createTime) - { + public void setCreateTime(Date createTime) { this.createTime = createTime; } - public String getUpdateBy() - { + public String getUpdateBy() { return updateBy; } - public void setUpdateBy(String updateBy) - { + public void setUpdateBy(String updateBy) { this.updateBy = updateBy; } - public Date getUpdateTime() - { + public Date getUpdateTime() { return updateTime; } - public void setUpdateTime(Date updateTime) - { + public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } - public String getRemark() - { + public String getRemark() { return remark; } - public void setRemark(String remark) - { + public void setRemark(String remark) { this.remark = remark; } - public Map getParams() - { - if (params == null) - { + public Map getParams() { + if (params == null) { params = new HashMap<>(); } return params; } - public void setParams(Map params) - { + public void setParams(Map params) { this.params = params; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java new file mode 100644 index 0000000..f39103b --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java @@ -0,0 +1,106 @@ +package com.ruoyi.common.core.domain; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.sql.SqlUtil; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 分页查询实体类 + * + * @author Lion Li + */ + +@Data +public class PageQuery implements Serializable { + + /** + * 当前记录起始索引 默认值 + */ + public static final int DEFAULT_PAGE_NUM = 1; + /** + * 每页显示记录数 默认值 默认查全部 + */ + public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; + private static final long serialVersionUID = 1L; + /** + * 分页大小 + */ + private Integer pageSize; + /** + * 当前页数 + */ + private Integer pageNum; + /** + * 排序列 + */ + private String orderByColumn; + /** + * 排序的方向desc或者asc + */ + private String isAsc; + + public Page build() { + Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM); + Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE); + if (pageNum <= 0) { + pageNum = DEFAULT_PAGE_NUM; + } + Page page = new Page<>(pageNum, pageSize); + List orderItems = buildOrderItem(); + if (CollUtil.isNotEmpty(orderItems)) { + page.addOrder(orderItems); + } + return page; + } + + /** + * 构建排序 + *

+ * 支持的用法如下: + * {isAsc:"asc",orderByColumn:"id"} order by id asc + * {isAsc:"asc",orderByColumn:"id,createTime"} order by id asc,create_time asc + * {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time desc + * {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time desc + */ + private List buildOrderItem() { + if (StringUtils.isBlank(orderByColumn) || StringUtils.isBlank(isAsc)) { + return null; + } + String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); + orderBy = StringUtils.toUnderScoreCase(orderBy); + + // 兼容前端排序类型 + isAsc = StringUtils.replaceEach(isAsc, new String[]{"ascending", "descending"}, new String[]{"asc", "desc"}); + + String[] orderByArr = orderBy.split(StringUtils.SEPARATORSTR); + String[] isAscArr = isAsc.split(StringUtils.SEPARATORSTR); + if (isAscArr.length != 1 && isAscArr.length != orderByArr.length) { + throw new ServiceException("排序参数有误"); + } + + List list = new ArrayList<>(); + // 每个字段各自排序 + for (int i = 0; i < orderByArr.length; i++) { + String orderByStr = orderByArr[i]; + String isAscStr = isAscArr.length == 1 ? isAscArr[0] : isAscArr[i]; + if ("asc".equals(isAscStr)) { + list.add(OrderItem.asc(orderByStr)); + } else if ("desc".equals(isAscStr)) { + list.add(OrderItem.desc(orderByStr)); + } else { + throw new ServiceException("排序参数有误"); + } + } + return list; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java index ef15802..b28f8f3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java @@ -1,71 +1,67 @@ package com.ruoyi.common.core.domain; -import java.io.Serializable; import com.ruoyi.common.constant.HttpStatus; +import java.io.Serializable; + /** * 响应信息主体 * * @author ruoyi */ -public class R implements Serializable -{ - private static final long serialVersionUID = 1L; - - /** 成功 */ +public class R implements Serializable { + /** + * 成功 + */ public static final int SUCCESS = HttpStatus.SUCCESS; - - /** 失败 */ + /** + * 失败 + */ public static final int FAIL = HttpStatus.ERROR; - + private static final long serialVersionUID = 1L; private int code; private String msg; private T data; - public static R ok() - { + public static R ok() { return restResult(null, SUCCESS, "操作成功"); } - public static R ok(T data) - { + public static R ok(T data) { return restResult(data, SUCCESS, "操作成功"); } - public static R ok(T data, String msg) - { + public static R ok(String msg) { + return restResult(null, SUCCESS, msg); + } + + public static R ok(T data, String msg) { return restResult(data, SUCCESS, msg); } - public static R fail() - { + public static R fail() { return restResult(null, FAIL, "操作失败"); } - public static R fail(String msg) - { + public static R fail(String msg) { return restResult(null, FAIL, msg); } - public static R fail(T data) - { + public static R fail(T data) { return restResult(data, FAIL, "操作失败"); } - public static R fail(T data, String msg) - { + public static R fail(T data, String msg) { return restResult(data, FAIL, msg); } - public static R fail(int code, String msg) - { + public static R fail(int code, String msg) { return restResult(null, code, msg); } - private static R restResult(T data, int code, String msg) - { + private static R restResult(T data, int code, String msg) { R apiResult = new R<>(); apiResult.setCode(code); apiResult.setData(data); @@ -73,43 +69,35 @@ public class R implements Serializable return apiResult; } - public int getCode() - { + public static Boolean isError(R ret) { + return !isSuccess(ret); + } + + public static Boolean isSuccess(R ret) { + return R.SUCCESS == ret.getCode(); + } + + public int getCode() { return code; } - public void setCode(int code) - { + public void setCode(int code) { this.code = code; } - public String getMsg() - { + public String getMsg() { return msg; } - public void setMsg(String msg) - { + public void setMsg(String msg) { this.msg = msg; } - public T getData() - { + public T getData() { return data; } - public void setData(T data) - { + public void setData(T data) { this.data = data; } - - public static Boolean isError(R ret) - { - return !isSuccess(ret); - } - - public static Boolean isSuccess(R ret) - { - return R.SUCCESS == ret.getCode(); - } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java index a180a18..265c738 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java @@ -5,75 +5,74 @@ import java.util.List; /** * Tree基类 - * + * * @author ruoyi */ -public class TreeEntity extends BaseEntity -{ +public class TreeEntity extends BaseEntity { private static final long serialVersionUID = 1L; - /** 父菜单名称 */ + /** + * 父菜单名称 + */ private String parentName; - /** 父菜单ID */ + /** + * 父菜单ID + */ private Long parentId; - /** 显示顺序 */ + /** + * 显示顺序 + */ private Integer orderNum; - /** 祖级列表 */ + /** + * 祖级列表 + */ private String ancestors; - /** 子部门 */ + /** + * 子部门 + */ private List children = new ArrayList<>(); - public String getParentName() - { + public String getParentName() { return parentName; } - public void setParentName(String parentName) - { + public void setParentName(String parentName) { this.parentName = parentName; } - public Long getParentId() - { + public Long getParentId() { return parentId; } - public void setParentId(Long parentId) - { + public void setParentId(Long parentId) { this.parentId = parentId; } - public Integer getOrderNum() - { + public Integer getOrderNum() { return orderNum; } - public void setOrderNum(Integer orderNum) - { + public void setOrderNum(Integer orderNum) { this.orderNum = orderNum; } - public String getAncestors() - { + public String getAncestors() { return ancestors; } - public void setAncestors(String ancestors) - { + public void setAncestors(String ancestors) { this.ancestors = ancestors; } - public List getChildren() - { + public List getChildren() { return children; } - public void setChildren(List children) - { + public void setChildren(List children) { this.children = children; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java index 738f12c..4608caf 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java @@ -1,176 +1,175 @@ package com.ruoyi.common.core.domain.entity; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel.ColumnType; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; /** * 字典数据表 sys_dict_data - * + * * @author ruoyi */ -public class SysDictData extends BaseEntity -{ +public class SysDictData extends BaseEntity { private static final long serialVersionUID = 1L; - /** 字典编码 */ + /** + * 字典编码 + */ @Excel(name = "字典编码", cellType = ColumnType.NUMERIC) private Long dictCode; - /** 字典排序 */ + /** + * 字典排序 + */ @Excel(name = "字典排序", cellType = ColumnType.NUMERIC) private Long dictSort; - /** 字典标签 */ + /** + * 字典标签 + */ @Excel(name = "字典标签") private String dictLabel; - /** 字典键值 */ + /** + * 字典键值 + */ @Excel(name = "字典键值") private String dictValue; - /** 字典类型 */ + /** + * 字典类型 + */ @Excel(name = "字典类型") private String dictType; - /** 样式属性(其他样式扩展) */ + /** + * 样式属性(其他样式扩展) + */ private String cssClass; - /** 表格字典样式 */ + /** + * 表格字典样式 + */ private String listClass; - /** 是否默认(Y是 N否) */ + /** + * 是否默认(Y是 N否) + */ @Excel(name = "是否默认", readConverterExp = "Y=是,N=否") private String isDefault; - /** 状态(0正常 1停用) */ + /** + * 状态(0正常 1停用) + */ @Excel(name = "状态", readConverterExp = "0=正常,1=停用") private String status; - public Long getDictCode() - { + public Long getDictCode() { return dictCode; } - public void setDictCode(Long dictCode) - { + public void setDictCode(Long dictCode) { this.dictCode = dictCode; } - public Long getDictSort() - { + public Long getDictSort() { return dictSort; } - public void setDictSort(Long dictSort) - { + public void setDictSort(Long dictSort) { this.dictSort = dictSort; } @NotBlank(message = "字典标签不能为空") @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") - public String getDictLabel() - { + public String getDictLabel() { return dictLabel; } - public void setDictLabel(String dictLabel) - { + public void setDictLabel(String dictLabel) { this.dictLabel = dictLabel; } @NotBlank(message = "字典键值不能为空") @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") - public String getDictValue() - { + public String getDictValue() { return dictValue; } - public void setDictValue(String dictValue) - { + public void setDictValue(String dictValue) { this.dictValue = dictValue; } @NotBlank(message = "字典类型不能为空") @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") - public String getDictType() - { + public String getDictType() { return dictType; } - public void setDictType(String dictType) - { + public void setDictType(String dictType) { this.dictType = dictType; } @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") - public String getCssClass() - { + public String getCssClass() { return cssClass; } - public void setCssClass(String cssClass) - { + public void setCssClass(String cssClass) { this.cssClass = cssClass; } - public String getListClass() - { + public String getListClass() { return listClass; } - public void setListClass(String listClass) - { + public void setListClass(String listClass) { this.listClass = listClass; } - public boolean getDefault() - { + public boolean getDefault() { return UserConstants.YES.equals(this.isDefault); } - public String getIsDefault() - { + public String getIsDefault() { return isDefault; } - public void setIsDefault(String isDefault) - { + public void setIsDefault(String isDefault) { this.isDefault = isDefault; } - public String getStatus() - { + public String getStatus() { return status; } - public void setStatus(String status) - { + public void setStatus(String status) { this.status = status; } - + @Override public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("dictCode", getDictCode()) - .append("dictSort", getDictSort()) - .append("dictLabel", getDictLabel()) - .append("dictValue", getDictValue()) - .append("dictType", getDictType()) - .append("cssClass", getCssClass()) - .append("listClass", getListClass()) - .append("isDefault", getIsDefault()) - .append("status", getStatus()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .toString(); + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("dictCode", getDictCode()) + .append("dictSort", getDictSort()) + .append("dictLabel", getDictLabel()) + .append("dictValue", getDictValue()) + .append("dictType", getDictType()) + .append("cssClass", getCssClass()) + .append("listClass", getListClass()) + .append("isDefault", getIsDefault()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java index e324fcf..a61ebf0 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java @@ -1,96 +1,96 @@ package com.ruoyi.common.core.domain.entity; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel.ColumnType; import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; /** * 字典类型表 sys_dict_type - * + * * @author ruoyi */ -public class SysDictType extends BaseEntity -{ +public class SysDictType extends BaseEntity { private static final long serialVersionUID = 1L; - /** 字典主键 */ + /** + * 字典主键 + */ @Excel(name = "字典主键", cellType = ColumnType.NUMERIC) private Long dictId; - /** 字典名称 */ + /** + * 字典名称 + */ @Excel(name = "字典名称") private String dictName; - /** 字典类型 */ + /** + * 字典类型 + */ @Excel(name = "字典类型") private String dictType; - /** 状态(0正常 1停用) */ + /** + * 状态(0正常 1停用) + */ @Excel(name = "状态", readConverterExp = "0=正常,1=停用") private String status; - public Long getDictId() - { + public Long getDictId() { return dictId; } - public void setDictId(Long dictId) - { + public void setDictId(Long dictId) { this.dictId = dictId; } @NotBlank(message = "字典名称不能为空") @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") - public String getDictName() - { + public String getDictName() { return dictName; } - public void setDictName(String dictName) - { + public void setDictName(String dictName) { this.dictName = dictName; } @NotBlank(message = "字典类型不能为空") @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") - public String getDictType() - { + public String getDictType() { return dictType; } - public void setDictType(String dictType) - { + public void setDictType(String dictType) { this.dictType = dictType; } - public String getStatus() - { + public String getStatus() { return status; } - public void setStatus(String status) - { + public void setStatus(String status) { this.status = status; } - + @Override public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("dictId", getDictId()) - .append("dictName", getDictName()) - .append("dictType", getDictType()) - .append("status", getStatus()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .toString(); + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("dictId", getDictId()) + .append("dictName", getDictName()) + .append("dictType", getDictType()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java index 94e1a18..6cbd225 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java @@ -1,259 +1,259 @@ package com.ruoyi.common.core.domain.entity; -import java.util.ArrayList; -import java.util.List; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import com.ruoyi.common.core.domain.BaseEntity; +import java.util.ArrayList; +import java.util.List; /** * 菜单权限表 sys_menu - * + * * @author ruoyi */ -public class SysMenu extends BaseEntity -{ +public class SysMenu extends BaseEntity { private static final long serialVersionUID = 1L; - /** 菜单ID */ + /** + * 菜单ID + */ private Long menuId; - /** 菜单名称 */ + /** + * 菜单名称 + */ private String menuName; - /** 父菜单名称 */ + /** + * 父菜单名称 + */ private String parentName; - /** 父菜单ID */ + /** + * 父菜单ID + */ private Long parentId; - /** 显示顺序 */ + /** + * 显示顺序 + */ private Integer orderNum; - /** 路由地址 */ + /** + * 路由地址 + */ private String path; - /** 组件路径 */ + /** + * 组件路径 + */ private String component; - /** 路由参数 */ + /** + * 路由参数 + */ private String query; - /** 是否为外链(0是 1否) */ + /** + * 是否为外链(0是 1否) + */ private String isFrame; - /** 是否缓存(0缓存 1不缓存) */ + /** + * 是否缓存(0缓存 1不缓存) + */ private String isCache; - /** 类型(M目录 C菜单 F按钮) */ + /** + * 类型(M目录 C菜单 F按钮) + */ private String menuType; - /** 显示状态(0显示 1隐藏) */ + /** + * 显示状态(0显示 1隐藏) + */ private String visible; - - /** 菜单状态(0正常 1停用) */ + + /** + * 菜单状态(0正常 1停用) + */ private String status; - /** 权限字符串 */ + /** + * 权限字符串 + */ private String perms; - /** 菜单图标 */ + /** + * 菜单图标 + */ private String icon; - /** 子菜单 */ + /** + * 子菜单 + */ private List children = new ArrayList(); - public Long getMenuId() - { + public Long getMenuId() { return menuId; } - public void setMenuId(Long menuId) - { + public void setMenuId(Long menuId) { this.menuId = menuId; } @NotBlank(message = "菜单名称不能为空") @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") - public String getMenuName() - { + public String getMenuName() { return menuName; } - public void setMenuName(String menuName) - { + public void setMenuName(String menuName) { this.menuName = menuName; } - public String getParentName() - { + public String getParentName() { return parentName; } - public void setParentName(String parentName) - { + public void setParentName(String parentName) { this.parentName = parentName; } - public Long getParentId() - { + public Long getParentId() { return parentId; } - public void setParentId(Long parentId) - { + public void setParentId(Long parentId) { this.parentId = parentId; } @NotNull(message = "显示顺序不能为空") - public Integer getOrderNum() - { + public Integer getOrderNum() { return orderNum; } - public void setOrderNum(Integer orderNum) - { + public void setOrderNum(Integer orderNum) { this.orderNum = orderNum; } @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") - public String getPath() - { + public String getPath() { return path; } - public void setPath(String path) - { + public void setPath(String path) { this.path = path; } @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") - public String getComponent() - { + public String getComponent() { return component; } - public void setComponent(String component) - { + public void setComponent(String component) { this.component = component; } - public String getQuery() - { + public String getQuery() { return query; } - public void setQuery(String query) - { + public void setQuery(String query) { this.query = query; } - public String getIsFrame() - { + public String getIsFrame() { return isFrame; } - public void setIsFrame(String isFrame) - { + public void setIsFrame(String isFrame) { this.isFrame = isFrame; } - public String getIsCache() - { + public String getIsCache() { return isCache; } - public void setIsCache(String isCache) - { + public void setIsCache(String isCache) { this.isCache = isCache; } @NotBlank(message = "菜单类型不能为空") - public String getMenuType() - { + public String getMenuType() { return menuType; } - public void setMenuType(String menuType) - { + public void setMenuType(String menuType) { this.menuType = menuType; } - public String getVisible() - { + public String getVisible() { return visible; } - public void setVisible(String visible) - { + public void setVisible(String visible) { this.visible = visible; } - public String getStatus() - { + public String getStatus() { return status; } - public void setStatus(String status) - { + public void setStatus(String status) { this.status = status; } @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") - public String getPerms() - { + public String getPerms() { return perms; } - public void setPerms(String perms) - { + public void setPerms(String perms) { this.perms = perms; } - public String getIcon() - { + public String getIcon() { return icon; } - public void setIcon(String icon) - { + public void setIcon(String icon) { this.icon = icon; } - public List getChildren() - { + public List getChildren() { return children; } - public void setChildren(List children) - { + public void setChildren(List children) { this.children = children; } - + @Override public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("menuId", getMenuId()) - .append("menuName", getMenuName()) - .append("parentId", getParentId()) - .append("orderNum", getOrderNum()) - .append("path", getPath()) - .append("component", getComponent()) - .append("isFrame", getIsFrame()) - .append("IsCache", getIsCache()) - .append("menuType", getMenuType()) - .append("visible", getVisible()) - .append("status ", getStatus()) - .append("perms", getPerms()) - .append("icon", getIcon()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .toString(); + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("menuId", getMenuId()) + .append("menuName", getMenuName()) + .append("parentId", getParentId()) + .append("orderNum", getOrderNum()) + .append("path", getPath()) + .append("component", getComponent()) + .append("isFrame", getIsFrame()) + .append("IsCache", getIsCache()) + .append("menuType", getMenuType()) + .append("visible", getVisible()) + .append("status ", getStatus()) + .append("perms", getPerms()) + .append("icon", getIcon()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index 3fa925a..2ed8875 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -52,88 +52,53 @@ public class SysUser extends BaseEntity { */ @Excel(name = "政务端账号") private String zwuser; - - public String getZwuser() { - return zwuser; - } - - public void setZwuser(String zwuser) { - this.zwuser = zwuser; - } - - public String getUserType() { - return userType; - } - - public void setUserType(String userType) { - this.userType = userType; - } - - public Long getEnterpriseId() { - return enterpriseId; - } - - public void setEnterpriseId(Long enterpriseId) { - this.enterpriseId = enterpriseId; - } - /** * 用户昵称 */ @Excel(name = "用户名称") private String nickName; - /** * 用户邮箱 */ @Excel(name = "用户邮箱") private String email; - /** * 手机号码 */ @Excel(name = "手机号码") private String phonenumber; - /** * 用户性别 */ @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") private String sex; - /** * 用户头像 */ private String avatar; - /** * 密码 */ private String password; - /** * 帐号状态(0正常 1停用) */ @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") private String status; - /** * 删除标志(0代表存在 2代表删除) */ private String delFlag; - /** * 最后登录IP */ @Excel(name = "最后登录IP", type = Type.EXPORT) private String loginIp; - /** * 最后登录时间 */ @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) private Date loginDate; - /** * 部门对象 */ @@ -142,17 +107,14 @@ public class SysUser extends BaseEntity { @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT) }) private SysDept dept; - /** * 角色对象 */ private List roles; - /** * 角色组 */ private Long[] roleIds; - /** * 岗位组 */ @@ -178,6 +140,30 @@ public class SysUser extends BaseEntity { return userId != null && 1L == userId; } + public String getZwuser() { + return zwuser; + } + + public void setZwuser(String zwuser) { + this.zwuser = zwuser; + } + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public Long getEnterpriseId() { + return enterpriseId; + } + + public void setEnterpriseId(Long enterpriseId) { + this.enterpriseId = enterpriseId; + } + public Long getUserId() { return userId; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java index 71e1d59..589dbc3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java @@ -2,11 +2,10 @@ package com.ruoyi.common.core.domain.model; /** * 用户登录对象 - * + * * @author ruoyi */ -public class LoginBody -{ +public class LoginBody { /** * 用户名 */ @@ -54,43 +53,35 @@ public class LoginBody this.userType = userType; } - public String getUsername() - { + public String getUsername() { return username; } - public void setUsername(String username) - { + public void setUsername(String username) { this.username = username; } - public String getPassword() - { + public String getPassword() { return password; } - public void setPassword(String password) - { + public void setPassword(String password) { this.password = password; } - public String getCode() - { + public String getCode() { return code; } - public void setCode(String code) - { + public void setCode(String code) { this.code = code; } - public String getUuid() - { + public String getUuid() { return uuid; } - public void setUuid(String uuid) - { + public void setUuid(String uuid) { this.uuid = uuid; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java index 41d244e..691b8da 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java @@ -4,16 +4,16 @@ import com.alibaba.fastjson2.annotation.JSONField; import com.ruoyi.common.core.domain.entity.SysUser; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; + import java.util.Collection; import java.util.Set; /** * 登录用户身份权限 - * + * * @author ruoyi */ -public class LoginUser implements UserDetails -{ +public class LoginUser implements UserDetails { private static final long serialVersionUID = 1L; /** @@ -78,205 +78,177 @@ public class LoginUser implements UserDetails private Set roles; - public Set getRoles() { - return roles; + public LoginUser() { } - public void setRoles(Set roles) { - this.roles = roles; - } - - - public LoginUser() - { - } - - public LoginUser(SysUser user, Set permissions) - { + public LoginUser(SysUser user, Set permissions) { this.user = user; this.permissions = permissions; } - public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) - { + + public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) { this.userId = userId; this.deptId = deptId; this.user = user; this.permissions = permissions; } - public Long getUserId() - { + public Set getRoles() { + return roles; + } + + public void setRoles(Set roles) { + this.roles = roles; + } + + public Long getUserId() { return userId; } - public void setUserId(Long userId) - { + public void setUserId(Long userId) { this.userId = userId; } - public Long getDeptId() - { + public Long getDeptId() { return deptId; } - public void setDeptId(Long deptId) - { + public void setDeptId(Long deptId) { this.deptId = deptId; } - public String getToken() - { + public String getToken() { return token; } - public void setToken(String token) - { + public void setToken(String token) { this.token = token; } @JSONField(serialize = false) @Override - public String getPassword() - { + public String getPassword() { return user.getPassword(); } @Override - public String getUsername() - { + public String getUsername() { return user.getUserName(); } + public String getNickName() { + return user.getNickName(); + } + /** * 账户是否未过期,过期无法验证 */ @JSONField(serialize = false) @Override - public boolean isAccountNonExpired() - { + public boolean isAccountNonExpired() { return true; } /** * 指定用户是否解锁,锁定的用户无法进行身份验证 - * + * * @return */ @JSONField(serialize = false) @Override - public boolean isAccountNonLocked() - { + public boolean isAccountNonLocked() { return true; } /** * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 - * + * * @return */ @JSONField(serialize = false) @Override - public boolean isCredentialsNonExpired() - { + public boolean isCredentialsNonExpired() { return true; } /** * 是否可用 ,禁用的用户不能身份验证 - * + * * @return */ @JSONField(serialize = false) @Override - public boolean isEnabled() - { + public boolean isEnabled() { return true; } - public Long getLoginTime() - { + public Long getLoginTime() { return loginTime; } - public void setLoginTime(Long loginTime) - { + public void setLoginTime(Long loginTime) { this.loginTime = loginTime; } - public String getIpaddr() - { + public String getIpaddr() { return ipaddr; } - public void setIpaddr(String ipaddr) - { + public void setIpaddr(String ipaddr) { this.ipaddr = ipaddr; } - public String getLoginLocation() - { + public String getLoginLocation() { return loginLocation; } - public void setLoginLocation(String loginLocation) - { + public void setLoginLocation(String loginLocation) { this.loginLocation = loginLocation; } - public String getBrowser() - { + public String getBrowser() { return browser; } - public void setBrowser(String browser) - { + public void setBrowser(String browser) { this.browser = browser; } - public String getOs() - { + public String getOs() { return os; } - public void setOs(String os) - { + public void setOs(String os) { this.os = os; } - public Long getExpireTime() - { + public Long getExpireTime() { return expireTime; } - public void setExpireTime(Long expireTime) - { + public void setExpireTime(Long expireTime) { this.expireTime = expireTime; } - public Set getPermissions() - { + public Set getPermissions() { return permissions; } - public void setPermissions(Set permissions) - { + public void setPermissions(Set permissions) { this.permissions = permissions; } - public SysUser getUser() - { + public SysUser getUser() { return user; } - public void setUser(SysUser user) - { + public void setUser(SysUser user) { this.user = user; } @Override - public Collection getAuthorities() - { + public Collection getAuthorities() { return null; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java index 868a1fc..5646b16 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java @@ -2,10 +2,9 @@ package com.ruoyi.common.core.domain.model; /** * 用户注册对象 - * + * * @author ruoyi */ -public class RegisterBody extends LoginBody -{ +public class RegisterBody extends LoginBody { } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java new file mode 100644 index 0000000..251e04d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java @@ -0,0 +1,192 @@ +package com.ruoyi.common.core.mapper; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.ruoyi.common.utils.BeanCopyUtils; +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 自定义 Mapper 接口, 实现 自定义扩展 + * + * @param mapper 泛型 + * @param table 泛型 + * @param vo 泛型 + * @author Lion Li + * @since 2021-05-13 + */ +@SuppressWarnings("unchecked") +public interface BaseMapperPlus extends BaseMapper { + + Log log = LogFactory.getLog(BaseMapperPlus.class); + + default Class currentVoClass() { + return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 2); + } + + default Class currentModelClass() { + return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 1); + } + + default Class currentMapperClass() { + return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 0); + } + + default List selectList() { + return this.selectList(new QueryWrapper<>()); + } + + /** + * 批量插入 + */ + default boolean insertBatch(Collection entityList) { + return Db.saveBatch(entityList); + } + + /** + * 批量更新 + */ + default boolean updateBatchById(Collection entityList) { + return Db.updateBatchById(entityList); + } + + /** + * 批量插入或更新 + */ + default boolean insertOrUpdateBatch(Collection entityList) { + return Db.saveOrUpdateBatch(entityList); + } + + /** + * 批量插入(包含限制条数) + */ + default boolean insertBatch(Collection entityList, int batchSize) { + return Db.saveBatch(entityList, batchSize); + } + + /** + * 批量更新(包含限制条数) + */ + default boolean updateBatchById(Collection entityList, int batchSize) { + return Db.updateBatchById(entityList, batchSize); + } + + /** + * 批量插入或更新(包含限制条数) + */ + default boolean insertOrUpdateBatch(Collection entityList, int batchSize) { + return Db.saveOrUpdateBatch(entityList, batchSize); + } + + /** + * 插入或更新(包含限制条数) + */ + default boolean insertOrUpdate(T entity) { + return Db.saveOrUpdate(entity); + } + + default V selectVoById(Serializable id) { + return selectVoById(id, this.currentVoClass()); + } + + /** + * 根据 ID 查询 + */ + default C selectVoById(Serializable id, Class voClass) { + T obj = this.selectById(id); + if (ObjectUtil.isNull(obj)) { + return null; + } + return BeanCopyUtils.copy(obj, voClass); + } + + default List selectVoBatchIds(Collection idList) { + return selectVoBatchIds(idList, this.currentVoClass()); + } + + /** + * 查询(根据ID 批量查询) + */ + default List selectVoBatchIds(Collection idList, Class voClass) { + List list = this.selectBatchIds(idList); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return BeanCopyUtils.copyList(list, voClass); + } + + default List selectVoByMap(Map map) { + return selectVoByMap(map, this.currentVoClass()); + } + + /** + * 查询(根据 columnMap 条件) + */ + default List selectVoByMap(Map map, Class voClass) { + List list = this.selectByMap(map); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return BeanCopyUtils.copyList(list, voClass); + } + + default V selectVoOne(Wrapper wrapper) { + return selectVoOne(wrapper, this.currentVoClass()); + } + + /** + * 根据 entity 条件,查询一条记录 + */ + default C selectVoOne(Wrapper wrapper, Class voClass) { + T obj = this.selectOne(wrapper); + if (ObjectUtil.isNull(obj)) { + return null; + } + return BeanCopyUtils.copy(obj, voClass); + } + + default List selectVoList(Wrapper wrapper) { + return selectVoList(wrapper, this.currentVoClass()); + } + + /** + * 根据 entity 条件,查询全部记录 + */ + default List selectVoList(Wrapper wrapper, Class voClass) { + List list = this.selectList(wrapper); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return BeanCopyUtils.copyList(list, voClass); + } + + default

> P selectVoPage(IPage page, Wrapper wrapper) { + return selectVoPage(page, wrapper, this.currentVoClass()); + } + + /** + * 分页查询VO + */ + default > P selectVoPage(IPage page, Wrapper wrapper, Class voClass) { + IPage pageData = this.selectPage(page, wrapper); + IPage voPage = new Page<>(pageData.getCurrent(), pageData.getSize(), pageData.getTotal()); + if (CollUtil.isEmpty(pageData.getRecords())) { + return (P) voPage; + } + voPage.setRecords(BeanCopyUtils.copyList(pageData.getRecords(), voClass)); + return (P) voPage; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java index 8966cb4..8d78800 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java @@ -4,98 +4,90 @@ import com.ruoyi.common.utils.StringUtils; /** * 分页数据 - * + * * @author ruoyi */ -public class PageDomain -{ - /** 当前记录起始索引 */ +public class PageDomain { + /** + * 当前记录起始索引 + */ private Integer pageNum; - /** 每页显示记录数 */ + /** + * 每页显示记录数 + */ private Integer pageSize; - /** 排序列 */ + /** + * 排序列 + */ private String orderByColumn; - /** 排序的方向desc或者asc */ + /** + * 排序的方向desc或者asc + */ private String isAsc = "asc"; - /** 分页参数合理化 */ + /** + * 分页参数合理化 + */ private Boolean reasonable = true; - public String getOrderBy() - { - if (StringUtils.isEmpty(orderByColumn)) - { + public String getOrderBy() { + if (StringUtils.isEmpty(orderByColumn)) { return ""; } return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; } - public Integer getPageNum() - { + public Integer getPageNum() { return pageNum; } - public void setPageNum(Integer pageNum) - { + public void setPageNum(Integer pageNum) { this.pageNum = pageNum; } - public Integer getPageSize() - { + public Integer getPageSize() { return pageSize; } - public void setPageSize(Integer pageSize) - { + public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } - public String getOrderByColumn() - { + public String getOrderByColumn() { return orderByColumn; } - public void setOrderByColumn(String orderByColumn) - { + public void setOrderByColumn(String orderByColumn) { this.orderByColumn = orderByColumn; } - public String getIsAsc() - { + public String getIsAsc() { return isAsc; } - public void setIsAsc(String isAsc) - { - if (StringUtils.isNotEmpty(isAsc)) - { + public void setIsAsc(String isAsc) { + if (StringUtils.isNotEmpty(isAsc)) { // 兼容前端排序类型 - if ("ascending".equals(isAsc)) - { + if ("ascending".equals(isAsc)) { isAsc = "asc"; - } - else if ("descending".equals(isAsc)) - { + } else if ("descending".equals(isAsc)) { isAsc = "desc"; } this.isAsc = isAsc; } } - public Boolean getReasonable() - { - if (StringUtils.isNull(reasonable)) - { + public Boolean getReasonable() { + if (StringUtils.isNull(reasonable)) { return Boolean.TRUE; } return reasonable; } - public void setReasonable(Boolean reasonable) - { + public void setReasonable(Boolean reasonable) { this.reasonable = reasonable; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java index 847685b..6405358 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java @@ -1,85 +1,107 @@ package com.ruoyi.common.core.page; +import cn.hutool.http.HttpStatus; +import com.baomidou.mybatisplus.core.metadata.IPage; + import java.io.Serializable; import java.util.List; /** * 表格分页数据对象 - * + * * @author ruoyi */ -public class TableDataInfo implements Serializable -{ +public class TableDataInfo implements Serializable { private static final long serialVersionUID = 1L; - /** 总记录数 */ + /** + * 总记录数 + */ private long total; - /** 列表数据 */ + /** + * 列表数据 + */ private List rows; - /** 消息状态码 */ + /** + * 消息状态码 + */ private int code; - /** 消息内容 */ + /** + * 消息内容 + */ private String msg; /** * 表格数据对象 */ - public TableDataInfo() - { + public TableDataInfo() { } + /** * 分页 - * - * @param list 列表数据 + * + * @param list 列表数据 * @param total 总记录数 */ - public TableDataInfo(List list, int total) - { + public TableDataInfo(List list, int total) { this.rows = list; this.total = total; } - public long getTotal() - { + public static TableDataInfo build(IPage page) { + TableDataInfo rspData = build(); + rspData.setRows(page.getRecords()); + rspData.setTotal(page.getTotal()); + return rspData; + } + + public static TableDataInfo build(List list) { + TableDataInfo rspData = build(); + rspData.setRows(list); + rspData.setTotal(list.size()); + return rspData; + } + + public static TableDataInfo build() { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + return rspData; + } + + public long getTotal() { return total; } - public void setTotal(long total) - { + public void setTotal(long total) { this.total = total; } - public List getRows() - { + public List getRows() { return rows; } - public void setRows(List rows) - { + public void setRows(List rows) { this.rows = rows; } - public int getCode() - { + public int getCode() { return code; } - public void setCode(int code) - { + public void setCode(int code) { this.code = code; } - public String getMsg() - { + public String getMsg() { return msg; } - public void setMsg(String msg) - { + public void setMsg(String msg) { this.msg = msg; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java index a120c30..d567aed 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java @@ -5,11 +5,10 @@ import com.ruoyi.common.utils.ServletUtils; /** * 表格数据处理 - * + * * @author ruoyi */ -public class TableSupport -{ +public class TableSupport { /** * 当前记录起始索引 */ @@ -38,8 +37,7 @@ public class TableSupport /** * 封装分页对象 */ - public static PageDomain getPageDomain() - { + public static PageDomain getPageDomain() { PageDomain pageDomain = new PageDomain(); pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1)); pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10)); @@ -49,8 +47,7 @@ public class TableSupport return pageDomain; } - public static PageDomain buildPageRequest() - { + public static PageDomain buildPageRequest() { return getPageDomain(); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java index 44e80d8..f7c56a5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java @@ -1,11 +1,5 @@ package com.ruoyi.common.core.redis; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.HashOperations; @@ -13,64 +7,66 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + /** * spring redis 工具类 * * @author ruoyi **/ -@SuppressWarnings(value = { "unchecked", "rawtypes" }) +@SuppressWarnings(value = {"unchecked", "rawtypes"}) @Component -public class RedisCache -{ +public class RedisCache { @Autowired public RedisTemplate redisTemplate; /** * 缓存基本的对象,Integer、String、实体类等 * - * @param key 缓存的键值 + * @param key 缓存的键值 * @param value 缓存的值 */ - public void setCacheObject(final String key, final T value) - { + public void setCacheObject(final String key, final T value) { redisTemplate.opsForValue().set(key, value); } /** * 缓存基本的对象,Integer、String、实体类等 * - * @param key 缓存的键值 - * @param value 缓存的值 - * @param timeout 时间 + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 * @param timeUnit 时间颗粒度 */ - public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) - { + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { redisTemplate.opsForValue().set(key, value, timeout, timeUnit); } /** * 设置有效时间 * - * @param key Redis键 + * @param key Redis键 * @param timeout 超时时间 * @return true=设置成功;false=设置失败 */ - public boolean expire(final String key, final long timeout) - { + public boolean expire(final String key, final long timeout) { return expire(key, timeout, TimeUnit.SECONDS); } /** * 设置有效时间 * - * @param key Redis键 + * @param key Redis键 * @param timeout 超时时间 - * @param unit 时间单位 + * @param unit 时间单位 * @return true=设置成功;false=设置失败 */ - public boolean expire(final String key, final long timeout, final TimeUnit unit) - { + public boolean expire(final String key, final long timeout, final TimeUnit unit) { return redisTemplate.expire(key, timeout, unit); } @@ -80,8 +76,7 @@ public class RedisCache * @param key Redis键 * @return 有效时间 */ - public long getExpire(final String key) - { + public long getExpire(final String key) { return redisTemplate.getExpire(key); } @@ -91,8 +86,7 @@ public class RedisCache * @param key 键 * @return true 存在 false不存在 */ - public Boolean hasKey(String key) - { + public Boolean hasKey(String key) { return redisTemplate.hasKey(key); } @@ -102,8 +96,7 @@ public class RedisCache * @param key 缓存键值 * @return 缓存键值对应的数据 */ - public T getCacheObject(final String key) - { + public T getCacheObject(final String key) { ValueOperations operation = redisTemplate.opsForValue(); return operation.get(key); } @@ -113,8 +106,7 @@ public class RedisCache * * @param key */ - public boolean deleteObject(final String key) - { + public boolean deleteObject(final String key) { return redisTemplate.delete(key); } @@ -124,20 +116,18 @@ public class RedisCache * @param collection 多个对象 * @return */ - public boolean deleteObject(final Collection collection) - { + public boolean deleteObject(final Collection collection) { return redisTemplate.delete(collection) > 0; } /** * 缓存List数据 * - * @param key 缓存的键值 + * @param key 缓存的键值 * @param dataList 待缓存的List数据 * @return 缓存的对象 */ - public long setCacheList(final String key, final List dataList) - { + public long setCacheList(final String key, final List dataList) { Long count = redisTemplate.opsForList().rightPushAll(key, dataList); return count == null ? 0 : count; } @@ -148,24 +138,21 @@ public class RedisCache * @param key 缓存的键值 * @return 缓存键值对应的数据 */ - public List getCacheList(final String key) - { + public List getCacheList(final String key) { return redisTemplate.opsForList().range(key, 0, -1); } /** * 缓存Set * - * @param key 缓存键值 + * @param key 缓存键值 * @param dataSet 缓存的数据 * @return 缓存数据的对象 */ - public BoundSetOperations setCacheSet(final String key, final Set dataSet) - { + public BoundSetOperations setCacheSet(final String key, final Set dataSet) { BoundSetOperations setOperation = redisTemplate.boundSetOps(key); Iterator it = dataSet.iterator(); - while (it.hasNext()) - { + while (it.hasNext()) { setOperation.add(it.next()); } return setOperation; @@ -177,8 +164,7 @@ public class RedisCache * @param key * @return */ - public Set getCacheSet(final String key) - { + public Set getCacheSet(final String key) { return redisTemplate.opsForSet().members(key); } @@ -188,8 +174,7 @@ public class RedisCache * @param key * @param dataMap */ - public void setCacheMap(final String key, final Map dataMap) - { + public void setCacheMap(final String key, final Map dataMap) { if (dataMap != null) { redisTemplate.opsForHash().putAll(key, dataMap); } @@ -201,32 +186,29 @@ public class RedisCache * @param key * @return */ - public Map getCacheMap(final String key) - { + public Map getCacheMap(final String key) { return redisTemplate.opsForHash().entries(key); } /** * 往Hash中存入数据 * - * @param key Redis键 - * @param hKey Hash键 + * @param key Redis键 + * @param hKey Hash键 * @param value 值 */ - public void setCacheMapValue(final String key, final String hKey, final T value) - { + public void setCacheMapValue(final String key, final String hKey, final T value) { redisTemplate.opsForHash().put(key, hKey, value); } /** * 获取Hash中的数据 * - * @param key Redis键 + * @param key Redis键 * @param hKey Hash键 * @return Hash中的对象 */ - public T getCacheMapValue(final String key, final String hKey) - { + public T getCacheMapValue(final String key, final String hKey) { HashOperations opsForHash = redisTemplate.opsForHash(); return opsForHash.get(key, hKey); } @@ -234,24 +216,22 @@ public class RedisCache /** * 获取多个Hash中的数据 * - * @param key Redis键 + * @param key Redis键 * @param hKeys Hash键集合 * @return Hash对象集合 */ - public List getMultiCacheMapValue(final String key, final Collection hKeys) - { + public List getMultiCacheMapValue(final String key, final Collection hKeys) { return redisTemplate.opsForHash().multiGet(key, hKeys); } /** * 删除Hash中的某条数据 * - * @param key Redis键 + * @param key Redis键 * @param hKey Hash键 * @return 是否成功 */ - public boolean deleteCacheMapValue(final String key, final String hKey) - { + public boolean deleteCacheMapValue(final String key, final String hKey) { return redisTemplate.opsForHash().delete(key, hKey) > 0; } @@ -261,8 +241,7 @@ public class RedisCache * @param pattern 字符串前缀 * @return 对象列表 */ - public Collection keys(final String pattern) - { + public Collection keys(final String pattern) { return redisTemplate.keys(pattern); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/DictService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/DictService.java new file mode 100644 index 0000000..b334c82 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/DictService.java @@ -0,0 +1,57 @@ +package com.ruoyi.common.core.service; + +/** + * 通用 字典服务 + * + * @author Lion Li + */ +public interface DictService { + + /** + * 分隔符 + */ + String SEPARATOR = ","; + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + default String getDictLabel(String dictType, String dictValue) { + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + default String getDictValue(String dictType, String dictLabel) { + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + String getDictLabel(String dictType, String dictValue, String separator); + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + String getDictValue(String dictType, String dictLabel, String separator); + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java new file mode 100644 index 0000000..0d98240 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java @@ -0,0 +1,26 @@ +package com.ruoyi.common.core.service; + +/** + * 通用 用户服务 + * + * @author Lion Li + */ +public interface UserService { + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ + String selectUserNameById(Long userId); + + /** + * 通过用户ID查询用户昵称 + * + * @param userId 用户ID + * @return 用户昵称 + */ + String selectNickNameById(Long userId); + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java index 84124aa..777005c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java @@ -1,76 +1,82 @@ package com.ruoyi.common.core.text; +import com.ruoyi.common.utils.StringUtils; + import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import com.ruoyi.common.utils.StringUtils; /** * 字符集工具类 - * + * * @author ruoyi */ -public class CharsetKit -{ - /** ISO-8859-1 */ +public class CharsetKit { + /** + * ISO-8859-1 + */ public static final String ISO_8859_1 = "ISO-8859-1"; - /** UTF-8 */ + /** + * UTF-8 + */ public static final String UTF_8 = "UTF-8"; - /** GBK */ + /** + * GBK + */ public static final String GBK = "GBK"; - /** ISO-8859-1 */ + /** + * ISO-8859-1 + */ public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); - /** UTF-8 */ + /** + * UTF-8 + */ public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); - /** GBK */ + /** + * GBK + */ public static final Charset CHARSET_GBK = Charset.forName(GBK); /** * 转换为Charset对象 - * + * * @param charset 字符集,为空则返回默认字符集 * @return Charset */ - public static Charset charset(String charset) - { + public static Charset charset(String charset) { return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); } /** * 转换字符串的字符集编码 - * - * @param source 字符串 - * @param srcCharset 源字符集,默认ISO-8859-1 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 * @param destCharset 目标字符集,默认UTF-8 * @return 转换后的字符集 */ - public static String convert(String source, String srcCharset, String destCharset) - { + public static String convert(String source, String srcCharset, String destCharset) { return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); } /** * 转换字符串的字符集编码 - * - * @param source 字符串 - * @param srcCharset 源字符集,默认ISO-8859-1 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 * @param destCharset 目标字符集,默认UTF-8 * @return 转换后的字符集 */ - public static String convert(String source, Charset srcCharset, Charset destCharset) - { - if (null == srcCharset) - { + public static String convert(String source, Charset srcCharset, Charset destCharset) { + if (null == srcCharset) { srcCharset = StandardCharsets.ISO_8859_1; } - if (null == destCharset) - { + if (null == destCharset) { destCharset = StandardCharsets.UTF_8; } - if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) - { + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) { return source; } return new String(source.getBytes(srcCharset), destCharset); @@ -79,8 +85,7 @@ public class CharsetKit /** * @return 系统字符集编码 */ - public static String systemCharset() - { + public static String systemCharset() { return Charset.defaultCharset().name(); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java index 0066112..f07c462 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java @@ -1,5 +1,8 @@ package com.ruoyi.common.core.text; +import com.ruoyi.common.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; + import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; @@ -7,33 +10,27 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.text.NumberFormat; import java.util.Set; -import com.ruoyi.common.utils.StringUtils; -import org.apache.commons.lang3.ArrayUtils; /** * 类型转换器 * * @author ruoyi */ -public class Convert -{ +public class Convert { /** * 转换为字符串
* 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static String toStr(Object value, String defaultValue) - { - if (null == value) - { + public static String toStr(Object value, String defaultValue) { + if (null == value) { return defaultValue; } - if (value instanceof String) - { + if (value instanceof String) { return (String) value; } return value.toString(); @@ -47,8 +44,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static String toStr(Object value) - { + public static String toStr(Object value) { return toStr(value, null); } @@ -57,18 +53,15 @@ public class Convert * 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static Character toChar(Object value, Character defaultValue) - { - if (null == value) - { + public static Character toChar(Object value, Character defaultValue) { + if (null == value) { return defaultValue; } - if (value instanceof Character) - { + if (value instanceof Character) { return (Character) value; } @@ -84,8 +77,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static Character toChar(Object value) - { + public static Character toChar(Object value) { return toChar(value, null); } @@ -94,35 +86,27 @@ public class Convert * 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static Byte toByte(Object value, Byte defaultValue) - { - if (value == null) - { + public static Byte toByte(Object value, Byte defaultValue) { + if (value == null) { return defaultValue; } - if (value instanceof Byte) - { + if (value instanceof Byte) { return (Byte) value; } - if (value instanceof Number) - { + if (value instanceof Number) { return ((Number) value).byteValue(); } final String valueStr = toStr(value, null); - if (StringUtils.isEmpty(valueStr)) - { + if (StringUtils.isEmpty(valueStr)) { return defaultValue; } - try - { + try { return Byte.parseByte(valueStr); - } - catch (Exception e) - { + } catch (Exception e) { return defaultValue; } } @@ -135,8 +119,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static Byte toByte(Object value) - { + public static Byte toByte(Object value) { return toByte(value, null); } @@ -145,35 +128,27 @@ public class Convert * 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static Short toShort(Object value, Short defaultValue) - { - if (value == null) - { + public static Short toShort(Object value, Short defaultValue) { + if (value == null) { return defaultValue; } - if (value instanceof Short) - { + if (value instanceof Short) { return (Short) value; } - if (value instanceof Number) - { + if (value instanceof Number) { return ((Number) value).shortValue(); } final String valueStr = toStr(value, null); - if (StringUtils.isEmpty(valueStr)) - { + if (StringUtils.isEmpty(valueStr)) { return defaultValue; } - try - { + try { return Short.parseShort(valueStr.trim()); - } - catch (Exception e) - { + } catch (Exception e) { return defaultValue; } } @@ -186,8 +161,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static Short toShort(Object value) - { + public static Short toShort(Object value) { return toShort(value, null); } @@ -196,31 +170,24 @@ public class Convert * 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static Number toNumber(Object value, Number defaultValue) - { - if (value == null) - { + public static Number toNumber(Object value, Number defaultValue) { + if (value == null) { return defaultValue; } - if (value instanceof Number) - { + if (value instanceof Number) { return (Number) value; } final String valueStr = toStr(value, null); - if (StringUtils.isEmpty(valueStr)) - { + if (StringUtils.isEmpty(valueStr)) { return defaultValue; } - try - { + try { return NumberFormat.getInstance().parse(valueStr); - } - catch (Exception e) - { + } catch (Exception e) { return defaultValue; } } @@ -233,8 +200,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static Number toNumber(Object value) - { + public static Number toNumber(Object value) { return toNumber(value, null); } @@ -243,35 +209,27 @@ public class Convert * 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static Integer toInt(Object value, Integer defaultValue) - { - if (value == null) - { + public static Integer toInt(Object value, Integer defaultValue) { + if (value == null) { return defaultValue; } - if (value instanceof Integer) - { + if (value instanceof Integer) { return (Integer) value; } - if (value instanceof Number) - { + if (value instanceof Number) { return ((Number) value).intValue(); } final String valueStr = toStr(value, null); - if (StringUtils.isEmpty(valueStr)) - { + if (StringUtils.isEmpty(valueStr)) { return defaultValue; } - try - { + try { return Integer.parseInt(valueStr.trim()); - } - catch (Exception e) - { + } catch (Exception e) { return defaultValue; } } @@ -284,8 +242,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static Integer toInt(Object value) - { + public static Integer toInt(Object value) { return toInt(value, null); } @@ -295,8 +252,7 @@ public class Convert * @param str 被转换的值 * @return 结果 */ - public static Integer[] toIntArray(String str) - { + public static Integer[] toIntArray(String str) { return toIntArray(",", str); } @@ -306,8 +262,7 @@ public class Convert * @param str 被转换的值 * @return 结果 */ - public static Long[] toLongArray(String str) - { + public static Long[] toLongArray(String str) { return toLongArray(",", str); } @@ -318,16 +273,13 @@ public class Convert * @param split 被转换的值 * @return 结果 */ - public static Integer[] toIntArray(String split, String str) - { - if (StringUtils.isEmpty(str)) - { - return new Integer[] {}; + public static Integer[] toIntArray(String split, String str) { + if (StringUtils.isEmpty(str)) { + return new Integer[]{}; } String[] arr = str.split(split); final Integer[] ints = new Integer[arr.length]; - for (int i = 0; i < arr.length; i++) - { + for (int i = 0; i < arr.length; i++) { final Integer v = toInt(arr[i], 0); ints[i] = v; } @@ -338,19 +290,16 @@ public class Convert * 转换为Long数组
* * @param split 分隔符 - * @param str 被转换的值 + * @param str 被转换的值 * @return 结果 */ - public static Long[] toLongArray(String split, String str) - { - if (StringUtils.isEmpty(str)) - { - return new Long[] {}; + public static Long[] toLongArray(String split, String str) { + if (StringUtils.isEmpty(str)) { + return new Long[]{}; } String[] arr = str.split(split); final Long[] longs = new Long[arr.length]; - for (int i = 0; i < arr.length; i++) - { + for (int i = 0; i < arr.length; i++) { final Long v = toLong(arr[i], null); longs[i] = v; } @@ -363,8 +312,7 @@ public class Convert * @param str 被转换的值 * @return 结果 */ - public static String[] toStrArray(String str) - { + public static String[] toStrArray(String str) { return toStrArray(",", str); } @@ -375,8 +323,7 @@ public class Convert * @param split 被转换的值 * @return 结果 */ - public static String[] toStrArray(String split, String str) - { + public static String[] toStrArray(String split, String str) { return str.split(split); } @@ -385,36 +332,28 @@ public class Convert * 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static Long toLong(Object value, Long defaultValue) - { - if (value == null) - { + public static Long toLong(Object value, Long defaultValue) { + if (value == null) { return defaultValue; } - if (value instanceof Long) - { + if (value instanceof Long) { return (Long) value; } - if (value instanceof Number) - { + if (value instanceof Number) { return ((Number) value).longValue(); } final String valueStr = toStr(value, null); - if (StringUtils.isEmpty(valueStr)) - { + if (StringUtils.isEmpty(valueStr)) { return defaultValue; } - try - { + try { // 支持科学计数法 return new BigDecimal(valueStr.trim()).longValue(); - } - catch (Exception e) - { + } catch (Exception e) { return defaultValue; } } @@ -427,8 +366,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static Long toLong(Object value) - { + public static Long toLong(Object value) { return toLong(value, null); } @@ -437,36 +375,28 @@ public class Convert * 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static Double toDouble(Object value, Double defaultValue) - { - if (value == null) - { + public static Double toDouble(Object value, Double defaultValue) { + if (value == null) { return defaultValue; } - if (value instanceof Double) - { + if (value instanceof Double) { return (Double) value; } - if (value instanceof Number) - { + if (value instanceof Number) { return ((Number) value).doubleValue(); } final String valueStr = toStr(value, null); - if (StringUtils.isEmpty(valueStr)) - { + if (StringUtils.isEmpty(valueStr)) { return defaultValue; } - try - { + try { // 支持科学计数法 return new BigDecimal(valueStr.trim()).doubleValue(); - } - catch (Exception e) - { + } catch (Exception e) { return defaultValue; } } @@ -479,8 +409,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static Double toDouble(Object value) - { + public static Double toDouble(Object value) { return toDouble(value, null); } @@ -489,35 +418,27 @@ public class Convert * 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static Float toFloat(Object value, Float defaultValue) - { - if (value == null) - { + public static Float toFloat(Object value, Float defaultValue) { + if (value == null) { return defaultValue; } - if (value instanceof Float) - { + if (value instanceof Float) { return (Float) value; } - if (value instanceof Number) - { + if (value instanceof Number) { return ((Number) value).floatValue(); } final String valueStr = toStr(value, null); - if (StringUtils.isEmpty(valueStr)) - { + if (StringUtils.isEmpty(valueStr)) { return defaultValue; } - try - { + try { return Float.parseFloat(valueStr.trim()); - } - catch (Exception e) - { + } catch (Exception e) { return defaultValue; } } @@ -530,8 +451,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static Float toFloat(Object value) - { + public static Float toFloat(Object value) { return toFloat(value, null); } @@ -540,28 +460,23 @@ public class Convert * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static Boolean toBool(Object value, Boolean defaultValue) - { - if (value == null) - { + public static Boolean toBool(Object value, Boolean defaultValue) { + if (value == null) { return defaultValue; } - if (value instanceof Boolean) - { + if (value instanceof Boolean) { return (Boolean) value; } String valueStr = toStr(value, null); - if (StringUtils.isEmpty(valueStr)) - { + if (StringUtils.isEmpty(valueStr)) { return defaultValue; } valueStr = valueStr.trim().toLowerCase(); - switch (valueStr) - { + switch (valueStr) { case "true": case "yes": case "ok": @@ -584,8 +499,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static Boolean toBool(Object value) - { + public static Boolean toBool(Object value) { return toBool(value, null); } @@ -593,34 +507,27 @@ public class Convert * 转换为Enum对象
* 如果给定的值为空,或者转换失败,返回默认值
* - * @param clazz Enum的Class - * @param value 值 + * @param clazz Enum的Class + * @param value 值 * @param defaultValue 默认值 * @return Enum */ - public static > E toEnum(Class clazz, Object value, E defaultValue) - { - if (value == null) - { + public static > E toEnum(Class clazz, Object value, E defaultValue) { + if (value == null) { return defaultValue; } - if (clazz.isAssignableFrom(value.getClass())) - { + if (clazz.isAssignableFrom(value.getClass())) { @SuppressWarnings("unchecked") E myE = (E) value; return myE; } final String valueStr = toStr(value, null); - if (StringUtils.isEmpty(valueStr)) - { + if (StringUtils.isEmpty(valueStr)) { return defaultValue; } - try - { + try { return Enum.valueOf(clazz, valueStr); - } - catch (Exception e) - { + } catch (Exception e) { return defaultValue; } } @@ -633,8 +540,7 @@ public class Convert * @param value 值 * @return Enum */ - public static > E toEnum(Class clazz, Object value) - { + public static > E toEnum(Class clazz, Object value) { return toEnum(clazz, value, null); } @@ -643,35 +549,27 @@ public class Convert * 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static BigInteger toBigInteger(Object value, BigInteger defaultValue) - { - if (value == null) - { + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) { + if (value == null) { return defaultValue; } - if (value instanceof BigInteger) - { + if (value instanceof BigInteger) { return (BigInteger) value; } - if (value instanceof Long) - { + if (value instanceof Long) { return BigInteger.valueOf((Long) value); } final String valueStr = toStr(value, null); - if (StringUtils.isEmpty(valueStr)) - { + if (StringUtils.isEmpty(valueStr)) { return defaultValue; } - try - { + try { return new BigInteger(valueStr); - } - catch (Exception e) - { + } catch (Exception e) { return defaultValue; } } @@ -684,8 +582,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static BigInteger toBigInteger(Object value) - { + public static BigInteger toBigInteger(Object value) { return toBigInteger(value, null); } @@ -694,43 +591,33 @@ public class Convert * 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错 * - * @param value 被转换的值 + * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ - public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) - { - if (value == null) - { + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) { + if (value == null) { return defaultValue; } - if (value instanceof BigDecimal) - { + if (value instanceof BigDecimal) { return (BigDecimal) value; } - if (value instanceof Long) - { + if (value instanceof Long) { return new BigDecimal((Long) value); } - if (value instanceof Double) - { + if (value instanceof Double) { return BigDecimal.valueOf((Double) value); } - if (value instanceof Integer) - { + if (value instanceof Integer) { return new BigDecimal((Integer) value); } final String valueStr = toStr(value, null); - if (StringUtils.isEmpty(valueStr)) - { + if (StringUtils.isEmpty(valueStr)) { return defaultValue; } - try - { + try { return new BigDecimal(valueStr); - } - catch (Exception e) - { + } catch (Exception e) { return defaultValue; } } @@ -743,8 +630,7 @@ public class Convert * @param value 被转换的值 * @return 结果 */ - public static BigDecimal toBigDecimal(Object value) - { + public static BigDecimal toBigDecimal(Object value) { return toBigDecimal(value, null); } @@ -755,8 +641,7 @@ public class Convert * @param obj 对象 * @return 字符串 */ - public static String utf8Str(Object obj) - { + public static String utf8Str(Object obj) { return str(obj, CharsetKit.CHARSET_UTF_8); } @@ -764,12 +649,11 @@ public class Convert * 将对象转为字符串
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 * - * @param obj 对象 + * @param obj 对象 * @param charsetName 字符集 * @return 字符串 */ - public static String str(Object obj, String charsetName) - { + public static String str(Object obj, String charsetName) { return str(obj, Charset.forName(charsetName)); } @@ -777,32 +661,23 @@ public class Convert * 将对象转为字符串
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 * - * @param obj 对象 + * @param obj 对象 * @param charset 字符集 * @return 字符串 */ - public static String str(Object obj, Charset charset) - { - if (null == obj) - { + public static String str(Object obj, Charset charset) { + if (null == obj) { return null; } - if (obj instanceof String) - { + if (obj instanceof String) { return (String) obj; - } - else if (obj instanceof byte[]) - { + } else if (obj instanceof byte[]) { return str((byte[]) obj, charset); - } - else if (obj instanceof Byte[]) - { + } else if (obj instanceof Byte[]) { byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); return str(bytes, charset); - } - else if (obj instanceof ByteBuffer) - { + } else if (obj instanceof ByteBuffer) { return str((ByteBuffer) obj, charset); } return obj.toString(); @@ -811,31 +686,27 @@ public class Convert /** * 将byte数组转为字符串 * - * @param bytes byte数组 + * @param bytes byte数组 * @param charset 字符集 * @return 字符串 */ - public static String str(byte[] bytes, String charset) - { + public static String str(byte[] bytes, String charset) { return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); } /** * 解码字节码 * - * @param data 字符串 + * @param data 字符串 * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 * @return 解码后的字符串 */ - public static String str(byte[] data, Charset charset) - { - if (data == null) - { + public static String str(byte[] data, Charset charset) { + if (data == null) { return null; } - if (null == charset) - { + if (null == charset) { return new String(data); } return new String(data, charset); @@ -844,14 +715,12 @@ public class Convert /** * 将编码的byteBuffer数据转换为字符串 * - * @param data 数据 + * @param data 数据 * @param charset 字符集,如果为空使用当前系统字符集 * @return 字符串 */ - public static String str(ByteBuffer data, String charset) - { - if (data == null) - { + public static String str(ByteBuffer data, String charset) { + if (data == null) { return null; } @@ -861,55 +730,47 @@ public class Convert /** * 将编码的byteBuffer数据转换为字符串 * - * @param data 数据 + * @param data 数据 * @param charset 字符集,如果为空使用当前系统字符集 * @return 字符串 */ - public static String str(ByteBuffer data, Charset charset) - { - if (null == charset) - { + public static String str(ByteBuffer data, Charset charset) { + if (null == charset) { charset = Charset.defaultCharset(); } return charset.decode(data).toString(); } // ----------------------------------------------------------------------- 全角半角转换 + /** * 半角转全角 * * @param input String. * @return 全角字符串. */ - public static String toSBC(String input) - { + public static String toSBC(String input) { return toSBC(input, null); } /** * 半角转全角 * - * @param input String + * @param input String * @param notConvertSet 不替换的字符集合 * @return 全角字符串. */ - public static String toSBC(String input, Set notConvertSet) - { + public static String toSBC(String input, Set notConvertSet) { char[] c = input.toCharArray(); - for (int i = 0; i < c.length; i++) - { - if (null != notConvertSet && notConvertSet.contains(c[i])) - { + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { // 跳过不替换的字符 continue; } - if (c[i] == ' ') - { + if (c[i] == ' ') { c[i] = '\u3000'; - } - else if (c[i] < '\177') - { + } else if (c[i] < '\177') { c[i] = (char) (c[i] + 65248); } @@ -923,35 +784,28 @@ public class Convert * @param input String. * @return 半角字符串 */ - public static String toDBC(String input) - { + public static String toDBC(String input) { return toDBC(input, null); } /** * 替换全角为半角 * - * @param text 文本 + * @param text 文本 * @param notConvertSet 不替换的字符集合 * @return 替换后的字符 */ - public static String toDBC(String text, Set notConvertSet) - { + public static String toDBC(String text, Set notConvertSet) { char[] c = text.toCharArray(); - for (int i = 0; i < c.length; i++) - { - if (null != notConvertSet && notConvertSet.contains(c[i])) - { + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { // 跳过不替换的字符 continue; } - if (c[i] == '\u3000') - { + if (c[i] == '\u3000') { c[i] = ' '; - } - else if (c[i] > '\uFF00' && c[i] < '\uFF5F') - { + } else if (c[i] > '\uFF00' && c[i] < '\uFF5F') { c[i] = (char) (c[i] - 65248); } } @@ -966,18 +820,16 @@ public class Convert * @param n 数字 * @return 中文大写数字 */ - public static String digitUppercase(double n) - { - String[] fraction = { "角", "分" }; - String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; - String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } }; + public static String digitUppercase(double n) { + String[] fraction = {"角", "分"}; + String[] digit = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; + String[][] unit = {{"元", "万", "亿"}, {"", "拾", "佰", "仟"}}; String head = n < 0 ? "负" : ""; n = Math.abs(n); String s = ""; - for (int i = 0; i < fraction.length; i++) - { + for (int i = 0; i < fraction.length; i++) { // 优化double计算精度丢失问题 BigDecimal nNum = new BigDecimal(n); BigDecimal decimal = new BigDecimal(10); @@ -985,17 +837,14 @@ public class Convert double d = scale.doubleValue(); s += (digit[(int) (Math.floor(d * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); } - if (s.length() < 1) - { + if (s.length() < 1) { s = "整"; } int integerPart = (int) Math.floor(n); - for (int i = 0; i < unit[0].length && integerPart > 0; i++) - { + for (int i = 0; i < unit[0].length && integerPart > 0; i++) { String p = ""; - for (int j = 0; j < unit[1].length && n > 0; j++) - { + for (int j = 0; j < unit[1].length && n > 0; j++) { p = digit[integerPart % 10] + unit[1][j] + p; integerPart = integerPart / 10; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java index c78ac77..eec64f9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java @@ -4,11 +4,10 @@ import com.ruoyi.common.utils.StringUtils; /** * 字符串格式化 - * + * * @author ruoyi */ -public class StrFormatter -{ +public class StrFormatter { public static final String EMPTY_JSON = "{}"; public static final char C_BACKSLASH = '\\'; public static final char C_DELIM_START = '{'; @@ -22,15 +21,13 @@ public class StrFormatter * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
- * + * * @param strPattern 字符串模板 - * @param argArray 参数列表 + * @param argArray 参数列表 * @return 结果 */ - public static String format(final String strPattern, final Object... argArray) - { - if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) - { + public static String format(final String strPattern, final Object... argArray) { + if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) { return strPattern; } final int strPatternLength = strPattern.length(); @@ -40,43 +37,30 @@ public class StrFormatter int handledPosition = 0; int delimIndex;// 占位符所在位置 - for (int argIndex = 0; argIndex < argArray.length; argIndex++) - { + for (int argIndex = 0; argIndex < argArray.length; argIndex++) { delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); - if (delimIndex == -1) - { - if (handledPosition == 0) - { + if (delimIndex == -1) { + if (handledPosition == 0) { return strPattern; - } - else - { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 + } else { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 sbuf.append(strPattern, handledPosition, strPatternLength); return sbuf.toString(); } - } - else - { - if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) - { - if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) - { + } else { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) { // 转义符之前还有一个转义符,占位符依旧有效 sbuf.append(strPattern, handledPosition, delimIndex - 1); sbuf.append(Convert.utf8Str(argArray[argIndex])); handledPosition = delimIndex + 2; - } - else - { + } else { // 占位符被转义 argIndex--; sbuf.append(strPattern, handledPosition, delimIndex - 1); sbuf.append(C_DELIM_START); handledPosition = delimIndex + 1; } - } - else - { + } else { // 正常占位符 sbuf.append(strPattern, handledPosition, delimIndex); sbuf.append(Convert.utf8Str(argArray[argIndex])); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/AddGroup.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/AddGroup.java new file mode 100644 index 0000000..e1934e1 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/AddGroup.java @@ -0,0 +1,9 @@ +package com.ruoyi.common.core.validate; + +/** + * 校验分组 add + * + * @author Lion Li + */ +public interface AddGroup { +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/EditGroup.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/EditGroup.java new file mode 100644 index 0000000..3c6ca7f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/EditGroup.java @@ -0,0 +1,9 @@ +package com.ruoyi.common.core.validate; + +/** + * 校验分组 edit + * + * @author Lion Li + */ +public interface EditGroup { +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/QueryGroup.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/QueryGroup.java new file mode 100644 index 0000000..bbbfe03 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/QueryGroup.java @@ -0,0 +1,9 @@ +package com.ruoyi.common.core.validate; + +/** + * 校验分组 query + * + * @author Lion Li + */ +public interface QueryGroup { +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java index 10b7306..ce32cb4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java @@ -2,12 +2,10 @@ package com.ruoyi.common.enums; /** * 操作状态 - * - * @author ruoyi * + * @author ruoyi */ -public enum BusinessStatus -{ +public enum BusinessStatus { /** * 成功 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java index 2e17c4a..2d2f2e4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java @@ -2,11 +2,10 @@ package com.ruoyi.common.enums; /** * 业务操作类型 - * + * * @author ruoyi */ -public enum BusinessType -{ +public enum BusinessType { /** * 其它 */ @@ -51,7 +50,7 @@ public enum BusinessType * 生成代码 */ GENCODE, - + /** * 清空数据 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java index 0d945be..e9ed99a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java @@ -2,11 +2,10 @@ package com.ruoyi.common.enums; /** * 数据源 - * + * * @author ruoyi */ -public enum DataSourceType -{ +public enum DataSourceType { /** * 主库 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java index be6f739..bd1bfcc 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java @@ -1,36 +1,32 @@ package com.ruoyi.common.enums; +import org.springframework.lang.Nullable; + import java.util.HashMap; import java.util.Map; -import org.springframework.lang.Nullable; /** * 请求方式 * * @author ruoyi */ -public enum HttpMethod -{ +public enum HttpMethod { GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; private static final Map mappings = new HashMap<>(16); - static - { - for (HttpMethod httpMethod : values()) - { + static { + for (HttpMethod httpMethod : values()) { mappings.put(httpMethod.name(), httpMethod); } } @Nullable - public static HttpMethod resolve(@Nullable String method) - { + public static HttpMethod resolve(@Nullable String method) { return (method != null ? mappings.get(method) : null); } - public boolean matches(String method) - { + public boolean matches(String method) { return (this == resolve(method)); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java index c609fd8..847cc85 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java @@ -6,8 +6,7 @@ package com.ruoyi.common.enums; * @author ruoyi */ -public enum LimitType -{ +public enum LimitType { /** * 默认策略全局限流 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java index bdd143c..3c4127d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java @@ -2,11 +2,10 @@ package com.ruoyi.common.enums; /** * 操作人类别 - * + * * @author ruoyi */ -public enum OperatorType -{ +public enum OperatorType { /** * 其它 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java index d7ff44a..673ddeb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java @@ -2,29 +2,25 @@ package com.ruoyi.common.enums; /** * 用户状态 - * + * * @author ruoyi */ -public enum UserStatus -{ +public enum UserStatus { OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除"); private final String code; private final String info; - UserStatus(String code, String info) - { + UserStatus(String code, String info) { this.code = code; this.info = info; } - public String getCode() - { + public String getCode() { return code; } - public String getInfo() - { + public String getInfo() { return info; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/excel/CellMergeStrategy.java b/ruoyi-common/src/main/java/com/ruoyi/common/excel/CellMergeStrategy.java new file mode 100644 index 0000000..3dfe16f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/excel/CellMergeStrategy.java @@ -0,0 +1,114 @@ +package com.ruoyi.common.excel; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.write.merge.AbstractMergeStrategy; +import com.ruoyi.common.annotation.CellMerge; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 列值重复合并策略 + * + * @author Lion Li + */ +@AllArgsConstructor +@Slf4j +public class CellMergeStrategy extends AbstractMergeStrategy { + + private List list; + private boolean hasTitle; + + @SneakyThrows + private static List handle(List list, boolean hasTitle) { + List cellList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + return cellList; + } + Class clazz = list.get(0).getClass(); + Field[] fields = clazz.getDeclaredFields(); + // 有注解的字段 + List mergeFields = new ArrayList<>(); + List mergeFieldsIndex = new ArrayList<>(); + for (int i = 0; i < fields.length; i++) { + Field field = fields[i]; + if (field.isAnnotationPresent(CellMerge.class)) { + CellMerge cm = field.getAnnotation(CellMerge.class); + mergeFields.add(field); + mergeFieldsIndex.add(cm.index() == -1 ? i : cm.index()); + } + } + // 行合并开始下标 + int rowIndex = hasTitle ? 1 : 0; + Map map = new HashMap<>(); + // 生成两两合并单元格 + for (int i = 0; i < list.size(); i++) { + for (int j = 0; j < mergeFields.size(); j++) { + Field field = mergeFields.get(j); + String name = field.getName(); + String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1); + Method readMethod = clazz.getMethod(methodName); + Object val = readMethod.invoke(list.get(i)); + + int colNum = mergeFieldsIndex.get(j); + if (!map.containsKey(field)) { + map.put(field, new RepeatCell(val, i)); + } else { + RepeatCell repeatCell = map.get(field); + Object cellValue = repeatCell.getValue(); + if (cellValue == null || "".equals(cellValue)) { + // 空值跳过不合并 + continue; + } + if (!cellValue.equals(val)) { + if (i - repeatCell.getCurrent() > 1) { + cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum)); + } + map.put(field, new RepeatCell(val, i)); + } else if (i == list.size() - 1) { + if (i > repeatCell.getCurrent()) { + cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex, colNum, colNum)); + } + } + } + } + } + return cellList; + } + + @Override + protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { + List cellList = handle(list, hasTitle); + // judge the list is not null + if (CollectionUtils.isNotEmpty(cellList)) { + // the judge is necessary + if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) { + for (CellRangeAddress item : cellList) { + sheet.addMergedRegion(item); + } + } + } + } + + @Data + @AllArgsConstructor + static class RepeatCell { + + private Object value; + + private int current; + + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java new file mode 100644 index 0000000..20ca3ae --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java @@ -0,0 +1,106 @@ +package com.ruoyi.common.excel; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.exception.ExcelAnalysisException; +import com.alibaba.excel.exception.ExcelDataConvertException; +import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.common.utils.StreamUtils; +import com.ruoyi.common.utils.ValidatorUtils; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import java.util.Map; +import java.util.Set; + +/** + * Excel 导入监听 + * + * @author Yjoioooo + * @author Lion Li + */ +@Slf4j +@NoArgsConstructor +public class DefaultExcelListener extends AnalysisEventListener implements ExcelListener { + + /** + * 是否Validator检验,默认为是 + */ + private Boolean isValidate = Boolean.TRUE; + + /** + * excel 表头数据 + */ + private Map headMap; + + /** + * 导入回执 + */ + private ExcelResult excelResult; + + public DefaultExcelListener(boolean isValidate) { + this.excelResult = new DefaultExcelResult<>(); + this.isValidate = isValidate; + } + + /** + * 处理异常 + * + * @param exception ExcelDataConvertException + * @param context Excel 上下文 + */ + @Override + public void onException(Exception exception, AnalysisContext context) throws Exception { + String errMsg = null; + if (exception instanceof ExcelDataConvertException) { + // 如果是某一个单元格的转换异常 能获取到具体行号 + ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception; + Integer rowIndex = excelDataConvertException.getRowIndex(); + Integer columnIndex = excelDataConvertException.getColumnIndex(); + errMsg = StrUtil.format("第{}行-第{}列-表头{}: 解析异常
", + rowIndex + 1, columnIndex + 1, headMap.get(columnIndex)); + if (log.isDebugEnabled()) { + log.error(errMsg); + } + } + if (exception instanceof ConstraintViolationException) { + ConstraintViolationException constraintViolationException = (ConstraintViolationException) exception; + Set> constraintViolations = constraintViolationException.getConstraintViolations(); + String constraintViolationsMsg = StreamUtils.join(constraintViolations, ConstraintViolation::getMessage, ", "); + errMsg = StrUtil.format("第{}行数据校验异常: {}", context.readRowHolder().getRowIndex() + 1, constraintViolationsMsg); + if (log.isDebugEnabled()) { + log.error(errMsg); + } + } + excelResult.getErrorList().add(errMsg); + throw new ExcelAnalysisException(errMsg); + } + + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + this.headMap = headMap; + log.debug("解析到一条表头数据: {}", JsonUtils.toJsonString(headMap)); + } + + @Override + public void invoke(T data, AnalysisContext context) { + if (isValidate) { + ValidatorUtils.validate(data); + } + excelResult.getList().add(data); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + log.debug("所有数据解析完成!"); + } + + @Override + public ExcelResult getExcelResult() { + return excelResult; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelResult.java new file mode 100644 index 0000000..5ef65bf --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelResult.java @@ -0,0 +1,73 @@ +package com.ruoyi.common.excel; + +import cn.hutool.core.util.StrUtil; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +/** + * 默认excel返回对象 + * + * @author Yjoioooo + * @author Lion Li + */ +public class DefaultExcelResult implements ExcelResult { + + /** + * 数据对象list + */ + @Setter + private List list; + + /** + * 错误信息列表 + */ + @Setter + private List errorList; + + public DefaultExcelResult() { + this.list = new ArrayList<>(); + this.errorList = new ArrayList<>(); + } + + public DefaultExcelResult(List list, List errorList) { + this.list = list; + this.errorList = errorList; + } + + public DefaultExcelResult(ExcelResult excelResult) { + this.list = excelResult.getList(); + this.errorList = excelResult.getErrorList(); + } + + @Override + public List getList() { + return list; + } + + @Override + public List getErrorList() { + return errorList; + } + + /** + * 获取导入回执 + * + * @return 导入回执 + */ + @Override + public String getAnalysis() { + int successCount = list.size(); + int errorCount = errorList.size(); + if (successCount == 0) { + return "读取失败,未解析到数据"; + } else { + if (errorCount == 0) { + return StrUtil.format("恭喜您,全部读取成功!共{}条", successCount); + } else { + return ""; + } + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/excel/ExcelListener.java b/ruoyi-common/src/main/java/com/ruoyi/common/excel/ExcelListener.java new file mode 100644 index 0000000..2064cad --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/excel/ExcelListener.java @@ -0,0 +1,14 @@ +package com.ruoyi.common.excel; + +import com.alibaba.excel.read.listener.ReadListener; + +/** + * Excel 导入监听 + * + * @author Lion Li + */ +public interface ExcelListener extends ReadListener { + + ExcelResult getExcelResult(); + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/excel/ExcelResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/excel/ExcelResult.java new file mode 100644 index 0000000..63f8b8a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/excel/ExcelResult.java @@ -0,0 +1,26 @@ +package com.ruoyi.common.excel; + +import java.util.List; + +/** + * excel返回对象 + * + * @author Lion Li + */ +public interface ExcelResult { + + /** + * 对象列表 + */ + List getList(); + + /** + * 错误列表 + */ + List getErrorList(); + + /** + * 导入回执 + */ + String getAnalysis(); +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java index f6ad2ab..9178131 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java @@ -2,14 +2,12 @@ package com.ruoyi.common.exception; /** * 演示模式异常 - * + * * @author ruoyi */ -public class DemoModeException extends RuntimeException -{ +public class DemoModeException extends RuntimeException { private static final long serialVersionUID = 1L; - public DemoModeException() - { + public DemoModeException() { } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java index 81a71b5..d0d9441 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java @@ -2,11 +2,10 @@ package com.ruoyi.common.exception; /** * 全局异常 - * + * * @author ruoyi */ -public class GlobalException extends RuntimeException -{ +public class GlobalException extends RuntimeException { private static final long serialVersionUID = 1L; /** @@ -16,7 +15,7 @@ public class GlobalException extends RuntimeException /** * 错误明细,内部调试错误 - * + *

* 和 {@link CommonResult#getDetailMessage()} 一致的设计 */ private String detailMessage; @@ -24,34 +23,28 @@ public class GlobalException extends RuntimeException /** * 空构造方法,避免反序列化问题 */ - public GlobalException() - { + public GlobalException() { } - public GlobalException(String message) - { + public GlobalException(String message) { this.message = message; } - public String getDetailMessage() - { + public String getDetailMessage() { return detailMessage; } - public GlobalException setDetailMessage(String detailMessage) - { + public GlobalException setDetailMessage(String detailMessage) { this.detailMessage = detailMessage; return this; } @Override - public String getMessage() - { + public String getMessage() { return message; } - public GlobalException setMessage(String message) - { + public GlobalException setMessage(String message) { this.message = message; return this; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java index fcc7ab6..6f361a9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java @@ -2,11 +2,10 @@ package com.ruoyi.common.exception; /** * 业务异常 - * + * * @author ruoyi */ -public final class ServiceException extends RuntimeException -{ +public final class ServiceException extends RuntimeException { private static final long serialVersionUID = 1L; /** @@ -21,7 +20,7 @@ public final class ServiceException extends RuntimeException /** * 错误明细,内部调试错误 - * + *

* 和 {@link CommonResult#getDetailMessage()} 一致的设计 */ private String detailMessage; @@ -29,46 +28,38 @@ public final class ServiceException extends RuntimeException /** * 空构造方法,避免反序列化问题 */ - public ServiceException() - { + public ServiceException() { } - public ServiceException(String message) - { + public ServiceException(String message) { this.message = message; } - public ServiceException(String message, Integer code) - { + public ServiceException(String message, Integer code) { this.message = message; this.code = code; } - public String getDetailMessage() - { + public String getDetailMessage() { return detailMessage; } - @Override - public String getMessage() - { - return message; + public ServiceException setDetailMessage(String detailMessage) { + this.detailMessage = detailMessage; + return this; } - public Integer getCode() - { - return code; + @Override + public String getMessage() { + return message; } - public ServiceException setMessage(String message) - { + public ServiceException setMessage(String message) { this.message = message; return this; } - public ServiceException setDetailMessage(String detailMessage) - { - this.detailMessage = detailMessage; - return this; + public Integer getCode() { + return code; } } \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/UtilException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/UtilException.java index 980fa46..01cc878 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/UtilException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/UtilException.java @@ -2,25 +2,21 @@ package com.ruoyi.common.exception; /** * 工具类异常 - * + * * @author ruoyi */ -public class UtilException extends RuntimeException -{ +public class UtilException extends RuntimeException { private static final long serialVersionUID = 8247610319171014183L; - public UtilException(Throwable e) - { + public UtilException(Throwable e) { super(e.getMessage(), e); } - public UtilException(String message) - { + public UtilException(String message) { super(message); } - public UtilException(String message, Throwable throwable) - { + public UtilException(String message, Throwable throwable) { super(message, throwable); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java index b55d72e..c4ff125 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java @@ -5,11 +5,10 @@ import com.ruoyi.common.utils.StringUtils; /** * 基础异常 - * + * * @author ruoyi */ -public class BaseException extends RuntimeException -{ +public class BaseException extends RuntimeException { private static final long serialVersionUID = 1L; /** @@ -32,66 +31,54 @@ public class BaseException extends RuntimeException */ private String defaultMessage; - public BaseException(String module, String code, Object[] args, String defaultMessage) - { + public BaseException(String module, String code, Object[] args, String defaultMessage) { this.module = module; this.code = code; this.args = args; this.defaultMessage = defaultMessage; } - public BaseException(String module, String code, Object[] args) - { + public BaseException(String module, String code, Object[] args) { this(module, code, args, null); } - public BaseException(String module, String defaultMessage) - { + public BaseException(String module, String defaultMessage) { this(module, null, null, defaultMessage); } - public BaseException(String code, Object[] args) - { + public BaseException(String code, Object[] args) { this(null, code, args, null); } - public BaseException(String defaultMessage) - { + public BaseException(String defaultMessage) { this(null, null, null, defaultMessage); } @Override - public String getMessage() - { + public String getMessage() { String message = null; - if (!StringUtils.isEmpty(code)) - { + if (!StringUtils.isEmpty(code)) { message = MessageUtils.message(code, args); } - if (message == null) - { + if (message == null) { message = defaultMessage; } return message; } - public String getModule() - { + public String getModule() { return module; } - public String getCode() - { + public String getCode() { return code; } - public Object[] getArgs() - { + public Object[] getArgs() { return args; } - public String getDefaultMessage() - { + public String getDefaultMessage() { return defaultMessage; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java index 871f09b..794f4e1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java @@ -4,15 +4,13 @@ import com.ruoyi.common.exception.base.BaseException; /** * 文件信息异常类 - * + * * @author ruoyi */ -public class FileException extends BaseException -{ +public class FileException extends BaseException { private static final long serialVersionUID = 1L; - public FileException(String code, Object[] args) - { + public FileException(String code, Object[] args) { super("file", code, args, null); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java index 70e0ec9..64a5020 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java @@ -2,15 +2,13 @@ package com.ruoyi.common.exception.file; /** * 文件名称超长限制异常类 - * + * * @author ruoyi */ -public class FileNameLengthLimitExceededException extends FileException -{ +public class FileNameLengthLimitExceededException extends FileException { private static final long serialVersionUID = 1L; - public FileNameLengthLimitExceededException(int defaultFileNameLength) - { - super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }); + public FileNameLengthLimitExceededException(int defaultFileNameLength) { + super("upload.filename.exceed.length", new Object[]{defaultFileNameLength}); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java index ec6ab05..93e9e1c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java @@ -2,15 +2,13 @@ package com.ruoyi.common.exception.file; /** * 文件名大小限制异常类 - * + * * @author ruoyi */ -public class FileSizeLimitExceededException extends FileException -{ +public class FileSizeLimitExceededException extends FileException { private static final long serialVersionUID = 1L; - public FileSizeLimitExceededException(long defaultMaxSize) - { - super("upload.exceed.maxSize", new Object[] { defaultMaxSize }); + public FileSizeLimitExceededException(long defaultMaxSize) { + super("upload.exceed.maxSize", new Object[]{defaultMaxSize}); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileUploadException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileUploadException.java index f45e7ef..4153ce8 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileUploadException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileUploadException.java @@ -5,57 +5,48 @@ import java.io.PrintWriter; /** * 文件上传异常类 - * + * * @author ruoyi */ -public class FileUploadException extends Exception -{ +public class FileUploadException extends Exception { private static final long serialVersionUID = 1L; private final Throwable cause; - public FileUploadException() - { + public FileUploadException() { this(null, null); } - public FileUploadException(final String msg) - { + public FileUploadException(final String msg) { this(msg, null); } - public FileUploadException(String msg, Throwable cause) - { + public FileUploadException(String msg, Throwable cause) { super(msg); this.cause = cause; } @Override - public void printStackTrace(PrintStream stream) - { + public void printStackTrace(PrintStream stream) { super.printStackTrace(stream); - if (cause != null) - { + if (cause != null) { stream.println("Caused by:"); cause.printStackTrace(stream); } } @Override - public void printStackTrace(PrintWriter writer) - { + public void printStackTrace(PrintWriter writer) { super.printStackTrace(writer); - if (cause != null) - { + if (cause != null) { writer.println("Caused by:"); cause.printStackTrace(writer); } } @Override - public Throwable getCause() - { + public Throwable getCause() { return cause; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java index 011f308..3c6769c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java @@ -4,76 +4,63 @@ import java.util.Arrays; /** * 文件上传 误异常类 - * + * * @author ruoyi */ -public class InvalidExtensionException extends FileUploadException -{ +public class InvalidExtensionException extends FileUploadException { private static final long serialVersionUID = 1L; private String[] allowedExtension; private String extension; private String filename; - public InvalidExtensionException(String[] allowedExtension, String extension, String filename) - { + public InvalidExtensionException(String[] allowedExtension, String extension, String filename) { super("文件[" + filename + "]后缀[" + extension + "]不正确,请上传" + Arrays.toString(allowedExtension) + "格式"); this.allowedExtension = allowedExtension; this.extension = extension; this.filename = filename; } - public String[] getAllowedExtension() - { + public String[] getAllowedExtension() { return allowedExtension; } - public String getExtension() - { + public String getExtension() { return extension; } - public String getFilename() - { + public String getFilename() { return filename; } - public static class InvalidImageExtensionException extends InvalidExtensionException - { + public static class InvalidImageExtensionException extends InvalidExtensionException { private static final long serialVersionUID = 1L; - public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) - { + public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) { super(allowedExtension, extension, filename); } } - public static class InvalidFlashExtensionException extends InvalidExtensionException - { + public static class InvalidFlashExtensionException extends InvalidExtensionException { private static final long serialVersionUID = 1L; - public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) - { + public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) { super(allowedExtension, extension, filename); } } - public static class InvalidMediaExtensionException extends InvalidExtensionException - { + public static class InvalidMediaExtensionException extends InvalidExtensionException { private static final long serialVersionUID = 1L; - public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) - { + public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) { super(allowedExtension, extension, filename); } } - public static class InvalidVideoExtensionException extends InvalidExtensionException - { + public static class InvalidVideoExtensionException extends InvalidExtensionException { private static final long serialVersionUID = 1L; - public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) - { + public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) { super(allowedExtension, extension, filename); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java index a567b40..c9ac31f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java @@ -2,33 +2,28 @@ package com.ruoyi.common.exception.job; /** * 计划策略异常 - * + * * @author ruoyi */ -public class TaskException extends Exception -{ +public class TaskException extends Exception { private static final long serialVersionUID = 1L; private Code code; - public TaskException(String msg, Code code) - { + public TaskException(String msg, Code code) { this(msg, code, null); } - public TaskException(String msg, Code code, Exception nestedEx) - { + public TaskException(String msg, Code code, Exception nestedEx) { super(msg, nestedEx); this.code = code; } - public Code getCode() - { + public Code getCode() { return code; } - public enum Code - { + public enum Code { TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE } } \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/BlackListException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/BlackListException.java index 2bf5038..6bf6db0 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/BlackListException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/BlackListException.java @@ -2,15 +2,13 @@ package com.ruoyi.common.exception.user; /** * 黑名单IP异常类 - * + * * @author ruoyi */ -public class BlackListException extends UserException -{ +public class BlackListException extends UserException { private static final long serialVersionUID = 1L; - public BlackListException() - { + public BlackListException() { super("login.blocked", null); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java index 389dbc7..9040485 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java @@ -2,15 +2,13 @@ package com.ruoyi.common.exception.user; /** * 验证码错误异常类 - * + * * @author ruoyi */ -public class CaptchaException extends UserException -{ +public class CaptchaException extends UserException { private static final long serialVersionUID = 1L; - public CaptchaException() - { + public CaptchaException() { super("user.jcaptcha.error", null); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java index 85f9486..ae5f759 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java @@ -2,15 +2,13 @@ package com.ruoyi.common.exception.user; /** * 验证码失效异常类 - * + * * @author ruoyi */ -public class CaptchaExpireException extends UserException -{ +public class CaptchaExpireException extends UserException { private static final long serialVersionUID = 1L; - public CaptchaExpireException() - { + public CaptchaExpireException() { super("user.jcaptcha.expire", null); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java index c292d70..94dbcdd 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java @@ -4,15 +4,13 @@ import com.ruoyi.common.exception.base.BaseException; /** * 用户信息异常类 - * + * * @author ruoyi */ -public class UserException extends BaseException -{ +public class UserException extends BaseException { private static final long serialVersionUID = 1L; - public UserException(String code, Object[] args) - { + public UserException(String code, Object[] args) { super("user", code, args, null); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserNotExistsException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserNotExistsException.java index eff8181..9f19b90 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserNotExistsException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserNotExistsException.java @@ -2,15 +2,13 @@ package com.ruoyi.common.exception.user; /** * 用户不存在异常类 - * + * * @author ruoyi */ -public class UserNotExistsException extends UserException -{ +public class UserNotExistsException extends UserException { private static final long serialVersionUID = 1L; - public UserNotExistsException() - { + public UserNotExistsException() { super("user.not.exists", null); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java index a7f3e5f..0fab116 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java @@ -2,15 +2,13 @@ package com.ruoyi.common.exception.user; /** * 用户密码不正确或不符合规范异常类 - * + * * @author ruoyi */ -public class UserPasswordNotMatchException extends UserException -{ +public class UserPasswordNotMatchException extends UserException { private static final long serialVersionUID = 1L; - public UserPasswordNotMatchException() - { + public UserPasswordNotMatchException() { super("user.password.not.match", null); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java index c887cf1..6340773 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java @@ -2,15 +2,13 @@ package com.ruoyi.common.exception.user; /** * 用户错误最大次数异常类 - * + * * @author ruoyi */ -public class UserPasswordRetryLimitExceedException extends UserException -{ +public class UserPasswordRetryLimitExceedException extends UserException { private static final long serialVersionUID = 1L; - public UserPasswordRetryLimitExceedException(int retryLimitCount, int lockTime) - { - super("user.password.retry.limit.exceed", new Object[] { retryLimitCount, lockTime }); + public UserPasswordRetryLimitExceedException(int retryLimitCount, int lockTime) { + super("user.password.retry.limit.exceed", new Object[]{retryLimitCount, lockTime}); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/PropertyPreExcludeFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/PropertyPreExcludeFilter.java index e1e431b..d0daa16 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/PropertyPreExcludeFilter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/PropertyPreExcludeFilter.java @@ -4,19 +4,15 @@ import com.alibaba.fastjson2.filter.SimplePropertyPreFilter; /** * 排除JSON敏感属性 - * + * * @author ruoyi */ -public class PropertyPreExcludeFilter extends SimplePropertyPreFilter -{ - public PropertyPreExcludeFilter() - { +public class PropertyPreExcludeFilter extends SimplePropertyPreFilter { + public PropertyPreExcludeFilter() { } - public PropertyPreExcludeFilter addExcludes(String... filters) - { - for (int i = 0; i < filters.length; i++) - { + public PropertyPreExcludeFilter addExcludes(String... filters) { + for (int i = 0; i < filters.length; i++) { this.getExcludes().add(filters[i]); } return this; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java index a1bcfe2..6b75394 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java @@ -1,6 +1,8 @@ package com.ruoyi.common.filter; -import java.io.IOException; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.http.MediaType; + import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -8,45 +10,36 @@ import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; -import org.springframework.http.MediaType; -import com.ruoyi.common.utils.StringUtils; +import java.io.IOException; /** * Repeatable 过滤器 - * + * * @author ruoyi */ -public class RepeatableFilter implements Filter -{ +public class RepeatableFilter implements Filter { @Override - public void init(FilterConfig filterConfig) throws ServletException - { + public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException - { + throws IOException, ServletException { ServletRequest requestWrapper = null; if (request instanceof HttpServletRequest - && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) - { + && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) { requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); } - if (null == requestWrapper) - { + if (null == requestWrapper) { chain.doFilter(request, response); - } - else - { + } else { chain.doFilter(requestWrapper, response); } } @Override - public void destroy() - { + public void destroy() { } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java index 407d1ba..62d8972 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java @@ -1,28 +1,27 @@ package com.ruoyi.common.filter; -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStreamReader; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.http.HttpHelper; + import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; -import com.ruoyi.common.utils.http.HttpHelper; -import com.ruoyi.common.constant.Constants; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; /** * 构建可重复读取inputStream的request - * + * * @author ruoyi */ -public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper -{ +public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper { private final byte[] body; - public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException - { + public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException { super(request); request.setCharacterEncoding(Constants.UTF8); response.setCharacterEncoding(Constants.UTF8); @@ -31,44 +30,36 @@ public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper } @Override - public BufferedReader getReader() throws IOException - { + public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override - public ServletInputStream getInputStream() throws IOException - { + public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream bais = new ByteArrayInputStream(body); - return new ServletInputStream() - { + return new ServletInputStream() { @Override - public int read() throws IOException - { + public int read() throws IOException { return bais.read(); } @Override - public int available() throws IOException - { + public int available() throws IOException { return body.length; } @Override - public boolean isFinished() - { + public boolean isFinished() { return false; } @Override - public boolean isReady() - { + public boolean isReady() { return false; } @Override - public void setReadListener(ReadListener readListener) - { + public void setReadListener(ReadListener readListener) { } }; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java index 9052f0d..a18a8e3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java @@ -1,8 +1,8 @@ package com.ruoyi.common.filter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import com.ruoyi.common.enums.HttpMethod; +import com.ruoyi.common.utils.StringUtils; + import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -11,30 +11,27 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.enums.HttpMethod; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; /** * 防止XSS攻击的过滤器 - * + * * @author ruoyi */ -public class XssFilter implements Filter -{ +public class XssFilter implements Filter { /** * 排除链接 */ public List excludes = new ArrayList<>(); @Override - public void init(FilterConfig filterConfig) throws ServletException - { + public void init(FilterConfig filterConfig) throws ServletException { String tempExcludes = filterConfig.getInitParameter("excludes"); - if (StringUtils.isNotEmpty(tempExcludes)) - { + if (StringUtils.isNotEmpty(tempExcludes)) { String[] url = tempExcludes.split(","); - for (int i = 0; url != null && i < url.length; i++) - { + for (int i = 0; url != null && i < url.length; i++) { excludes.add(url[i]); } } @@ -42,12 +39,10 @@ public class XssFilter implements Filter @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException - { + throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; - if (handleExcludeURL(req, resp)) - { + if (handleExcludeURL(req, resp)) { chain.doFilter(request, response); return; } @@ -55,21 +50,18 @@ public class XssFilter implements Filter chain.doFilter(xssRequest, response); } - private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) - { + private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) { String url = request.getServletPath(); String method = request.getMethod(); // GET DELETE 不过滤 - if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) - { + if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) { return true; } return StringUtils.matches(url, excludes); } @Override - public void destroy() - { + public void destroy() { } } \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java index 05149f0..61eba17 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java @@ -1,42 +1,38 @@ package com.ruoyi.common.filter; -import java.io.ByteArrayInputStream; -import java.io.IOException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.html.EscapeUtil; +import org.apache.commons.io.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; + import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; -import org.apache.commons.io.IOUtils; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.html.EscapeUtil; +import java.io.ByteArrayInputStream; +import java.io.IOException; /** * XSS过滤处理 - * + * * @author ruoyi */ -public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper -{ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { /** * @param request */ - public XssHttpServletRequestWrapper(HttpServletRequest request) - { + public XssHttpServletRequestWrapper(HttpServletRequest request) { super(request); } @Override - public String[] getParameterValues(String name) - { + public String[] getParameterValues(String name) { String[] values = super.getParameterValues(name); - if (values != null) - { + if (values != null) { int length = values.length; String[] escapesValues = new String[length]; - for (int i = 0; i < length; i++) - { + for (int i = 0; i < length; i++) { // 防xss攻击和过滤前后空格 escapesValues[i] = EscapeUtil.clean(values[i]).trim(); } @@ -46,18 +42,15 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper } @Override - public ServletInputStream getInputStream() throws IOException - { + public ServletInputStream getInputStream() throws IOException { // 非json类型,直接返回 - if (!isJsonRequest()) - { + if (!isJsonRequest()) { return super.getInputStream(); } // 为空,直接返回 String json = IOUtils.toString(super.getInputStream(), "utf-8"); - if (StringUtils.isEmpty(json)) - { + if (StringUtils.isEmpty(json)) { return super.getInputStream(); } @@ -65,34 +58,28 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper json = EscapeUtil.clean(json).trim(); byte[] jsonBytes = json.getBytes("utf-8"); final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes); - return new ServletInputStream() - { + return new ServletInputStream() { @Override - public boolean isFinished() - { + public boolean isFinished() { return true; } @Override - public boolean isReady() - { + public boolean isReady() { return true; } @Override - public int available() throws IOException - { + public int available() throws IOException { return jsonBytes.length; } @Override - public void setReadListener(ReadListener readListener) - { + public void setReadListener(ReadListener readListener) { } @Override - public int read() throws IOException - { + public int read() throws IOException { return bis.read(); } }; @@ -100,11 +87,10 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper /** * 是否是Json请求 - * + * * @param request */ - public boolean isJsonRequest() - { + public boolean isJsonRequest() { String header = super.getHeader(HttpHeaders.CONTENT_TYPE); return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java index b6326c2..19a231c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java @@ -5,28 +5,30 @@ import java.math.RoundingMode; /** * 精确的浮点数运算 - * + * * @author ruoyi */ -public class Arith -{ +public class Arith { - /** 默认除法运算精度 */ + /** + * 默认除法运算精度 + */ private static final int DEF_DIV_SCALE = 10; - /** 这个类不能实例化 */ - private Arith() - { + /** + * 这个类不能实例化 + */ + private Arith() { } /** * 提供精确的加法运算。 + * * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ - public static double add(double v1, double v2) - { + public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); @@ -34,12 +36,12 @@ public class Arith /** * 提供精确的减法运算。 + * * @param v1 被减数 * @param v2 减数 * @return 两个参数的差 */ - public static double sub(double v1, double v2) - { + public static double sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); @@ -47,12 +49,12 @@ public class Arith /** * 提供精确的乘法运算。 + * * @param v1 被乘数 * @param v2 乘数 * @return 两个参数的积 */ - public static double mul(double v1, double v2) - { + public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); @@ -61,34 +63,32 @@ public class Arith /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 * 小数点以后10位,以后的数字四舍五入。 + * * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 */ - public static double div(double v1, double v2) - { + public static double div(double v1, double v2) { return div(v1, v2, DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 * 定精度,以后的数字四舍五入。 - * @param v1 被除数 - * @param v2 除数 + * + * @param v1 被除数 + * @param v2 除数 * @param scale 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ - public static double div(double v1, double v2, int scale) - { - if (scale < 0) - { + public static double div(double v1, double v2, int scale) { + if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); - if (b1.compareTo(BigDecimal.ZERO) == 0) - { + if (b1.compareTo(BigDecimal.ZERO) == 0) { return BigDecimal.ZERO.doubleValue(); } return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); @@ -96,14 +96,13 @@ public class Arith /** * 提供精确的小数位四舍五入处理。 - * @param v 需要四舍五入的数字 + * + * @param v 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */ - public static double round(double v, int scale) - { - if (scale < 0) - { + public static double round(double v, int scale) { + if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java new file mode 100644 index 0000000..e1bafee --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java @@ -0,0 +1,204 @@ +package com.ruoyi.common.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.SimpleCache; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.springframework.cglib.beans.BeanCopier; +import org.springframework.cglib.beans.BeanMap; +import org.springframework.cglib.core.Converter; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * bean深拷贝工具(基于 cglib 性能优异) + *

+ * 重点 cglib 不支持 拷贝到链式对象 + * 例如: 源对象 拷贝到 目标(链式对象) + * 请区分好`浅拷贝`和`深拷贝`再做使用 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class BeanCopyUtils { + + /** + * 单对象基于class创建拷贝 + * + * @param source 数据来源实体 + * @param desc 描述对象 转换后的对象 + * @return desc + */ + public static V copy(T source, Class desc) { + if (ObjectUtil.isNull(source)) { + return null; + } + if (ObjectUtil.isNull(desc)) { + return null; + } + final V target = ReflectUtil.newInstanceIfPossible(desc); + return copy(source, target); + } + + /** + * 单对象基于对象创建拷贝 + * + * @param source 数据来源实体 + * @param desc 转换后的对象 + * @return desc + */ + public static V copy(T source, V desc) { + if (ObjectUtil.isNull(source)) { + return null; + } + if (ObjectUtil.isNull(desc)) { + return null; + } + BeanCopier beanCopier = BeanCopierCache.INSTANCE.get(source.getClass(), desc.getClass(), null); + beanCopier.copy(source, desc, null); + return desc; + } + + /** + * 列表对象基于class创建拷贝 + * + * @param sourceList 数据来源实体列表 + * @param desc 描述对象 转换后的对象 + * @return desc + */ + public static List copyList(List sourceList, Class desc) { + if (ObjectUtil.isNull(sourceList)) { + return null; + } + if (CollUtil.isEmpty(sourceList)) { + return CollUtil.newArrayList(); + } + return StreamUtils.toList(sourceList, source -> { + V target = ReflectUtil.newInstanceIfPossible(desc); + copy(source, target); + return target; + }); + } + + /** + * bean拷贝到map + * + * @param bean 数据来源实体 + * @return map对象 + */ + @SuppressWarnings("unchecked") + public static Map copyToMap(T bean) { + if (ObjectUtil.isNull(bean)) { + return null; + } + return BeanMap.create(bean); + } + + /** + * map拷贝到bean + * + * @param map 数据来源 + * @param beanClass bean类 + * @return bean对象 + */ + public static T mapToBean(Map map, Class beanClass) { + if (MapUtil.isEmpty(map)) { + return null; + } + if (ObjectUtil.isNull(beanClass)) { + return null; + } + T bean = ReflectUtil.newInstanceIfPossible(beanClass); + return mapToBean(map, bean); + } + + /** + * map拷贝到bean + * + * @param map 数据来源 + * @param bean bean对象 + * @return bean对象 + */ + public static T mapToBean(Map map, T bean) { + if (MapUtil.isEmpty(map)) { + return null; + } + if (ObjectUtil.isNull(bean)) { + return null; + } + BeanMap.create(bean).putAll(map); + return bean; + } + + /** + * map拷贝到map + * + * @param map 数据来源 + * @param clazz 返回的对象类型 + * @return map对象 + */ + public static Map mapToMap(Map map, Class clazz) { + if (MapUtil.isEmpty(map)) { + return null; + } + if (ObjectUtil.isNull(clazz)) { + return null; + } + Map copyMap = new LinkedHashMap<>(map.size()); + map.forEach((k, v) -> copyMap.put(k, copy(v, clazz))); + return copyMap; + } + + /** + * BeanCopier属性缓存
+ * 缓存用于防止多次反射造成的性能问题 + * + * @author Looly + * @since 5.4.1 + */ + public enum BeanCopierCache { + /** + * BeanCopier属性缓存单例 + */ + INSTANCE; + + private final SimpleCache cache = new SimpleCache<>(); + + /** + * 获得类与转换器生成的key在{@link BeanCopier}的Map中对应的元素 + * + * @param srcClass 源Bean的类 + * @param targetClass 目标Bean的类 + * @param converter 转换器 + * @return Map中对应的BeanCopier + */ + public BeanCopier get(Class srcClass, Class targetClass, Converter converter) { + final String key = genKey(srcClass, targetClass, converter); + return cache.get(key, () -> BeanCopier.create(srcClass, targetClass, converter != null)); + } + + /** + * 获得类与转换器生成的key + * + * @param srcClass 源Bean的类 + * @param targetClass 目标Bean的类 + * @param converter 转换器 + * @return 属性名和Map映射的key + */ + private String genKey(Class srcClass, Class targetClass, Converter converter) { + final StringBuilder key = StrUtil.builder() + .append(srcClass.getName()).append('#').append(targetClass.getName()); + if (null != converter) { + key.append('#').append(converter.getClass().getName()); + } + return key.toString(); + } + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java index fb2ae21..624f917 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -1,5 +1,7 @@ package com.ruoyi.common.utils; +import org.apache.commons.lang3.time.DateFormatUtils; + import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -9,15 +11,13 @@ import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Date; -import org.apache.commons.lang3.time.DateFormatUtils; /** * 时间工具类 - * + * * @author ruoyi */ -public class DateUtils extends org.apache.commons.lang3.time.DateUtils -{ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static String YYYY = "yyyy"; public static String YYYY_MM = "yyyy-MM"; @@ -29,63 +29,52 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; private static String[] parsePatterns = { - "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; /** * 获取当前Date型日期 - * + * * @return Date() 当前日期 */ - public static Date getNowDate() - { + public static Date getNowDate() { return new Date(); } /** * 获取当前日期, 默认格式为yyyy-MM-dd - * + * * @return String */ - public static String getDate() - { + public static String getDate() { return dateTimeNow(YYYY_MM_DD); } - public static final String getTime() - { + public static final String getTime() { return dateTimeNow(YYYY_MM_DD_HH_MM_SS); } - public static final String dateTimeNow() - { + public static final String dateTimeNow() { return dateTimeNow(YYYYMMDDHHMMSS); } - public static final String dateTimeNow(final String format) - { + public static final String dateTimeNow(final String format) { return parseDateToStr(format, new Date()); } - public static final String dateTime(final Date date) - { + public static final String dateTime(final Date date) { return parseDateToStr(YYYY_MM_DD, date); } - public static final String parseDateToStr(final String format, final Date date) - { + public static final String parseDateToStr(final String format, final Date date) { return new SimpleDateFormat(format).format(date); } - public static final Date dateTime(final String format, final String ts) - { - try - { + public static final Date dateTime(final String format, final String ts) { + try { return new SimpleDateFormat(format).parse(ts); - } - catch (ParseException e) - { + } catch (ParseException e) { throw new RuntimeException(e); } } @@ -93,8 +82,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 日期路径 即年/月/日 如2018/08/08 */ - public static final String datePath() - { + public static final String datePath() { Date now = new Date(); return DateFormatUtils.format(now, "yyyy/MM/dd"); } @@ -102,8 +90,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 日期路径 即年/月/日 如20180808 */ - public static final String dateTime() - { + public static final String dateTime() { Date now = new Date(); return DateFormatUtils.format(now, "yyyyMMdd"); } @@ -111,18 +98,13 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 日期型字符串转化为日期 格式 */ - public static Date parseDate(Object str) - { - if (str == null) - { + public static Date parseDate(Object str) { + if (str == null) { return null; } - try - { + try { return parseDate(str.toString(), parsePatterns); - } - catch (ParseException e) - { + } catch (ParseException e) { return null; } } @@ -130,8 +112,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 获取服务器启动时间 */ - public static Date getServerStartDate() - { + public static Date getServerStartDate() { long time = ManagementFactory.getRuntimeMXBean().getStartTime(); return new Date(time); } @@ -139,20 +120,18 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 计算相差天数 */ - public static int differentDaysByMillisecond(Date date1, Date date2) - { + public static int differentDaysByMillisecond(Date date1, Date date2) { return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); } /** * 计算时间差 * - * @param endDate 最后时间 + * @param endDate 最后时间 * @param startTime 开始时间 * @return 时间差(天/小时/分钟) */ - public static String timeDistance(Date endDate, Date startTime) - { + public static String timeDistance(Date endDate, Date startTime) { long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; @@ -173,8 +152,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 增加 LocalDateTime ==> Date */ - public static Date toDate(LocalDateTime temporalAccessor) - { + public static Date toDate(LocalDateTime temporalAccessor) { ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } @@ -182,10 +160,31 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 增加 LocalDate ==> Date */ - public static Date toDate(LocalDate temporalAccessor) - { + public static Date toDate(LocalDate temporalAccessor) { LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } + + /** + * 计算两个时间差 + */ + public static String getDatePoor(Date endDate, Date nowDate) { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - nowDate.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java index cc5eab2..2328b78 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java @@ -1,20 +1,20 @@ package com.ruoyi.common.utils; -import java.util.Collection; -import java.util.List; import com.alibaba.fastjson2.JSONArray; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.spring.SpringUtils; +import java.util.Collection; +import java.util.List; + /** * 字典工具类 - * + * * @author ruoyi */ -public class DictUtils -{ +public class DictUtils { /** * 分隔符 */ @@ -22,26 +22,23 @@ public class DictUtils /** * 设置字典缓存 - * - * @param key 参数键 + * + * @param key 参数键 * @param dictDatas 字典数据列表 */ - public static void setDictCache(String key, List dictDatas) - { + public static void setDictCache(String key, List dictDatas) { SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas); } /** * 获取字典缓存 - * + * * @param key 参数键 * @return dictDatas 字典数据列表 */ - public static List getDictCache(String key) - { + public static List getDictCache(String key) { JSONArray arrayCache = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); - if (StringUtils.isNotNull(arrayCache)) - { + if (StringUtils.isNotNull(arrayCache)) { return arrayCache.toList(SysDictData.class); } return null; @@ -49,63 +46,51 @@ public class DictUtils /** * 根据字典类型和字典值获取字典标签 - * - * @param dictType 字典类型 + * + * @param dictType 字典类型 * @param dictValue 字典值 * @return 字典标签 */ - public static String getDictLabel(String dictType, String dictValue) - { + public static String getDictLabel(String dictType, String dictValue) { return getDictLabel(dictType, dictValue, SEPARATOR); } /** * 根据字典类型和字典标签获取字典值 - * - * @param dictType 字典类型 + * + * @param dictType 字典类型 * @param dictLabel 字典标签 * @return 字典值 */ - public static String getDictValue(String dictType, String dictLabel) - { + public static String getDictValue(String dictType, String dictLabel) { return getDictValue(dictType, dictLabel, SEPARATOR); } /** * 根据字典类型和字典值获取字典标签 - * - * @param dictType 字典类型 + * + * @param dictType 字典类型 * @param dictValue 字典值 * @param separator 分隔符 * @return 字典标签 */ - public static String getDictLabel(String dictType, String dictValue, String separator) - { + public static String getDictLabel(String dictType, String dictValue, String separator) { StringBuilder propertyString = new StringBuilder(); List datas = getDictCache(dictType); - if (StringUtils.isNotNull(datas)) - { - if (StringUtils.containsAny(separator, dictValue)) - { - for (SysDictData dict : datas) - { - for (String value : dictValue.split(separator)) - { - if (value.equals(dict.getDictValue())) - { + if (StringUtils.isNotNull(datas)) { + if (StringUtils.containsAny(separator, dictValue)) { + for (SysDictData dict : datas) { + for (String value : dictValue.split(separator)) { + if (value.equals(dict.getDictValue())) { propertyString.append(dict.getDictLabel()).append(separator); break; } } } - } - else - { - for (SysDictData dict : datas) - { - if (dictValue.equals(dict.getDictValue())) - { + } else { + for (SysDictData dict : datas) { + if (dictValue.equals(dict.getDictValue())) { return dict.getDictLabel(); } } @@ -116,37 +101,28 @@ public class DictUtils /** * 根据字典类型和字典标签获取字典值 - * - * @param dictType 字典类型 + * + * @param dictType 字典类型 * @param dictLabel 字典标签 * @param separator 分隔符 * @return 字典值 */ - public static String getDictValue(String dictType, String dictLabel, String separator) - { + public static String getDictValue(String dictType, String dictLabel, String separator) { StringBuilder propertyString = new StringBuilder(); List datas = getDictCache(dictType); - if (StringUtils.containsAny(separator, dictLabel) && StringUtils.isNotEmpty(datas)) - { - for (SysDictData dict : datas) - { - for (String label : dictLabel.split(separator)) - { - if (label.equals(dict.getDictLabel())) - { + if (StringUtils.containsAny(separator, dictLabel) && StringUtils.isNotEmpty(datas)) { + for (SysDictData dict : datas) { + for (String label : dictLabel.split(separator)) { + if (label.equals(dict.getDictLabel())) { propertyString.append(dict.getDictValue()).append(separator); break; } } } - } - else - { - for (SysDictData dict : datas) - { - if (dictLabel.equals(dict.getDictLabel())) - { + } else { + for (SysDictData dict : datas) { + if (dictLabel.equals(dict.getDictLabel())) { return dict.getDictValue(); } } @@ -156,31 +132,28 @@ public class DictUtils /** * 删除指定字典缓存 - * + * * @param key 字典键 */ - public static void removeDictCache(String key) - { + public static void removeDictCache(String key) { SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key)); } /** * 清空字典缓存 */ - public static void clearDictCache() - { + public static void clearDictCache() { Collection keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.SYS_DICT_KEY + "*"); SpringUtils.getBean(RedisCache.class).deleteObject(keys); } /** * 设置cache key - * + * * @param configKey 参数键 * @return 缓存键key */ - public static String getCacheKey(String configKey) - { + public static String getCacheKey(String configKey) { return CacheConstants.SYS_DICT_KEY + configKey; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java index 214e4a0..fd7a780 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java @@ -1,37 +1,33 @@ package com.ruoyi.common.utils; +import org.apache.commons.lang3.exception.ExceptionUtils; + import java.io.PrintWriter; import java.io.StringWriter; -import org.apache.commons.lang3.exception.ExceptionUtils; /** * 错误信息处理类。 * * @author ruoyi */ -public class ExceptionUtil -{ +public class ExceptionUtil { /** * 获取exception的详细错误信息。 */ - public static String getExceptionMessage(Throwable e) - { + public static String getExceptionMessage(Throwable e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw, true)); return sw.toString(); } - public static String getRootErrorMessage(Exception e) - { + public static String getRootErrorMessage(Exception e) { Throwable root = ExceptionUtils.getRootCause(e); root = (root == null ? e : root); - if (root == null) - { + if (root == null) { return ""; } String msg = root.getMessage(); - if (msg == null) - { + if (msg == null) { return "null"; } return StringUtils.defaultString(msg); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java new file mode 100644 index 0000000..e5c471e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java @@ -0,0 +1,112 @@ +package com.ruoyi.common.utils; + +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.exc.MismatchedInputException; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * JSON 工具类 + * + * @author 芋道源码 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class JsonUtils { + + private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class); + + public static ObjectMapper getObjectMapper() { + return OBJECT_MAPPER; + } + + public static String toJsonString(Object object) { + if (ObjectUtil.isNull(object)) { + return null; + } + try { + return OBJECT_MAPPER.writeValueAsString(object); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, Class clazz) { + if (StringUtils.isEmpty(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, clazz); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static T parseObject(byte[] bytes, Class clazz) { + if (ArrayUtil.isEmpty(bytes)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(bytes, clazz); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, TypeReference typeReference) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, typeReference); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static Dict parseMap(String text) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class)); + } catch (MismatchedInputException e) { + // 类型不匹配说明不是json + return null; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static List parseArrayMap(String text) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static List parseArray(String text, Class clazz) { + if (StringUtils.isEmpty(text)) { + return new ArrayList<>(); + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java index 0de30c6..a0d5c9f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java @@ -2,15 +2,12 @@ package com.ruoyi.common.utils; /** * 处理并记录日志文件 - * + * * @author ruoyi */ -public class LogUtils -{ - public static String getBlock(Object msg) - { - if (msg == null) - { +public class LogUtils { + public static String getBlock(Object msg) { + if (msg == null) { msg = ""; } return "[" + msg.toString() + "]"; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java index 7dac75a..039eb24 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java @@ -1,16 +1,15 @@ package com.ruoyi.common.utils; +import com.ruoyi.common.utils.spring.SpringUtils; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; -import com.ruoyi.common.utils.spring.SpringUtils; /** * 获取i18n资源文件 - * + * * @author ruoyi */ -public class MessageUtils -{ +public class MessageUtils { /** * 根据消息键和参数 获取消息 委托给spring messageSource * @@ -18,8 +17,7 @@ public class MessageUtils * @param args 参数 * @return 获取国际化翻译值 */ - public static String message(String code, Object... args) - { + public static String message(String code, Object... args) { MessageSource messageSource = SpringUtils.getBean(MessageSource.class); return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java index 70e9b08..c51ea3c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java @@ -7,16 +7,14 @@ import com.ruoyi.common.utils.sql.SqlUtil; /** * 分页工具类 - * + * * @author ruoyi */ -public class PageUtils extends PageHelper -{ +public class PageUtils extends PageHelper { /** * 设置请求分页数据 */ - public static void startPage() - { + public static void startPage() { PageDomain pageDomain = TableSupport.buildPageRequest(); Integer pageNum = pageDomain.getPageNum(); Integer pageSize = pageDomain.getPageSize(); @@ -28,8 +26,7 @@ public class PageUtils extends PageHelper /** * 清理分页的线程变量 */ - public static void clearPage() - { + public static void clearPage() { PageHelper.clearPage(); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java index 0d3ac5f..b6ef87c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java @@ -1,37 +1,33 @@ package com.ruoyi.common.utils; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.util.PatternMatchUtils; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.ServiceException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.util.PatternMatchUtils; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; /** * 安全服务工具类 - * + * * @author ruoyi */ -public class SecurityUtils -{ +public class SecurityUtils { /** * 用户ID **/ - public static Long getUserId() - { - try - { + public static Long getUserId() { + try { return getLoginUser().getUserId(); - } - catch (Exception e) - { + } catch (Exception e) { throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); } } @@ -39,14 +35,10 @@ public class SecurityUtils /** * 获取部门ID **/ - public static Long getDeptId() - { - try - { + public static Long getDeptId() { + try { return getLoginUser().getDeptId(); - } - catch (Exception e) - { + } catch (Exception e) { throw new ServiceException("获取部门ID异常", HttpStatus.UNAUTHORIZED); } } @@ -54,29 +46,31 @@ public class SecurityUtils /** * 获取用户账户 **/ - public static String getUsername() - { - try - { + public static String getUsername() { + try { return getLoginUser().getUsername(); - } - catch (Exception e) - { + } catch (Exception e) { throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED); } } + /** + * 获取用户账户 + **/ + public static String getNickName() { + try { + return getLoginUser().getNickName(); + } catch (Exception e) { + throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED); + } + } /** * 获取用户 **/ - public static LoginUser getLoginUser() - { - try - { + public static LoginUser getLoginUser() { + try { return (LoginUser) getAuthentication().getPrincipal(); - } - catch (Exception e) - { + } catch (Exception e) { throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED); } } @@ -84,8 +78,7 @@ public class SecurityUtils /** * 获取Authentication */ - public static Authentication getAuthentication() - { + public static Authentication getAuthentication() { return SecurityContextHolder.getContext().getAuthentication(); } @@ -95,8 +88,7 @@ public class SecurityUtils * @param password 密码 * @return 加密字符串 */ - public static String encryptPassword(String password) - { + public static String encryptPassword(String password) { BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); return passwordEncoder.encode(password); } @@ -104,59 +96,54 @@ public class SecurityUtils /** * 判断密码是否相同 * - * @param rawPassword 真实密码 + * @param rawPassword 真实密码 * @param encodedPassword 加密后字符 * @return 结果 */ - public static boolean matchesPassword(String rawPassword, String encodedPassword) - { + public static boolean matchesPassword(String rawPassword, String encodedPassword) { BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); return passwordEncoder.matches(rawPassword, encodedPassword); } /** * 是否为管理员 - * + * * @param userId 用户ID * @return 结果 */ - public static boolean isAdmin(Long userId) - { + public static boolean isAdmin(Long userId) { return userId != null && 1L == userId; } /** * 验证用户是否具备某权限 - * + * * @param permission 权限字符串 * @return 用户是否具备某权限 */ - public static boolean hasPermi(String permission) - { + public static boolean hasPermi(String permission) { return hasPermi(getLoginUser().getPermissions(), permission); } /** * 判断是否包含权限 - * + * * @param authorities 权限列表 - * @param permission 权限字符串 + * @param permission 权限字符串 * @return 用户是否具备某权限 */ - public static boolean hasPermi(Collection authorities, String permission) - { + public static boolean hasPermi(Collection authorities, String permission) { return authorities.stream().filter(StringUtils::hasText) .anyMatch(x -> Constants.ALL_PERMISSION.equals(x) || PatternMatchUtils.simpleMatch(x, permission)); } /** * 验证用户是否拥有某个角色 - * + * * @param role 角色标识 * @return 用户是否具备某角色 */ - public static boolean hasRole(String role) - { + public static boolean hasRole(String role) { List roleList = getLoginUser().getUser().getRoles(); Collection roles = roleList.stream().map(SysRole::getRoleKey).collect(Collectors.toSet()); return hasRole(roles, role); @@ -164,13 +151,12 @@ public class SecurityUtils /** * 判断是否包含角色 - * + * * @param roles 角色列表 - * @param role 角色 + * @param role 角色 * @return 用户是否具备某角色权限 */ - public static boolean hasRole(Collection roles, String role) - { + public static boolean hasRole(Collection roles, String role) { return roles.stream().filter(StringUtils::hasText) .anyMatch(x -> Constants.SUPER_ADMIN.equals(x) || PatternMatchUtils.simpleMatch(x, role)); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java index febb603..36a9651 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java @@ -1,5 +1,15 @@ package com.ruoyi.common.utils; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.text.Convert; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -7,68 +17,52 @@ import java.net.URLEncoder; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletRequest; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.text.Convert; /** * 客户端工具类 - * + * * @author ruoyi */ -public class ServletUtils -{ +public class ServletUtils { /** * 获取String参数 */ - public static String getParameter(String name) - { + public static String getParameter(String name) { return getRequest().getParameter(name); } /** * 获取String参数 */ - public static String getParameter(String name, String defaultValue) - { + public static String getParameter(String name, String defaultValue) { return Convert.toStr(getRequest().getParameter(name), defaultValue); } /** * 获取Integer参数 */ - public static Integer getParameterToInt(String name) - { + public static Integer getParameterToInt(String name) { return Convert.toInt(getRequest().getParameter(name)); } /** * 获取Integer参数 */ - public static Integer getParameterToInt(String name, Integer defaultValue) - { + public static Integer getParameterToInt(String name, Integer defaultValue) { return Convert.toInt(getRequest().getParameter(name), defaultValue); } /** * 获取Boolean参数 */ - public static Boolean getParameterToBool(String name) - { + public static Boolean getParameterToBool(String name) { return Convert.toBool(getRequest().getParameter(name)); } /** * 获取Boolean参数 */ - public static Boolean getParameterToBool(String name, Boolean defaultValue) - { + public static Boolean getParameterToBool(String name, Boolean defaultValue) { return Convert.toBool(getRequest().getParameter(name), defaultValue); } @@ -78,8 +72,7 @@ public class ServletUtils * @param request 请求对象{@link ServletRequest} * @return Map */ - public static Map getParams(ServletRequest request) - { + public static Map getParams(ServletRequest request) { final Map map = request.getParameterMap(); return Collections.unmodifiableMap(map); } @@ -90,11 +83,9 @@ public class ServletUtils * @param request 请求对象{@link ServletRequest} * @return Map */ - public static Map getParamMap(ServletRequest request) - { + public static Map getParamMap(ServletRequest request) { Map params = new HashMap<>(); - for (Map.Entry entry : getParams(request).entrySet()) - { + for (Map.Entry entry : getParams(request).entrySet()) { params.put(entry.getKey(), StringUtils.join(entry.getValue(), ",")); } return params; @@ -103,76 +94,64 @@ public class ServletUtils /** * 获取request */ - public static HttpServletRequest getRequest() - { + public static HttpServletRequest getRequest() { return getRequestAttributes().getRequest(); } /** * 获取response */ - public static HttpServletResponse getResponse() - { + public static HttpServletResponse getResponse() { return getRequestAttributes().getResponse(); } /** * 获取session */ - public static HttpSession getSession() - { + public static HttpSession getSession() { return getRequest().getSession(); } - public static ServletRequestAttributes getRequestAttributes() - { + public static ServletRequestAttributes getRequestAttributes() { RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); return (ServletRequestAttributes) attributes; } /** * 将字符串渲染到客户端 - * + * * @param response 渲染对象 - * @param string 待渲染的字符串 + * @param string 待渲染的字符串 */ - public static void renderString(HttpServletResponse response, String string) - { - try - { + public static void renderString(HttpServletResponse response, String string) { + try { response.setStatus(200); response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); response.getWriter().print(string); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } } /** * 是否是Ajax异步请求 - * + * * @param request */ - public static boolean isAjaxRequest(HttpServletRequest request) - { + public static boolean isAjaxRequest(HttpServletRequest request) { String accept = request.getHeader("accept"); - if (accept != null && accept.contains("application/json")) - { + if (accept != null && accept.contains("application/json")) { return true; } String xRequestedWith = request.getHeader("X-Requested-With"); - if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) - { + if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) { return true; } String uri = request.getRequestURI(); - if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) - { + if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) { return true; } @@ -182,36 +161,28 @@ public class ServletUtils /** * 内容编码 - * + * * @param str 内容 * @return 编码后的内容 */ - public static String urlEncode(String str) - { - try - { + public static String urlEncode(String str) { + try { return URLEncoder.encode(str, Constants.UTF8); - } - catch (UnsupportedEncodingException e) - { + } catch (UnsupportedEncodingException e) { return StringUtils.EMPTY; } } /** * 内容解码 - * + * * @param str 内容 * @return 解码后的内容 */ - public static String urlDecode(String str) - { - try - { + public static String urlDecode(String str) { + try { return URLDecoder.decode(str, Constants.UTF8); - } - catch (UnsupportedEncodingException e) - { + } catch (UnsupportedEncodingException e) { return StringUtils.EMPTY; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StreamUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StreamUtils.java new file mode 100644 index 0000000..fdb7484 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StreamUtils.java @@ -0,0 +1,259 @@ +package com.ruoyi.common.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +/** + * stream 流工具类 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class StreamUtils { + + /** + * 将collection过滤 + * + * @param collection 需要转化的集合 + * @param function 过滤方法 + * @return 过滤后的list + */ + public static List filter(Collection collection, Predicate function) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + return collection.stream().filter(function).collect(Collectors.toList()); + } + + /** + * 将collection拼接 + * + * @param collection 需要转化的集合 + * @param function 拼接方法 + * @return 拼接后的list + */ + public static String join(Collection collection, Function function) { + return join(collection, function, StringUtils.SEPARATORSTR); + } + + /** + * 将collection拼接 + * + * @param collection 需要转化的集合 + * @param function 拼接方法 + * @param delimiter 拼接符 + * @return 拼接后的list + */ + public static String join(Collection collection, Function function, CharSequence delimiter) { + if (CollUtil.isEmpty(collection)) { + return StringUtils.EMPTY; + } + return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter)); + } + + /** + * 将collection排序 + * + * @param collection 需要转化的集合 + * @param comparing 排序方法 + * @return 排序后的list + */ + public static List sorted(Collection collection, Comparator comparing) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + return collection.stream().sorted(comparing).collect(Collectors.toList()); + } + + /** + * 将collection转化为类型不变的map
+ * {@code Collection ----> Map} + * + * @param collection 需要转化的集合 + * @param key V类型转化为K类型的lambda方法 + * @param collection中的泛型 + * @param map中的key类型 + * @return 转化后的map + */ + public static Map toIdentityMap(Collection collection, Function key) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection.stream().collect(Collectors.toMap(key, Function.identity(), (l, r) -> l)); + } + + /** + * 将Collection转化为map(value类型与collection的泛型不同)
+ * {@code Collection -----> Map } + * + * @param collection 需要转化的集合 + * @param key E类型转化为K类型的lambda方法 + * @param value E类型转化为V类型的lambda方法 + * @param collection中的泛型 + * @param map中的key类型 + * @param map中的value类型 + * @return 转化后的map + */ + public static Map toMap(Collection collection, Function key, Function value) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection.stream().collect(Collectors.toMap(key, value, (l, r) -> l)); + } + + /** + * 将collection按照规则(比如有相同的班级id)分类成map
+ * {@code Collection -------> Map> } + * + * @param collection 需要分类的集合 + * @param key 分类的规则 + * @param collection中的泛型 + * @param map中的key类型 + * @return 分类后的map + */ + public static Map> groupByKey(Collection collection, Function key) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection + .stream() + .collect(Collectors.groupingBy(key, LinkedHashMap::new, Collectors.toList())); + } + + /** + * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
+ * {@code Collection ---> Map>> } + * + * @param collection 需要分类的集合 + * @param key1 第一个分类的规则 + * @param key2 第二个分类的规则 + * @param 集合元素类型 + * @param 第一个map中的key类型 + * @param 第二个map中的key类型 + * @return 分类后的map + */ + public static Map>> groupBy2Key(Collection collection, Function key1, Function key2) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection + .stream() + .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.groupingBy(key2, LinkedHashMap::new, Collectors.toList()))); + } + + /** + * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
+ * {@code Collection ---> Map> } + * + * @param collection 需要分类的集合 + * @param key1 第一个分类的规则 + * @param key2 第二个分类的规则 + * @param 第一个map中的key类型 + * @param 第二个map中的key类型 + * @param collection中的泛型 + * @return 分类后的map + */ + public static Map> group2Map(Collection collection, Function key1, Function key2) { + if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) { + return MapUtil.newHashMap(); + } + return collection + .stream() + .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.toMap(key2, Function.identity(), (l, r) -> l))); + } + + /** + * 将collection转化为List集合,但是两者的泛型不同
+ * {@code Collection ------> List } + * + * @param collection 需要转化的集合 + * @param function collection中的泛型转化为list泛型的lambda表达式 + * @param collection中的泛型 + * @param List中的泛型 + * @return 转化后的list + */ + public static List toList(Collection collection, Function function) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + return collection + .stream() + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * 将collection转化为Set集合,但是两者的泛型不同
+ * {@code Collection ------> Set } + * + * @param collection 需要转化的集合 + * @param function collection中的泛型转化为set泛型的lambda表达式 + * @param collection中的泛型 + * @param Set中的泛型 + * @return 转化后的Set + */ + public static Set toSet(Collection collection, Function function) { + if (CollUtil.isEmpty(collection) || function == null) { + return CollUtil.newHashSet(); + } + return collection + .stream() + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } + + + /** + * 合并两个相同key类型的map + * + * @param map1 第一个需要合并的 map + * @param map2 第二个需要合并的 map + * @param merge 合并的lambda,将key value1 value2合并成最终的类型,注意value可能为空的情况 + * @param map中的key类型 + * @param 第一个 map的value类型 + * @param 第二个 map的value类型 + * @param 最终map的value类型 + * @return 合并后的map + */ + public static Map merge(Map map1, Map map2, BiFunction merge) { + if (MapUtil.isEmpty(map1) && MapUtil.isEmpty(map2)) { + return MapUtil.newHashMap(); + } else if (MapUtil.isEmpty(map1)) { + map1 = MapUtil.newHashMap(); + } else if (MapUtil.isEmpty(map2)) { + map2 = MapUtil.newHashMap(); + } + Set key = new HashSet<>(); + key.addAll(map1.keySet()); + key.addAll(map2.keySet()); + Map map = new HashMap<>(); + for (K t : key) { + X x = map1.get(t); + Y y = map2.get(t); + V z = merge.apply(x, y); + if (z != null) { + map.put(t, z); + } + } + return map; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index ae435d2..7daeba9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -1,193 +1,179 @@ package com.ruoyi.common.utils; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.text.StrFormatter; +import org.springframework.util.AntPathMatcher; + import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import org.springframework.util.AntPathMatcher; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.text.StrFormatter; /** * 字符串工具类 - * + * * @author ruoyi */ -public class StringUtils extends org.apache.commons.lang3.StringUtils -{ - /** 空字符串 */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + public static final String SEPARATORSTR = ","; + /** + * 空字符串 + */ private static final String NULLSTR = ""; - - /** 下划线 */ + /** + * 下划线 + */ private static final char SEPARATOR = '_'; /** * 获取参数不为空值 - * + * * @param value defaultValue 要判断的value * @return value 返回值 */ - public static T nvl(T value, T defaultValue) - { + public static T nvl(T value, T defaultValue) { return value != null ? value : defaultValue; } /** * * 判断一个Collection是否为空, 包含List,Set,Queue - * + * * @param coll 要判断的Collection * @return true:为空 false:非空 */ - public static boolean isEmpty(Collection coll) - { + public static boolean isEmpty(Collection coll) { return isNull(coll) || coll.isEmpty(); } /** * * 判断一个Collection是否非空,包含List,Set,Queue - * + * * @param coll 要判断的Collection * @return true:非空 false:空 */ - public static boolean isNotEmpty(Collection coll) - { + public static boolean isNotEmpty(Collection coll) { return !isEmpty(coll); } /** * * 判断一个对象数组是否为空 - * + * * @param objects 要判断的对象数组 - ** @return true:为空 false:非空 + * * @return true:为空 false:非空 */ - public static boolean isEmpty(Object[] objects) - { + public static boolean isEmpty(Object[] objects) { return isNull(objects) || (objects.length == 0); } /** * * 判断一个对象数组是否非空 - * + * * @param objects 要判断的对象数组 * @return true:非空 false:空 */ - public static boolean isNotEmpty(Object[] objects) - { + public static boolean isNotEmpty(Object[] objects) { return !isEmpty(objects); } /** * * 判断一个Map是否为空 - * + * * @param map 要判断的Map * @return true:为空 false:非空 */ - public static boolean isEmpty(Map map) - { + public static boolean isEmpty(Map map) { return isNull(map) || map.isEmpty(); } /** * * 判断一个Map是否为空 - * + * * @param map 要判断的Map * @return true:非空 false:空 */ - public static boolean isNotEmpty(Map map) - { + public static boolean isNotEmpty(Map map) { return !isEmpty(map); } /** * * 判断一个字符串是否为空串 - * + * * @param str String * @return true:为空 false:非空 */ - public static boolean isEmpty(String str) - { + public static boolean isEmpty(String str) { return isNull(str) || NULLSTR.equals(str.trim()); } /** * * 判断一个字符串是否为非空串 - * + * * @param str String * @return true:非空串 false:空串 */ - public static boolean isNotEmpty(String str) - { + public static boolean isNotEmpty(String str) { return !isEmpty(str); } /** * * 判断一个对象是否为空 - * + * * @param object Object * @return true:为空 false:非空 */ - public static boolean isNull(Object object) - { + public static boolean isNull(Object object) { return object == null; } /** * * 判断一个对象是否非空 - * + * * @param object Object * @return true:非空 false:空 */ - public static boolean isNotNull(Object object) - { + public static boolean isNotNull(Object object) { return !isNull(object); } /** * * 判断一个对象是否是数组类型(Java基本型别的数组) - * + * * @param object 对象 * @return true:是数组 false:不是数组 */ - public static boolean isArray(Object object) - { + public static boolean isArray(Object object) { return isNotNull(object) && object.getClass().isArray(); } /** * 去空格 */ - public static String trim(String str) - { + public static String trim(String str) { return (str == null ? "" : str.trim()); } /** * 截取字符串 - * - * @param str 字符串 + * + * @param str 字符串 * @param start 开始 * @return 结果 */ - public static String substring(final String str, int start) - { - if (str == null) - { + public static String substring(final String str, int start) { + if (str == null) { return NULLSTR; } - if (start < 0) - { + if (start < 0) { start = str.length() + start; } - if (start < 0) - { + if (start < 0) { start = 0; } - if (start > str.length()) - { + if (start > str.length()) { return NULLSTR; } @@ -196,44 +182,36 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 截取字符串 - * - * @param str 字符串 + * + * @param str 字符串 * @param start 开始 - * @param end 结束 + * @param end 结束 * @return 结果 */ - public static String substring(final String str, int start, int end) - { - if (str == null) - { + public static String substring(final String str, int start, int end) { + if (str == null) { return NULLSTR; } - if (end < 0) - { + if (end < 0) { end = str.length() + end; } - if (start < 0) - { + if (start < 0) { start = str.length() + start; } - if (end > str.length()) - { + if (end > str.length()) { end = str.length(); } - if (start > end) - { + if (start > end) { return NULLSTR; } - if (start < 0) - { + if (start < 0) { start = 0; } - if (end < 0) - { + if (end < 0) { end = 0; } @@ -242,22 +220,18 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 判断是否为空,并且不是空白字符 - * + * * @param str 要判断的value * @return 结果 */ - public static boolean hasText(String str) - { + public static boolean hasText(String str) { return (str != null && !str.isEmpty() && containsText(str)); } - private static boolean containsText(CharSequence str) - { + private static boolean containsText(CharSequence str) { int strLen = str.length(); - for (int i = 0; i < strLen; i++) - { - if (!Character.isWhitespace(str.charAt(i))) - { + for (int i = 0; i < strLen; i++) { + if (!Character.isWhitespace(str.charAt(i))) { return true; } } @@ -272,15 +246,13 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
- * + * * @param template 文本模板,被替换的部分用 {} 表示 - * @param params 参数值 + * @param params 参数值 * @return 格式化后的文本 */ - public static String format(String template, Object... params) - { - if (isEmpty(params) || isEmpty(template)) - { + public static String format(String template, Object... params) { + if (isEmpty(params) || isEmpty(template)) { return template; } return StrFormatter.format(template, params); @@ -288,58 +260,50 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 是否为http(s)://开头 - * + * * @param link 链接 * @return 结果 */ - public static boolean ishttp(String link) - { + public static boolean ishttp(String link) { return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); } /** * 字符串转set - * + * * @param str 字符串 * @param sep 分隔符 * @return set集合 */ - public static final Set str2Set(String str, String sep) - { + public static final Set str2Set(String str, String sep) { return new HashSet(str2List(str, sep, true, false)); } /** * 字符串转list - * - * @param str 字符串 - * @param sep 分隔符 + * + * @param str 字符串 + * @param sep 分隔符 * @param filterBlank 过滤纯空白 - * @param trim 去掉首尾空白 + * @param trim 去掉首尾空白 * @return list集合 */ - public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) - { + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) { List list = new ArrayList(); - if (StringUtils.isEmpty(str)) - { + if (StringUtils.isEmpty(str)) { return list; } // 过滤空白字符串 - if (filterBlank && StringUtils.isBlank(str)) - { + if (filterBlank && StringUtils.isBlank(str)) { return list; } String[] split = str.split(sep); - for (String string : split) - { - if (filterBlank && StringUtils.isBlank(string)) - { + for (String string : split) { + if (filterBlank && StringUtils.isBlank(string)) { continue; } - if (trim) - { + if (trim) { string = string.trim(); } list.add(string); @@ -352,21 +316,15 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value * * @param collection 给定的集合 - * @param array 给定的数组 + * @param array 给定的数组 * @return boolean 结果 */ - public static boolean containsAny(Collection collection, String... array) - { - if (isEmpty(collection) || isEmpty(array)) - { + public static boolean containsAny(Collection collection, String... array) { + if (isEmpty(collection) || isEmpty(array)) { return false; - } - else - { - for (String str : array) - { - if (collection.contains(str)) - { + } else { + for (String str : array) { + if (collection.contains(str)) { return true; } } @@ -377,20 +335,16 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 * - * @param cs 指定字符串 + * @param cs 指定字符串 * @param searchCharSequences 需要检查的字符串数组 * @return 是否包含任意一个字符串 */ - public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) - { - if (isEmpty(cs) || isEmpty(searchCharSequences)) - { + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { + if (isEmpty(cs) || isEmpty(searchCharSequences)) { return false; } - for (CharSequence testStr : searchCharSequences) - { - if (containsIgnoreCase(cs, testStr)) - { + for (CharSequence testStr : searchCharSequences) { + if (containsIgnoreCase(cs, testStr)) { return true; } } @@ -400,10 +354,8 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 驼峰转下划线命名 */ - public static String toUnderScoreCase(String str) - { - if (str == null) - { + public static String toUnderScoreCase(String str) { + if (str == null) { return null; } StringBuilder sb = new StringBuilder(); @@ -413,31 +365,23 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils boolean curreCharIsUpperCase = true; // 下一字符是否大写 boolean nexteCharIsUpperCase = true; - for (int i = 0; i < str.length(); i++) - { + for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); - if (i > 0) - { + if (i > 0) { preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); - } - else - { + } else { preCharIsUpperCase = false; } curreCharIsUpperCase = Character.isUpperCase(c); - if (i < (str.length() - 1)) - { + if (i < (str.length() - 1)) { nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); } - if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) - { + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) { sb.append(SEPARATOR); - } - else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) - { + } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) { sb.append(SEPARATOR); } sb.append(Character.toLowerCase(c)); @@ -448,19 +392,15 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 是否包含字符串 - * - * @param str 验证字符串 + * + * @param str 验证字符串 * @param strs 字符串组 * @return 包含返回true */ - public static boolean inStringIgnoreCase(String str, String... strs) - { - if (str != null && strs != null) - { - for (String s : strs) - { - if (str.equalsIgnoreCase(trim(s))) - { + public static boolean inStringIgnoreCase(String str, String... strs) { + if (str != null && strs != null) { + for (String s : strs) { + if (str.equalsIgnoreCase(trim(s))) { return true; } } @@ -470,31 +410,25 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld - * + * * @param name 转换前的下划线大写方式命名的字符串 * @return 转换后的驼峰式命名的字符串 */ - public static String convertToCamelCase(String name) - { + public static String convertToCamelCase(String name) { StringBuilder result = new StringBuilder(); // 快速检查 - if (name == null || name.isEmpty()) - { + if (name == null || name.isEmpty()) { // 没必要转换 return ""; - } - else if (!name.contains("_")) - { + } else if (!name.contains("_")) { // 不含下划线,仅将首字母大写 return name.substring(0, 1).toUpperCase() + name.substring(1); } // 用下划线将原始字符串分割 String[] camels = name.split("_"); - for (String camel : camels) - { + for (String camel : camels) { // 跳过原始字符串中开头、结尾的下换线或双重下划线 - if (camel.isEmpty()) - { + if (camel.isEmpty()) { continue; } // 首字母大写 @@ -508,34 +442,25 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * 驼峰式命名法 * 例如:user_name->userName */ - public static String toCamelCase(String s) - { - if (s == null) - { + public static String toCamelCase(String s) { + if (s == null) { return null; } - if (s.indexOf(SEPARATOR) == -1) - { + if (s.indexOf(SEPARATOR) == -1) { return s; } s = s.toLowerCase(); StringBuilder sb = new StringBuilder(s.length()); boolean upperCase = false; - for (int i = 0; i < s.length(); i++) - { + for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); - if (c == SEPARATOR) - { + if (c == SEPARATOR) { upperCase = true; - } - else if (upperCase) - { + } else if (upperCase) { sb.append(Character.toUpperCase(c)); upperCase = false; - } - else - { + } else { sb.append(c); } } @@ -544,21 +469,17 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 - * - * @param str 指定字符串 + * + * @param str 指定字符串 * @param strs 需要检查的字符串数组 * @return 是否匹配 */ - public static boolean matches(String str, List strs) - { - if (isEmpty(str) || isEmpty(strs)) - { + public static boolean matches(String str, List strs) { + if (isEmpty(str) || isEmpty(strs)) { return false; } - for (String pattern : strs) - { - if (isMatch(pattern, str)) - { + for (String pattern : strs) { + if (isMatch(pattern, str)) { return true; } } @@ -566,70 +487,58 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils } /** - * 判断url是否与规则配置: - * ? 表示单个字符; - * * 表示一层路径内的任意字符串,不可跨层级; + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; * ** 表示任意层路径; - * + * * @param pattern 匹配规则 - * @param url 需要匹配的url + * @param url 需要匹配的url * @return */ - public static boolean isMatch(String pattern, String url) - { + public static boolean isMatch(String pattern, String url) { AntPathMatcher matcher = new AntPathMatcher(); return matcher.match(pattern, url); } @SuppressWarnings("unchecked") - public static T cast(Object obj) - { + public static T cast(Object obj) { return (T) obj; } /** * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 - * - * @param num 数字对象 + * + * @param num 数字对象 * @param size 字符串指定长度 * @return 返回数字的字符串格式,该字符串为指定长度。 */ - public static final String padl(final Number num, final int size) - { + public static final String padl(final Number num, final int size) { return padl(num.toString(), size, '0'); } /** * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 - * - * @param s 原始字符串 + * + * @param s 原始字符串 * @param size 字符串指定长度 - * @param c 用于补齐的字符 + * @param c 用于补齐的字符 * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 */ - public static final String padl(final String s, final int size, final char c) - { + public static final String padl(final String s, final int size, final char c) { final StringBuilder sb = new StringBuilder(size); - if (s != null) - { + if (s != null) { final int len = s.length(); - if (s.length() <= size) - { - for (int i = size - len; i > 0; i--) - { + if (s.length() <= size) { + for (int i = size - len; i > 0; i--) { sb.append(c); } sb.append(s); - } - else - { + } else { return s.substring(len - size, len); } - } - else - { - for (int i = size; i > 0; i--) - { + } else { + for (int i = size; i > 0; i--) { sb.append(c); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java index 71fe6d5..6226d28 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java @@ -1,33 +1,29 @@ package com.ruoyi.common.utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * 线程相关工具类. - * + * * @author ruoyi */ -public class Threads -{ +public class Threads { private static final Logger logger = LoggerFactory.getLogger(Threads.class); /** * sleep等待,单位为毫秒 */ - public static void sleep(long milliseconds) - { - try - { + public static void sleep(long milliseconds) { + try { Thread.sleep(milliseconds); - } - catch (InterruptedException e) - { + } catch (InterruptedException e) { return; } } @@ -39,24 +35,17 @@ public class Threads * 如果仍然超時,則強制退出. * 另对在shutdown时线程本身被调用中断做了处理. */ - public static void shutdownAndAwaitTermination(ExecutorService pool) - { - if (pool != null && !pool.isShutdown()) - { + public static void shutdownAndAwaitTermination(ExecutorService pool) { + if (pool != null && !pool.isShutdown()) { pool.shutdown(); - try - { - if (!pool.awaitTermination(120, TimeUnit.SECONDS)) - { + try { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { pool.shutdownNow(); - if (!pool.awaitTermination(120, TimeUnit.SECONDS)) - { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { logger.info("Pool did not terminate"); } } - } - catch (InterruptedException ie) - { + } catch (InterruptedException ie) { pool.shutdownNow(); Thread.currentThread().interrupt(); } @@ -66,33 +55,22 @@ public class Threads /** * 打印线程异常信息 */ - public static void printException(Runnable r, Throwable t) - { - if (t == null && r instanceof Future) - { - try - { + public static void printException(Runnable r, Throwable t) { + if (t == null && r instanceof Future) { + try { Future future = (Future) r; - if (future.isDone()) - { + if (future.isDone()) { future.get(); } - } - catch (CancellationException ce) - { + } catch (CancellationException ce) { t = ce; - } - catch (ExecutionException ee) - { + } catch (ExecutionException ee) { t = ee.getCause(); - } - catch (InterruptedException ie) - { + } catch (InterruptedException ie) { Thread.currentThread().interrupt(); } } - if (t != null) - { + if (t != null) { logger.error(t.getMessage(), t); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java new file mode 100644 index 0000000..1fe2eaf --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java @@ -0,0 +1,29 @@ +package com.ruoyi.common.utils; + +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validator; +import java.util.Set; + +/** + * Validator 校验框架工具 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ValidatorUtils { + + private static final Validator VALID = SpringUtils.getBean(Validator.class); + + public static void validate(T object, Class... groups) { + Set> validate = VALID.validate(object, groups); + if (!validate.isEmpty()) { + throw new ConstraintViolationException("参数校验异常", validate); + } + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java index 4463662..43114b3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java @@ -8,46 +8,46 @@ import java.util.regex.Pattern; /** * Bean 工具类 - * + * * @author ruoyi */ -public class BeanUtils extends org.springframework.beans.BeanUtils -{ - /** Bean方法名中属性名开始的下标 */ +public class BeanUtils extends org.springframework.beans.BeanUtils { + /** + * Bean方法名中属性名开始的下标 + */ private static final int BEAN_METHOD_PROP_INDEX = 3; - /** * 匹配getter方法的正则表达式 */ + /** + * 匹配getter方法的正则表达式 + */ private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); - /** * 匹配setter方法的正则表达式 */ + /** + * 匹配setter方法的正则表达式 + */ private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); /** * Bean属性复制工具方法。 - * + * * @param dest 目标对象 - * @param src 源对象 + * @param src 源对象 */ - public static void copyBeanProp(Object dest, Object src) - { - try - { + public static void copyBeanProp(Object dest, Object src) { + try { copyProperties(src, dest); - } - catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); } } /** * 获取对象的setter方法。 - * + * * @param obj 对象 * @return 对象的setter方法列表 */ - public static List getSetterMethods(Object obj) - { + public static List getSetterMethods(Object obj) { // setter方法列表 List setterMethods = new ArrayList(); @@ -56,11 +56,9 @@ public class BeanUtils extends org.springframework.beans.BeanUtils // 查找setter方法 - for (Method method : methods) - { + for (Method method : methods) { Matcher m = SET_PATTERN.matcher(method.getName()); - if (m.matches() && (method.getParameterTypes().length == 1)) - { + if (m.matches() && (method.getParameterTypes().length == 1)) { setterMethods.add(method); } } @@ -70,23 +68,20 @@ public class BeanUtils extends org.springframework.beans.BeanUtils /** * 获取对象的getter方法。 - * + * * @param obj 对象 * @return 对象的getter方法列表 */ - public static List getGetterMethods(Object obj) - { + public static List getGetterMethods(Object obj) { // getter方法列表 List getterMethods = new ArrayList(); // 获取所有方法 Method[] methods = obj.getClass().getMethods(); // 查找getter方法 - for (Method method : methods) - { + for (Method method : methods) { Matcher m = GET_PATTERN.matcher(method.getName()); - if (m.matches() && (method.getParameterTypes().length == 0)) - { + if (m.matches() && (method.getParameterTypes().length == 0)) { getterMethods.add(method); } } @@ -97,14 +92,13 @@ public class BeanUtils extends org.springframework.beans.BeanUtils /** * 检查Bean方法名中的属性名是否相等。
* 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 - * + * * @param m1 方法名1 * @param m2 方法名2 * @return 属性名一样返回true,否则返回false */ - public static boolean isMethodPropEquals(String m1, String m2) - { + public static boolean isMethodPropEquals(String m1, String m2) { return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java index 80bfed7..a0483d7 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java @@ -1,23 +1,20 @@ package com.ruoyi.common.utils.bean; -import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.Validator; +import java.util.Set; /** * bean对象属性验证 - * + * * @author ruoyi */ -public class BeanValidators -{ +public class BeanValidators { public static void validateWithException(Validator validator, Object object, Class... groups) - throws ConstraintViolationException - { + throws ConstraintViolationException { Set> constraintViolations = validator.validate(object, groups); - if (!constraintViolations.isEmpty()) - { + if (!constraintViolations.isEmpty()) { throw new ConstraintViolationException(constraintViolations); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java index 68130b9..def7201 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java @@ -1,27 +1,25 @@ package com.ruoyi.common.utils.file; -import java.io.File; import org.apache.commons.lang3.StringUtils; +import java.io.File; + /** * 文件类型工具类 * * @author ruoyi */ -public class FileTypeUtils -{ +public class FileTypeUtils { /** * 获取文件类型 *

* 例如: ruoyi.txt, 返回: txt - * + * * @param file 文件名 * @return 后缀(不含".") */ - public static String getFileType(File file) - { - if (null == file) - { + public static String getFileType(File file) { + if (null == file) { return StringUtils.EMPTY; } return getFileType(file.getName()); @@ -35,11 +33,9 @@ public class FileTypeUtils * @param fileName 文件名 * @return 后缀(不含".") */ - public static String getFileType(String fileName) - { + public static String getFileType(String fileName) { int separatorIndex = fileName.lastIndexOf("."); - if (separatorIndex < 0) - { + if (separatorIndex < 0) { return ""; } return fileName.substring(separatorIndex + 1).toLowerCase(); @@ -47,28 +43,20 @@ public class FileTypeUtils /** * 获取文件类型 - * + * * @param photoByte 文件字节码 * @return 后缀(不含".") */ - public static String getFileExtendName(byte[] photoByte) - { + public static String getFileExtendName(byte[] photoByte) { String strFileExtendName = "JPG"; if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) - && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) - { + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) { strFileExtendName = "GIF"; - } - else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) - { + } else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) { strFileExtendName = "JPG"; - } - else if ((photoByte[0] == 66) && (photoByte[1] == 77)) - { + } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) { strFileExtendName = "BMP"; - } - else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) - { + } else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) { strFileExtendName = "PNG"; } return strFileExtendName; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java index d9f2b13..1b5d69e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java @@ -1,11 +1,5 @@ package com.ruoyi.common.utils.file; -import java.io.File; -import java.io.IOException; -import java.nio.file.Paths; -import java.util.Objects; -import org.apache.commons.io.FilenameUtils; -import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException; @@ -14,14 +8,20 @@ import com.ruoyi.common.exception.file.InvalidExtensionException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.uuid.Seq; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Objects; /** * 文件上传工具类 * * @author ruoyi */ -public class FileUploadUtils -{ +public class FileUploadUtils { /** * 默认大小 50M */ @@ -37,14 +37,12 @@ public class FileUploadUtils */ private static String defaultBaseDir = RuoYiConfig.getProfile(); - public static void setDefaultBaseDir(String defaultBaseDir) - { - FileUploadUtils.defaultBaseDir = defaultBaseDir; + public static String getDefaultBaseDir() { + return defaultBaseDir; } - public static String getDefaultBaseDir() - { - return defaultBaseDir; + public static void setDefaultBaseDir(String defaultBaseDir) { + FileUploadUtils.defaultBaseDir = defaultBaseDir; } /** @@ -54,14 +52,10 @@ public class FileUploadUtils * @return 文件名称 * @throws Exception */ - public static final String upload(MultipartFile file) throws IOException - { - try - { + public static final String upload(MultipartFile file) throws IOException { + try { return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); - } - catch (Exception e) - { + } catch (Exception e) { throw new IOException(e.getMessage(), e); } } @@ -70,18 +64,14 @@ public class FileUploadUtils * 根据文件路径上传 * * @param baseDir 相对应用的基目录 - * @param file 上传的文件 + * @param file 上传的文件 * @return 文件名称 * @throws IOException */ - public static final String upload(String baseDir, MultipartFile file) throws IOException - { - try - { + public static final String upload(String baseDir, MultipartFile file) throws IOException { + try { return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); - } - catch (Exception e) - { + } catch (Exception e) { throw new IOException(e.getMessage(), e); } } @@ -89,22 +79,20 @@ public class FileUploadUtils /** * 文件上传 * - * @param baseDir 相对应用的基目录 - * @param file 上传的文件 + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 * @param allowedExtension 上传文件类型 * @return 返回上传成功的文件名 - * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileSizeLimitExceededException 如果超出最大大小 * @throws FileNameLengthLimitExceededException 文件名太长 - * @throws IOException 比如读写文件出错时 - * @throws InvalidExtensionException 文件校验异常 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 */ public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, - InvalidExtensionException - { + InvalidExtensionException { int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); - if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) - { + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) { throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); } @@ -120,28 +108,23 @@ public class FileUploadUtils /** * 编码文件名 */ - public static final String extractFilename(MultipartFile file) - { + public static final String extractFilename(MultipartFile file) { return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); } - public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException - { + public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException { File desc = new File(uploadDir + File.separator + fileName); - if (!desc.exists()) - { - if (!desc.getParentFile().exists()) - { + if (!desc.exists()) { + if (!desc.getParentFile().exists()) { desc.getParentFile().mkdirs(); } } return desc; } - public static final String getPathFileName(String uploadDir, String fileName) throws IOException - { + public static final String getPathFileName(String uploadDir, String fileName) throws IOException { int dirLastIndex = RuoYiConfig.getProfile().length() + 1; String currentDir = StringUtils.substring(uploadDir, dirLastIndex); return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; @@ -156,40 +139,28 @@ public class FileUploadUtils * @throws InvalidExtensionException */ public static final void assertAllowed(MultipartFile file, String[] allowedExtension) - throws FileSizeLimitExceededException, InvalidExtensionException - { + throws FileSizeLimitExceededException, InvalidExtensionException { long size = file.getSize(); - if (size > DEFAULT_MAX_SIZE) - { + if (size > DEFAULT_MAX_SIZE) { throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); } String fileName = file.getOriginalFilename(); String extension = getExtension(file); - if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) - { - if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) - { + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) { throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, fileName); - } - else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) - { + } else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) { throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, fileName); - } - else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) - { + } else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) { throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, fileName); - } - else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) - { + } else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) { throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, fileName); - } - else - { + } else { throw new InvalidExtensionException(allowedExtension, extension, fileName); } } @@ -202,12 +173,9 @@ public class FileUploadUtils * @param allowedExtension * @return */ - public static final boolean isAllowedExtension(String extension, String[] allowedExtension) - { - for (String str : allowedExtension) - { - if (str.equalsIgnoreCase(extension)) - { + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) { + for (String str : allowedExtension) { + if (str.equalsIgnoreCase(extension)) { return true; } } @@ -220,11 +188,9 @@ public class FileUploadUtils * @param file 表单文件 * @return 后缀名 */ - public static final String getExtension(MultipartFile file) - { + public static final String getExtension(MultipartFile file) { String extension = FilenameUtils.getExtension(file.getOriginalFilename()); - if (StringUtils.isEmpty(extension)) - { + if (StringUtils.isEmpty(extension)) { extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); } return extension; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java index 432dfda..59ed39a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java @@ -1,55 +1,45 @@ package com.ruoyi.common.utils.file; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.Arrays; -import org.apache.poi.util.IOUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.utils.StringUtils; /** * 图片处理工具类 * * @author ruoyi */ -public class ImageUtils -{ +public class ImageUtils { private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); - public static byte[] getImage(String imagePath) - { + public static byte[] getImage(String imagePath) { InputStream is = getFile(imagePath); - try - { + try { return IOUtils.toByteArray(is); - } - catch (Exception e) - { + } catch (Exception e) { log.error("图片加载异常 {}", e); return null; - } - finally - { + } finally { IOUtils.closeQuietly(is); } } - public static InputStream getFile(String imagePath) - { - try - { + public static InputStream getFile(String imagePath) { + try { byte[] result = readFile(imagePath); result = Arrays.copyOf(result, result.length); return new ByteArrayInputStream(result); - } - catch (Exception e) - { + } catch (Exception e) { log.error("获取图片异常 {}", e); } return null; @@ -57,17 +47,14 @@ public class ImageUtils /** * 读取文件为字节数据 - * + * * @param url 地址 * @return 字节数据 */ - public static byte[] readFile(String url) - { + public static byte[] readFile(String url) { InputStream in = null; - try - { - if (url.startsWith("http")) - { + try { + if (url.startsWith("http")) { // 网络地址 URL urlObj = new URL(url); URLConnection urlConnection = urlObj.openConnection(); @@ -75,23 +62,17 @@ public class ImageUtils urlConnection.setReadTimeout(60 * 1000); urlConnection.setDoInput(true); in = urlConnection.getInputStream(); - } - else - { + } else { // 本机地址 String localPath = RuoYiConfig.getProfile(); String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX); in = new FileInputStream(downloadPath); } return IOUtils.toByteArray(in); - } - catch (Exception e) - { + } catch (Exception e) { log.error("获取文件路径异常 {}", e); return null; - } - finally - { + } finally { IOUtils.closeQuietly(in); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java index f968f1a..335ef4b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java @@ -2,11 +2,10 @@ package com.ruoyi.common.utils.file; /** * 媒体类型工具类 - * + * * @author ruoyi */ -public class MimeTypeUtils -{ +public class MimeTypeUtils { public static final String IMAGE_PNG = "image/png"; public static final String IMAGE_JPG = "image/jpg"; @@ -16,15 +15,15 @@ public class MimeTypeUtils public static final String IMAGE_BMP = "image/bmp"; public static final String IMAGE_GIF = "image/gif"; - - public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; - public static final String[] FLASH_EXTENSION = { "swf", "flv" }; + public static final String[] IMAGE_EXTENSION = {"bmp", "gif", "jpg", "jpeg", "png"}; - public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", - "asf", "rm", "rmvb" }; + public static final String[] FLASH_EXTENSION = {"swf", "flv"}; - public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; + public static final String[] MEDIA_EXTENSION = {"swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb"}; + + public static final String[] VIDEO_EXTENSION = {"mp4", "avi", "rmvb"}; public static final String[] DEFAULT_ALLOWED_EXTENSION = { // 图片 @@ -36,12 +35,10 @@ public class MimeTypeUtils // 视频格式 "mp4", "avi", "rmvb", // pdf - "pdf" }; + "pdf"}; - public static String getExtension(String prefix) - { - switch (prefix) - { + public static String getExtension(String prefix) { + switch (prefix) { case IMAGE_PNG: return "png"; case IMAGE_JPG: diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java index f52e83e..d0dc36d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java @@ -4,20 +4,17 @@ import com.ruoyi.common.utils.StringUtils; /** * 转义和反转义工具类 - * + * * @author ruoyi */ -public class EscapeUtil -{ +public class EscapeUtil { public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; private static final char[][] TEXT = new char[64][]; - static - { - for (int i = 0; i < 64; i++) - { - TEXT[i] = new char[] { (char) i }; + static { + for (int i = 0; i < 64; i++) { + TEXT[i] = new char[]{(char) i}; } // special HTML characters @@ -30,69 +27,58 @@ public class EscapeUtil /** * 转义文本中的HTML字符为安全的字符 - * + * * @param text 被转义的文本 * @return 转义后的文本 */ - public static String escape(String text) - { + public static String escape(String text) { return encode(text); } /** * 还原被转义的HTML特殊字符 - * + * * @param content 包含转义符的HTML内容 * @return 转换后的字符串 */ - public static String unescape(String content) - { + public static String unescape(String content) { return decode(content); } /** * 清除所有HTML标签,但是不删除标签内的内容 - * + * * @param content 文本 * @return 清除标签后的文本 */ - public static String clean(String content) - { + public static String clean(String content) { return new HTMLFilter().filter(content); } /** * Escape编码 - * + * * @param text 被编码的文本 * @return 编码后的字符 */ - private static String encode(String text) - { - if (StringUtils.isEmpty(text)) - { + private static String encode(String text) { + if (StringUtils.isEmpty(text)) { return StringUtils.EMPTY; } final StringBuilder tmp = new StringBuilder(text.length() * 6); char c; - for (int i = 0; i < text.length(); i++) - { + for (int i = 0; i < text.length(); i++) { c = text.charAt(i); - if (c < 256) - { + if (c < 256) { tmp.append("%"); - if (c < 16) - { + if (c < 16) { tmp.append("0"); } tmp.append(Integer.toString(c, 16)); - } - else - { + } else { tmp.append("%u"); - if (c <= 0xfff) - { + if (c <= 0xfff) { // issue#I49JU8@Gitee tmp.append("0"); } @@ -104,47 +90,35 @@ public class EscapeUtil /** * Escape解码 - * + * * @param content 被转义的内容 * @return 解码后的字符串 */ - public static String decode(String content) - { - if (StringUtils.isEmpty(content)) - { + public static String decode(String content) { + if (StringUtils.isEmpty(content)) { return content; } StringBuilder tmp = new StringBuilder(content.length()); int lastPos = 0, pos = 0; char ch; - while (lastPos < content.length()) - { + while (lastPos < content.length()) { pos = content.indexOf("%", lastPos); - if (pos == lastPos) - { - if (content.charAt(pos + 1) == 'u') - { + if (pos == lastPos) { + if (content.charAt(pos + 1) == 'u') { ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); tmp.append(ch); lastPos = pos + 6; - } - else - { + } else { ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); tmp.append(ch); lastPos = pos + 3; } - } - else - { - if (pos == -1) - { + } else { + if (pos == -1) { tmp.append(content.substring(lastPos)); lastPos = content.length(); - } - else - { + } else { tmp.append(content.substring(lastPos, pos)); lastPos = pos; } @@ -153,8 +127,7 @@ public class EscapeUtil return tmp.toString(); } - public static void main(String[] args) - { + public static void main(String[] args) { String html = ""; String escape = EscapeUtil.escape(html); // String html = "ipt>alert(\"XSS\")ipt>"; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java index ebff3fd..8b94253 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java @@ -15,8 +15,7 @@ import java.util.regex.Pattern; * * @author ruoyi */ -public final class HTMLFilter -{ +public final class HTMLFilter { /** * regex flag union representing /si modifiers in php **/ @@ -100,8 +99,7 @@ public final class HTMLFilter /** * Default constructor. */ - public HTMLFilter() - { + public HTMLFilter() { vAllowed = new HashMap<>(); final ArrayList a_atts = new ArrayList<>(); @@ -122,13 +120,13 @@ public final class HTMLFilter vAllowed.put("i", no_atts); vAllowed.put("em", no_atts); - vSelfClosingTags = new String[] { "img" }; - vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" }; - vDisallowed = new String[] {}; - vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp. - vProtocolAtts = new String[] { "src", "href" }; - vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" }; - vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" }; + vSelfClosingTags = new String[]{"img"}; + vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"}; + vDisallowed = new String[]{}; + vAllowedProtocols = new String[]{"http", "mailto", "https"}; // no ftp. + vProtocolAtts = new String[]{"src", "href"}; + vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"}; + vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"}; stripComment = true; encodeQuotes = true; alwaysMakeTags = false; @@ -140,8 +138,7 @@ public final class HTMLFilter * @param conf map containing configuration. keys match field names. */ @SuppressWarnings("unchecked") - public HTMLFilter(final Map conf) - { + public HTMLFilter(final Map conf) { assert conf.containsKey("vAllowed") : "configuration requires vAllowed"; assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags"; @@ -165,20 +162,13 @@ public final class HTMLFilter alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true; } - private void reset() - { - vTagCounts.clear(); - } - // --------------------------------------------------------------- // my versions of some PHP library functions - public static String chr(final int decimal) - { + public static String chr(final int decimal) { return String.valueOf((char) decimal); } - public static String htmlSpecialChars(final String s) - { + public static String htmlSpecialChars(final String s) { String result = s; result = regexReplace(P_AMP, "&", result); result = regexReplace(P_QUOTE, """, result); @@ -187,16 +177,33 @@ public final class HTMLFilter return result; } + private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) { + Matcher m = regex_pattern.matcher(s); + return m.replaceAll(replacement); + } + // --------------------------------------------------------------- + private static boolean inArray(final String s, final String[] array) { + for (String item : array) { + if (item != null && item.equals(s)) { + return true; + } + } + return false; + } + + private void reset() { + vTagCounts.clear(); + } + /** * given a user submitted input String, filter out any invalid or restricted html. * * @param input text (i.e. submitted by a user) than may contain html * @return "clean" version of input, with only valid, whitelisted html elements allowed */ - public String filter(final String input) - { + public String filter(final String input) { reset(); String s = input; @@ -213,22 +220,18 @@ public final class HTMLFilter return s; } - public boolean isAlwaysMakeTags() - { + public boolean isAlwaysMakeTags() { return alwaysMakeTags; } - public boolean isStripComments() - { + public boolean isStripComments() { return stripComment; } - private String escapeComments(final String s) - { + private String escapeComments(final String s) { final Matcher m = P_COMMENTS.matcher(s); final StringBuffer buf = new StringBuffer(); - if (m.find()) - { + if (m.find()) { final String match = m.group(1); // (.*?) m.appendReplacement(buf, Matcher.quoteReplacement("")); } @@ -237,10 +240,8 @@ public final class HTMLFilter return buf.toString(); } - private String balanceHTML(String s) - { - if (alwaysMakeTags) - { + private String balanceHTML(String s) { + if (alwaysMakeTags) { // // try and form html // @@ -249,9 +250,7 @@ public final class HTMLFilter s = regexReplace(P_BODY_TO_END, "<$1>", s); s = regexReplace(P_XML_CONTENT, "$1<$2", s); - } - else - { + } else { // // escape stray brackets // @@ -269,13 +268,11 @@ public final class HTMLFilter return s; } - private String checkTags(String s) - { + private String checkTags(String s) { Matcher m = P_TAGS.matcher(s); final StringBuffer buf = new StringBuffer(); - while (m.find()) - { + while (m.find()) { String replaceStr = m.group(1); replaceStr = processTag(replaceStr); m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr)); @@ -285,10 +282,8 @@ public final class HTMLFilter // these get tallied in processTag // (remember to reset before subsequent calls to filter method) final StringBuilder sBuilder = new StringBuilder(buf.toString()); - for (String key : vTagCounts.keySet()) - { - for (int ii = 0; ii < vTagCounts.get(key); ii++) - { + for (String key : vTagCounts.keySet()) { + for (int ii = 0; ii < vTagCounts.get(key); ii++) { sBuilder.append(""); } } @@ -297,18 +292,14 @@ public final class HTMLFilter return s; } - private String processRemoveBlanks(final String s) - { + private String processRemoveBlanks(final String s) { String result = s; - for (String tag : vRemoveBlanks) - { - if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) - { + for (String tag : vRemoveBlanks) { + if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) { P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?>")); } result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result); - if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) - { + if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) { P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>")); } result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result); @@ -317,25 +308,14 @@ public final class HTMLFilter return result; } - private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) - { - Matcher m = regex_pattern.matcher(s); - return m.replaceAll(replacement); - } - - private String processTag(final String s) - { + private String processTag(final String s) { // ending tags Matcher m = P_END_TAG.matcher(s); - if (m.find()) - { + if (m.find()) { final String name = m.group(1).toLowerCase(); - if (allowed(name)) - { - if (!inArray(name, vSelfClosingTags)) - { - if (vTagCounts.containsKey(name)) - { + if (allowed(name)) { + if (!inArray(name, vSelfClosingTags)) { + if (vTagCounts.containsKey(name)) { vTagCounts.put(name, vTagCounts.get(name) - 1); return ""; } @@ -345,35 +325,30 @@ public final class HTMLFilter // starting tags m = P_START_TAG.matcher(s); - if (m.find()) - { + if (m.find()) { final String name = m.group(1).toLowerCase(); final String body = m.group(2); String ending = m.group(3); // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" ); - if (allowed(name)) - { + if (allowed(name)) { final StringBuilder params = new StringBuilder(); final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body); final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body); final List paramNames = new ArrayList<>(); final List paramValues = new ArrayList<>(); - while (m2.find()) - { + while (m2.find()) { paramNames.add(m2.group(1)); // ([a-z0-9]+) paramValues.add(m2.group(3)); // (.*?) } - while (m3.find()) - { + while (m3.find()) { paramNames.add(m3.group(1)); // ([a-z0-9]+) paramValues.add(m3.group(3)); // ([^\"\\s']+) } String paramName, paramValue; - for (int ii = 0; ii < paramNames.size(); ii++) - { + for (int ii = 0; ii < paramNames.size(); ii++) { paramName = paramNames.get(ii).toLowerCase(); paramValue = paramValues.get(ii); @@ -381,72 +356,55 @@ public final class HTMLFilter // debug( "paramValue='" + paramValue + "'" ); // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) ); - if (allowedAttribute(name, paramName)) - { - if (inArray(paramName, vProtocolAtts)) - { + if (allowedAttribute(name, paramName)) { + if (inArray(paramName, vProtocolAtts)) { paramValue = processParamProtocol(paramValue); } params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\""); } } - if (inArray(name, vSelfClosingTags)) - { + if (inArray(name, vSelfClosingTags)) { ending = " /"; } - if (inArray(name, vNeedClosingTags)) - { + if (inArray(name, vNeedClosingTags)) { ending = ""; } - if (ending == null || ending.length() < 1) - { - if (vTagCounts.containsKey(name)) - { + if (ending == null || ending.length() < 1) { + if (vTagCounts.containsKey(name)) { vTagCounts.put(name, vTagCounts.get(name) + 1); - } - else - { + } else { vTagCounts.put(name, 1); } - } - else - { + } else { ending = " /"; } return "<" + name + params + ending + ">"; - } - else - { + } else { return ""; } } // comments m = P_COMMENT.matcher(s); - if (!stripComment && m.find()) - { + if (!stripComment && m.find()) { return "<" + m.group() + ">"; } return ""; } - private String processParamProtocol(String s) - { + private String processParamProtocol(String s) { s = decodeEntities(s); final Matcher m = P_PROTOCOL.matcher(s); - if (m.find()) - { + if (m.find()) { final String protocol = m.group(1); - if (!inArray(protocol, vAllowedProtocols)) - { + if (!inArray(protocol, vAllowedProtocols)) { // bad protocol, turn into local anchor link instead s = "#" + s.substring(protocol.length() + 1); - if (s.startsWith("#//")) - { + if (s.startsWith("#//")) { s = "#" + s.substring(3); } } @@ -455,13 +413,11 @@ public final class HTMLFilter return s; } - private String decodeEntities(String s) - { + private String decodeEntities(String s) { StringBuffer buf = new StringBuffer(); Matcher m = P_ENTITY.matcher(s); - while (m.find()) - { + while (m.find()) { final String match = m.group(1); final int decimal = Integer.decode(match).intValue(); m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); @@ -471,8 +427,7 @@ public final class HTMLFilter buf = new StringBuffer(); m = P_ENTITY_UNICODE.matcher(s); - while (m.find()) - { + while (m.find()) { final String match = m.group(1); final int decimal = Integer.valueOf(match, 16).intValue(); m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); @@ -482,8 +437,7 @@ public final class HTMLFilter buf = new StringBuffer(); m = P_ENCODE.matcher(s); - while (m.find()) - { + while (m.find()) { final String match = m.group(1); final int decimal = Integer.valueOf(match, 16).intValue(); m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); @@ -495,14 +449,12 @@ public final class HTMLFilter return s; } - private String validateEntities(final String s) - { + private String validateEntities(final String s) { StringBuffer buf = new StringBuffer(); // validate entities throughout the string Matcher m = P_VALID_ENTITIES.matcher(s); - while (m.find()) - { + while (m.find()) { final String one = m.group(1); // ([^&;]*) final String two = m.group(2); // (?=(;|&|$)) m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two))); @@ -512,14 +464,11 @@ public final class HTMLFilter return encodeQuotes(buf.toString()); } - private String encodeQuotes(final String s) - { - if (encodeQuotes) - { + private String encodeQuotes(final String s) { + if (encodeQuotes) { StringBuffer buf = new StringBuffer(); Matcher m = P_VALID_QUOTES.matcher(s); - while (m.find()) - { + while (m.find()) { final String one = m.group(1); // (>|^) final String two = m.group(2); // ([^<]+?) final String three = m.group(3); // (<|$) @@ -528,43 +477,25 @@ public final class HTMLFilter } m.appendTail(buf); return buf.toString(); - } - else - { + } else { return s; } } - private String checkEntity(final String preamble, final String term) - { + private String checkEntity(final String preamble, final String term) { return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble; } - private boolean isValidEntity(final String entity) - { + private boolean isValidEntity(final String entity) { return inArray(entity, vAllowedEntities); } - private static boolean inArray(final String s, final String[] array) - { - for (String item : array) - { - if (item != null && item.equals(s)) - { - return true; - } - } - return false; - } - - private boolean allowed(final String name) - { + private boolean allowed(final String name) { return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed); } - private boolean allowedAttribute(final String name, final String paramName) - { + private boolean allowedAttribute(final String name, final String paramName) { return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName)); } } \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java index 589d123..2252176 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java @@ -1,51 +1,40 @@ package com.ruoyi.common.utils.http; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; -import javax.servlet.ServletRequest; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * 通用http工具封装 - * + * * @author ruoyi */ -public class HttpHelper -{ +public class HttpHelper { private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class); - public static String getBodyString(ServletRequest request) - { + public static String getBodyString(ServletRequest request) { StringBuilder sb = new StringBuilder(); BufferedReader reader = null; - try (InputStream inputStream = request.getInputStream()) - { + try (InputStream inputStream = request.getInputStream()) { reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); String line = ""; - while ((line = reader.readLine()) != null) - { + while ((line = reader.readLine()) != null) { sb.append(line); } - } - catch (IOException e) - { + } catch (IOException e) { LOGGER.warn("getBodyString出现问题!"); - } - finally - { - if (reader != null) - { - try - { + } finally { + if (reader != null) { + try { reader.close(); - } - catch (IOException e) - { + } catch (IOException e) { LOGGER.error(ExceptionUtils.getMessage(e)); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java index ef5eb28..6af068a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java @@ -1,5 +1,16 @@ package com.ruoyi.common.utils.http; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -11,24 +22,13 @@ import java.net.URL; import java.net.URLConnection; import java.nio.charset.StandardCharsets; import java.security.cert.X509Certificate; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.utils.StringUtils; /** * 通用http发送方法 - * + * * @author ruoyi */ -public class HttpUtils -{ +public class HttpUtils { private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); /** @@ -37,37 +37,33 @@ public class HttpUtils * @param url 发送请求的 URL * @return 所代表远程资源的响应结果 */ - public static String sendGet(String url) - { + public static String sendGet(String url) { return sendGet(url, StringUtils.EMPTY); } /** * 向指定 URL 发送GET方法的请求 * - * @param url 发送请求的 URL + * @param url 发送请求的 URL * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return 所代表远程资源的响应结果 */ - public static String sendGet(String url, String param) - { + public static String sendGet(String url, String param) { return sendGet(url, param, Constants.UTF8); } /** * 向指定 URL 发送GET方法的请求 * - * @param url 发送请求的 URL - * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @param contentType 编码类型 * @return 所代表远程资源的响应结果 */ - public static String sendGet(String url, String param, String contentType) - { + public static String sendGet(String url, String param, String contentType) { StringBuilder result = new StringBuilder(); BufferedReader in = null; - try - { + try { String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; log.info("sendGet - {}", urlNameString); URL realUrl = new URL(urlNameString); @@ -78,39 +74,24 @@ public class HttpUtils connection.connect(); in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); String line; - while ((line = in.readLine()) != null) - { + while ((line = in.readLine()) != null) { result.append(line); } log.info("recv - {}", result); - } - catch (ConnectException e) - { + } catch (ConnectException e) { log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); - } - catch (SocketTimeoutException e) - { + } catch (SocketTimeoutException e) { log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); - } - catch (IOException e) - { + } catch (IOException e) { log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); - } - catch (Exception e) - { + } catch (Exception e) { log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); - } - finally - { - try - { - if (in != null) - { + } finally { + try { + if (in != null) { in.close(); } - } - catch (Exception ex) - { + } catch (Exception ex) { log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); } } @@ -120,17 +101,15 @@ public class HttpUtils /** * 向指定 URL 发送POST方法的请求 * - * @param url 发送请求的 URL + * @param url 发送请求的 URL * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return 所代表远程资源的响应结果 */ - public static String sendPost(String url, String param) - { + public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; StringBuilder result = new StringBuilder(); - try - { + try { log.info("sendPost - {}", url); URL realUrl = new URL(url); URLConnection conn = realUrl.openConnection(); @@ -146,58 +125,40 @@ public class HttpUtils out.flush(); in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); String line; - while ((line = in.readLine()) != null) - { + while ((line = in.readLine()) != null) { result.append(line); } log.info("recv - {}", result); - } - catch (ConnectException e) - { + } catch (ConnectException e) { log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); - } - catch (SocketTimeoutException e) - { + } catch (SocketTimeoutException e) { log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); - } - catch (IOException e) - { + } catch (IOException e) { log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); - } - catch (Exception e) - { + } catch (Exception e) { log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); - } - finally - { - try - { - if (out != null) - { + } finally { + try { + if (out != null) { out.close(); } - if (in != null) - { + if (in != null) { in.close(); } - } - catch (IOException ex) - { + } catch (IOException ex) { log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); } } return result.toString(); } - public static String sendSSLPost(String url, String param) - { + public static String sendSSLPost(String url, String param) { StringBuilder result = new StringBuilder(); String urlNameString = url + "?" + param; - try - { + try { log.info("sendSSLPost - {}", urlNameString); SSLContext sc = SSLContext.getInstance("SSL"); - sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); + sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom()); URL console = new URL(urlNameString); HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); conn.setRequestProperty("accept", "*/*"); @@ -214,60 +175,44 @@ public class HttpUtils InputStream is = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String ret = ""; - while ((ret = br.readLine()) != null) - { - if (ret != null && !"".equals(ret.trim())) - { + while ((ret = br.readLine()) != null) { + if (ret != null && !"".equals(ret.trim())) { result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); } } log.info("recv - {}", result); conn.disconnect(); br.close(); - } - catch (ConnectException e) - { + } catch (ConnectException e) { log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); - } - catch (SocketTimeoutException e) - { + } catch (SocketTimeoutException e) { log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); - } - catch (IOException e) - { + } catch (IOException e) { log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); - } - catch (Exception e) - { + } catch (Exception e) { log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); } return result.toString(); } - private static class TrustAnyTrustManager implements X509TrustManager - { + private static class TrustAnyTrustManager implements X509TrustManager { @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) - { + public void checkClientTrusted(X509Certificate[] chain, String authType) { } @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) - { + public void checkServerTrusted(X509Certificate[] chain, String authType) { } @Override - public X509Certificate[] getAcceptedIssuers() - { - return new X509Certificate[] {}; + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; } } - private static class TrustAnyHostnameVerifier implements HostnameVerifier - { + private static class TrustAnyHostnameVerifier implements HostnameVerifier { @Override - public boolean verify(String hostname, SSLSession session) - { + public boolean verify(String hostname, SSLSession session) { return true; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java index edfe419..5d2fed1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java @@ -1,43 +1,35 @@ package com.ruoyi.common.utils.ip; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * 获取地址类 - * + * * @author ruoyi */ -public class AddressUtils -{ - private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); - +public class AddressUtils { // IP地址查询 public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; - // 未知地址 public static final String UNKNOWN = "XX XX"; + private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); - public static String getRealAddressByIP(String ip) - { + public static String getRealAddressByIP(String ip) { // 内网不查询 - if (IpUtils.internalIp(ip)) - { + if (IpUtils.internalIp(ip)) { return "内网IP"; } - if (RuoYiConfig.isAddressEnabled()) - { - try - { + if (RuoYiConfig.isAddressEnabled()) { + try { String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); - if (StringUtils.isEmpty(rspStr)) - { + if (StringUtils.isEmpty(rspStr)) { log.error("获取地理位置异常 {}", ip); return UNKNOWN; } @@ -45,9 +37,7 @@ public class AddressUtils String region = obj.getString("pro"); String city = obj.getString("city"); return String.format("%s %s", region, city); - } - catch (Exception e) - { + } catch (Exception e) { log.error("获取地理位置异常 {}", ip); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java index 8e89e30..16b87f4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java @@ -1,67 +1,59 @@ package com.ruoyi.common.utils.ip; -import java.net.InetAddress; -import java.net.UnknownHostException; -import javax.servlet.http.HttpServletRequest; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; +import javax.servlet.http.HttpServletRequest; +import java.net.InetAddress; +import java.net.UnknownHostException; + /** * 获取IP方法 - * + * * @author ruoyi */ -public class IpUtils -{ +public class IpUtils { public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; // 匹配 ip public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")"; - public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))"; // 匹配网段 public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")"; + public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))"; /** * 获取客户端IP - * + * * @return IP地址 */ - public static String getIpAddr() - { + public static String getIpAddr() { return getIpAddr(ServletUtils.getRequest()); } /** * 获取客户端IP - * + * * @param request 请求对象 * @return IP地址 */ - public static String getIpAddr(HttpServletRequest request) - { - if (request == null) - { + public static String getIpAddr(HttpServletRequest request) { + if (request == null) { return "unknown"; } String ip = request.getHeader("x-forwarded-for"); - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) - { + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(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)) - { + 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)) - { + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Real-IP"); } - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) - { + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } @@ -70,26 +62,23 @@ public class IpUtils /** * 检查是否为内部IP地址 - * + * * @param ip IP地址 * @return 结果 */ - public static boolean internalIp(String ip) - { + public static boolean internalIp(String ip) { byte[] addr = textToNumericFormatV4(ip); return internalIp(addr) || "127.0.0.1".equals(ip); } /** * 检查是否为内部IP地址 - * + * * @param addr byte地址 * @return 结果 */ - private static boolean internalIp(byte[] addr) - { - if (StringUtils.isNull(addr) || addr.length < 2) - { + private static boolean internalIp(byte[] addr) { + if (StringUtils.isNull(addr) || addr.length < 2) { return true; } final byte b0 = addr[0]; @@ -103,18 +92,15 @@ public class IpUtils // 192.168.x.x/16 final byte SECTION_5 = (byte) 0xC0; final byte SECTION_6 = (byte) 0xA8; - switch (b0) - { + switch (b0) { case SECTION_1: return true; case SECTION_2: - if (b1 >= SECTION_3 && b1 <= SECTION_4) - { + if (b1 >= SECTION_3 && b1 <= SECTION_4) { return true; } case SECTION_5: - switch (b1) - { + switch (b1) { case SECTION_6: return true; } @@ -125,29 +111,24 @@ public class IpUtils /** * 将IPv4地址转换成字节 - * + * * @param text IPv4地址 * @return byte 字节 */ - public static byte[] textToNumericFormatV4(String text) - { - if (text.length() == 0) - { + public static byte[] textToNumericFormatV4(String text) { + if (text.length() == 0) { return null; } byte[] bytes = new byte[4]; String[] elements = text.split("\\.", -1); - try - { + try { long l; int i; - switch (elements.length) - { + switch (elements.length) { case 1: l = Long.parseLong(elements[0]); - if ((l < 0L) || (l > 4294967295L)) - { + if ((l < 0L) || (l > 4294967295L)) { return null; } bytes[0] = (byte) (int) (l >> 24 & 0xFF); @@ -157,14 +138,12 @@ public class IpUtils break; case 2: l = Integer.parseInt(elements[0]); - if ((l < 0L) || (l > 255L)) - { + if ((l < 0L) || (l > 255L)) { return null; } bytes[0] = (byte) (int) (l & 0xFF); l = Integer.parseInt(elements[1]); - if ((l < 0L) || (l > 16777215L)) - { + if ((l < 0L) || (l > 16777215L)) { return null; } bytes[1] = (byte) (int) (l >> 16 & 0xFF); @@ -172,29 +151,24 @@ public class IpUtils bytes[3] = (byte) (int) (l & 0xFF); break; case 3: - for (i = 0; i < 2; ++i) - { + for (i = 0; i < 2; ++i) { l = Integer.parseInt(elements[i]); - if ((l < 0L) || (l > 255L)) - { + if ((l < 0L) || (l > 255L)) { return null; } bytes[i] = (byte) (int) (l & 0xFF); } l = Integer.parseInt(elements[2]); - if ((l < 0L) || (l > 65535L)) - { + if ((l < 0L) || (l > 65535L)) { return null; } bytes[2] = (byte) (int) (l >> 8 & 0xFF); bytes[3] = (byte) (int) (l & 0xFF); break; case 4: - for (i = 0; i < 4; ++i) - { + for (i = 0; i < 4; ++i) { l = Integer.parseInt(elements[i]); - if ((l < 0L) || (l > 255L)) - { + if ((l < 0L) || (l > 255L)) { return null; } bytes[i] = (byte) (int) (l & 0xFF); @@ -203,9 +177,7 @@ public class IpUtils default: return null; } - } - catch (NumberFormatException e) - { + } catch (NumberFormatException e) { return null; } return bytes; @@ -213,34 +185,26 @@ public class IpUtils /** * 获取IP地址 - * + * * @return 本地IP地址 */ - public static String getHostIp() - { - try - { + public static String getHostIp() { + try { return InetAddress.getLocalHost().getHostAddress(); - } - catch (UnknownHostException e) - { + } catch (UnknownHostException e) { } return "127.0.0.1"; } /** * 获取主机名 - * + * * @return 本地主机名 */ - public static String getHostName() - { - try - { + public static String getHostName() { + try { return InetAddress.getLocalHost().getHostName(); - } - catch (UnknownHostException e) - { + } catch (UnknownHostException e) { } return "未知"; } @@ -251,16 +215,12 @@ public class IpUtils * @param ip 获得的IP地址 * @return 第一个非unknown IP地址 */ - public static String getMultistageReverseProxyIp(String ip) - { + public static String getMultistageReverseProxyIp(String ip) { // 多级反向代理检测 - if (ip != null && ip.indexOf(",") > 0) - { + if (ip != null && ip.indexOf(",") > 0) { final String[] ips = ip.trim().split(","); - for (String subIp : ips) - { - if (false == isUnknown(subIp)) - { + for (String subIp : ips) { + if (false == isUnknown(subIp)) { ip = subIp; break; } @@ -275,39 +235,33 @@ public class IpUtils * @param checkString 被检测的字符串 * @return 是否未知 */ - public static boolean isUnknown(String checkString) - { + public static boolean isUnknown(String checkString) { return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); } /** * 是否为IP */ - public static boolean isIP(String ip) - { + public static boolean isIP(String ip) { return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP); } /** * 是否为IP,或 *为间隔的通配符地址 */ - public static boolean isIpWildCard(String ip) - { + public static boolean isIpWildCard(String ip) { return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD); } /** * 检测参数是否在ip通配符里 */ - public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) - { + public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) { String[] s1 = ipWildCard.split("\\."); String[] s2 = ip.split("\\."); boolean isMatchedSeg = true; - for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) - { - if (!s1[i].equals(s2[i])) - { + for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) { + if (!s1[i].equals(s2[i])) { isMatchedSeg = false; break; } @@ -318,29 +272,25 @@ public class IpUtils /** * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串 */ - public static boolean isIPSegment(String ipSeg) - { + public static boolean isIPSegment(String ipSeg) { return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG); } /** * 判断ip是否在指定网段中 */ - public static boolean ipIsInNetNoCheck(String iparea, String ip) - { + public static boolean ipIsInNetNoCheck(String iparea, String ip) { int idx = iparea.indexOf('-'); String[] sips = iparea.substring(0, idx).split("\\."); String[] sipe = iparea.substring(idx + 1).split("\\."); String[] sipt = ip.split("\\."); long ips = 0L, ipe = 0L, ipt = 0L; - for (int i = 0; i < 4; ++i) - { + for (int i = 0; i < 4; ++i) { ips = ips << 8 | Integer.parseInt(sips[i]); ipe = ipe << 8 | Integer.parseInt(sipe[i]); ipt = ipt << 8 | Integer.parseInt(sipt[i]); } - if (ips > ipe) - { + if (ips > ipe) { long t = ips; ips = ipe; ipe = t; @@ -350,30 +300,22 @@ public class IpUtils /** * 校验ip是否符合过滤串规则 - * + * * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99` - * @param ip 校验IP地址 + * @param ip 校验IP地址 * @return boolean 结果 */ - public static boolean isMatchedIp(String filter, String ip) - { - if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) - { + public static boolean isMatchedIp(String filter, String ip) { + if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) { return false; } String[] ips = filter.split(";"); - for (String iStr : ips) - { - if (isIP(iStr) && iStr.equals(ip)) - { + for (String iStr : ips) { + if (isIP(iStr) && iStr.equals(ip)) { return true; - } - else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) - { + } else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) { return true; - } - else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) - { + } else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) { return true; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java index ccab288..2d1fd3b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java @@ -5,19 +5,17 @@ import org.apache.poi.ss.usermodel.Workbook; /** * Excel数据格式处理适配器 - * + * * @author ruoyi */ -public interface ExcelHandlerAdapter -{ +public interface ExcelHandlerAdapter { /** * 格式化 - * - * @param value 单元格数据值 - * @param args excel注解args参数组 - * @param cell 单元格对象 - * @param wb 工作簿对象 * + * @param value 单元格数据值 + * @param args excel注解args参数组 + * @param cell 单元格对象 + * @param wb 工作簿对象 * @return 处理后的值 */ Object format(Object value, String[] args, Cell cell, Workbook wb); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 6f45d5b..d3fdf38 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -1,29 +1,20 @@ package com.ruoyi.common.utils.poi; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.math.BigDecimal; -import java.text.DecimalFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletResponse; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.annotation.Excel.Type; +import com.ruoyi.common.annotation.Excels; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.exception.UtilException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.DictUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileTypeUtils; +import com.ruoyi.common.utils.file.FileUtils; +import com.ruoyi.common.utils.file.ImageUtils; +import com.ruoyi.common.utils.reflect.ReflectUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.RegExUtils; import org.apache.commons.lang3.reflect.FieldUtils; @@ -69,138 +60,270 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.ruoyi.common.annotation.Excel; -import com.ruoyi.common.annotation.Excel.ColumnType; -import com.ruoyi.common.annotation.Excel.Type; -import com.ruoyi.common.annotation.Excels; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.text.Convert; -import com.ruoyi.common.exception.UtilException; -import com.ruoyi.common.utils.DateUtils; -import com.ruoyi.common.utils.DictUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.file.FileTypeUtils; -import com.ruoyi.common.utils.file.FileUtils; -import com.ruoyi.common.utils.file.ImageUtils; -import com.ruoyi.common.utils.reflect.ReflectUtils; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; /** * Excel相关处理 - * + * * @author ruoyi */ -public class ExcelUtil -{ - private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); - +public class ExcelUtil { public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; - - public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; - + public static final String[] FORMULA_STR = {"=", "-", "+", "@"}; + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + /** + * 数字格式 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); /** * 用于dictType属性数据存储,避免重复查缓存 */ public Map sysDictMap = new HashMap(); - /** - * Excel sheet最大行数,默认65536 + * 实体对象 */ - public static final int sheetSize = 65536; - + public Class clazz; + /** + * 需要排除列属性 + */ + public String[] excludeFields; /** * 工作表名称 */ private String sheetName; - /** * 导出类型(EXPORT:导出数据;IMPORT:导入模板) */ private Type type; - /** * 工作薄对象 */ private Workbook wb; - /** * 工作表对象 */ private Sheet sheet; - /** * 样式列表 */ private Map styles; - /** * 导入导出数据列表 */ private List list; - /** * 注解列表 */ private List fields; - /** * 当前行号 */ private int rownum; - /** * 标题 */ private String title; - /** * 最大高度 */ private short maxHeight; - /** * 合并后最后行数 */ private int subMergedLastRowNum = 0; - /** * 合并后开始行数 */ private int subMergedFirstRowNum = 1; - /** * 对象的子列表方法 */ private Method subMethod; - /** * 对象的子列表属性 */ private List subFields; - /** * 统计列表 */ private Map statistics = new HashMap(); + public ExcelUtil(Class clazz) { + this.clazz = clazz; + } + /** - * 数字格式 + * 获取画布 */ - private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + public static Drawing getDrawingPatriarch(Sheet sheet) { + if (sheet.getDrawingPatriarch() == null) { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } /** - * 实体对象 + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 */ - public Class clazz; + public static String convertByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[0].equals(value)) { + propertyString.append(itemArray[1] + separator); + break; + } + } + } else { + if (itemArray[0].equals(propertyValue)) { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } /** - * 需要排除列属性 + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 */ - public String[] excludeFields; + public static String reverseByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[1].equals(value)) { + propertyString.append(itemArray[0] + separator); + break; + } + } + } else { + if (itemArray[1].equals(propertyValue)) { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } - public ExcelUtil(Class clazz) - { - this.clazz = clazz; + /** + * 解析字典值 + * + * @param dictValue 字典值 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } + + /** + * 反向解析值字典值 + * + * @param dictLabel 字典标签 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典值 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + /** + * 获取Excel2003图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) { + Map sheetIndexPicMap = new HashMap(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) { + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) { + HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); + if (shape instanceof HSSFPicture) { + HSSFPicture pic = (HSSFPicture) shape; + int pictureIndex = pic.getPictureIndex() - 1; + HSSFPictureData picData = pictures.get(pictureIndex); + String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; + } else { + return sheetIndexPicMap; + } + } + + /** + * 获取Excel2007图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) { + Map sheetIndexPicMap = new HashMap(); + for (POIXMLDocumentPart dr : sheet.getRelations()) { + if (dr instanceof XSSFDrawing) { + XSSFDrawing drawing = (XSSFDrawing) dr; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) { + if (shape instanceof XSSFPicture) { + XSSFPicture pic = (XSSFPicture) shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.put(picIndex, pic.getPictureData()); + } + } + } + } + return sheetIndexPicMap; } /** @@ -209,15 +332,12 @@ public class ExcelUtil * @param fields 列属性名 示例[单个"name"/多个"id","name"] * @throws Exception */ - public void hideColumn(String... fields) - { + public void hideColumn(String... fields) { this.excludeFields = fields; } - public void init(List list, String sheetName, String title, Type type) - { - if (list == null) - { + public void init(List list, String sheetName, String title, Type type) { + if (list == null) { list = new ArrayList(); } this.list = list; @@ -233,15 +353,12 @@ public class ExcelUtil /** * 创建excel第一行标题 */ - public void createTitle() - { - if (StringUtils.isNotEmpty(title)) - { + public void createTitle() { + if (StringUtils.isNotEmpty(title)) { subMergedFirstRowNum++; subMergedLastRowNum++; int titleLastCol = this.fields.size() - 1; - if (isSubList()) - { + if (isSubList()) { titleLastCol = titleLastCol + subFields.size() - 1; } Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); @@ -256,16 +373,13 @@ public class ExcelUtil /** * 创建对象的子列表名称 */ - public void createSubHead() - { - if (isSubList()) - { + public void createSubHead() { + if (isSubList()) { subMergedFirstRowNum++; subMergedLastRowNum++; Row subRow = sheet.createRow(rownum); int excelNum = 0; - for (Object[] objects : fields) - { + for (Object[] objects : fields) { Excel attr = (Excel) objects[1]; Cell headCell1 = subRow.createCell(excelNum); headCell1.setCellValue(attr.name()); @@ -274,8 +388,7 @@ public class ExcelUtil } int headFirstRow = excelNum - 1; int headLastRow = headFirstRow + subFields.size() - 1; - if (headLastRow > headFirstRow) - { + if (headLastRow > headFirstRow) { sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); } rownum++; @@ -284,24 +397,18 @@ public class ExcelUtil /** * 对excel表单默认第一个索引名转换成list - * + * * @param is 输入流 * @return 转换后集合 */ - public List importExcel(InputStream is) - { + public List importExcel(InputStream is) { List list = null; - try - { + try { list = importExcel(is, 0); - } - catch (Exception e) - { + } catch (Exception e) { log.error("导入Excel异常{}", e.getMessage()); throw new UtilException(e.getMessage()); - } - finally - { + } finally { IOUtils.closeQuietly(is); } return list; @@ -309,90 +416,74 @@ public class ExcelUtil /** * 对excel表单默认第一个索引名转换成list - * - * @param is 输入流 + * + * @param is 输入流 * @param titleNum 标题占用行数 * @return 转换后集合 */ - public List importExcel(InputStream is, int titleNum) throws Exception - { + public List importExcel(InputStream is, int titleNum) throws Exception { return importExcel(StringUtils.EMPTY, is, titleNum); } /** * 对excel表单指定表格索引名转换成list - * + * * @param sheetName 表格索引名 - * @param titleNum 标题占用行数 - * @param is 输入流 + * @param titleNum 标题占用行数 + * @param is 输入流 * @return 转换后集合 */ - public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception - { + public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception { this.type = Type.IMPORT; this.wb = WorkbookFactory.create(is); List list = new ArrayList(); // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); - if (sheet == null) - { + if (sheet == null) { throw new IOException("文件sheet不存在"); } boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); Map pictures; - if (isXSSFWorkbook) - { + if (isXSSFWorkbook) { pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); - } - else - { + } else { pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); } // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 int rows = sheet.getLastRowNum(); - if (rows > 0) - { + if (rows > 0) { // 定义一个map用于存放excel列的序号和field. Map cellMap = new HashMap(); // 获取表头 Row heard = sheet.getRow(titleNum); - for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) - { + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { Cell cell = heard.getCell(i); - if (StringUtils.isNotNull(cell)) - { + if (StringUtils.isNotNull(cell)) { String value = this.getCellValue(heard, i).toString(); cellMap.put(value, i); - } - else - { + } else { cellMap.put(null, i); } } // 有数据时才处理 得到类的所有field. List fields = this.getFields(); Map fieldsMap = new HashMap(); - for (Object[] objects : fields) - { + for (Object[] objects : fields) { Excel attr = (Excel) objects[1]; Integer column = cellMap.get(attr.name()); - if (column != null) - { + if (column != null) { fieldsMap.put(column, objects); } } - for (int i = titleNum + 1; i <= rows; i++) - { + for (int i = titleNum + 1; i <= rows; i++) { // 从第2行开始取数据,默认第一行是表头. Row row = sheet.getRow(i); // 判断当前行是否是空行 - if (isRowEmpty(row)) - { + if (isRowEmpty(row)) { continue; } T entity = null; - for (Map.Entry entry : fieldsMap.entrySet()) - { + for (Map.Entry entry : fieldsMap.entrySet()) { Object val = this.getCellValue(row, entry.getKey()); // 如果不存在实例则新建. @@ -402,89 +493,53 @@ public class ExcelUtil Excel attr = (Excel) entry.getValue()[1]; // 取得类型,并根据对象类型设置值. Class fieldType = field.getType(); - if (String.class == fieldType) - { + if (String.class == fieldType) { String s = Convert.toStr(val); - if (StringUtils.endsWith(s, ".0")) - { + if (StringUtils.endsWith(s, ".0")) { val = StringUtils.substringBefore(s, ".0"); - } - else - { + } else { String dateFormat = field.getAnnotation(Excel.class).dateFormat(); - if (StringUtils.isNotEmpty(dateFormat)) - { + if (StringUtils.isNotEmpty(dateFormat)) { val = parseDateToStr(dateFormat, val); - } - else - { + } else { val = Convert.toStr(val); } } - } - else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) - { + } else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) { val = Convert.toInt(val); - } - else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) - { + } else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) { val = Convert.toLong(val); - } - else if (Double.TYPE == fieldType || Double.class == fieldType) - { + } else if (Double.TYPE == fieldType || Double.class == fieldType) { val = Convert.toDouble(val); - } - else if (Float.TYPE == fieldType || Float.class == fieldType) - { + } else if (Float.TYPE == fieldType || Float.class == fieldType) { val = Convert.toFloat(val); - } - else if (BigDecimal.class == fieldType) - { + } else if (BigDecimal.class == fieldType) { val = Convert.toBigDecimal(val); - } - else if (Date.class == fieldType) - { - if (val instanceof String) - { + } else if (Date.class == fieldType) { + if (val instanceof String) { val = DateUtils.parseDate(val); - } - else if (val instanceof Double) - { + } else if (val instanceof Double) { val = DateUtil.getJavaDate((Double) val); } - } - else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) - { + } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) { val = Convert.toBool(val, false); } - if (StringUtils.isNotNull(fieldType)) - { + if (StringUtils.isNotNull(fieldType)) { String propertyName = field.getName(); - if (StringUtils.isNotEmpty(attr.targetAttr())) - { + if (StringUtils.isNotEmpty(attr.targetAttr())) { propertyName = field.getName() + "." + attr.targetAttr(); } - if (StringUtils.isNotEmpty(attr.readConverterExp())) - { + if (StringUtils.isNotEmpty(attr.readConverterExp())) { val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); - } - else if (StringUtils.isNotEmpty(attr.dictType())) - { + } else if (StringUtils.isNotEmpty(attr.dictType())) { val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); - } - else if (!attr.handler().equals(ExcelHandlerAdapter.class)) - { + } else if (!attr.handler().equals(ExcelHandlerAdapter.class)) { val = dataFormatHandlerAdapter(val, attr, null); - } - else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) - { + } else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) { PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); - if (image == null) - { + if (image == null) { val = ""; - } - else - { + } else { byte[] data = image.getData(); val = FileUtils.writeImportBytes(data); } @@ -500,54 +555,50 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * - * @param list 导出数据集合 + * + * @param list 导出数据集合 * @param sheetName 工作表的名称 * @return 结果 */ - public AjaxResult exportExcel(List list, String sheetName) - { + public AjaxResult exportExcel(List list, String sheetName) { return exportExcel(list, sheetName, StringUtils.EMPTY); } /** * 对list数据源将其里面的数据导入到excel表单 - * - * @param list 导出数据集合 + * + * @param list 导出数据集合 * @param sheetName 工作表的名称 - * @param title 标题 + * @param title 标题 * @return 结果 */ - public AjaxResult exportExcel(List list, String sheetName, String title) - { + public AjaxResult exportExcel(List list, String sheetName, String title) { this.init(list, sheetName, title, Type.EXPORT); return exportExcel(); } /** * 对list数据源将其里面的数据导入到excel表单 - * - * @param response 返回数据 - * @param list 导出数据集合 + * + * @param response 返回数据 + * @param list 导出数据集合 * @param sheetName 工作表的名称 * @return 结果 */ - public void exportExcel(HttpServletResponse response, List list, String sheetName) - { + public void exportExcel(HttpServletResponse response, List list, String sheetName) { exportExcel(response, list, sheetName, StringUtils.EMPTY); } /** * 对list数据源将其里面的数据导入到excel表单 - * - * @param response 返回数据 - * @param list 导出数据集合 + * + * @param response 返回数据 + * @param list 导出数据集合 * @param sheetName 工作表的名称 - * @param title 标题 + * @param title 标题 * @return 结果 */ - public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) - { + public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); this.init(list, sheetName, title, Type.EXPORT); @@ -556,48 +607,44 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @return 结果 */ - public AjaxResult importTemplateExcel(String sheetName) - { + public AjaxResult importTemplateExcel(String sheetName) { return importTemplateExcel(sheetName, StringUtils.EMPTY); } /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 - * @param title 标题 + * @param title 标题 * @return 结果 */ - public AjaxResult importTemplateExcel(String sheetName, String title) - { + public AjaxResult importTemplateExcel(String sheetName, String title) { this.init(null, sheetName, title, Type.IMPORT); return exportExcel(); } /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @return 结果 */ - public void importTemplateExcel(HttpServletResponse response, String sheetName) - { + public void importTemplateExcel(HttpServletResponse response, String sheetName) { importTemplateExcel(response, sheetName, StringUtils.EMPTY); } /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 - * @param title 标题 + * @param title 标题 * @return 结果 */ - public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) - { + public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); this.init(null, sheetName, title, Type.IMPORT); @@ -606,49 +653,37 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @return 结果 */ - public void exportExcel(HttpServletResponse response) - { - try - { + public void exportExcel(HttpServletResponse response) { + try { writeSheet(); wb.write(response.getOutputStream()); - } - catch (Exception e) - { + } catch (Exception e) { log.error("导出Excel异常{}", e.getMessage()); - } - finally - { + } finally { IOUtils.closeQuietly(wb); } } /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @return 结果 */ - public AjaxResult exportExcel() - { + public AjaxResult exportExcel() { OutputStream out = null; - try - { + try { writeSheet(); String filename = encodingFilename(sheetName); out = new FileOutputStream(getAbsoluteFile(filename)); wb.write(out); return AjaxResult.success(filename); - } - catch (Exception e) - { + } catch (Exception e) { log.error("导出Excel异常{}", e.getMessage()); throw new UtilException("导出Excel失败,请联系网站管理员!"); - } - finally - { + } finally { IOUtils.closeQuietly(wb); IOUtils.closeQuietly(out); } @@ -657,37 +692,29 @@ public class ExcelUtil /** * 创建写入数据到Sheet */ - public void writeSheet() - { + public void writeSheet() { // 取出一共有多少个sheet. int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); - for (int index = 0; index < sheetNo; index++) - { + for (int index = 0; index < sheetNo; index++) { createSheet(sheetNo, index); // 产生一行 Row row = sheet.createRow(rownum); int column = 0; // 写入各个字段的列头名称 - for (Object[] os : fields) - { + for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; - if (Collection.class.isAssignableFrom(field.getType())) - { - for (Field subField : subFields) - { + if (Collection.class.isAssignableFrom(field.getType())) { + for (Field subField : subFields) { Excel subExcel = subField.getAnnotation(Excel.class); this.createHeadCell(subExcel, row, column++); } - } - else - { + } else { this.createHeadCell(excel, row, column++); } } - if (Type.EXPORT.equals(type)) - { + if (Type.EXPORT.equals(type)) { fillExcelData(index, row); addStatisticsRow(); } @@ -696,57 +723,45 @@ public class ExcelUtil /** * 填充excel数据 - * + * * @param index 序号 - * @param row 单元格行 + * @param row 单元格行 */ @SuppressWarnings("unchecked") - public void fillExcelData(int index, Row row) - { + public void fillExcelData(int index, Row row) { int startNo = index * sheetSize; int endNo = Math.min(startNo + sheetSize, list.size()); int rowNo = (1 + rownum) - startNo; - for (int i = startNo; i < endNo; i++) - { + for (int i = startNo; i < endNo; i++) { rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; row = sheet.createRow(rowNo); // 得到导出对象. T vo = (T) list.get(i); Collection subList = null; - if (isSubList()) - { - if (isSubListValue(vo)) - { + if (isSubList()) { + if (isSubListValue(vo)) { subList = getListCellValue(vo); subMergedLastRowNum = subMergedLastRowNum + subList.size(); - } - else - { + } else { subMergedFirstRowNum++; subMergedLastRowNum++; } } int column = 0; - for (Object[] os : fields) - { + for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; - if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) - { + if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) { boolean subFirst = false; - for (Object obj : subList) - { - if (subFirst) - { + for (Object obj : subList) { + if (subFirst) { rowNo++; row = sheet.createRow(rowNo); } List subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); int subIndex = 0; - for (Field subField : subFields) - { - if (subField.isAnnotationPresent(Excel.class)) - { + for (Field subField : subFields) { + if (subField.isAnnotationPresent(Excel.class)) { subField.setAccessible(true); Excel attr = subField.getAnnotation(Excel.class); this.addCell(attr, row, (T) obj, subField, column + subIndex); @@ -756,9 +771,7 @@ public class ExcelUtil subFirst = true; } this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); - } - else - { + } else { this.addCell(excel, row, vo, field, column++); } } @@ -767,12 +780,11 @@ public class ExcelUtil /** * 创建表格样式 - * + * * @param wb 工作薄对象 * @return 样式列表 */ - private Map createStyles(Workbook wb) - { + private Map createStyles(Workbook wb) { // 写入各条记录,每条记录对应excel表中的一行 Map styles = new HashMap(); CellStyle style = wb.createCellStyle(); @@ -820,19 +832,16 @@ public class ExcelUtil /** * 根据Excel注解创建表格头样式 - * + * * @param wb 工作薄对象 * @return 自定义样式列表 */ - private Map annotationHeaderStyles(Workbook wb, Map styles) - { + private Map annotationHeaderStyles(Workbook wb, Map styles) { Map headerStyles = new HashMap(); - for (Object[] os : fields) - { + for (Object[] os : fields) { Excel excel = (Excel) os[1]; String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); - if (!headerStyles.containsKey(key)) - { + if (!headerStyles.containsKey(key)) { CellStyle style = wb.createCellStyle(); style.cloneStyleFrom(styles.get("data")); style.setAlignment(HorizontalAlignment.CENTER); @@ -853,19 +862,16 @@ public class ExcelUtil /** * 根据Excel注解创建表格列样式 - * + * * @param wb 工作薄对象 * @return 自定义样式列表 */ - private Map annotationDataStyles(Workbook wb) - { + private Map annotationDataStyles(Workbook wb) { Map styles = new HashMap(); - for (Object[] os : fields) - { + for (Object[] os : fields) { Excel excel = (Excel) os[1]; String key = StringUtils.format("data_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor()); - if (!styles.containsKey(key)) - { + if (!styles.containsKey(key)) { CellStyle style = wb.createCellStyle(); style.setAlignment(excel.align()); style.setVerticalAlignment(VerticalAlignment.CENTER); @@ -893,20 +899,17 @@ public class ExcelUtil /** * 创建单元格 */ - public Cell createHeadCell(Excel attr, Row row, int column) - { + public Cell createHeadCell(Excel attr, Row row, int column) { // 创建列 Cell cell = row.createCell(column); // 写入列信息 cell.setCellValue(attr.name()); setDataValidation(attr, row, column); cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); - if (isSubList()) - { + if (isSubList()) { // 填充默认样式,防止合并单元格样式失效 sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); - if (attr.needMerge()) - { + if (attr.needMerge()) { sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); } } @@ -915,40 +918,30 @@ public class ExcelUtil /** * 设置单元格信息 - * + * * @param value 单元格值 - * @param attr 注解相关 - * @param cell 单元格信息 + * @param attr 注解相关 + * @param cell 单元格信息 */ - public void setCellVo(Object value, Excel attr, Cell cell) - { - if (ColumnType.STRING == attr.cellType()) - { + public void setCellVo(Object value, Excel attr, Cell cell) { + if (ColumnType.STRING == attr.cellType()) { String cellValue = Convert.toStr(value); // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 - if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) - { + if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) { cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); } - if (value instanceof Collection && StringUtils.equals("[]", cellValue)) - { + if (value instanceof Collection && StringUtils.equals("[]", cellValue)) { cellValue = StringUtils.EMPTY; } cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); - } - else if (ColumnType.NUMERIC == attr.cellType()) - { - if (StringUtils.isNotNull(value)) - { + } else if (ColumnType.NUMERIC == attr.cellType()) { + if (StringUtils.isNotNull(value)) { cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); } - } - else if (ColumnType.IMAGE == attr.cellType()) - { + } else if (ColumnType.IMAGE == attr.cellType()) { ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); String imagePath = Convert.toStr(value); - if (StringUtils.isNotEmpty(imagePath)) - { + if (StringUtils.isNotEmpty(imagePath)) { byte[] data = ImageUtils.getImage(imagePath); getDrawingPatriarch(cell.getSheet()).createPicture(anchor, cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); @@ -956,30 +949,14 @@ public class ExcelUtil } } - /** - * 获取画布 - */ - public static Drawing getDrawingPatriarch(Sheet sheet) - { - if (sheet.getDrawingPatriarch() == null) - { - sheet.createDrawingPatriarch(); - } - return sheet.getDrawingPatriarch(); - } - /** * 获取图片类型,设置图片插入类型 */ - public int getImageType(byte[] value) - { + public int getImageType(byte[] value) { String type = FileTypeUtils.getFileExtendName(value); - if ("JPG".equalsIgnoreCase(type)) - { + if ("JPG".equalsIgnoreCase(type)) { return Workbook.PICTURE_TYPE_JPEG; - } - else if ("PNG".equalsIgnoreCase(type)) - { + } else if ("PNG".equalsIgnoreCase(type)) { return Workbook.PICTURE_TYPE_PNG; } return Workbook.PICTURE_TYPE_JPEG; @@ -988,26 +965,18 @@ public class ExcelUtil /** * 创建表格样式 */ - public void setDataValidation(Excel attr, Row row, int column) - { - if (attr.name().indexOf("注:") >= 0) - { + public void setDataValidation(Excel attr, Row row, int column) { + if (attr.name().indexOf("注:") >= 0) { sheet.setColumnWidth(column, 6000); - } - else - { + } else { // 设置列宽 sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); } - if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) - { - if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255) - { + if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) { + if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255) { // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 setXSSFValidationWithHidden(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); - } - else - { + } else { // 提示信息或只能选择不能输入的列内容. setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); } @@ -1017,20 +986,16 @@ public class ExcelUtil /** * 添加单元格 */ - public Cell addCell(Excel attr, Row row, T vo, Field field, int column) - { + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) { Cell cell = null; - try - { + try { // 设置行高 row.setHeight(maxHeight); // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. - if (attr.isExport()) - { + if (attr.isExport()) { // 创建cell cell = row.createCell(column); - if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) - { + if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) { CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); sheet.addMergedRegion(cellAddress); } @@ -1042,41 +1007,27 @@ public class ExcelUtil String readConverterExp = attr.readConverterExp(); String separator = attr.separator(); String dictType = attr.dictType(); - if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) - { + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) { cell.setCellValue(parseDateToStr(dateFormat, value)); - } - else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) - { + } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) { cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); - } - else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) - { - if (!sysDictMap.containsKey(dictType + value)) - { + } else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) { + if (!sysDictMap.containsKey(dictType + value)) { String lable = convertDictByExp(Convert.toStr(value), dictType, separator); sysDictMap.put(dictType + value, lable); } cell.setCellValue(sysDictMap.get(dictType + value)); - } - else if (value instanceof BigDecimal && -1 != attr.scale()) - { + } else if (value instanceof BigDecimal && -1 != attr.scale()) { cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); - } - else if (!attr.handler().equals(ExcelHandlerAdapter.class)) - { + } else if (!attr.handler().equals(ExcelHandlerAdapter.class)) { cell.setCellValue(dataFormatHandlerAdapter(value, attr, cell)); - } - else - { + } else { // 设置列类型 setCellVo(value, attr, cell); } addStatisticsData(column, Convert.toStr(value), attr); } - } - catch (Exception e) - { + } catch (Exception e) { log.error("导出Excel失败{}", e); } return cell; @@ -1084,36 +1035,31 @@ public class ExcelUtil /** * 设置 POI XSSFSheet 单元格提示或选择框 - * - * @param sheet 表单 - * @param textlist 下拉框显示的内容 + * + * @param sheet 表单 + * @param textlist 下拉框显示的内容 * @param promptContent 提示内容 - * @param firstRow 开始行 - * @param endRow 结束行 - * @param firstCol 开始列 - * @param endCol 结束列 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 */ public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, - int firstCol, int endCol) - { + int firstCol, int endCol) { DataValidationHelper helper = sheet.getDataValidationHelper(); DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); DataValidation dataValidation = helper.createValidation(constraint, regions); - if (StringUtils.isNotEmpty(promptContent)) - { + if (StringUtils.isNotEmpty(promptContent)) { // 如果设置了提示信息则鼠标放上去提示 dataValidation.createPromptBox("", promptContent); dataValidation.setShowPromptBox(true); } // 处理Excel兼容性问题 - if (dataValidation instanceof XSSFDataValidation) - { + if (dataValidation instanceof XSSFDataValidation) { dataValidation.setSuppressDropDownArrow(true); dataValidation.setShowErrorBox(true); - } - else - { + } else { dataValidation.setSuppressDropDownArrow(false); } sheet.addValidationData(dataValidation); @@ -1121,21 +1067,19 @@ public class ExcelUtil /** * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). - * - * @param sheet 要设置的sheet. - * @param textlist 下拉框显示的内容 + * + * @param sheet 要设置的sheet. + * @param textlist 下拉框显示的内容 * @param promptContent 提示内容 - * @param firstRow 开始行 - * @param endRow 结束行 - * @param firstCol 开始列 - * @param endCol 结束列 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 */ - public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) - { + public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) { String hideSheetName = "combo_" + firstCol + "_" + endCol; Sheet hideSheet = wb.createSheet(hideSheetName); // 用于存储 下拉菜单数据 - for (int i = 0; i < textlist.length; i++) - { + for (int i = 0; i < textlist.length; i++) { hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]); } // 创建名称,可被其他单元格引用 @@ -1149,20 +1093,16 @@ public class ExcelUtil CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); // 数据有效性对象 DataValidation dataValidation = helper.createValidation(constraint, regions); - if (StringUtils.isNotEmpty(promptContent)) - { + if (StringUtils.isNotEmpty(promptContent)) { // 如果设置了提示信息则鼠标放上去提示 dataValidation.createPromptBox("", promptContent); dataValidation.setShowPromptBox(true); } // 处理Excel兼容性问题 - if (dataValidation instanceof XSSFDataValidation) - { + if (dataValidation instanceof XSSFDataValidation) { dataValidation.setSuppressDropDownArrow(true); dataValidation.setShowErrorBox(true); - } - else - { + } else { dataValidation.setSuppressDropDownArrow(false); } @@ -1171,123 +1111,19 @@ public class ExcelUtil wb.setSheetHidden(wb.getSheetIndex(hideSheet), true); } - /** - * 解析导出值 0=男,1=女,2=未知 - * - * @param propertyValue 参数值 - * @param converterExp 翻译注解 - * @param separator 分隔符 - * @return 解析后值 - */ - public static String convertByExp(String propertyValue, String converterExp, String separator) - { - StringBuilder propertyString = new StringBuilder(); - String[] convertSource = converterExp.split(","); - for (String item : convertSource) - { - String[] itemArray = item.split("="); - if (StringUtils.containsAny(propertyValue, separator)) - { - for (String value : propertyValue.split(separator)) - { - if (itemArray[0].equals(value)) - { - propertyString.append(itemArray[1] + separator); - break; - } - } - } - else - { - if (itemArray[0].equals(propertyValue)) - { - return itemArray[1]; - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 反向解析值 男=0,女=1,未知=2 - * - * @param propertyValue 参数值 - * @param converterExp 翻译注解 - * @param separator 分隔符 - * @return 解析后值 - */ - public static String reverseByExp(String propertyValue, String converterExp, String separator) - { - StringBuilder propertyString = new StringBuilder(); - String[] convertSource = converterExp.split(","); - for (String item : convertSource) - { - String[] itemArray = item.split("="); - if (StringUtils.containsAny(propertyValue, separator)) - { - for (String value : propertyValue.split(separator)) - { - if (itemArray[1].equals(value)) - { - propertyString.append(itemArray[0] + separator); - break; - } - } - } - else - { - if (itemArray[1].equals(propertyValue)) - { - return itemArray[0]; - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 解析字典值 - * - * @param dictValue 字典值 - * @param dictType 字典类型 - * @param separator 分隔符 - * @return 字典标签 - */ - public static String convertDictByExp(String dictValue, String dictType, String separator) - { - return DictUtils.getDictLabel(dictType, dictValue, separator); - } - - /** - * 反向解析值字典值 - * - * @param dictLabel 字典标签 - * @param dictType 字典类型 - * @param separator 分隔符 - * @return 字典值 - */ - public static String reverseDictByExp(String dictLabel, String dictType, String separator) - { - return DictUtils.getDictValue(dictType, dictLabel, separator); - } - /** * 数据处理器 - * + * * @param value 数据值 * @param excel 数据注解 * @return */ - public String dataFormatHandlerAdapter(Object value, Excel excel, Cell cell) - { - try - { + public String dataFormatHandlerAdapter(Object value, Excel excel, Cell cell) { + try { Object instance = excel.handler().newInstance(); - Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class, Cell.class, Workbook.class }); + Method formatMethod = excel.handler().getMethod("format", new Class[]{Object.class, String[].class, Cell.class, Workbook.class}); value = formatMethod.invoke(instance, value, excel.args(), cell, this.wb); - } - catch (Exception e) - { + } catch (Exception e) { log.error("不能格式化数据 " + excel.handler(), e.getMessage()); } return Convert.toStr(value); @@ -1296,21 +1132,15 @@ public class ExcelUtil /** * 合计统计信息 */ - private void addStatisticsData(Integer index, String text, Excel entity) - { - if (entity != null && entity.isStatistics()) - { + private void addStatisticsData(Integer index, String text, Excel entity) { + if (entity != null && entity.isStatistics()) { Double temp = 0D; - if (!statistics.containsKey(index)) - { + if (!statistics.containsKey(index)) { statistics.put(index, temp); } - try - { + try { temp = Double.valueOf(text); - } - catch (NumberFormatException e) - { + } catch (NumberFormatException e) { } statistics.put(index, statistics.get(index) + temp); } @@ -1319,18 +1149,15 @@ public class ExcelUtil /** * 创建统计行 */ - public void addStatisticsRow() - { - if (statistics.size() > 0) - { + public void addStatisticsRow() { + if (statistics.size() > 0) { Row row = sheet.createRow(sheet.getLastRowNum() + 1); Set keys = statistics.keySet(); Cell cell = row.createCell(0); cell.setCellStyle(styles.get("total")); cell.setCellValue("合计"); - for (Integer key : keys) - { + for (Integer key : keys) { cell = row.createCell(key); cell.setCellStyle(styles.get("total")); cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); @@ -1342,23 +1169,20 @@ public class ExcelUtil /** * 编码文件名 */ - public String encodingFilename(String filename) - { + public String encodingFilename(String filename) { filename = UUID.randomUUID() + "_" + filename + ".xlsx"; return filename; } /** * 获取下载路径 - * + * * @param filename 文件名称 */ - public String getAbsoluteFile(String filename) - { + public String getAbsoluteFile(String filename) { String downloadPath = RuoYiConfig.getDownloadPath() + filename; File desc = new File(downloadPath); - if (!desc.getParentFile().exists()) - { + if (!desc.getParentFile().exists()) { desc.getParentFile().mkdirs(); } return downloadPath; @@ -1366,29 +1190,23 @@ public class ExcelUtil /** * 获取bean中的属性值 - * - * @param vo 实体对象 + * + * @param vo 实体对象 * @param field 字段 * @param excel 注解 * @return 最终的属性值 * @throws Exception */ - private Object getTargetValue(T vo, Field field, Excel excel) throws Exception - { + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception { Object o = field.get(vo); - if (StringUtils.isNotEmpty(excel.targetAttr())) - { + if (StringUtils.isNotEmpty(excel.targetAttr())) { String target = excel.targetAttr(); - if (target.contains(".")) - { + if (target.contains(".")) { String[] targets = target.split("[.]"); - for (String name : targets) - { + for (String name : targets) { o = getValue(o, name); } - } - else - { + } else { o = getValue(o, target); } } @@ -1397,16 +1215,14 @@ public class ExcelUtil /** * 以类的属性的get方法方法形式获取值 - * + * * @param o * @param name * @return value * @throws Exception */ - private Object getValue(Object o, String name) throws Exception - { - if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) - { + private Object getValue(Object o, String name) throws Exception { + if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) { Class clazz = o.getClass(); Field field = clazz.getDeclaredField(name); field.setAccessible(true); @@ -1418,8 +1234,7 @@ public class ExcelUtil /** * 得到所有定义字段 */ - private void createExcelField() - { + private void createExcelField() { this.fields = getFields(); this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); this.maxHeight = getRowHeight(); @@ -1428,27 +1243,21 @@ public class ExcelUtil /** * 获取字段注解信息 */ - public List getFields() - { + public List getFields() { List fields = new ArrayList(); List tempFields = new ArrayList<>(); tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); - for (Field field : tempFields) - { - if (!ArrayUtils.contains(this.excludeFields, field.getName())) - { + for (Field field : tempFields) { + if (!ArrayUtils.contains(this.excludeFields, field.getName())) { // 单注解 - if (field.isAnnotationPresent(Excel.class)) - { + if (field.isAnnotationPresent(Excel.class)) { Excel attr = field.getAnnotation(Excel.class); - if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) - { + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) { field.setAccessible(true); - fields.add(new Object[] { field, attr }); + fields.add(new Object[]{field, attr}); } - if (Collection.class.isAssignableFrom(field.getType())) - { + if (Collection.class.isAssignableFrom(field.getType())) { subMethod = getSubMethod(field.getName(), clazz); ParameterizedType pt = (ParameterizedType) field.getGenericType(); Class subClass = (Class) pt.getActualTypeArguments()[0]; @@ -1457,17 +1266,14 @@ public class ExcelUtil } // 多注解 - if (field.isAnnotationPresent(Excels.class)) - { + if (field.isAnnotationPresent(Excels.class)) { Excels attrs = field.getAnnotation(Excels.class); Excel[] excels = attrs.value(); - for (Excel attr : excels) - { + for (Excel attr : excels) { if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) - && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) - { + && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) { field.setAccessible(true); - fields.add(new Object[] { field, attr }); + fields.add(new Object[]{field, attr}); } } } @@ -1479,11 +1285,9 @@ public class ExcelUtil /** * 根据注解获取最大行高 */ - public short getRowHeight() - { + public short getRowHeight() { double maxHeight = 0; - for (Object[] os : this.fields) - { + for (Object[] os : this.fields) { Excel excel = (Excel) os[1]; maxHeight = Math.max(maxHeight, excel.height()); } @@ -1493,8 +1297,7 @@ public class ExcelUtil /** * 创建一个工作簿 */ - public void createWorkbook() - { + public void createWorkbook() { this.wb = new SXSSFWorkbook(500); this.sheet = wb.createSheet(); wb.setSheetName(0, sheetName); @@ -1503,15 +1306,13 @@ public class ExcelUtil /** * 创建工作表 - * + * * @param sheetNo sheet数量 - * @param index 序号 + * @param index 序号 */ - public void createSheet(int sheetNo, int index) - { + public void createSheet(int sheetNo, int index) { // 设置工作表的名称. - if (sheetNo > 1 && index > 0) - { + if (sheetNo > 1 && index > 0) { this.sheet = wb.createSheet(); this.createTitle(); wb.setSheetName(index, sheetName + index); @@ -1520,59 +1321,40 @@ public class ExcelUtil /** * 获取单元格值 - * - * @param row 获取的行 + * + * @param row 获取的行 * @param column 获取单元格列号 * @return 单元格值 */ - public Object getCellValue(Row row, int column) - { - if (row == null) - { + public Object getCellValue(Row row, int column) { + if (row == null) { return row; } Object val = ""; - try - { + try { Cell cell = row.getCell(column); - if (StringUtils.isNotNull(cell)) - { - if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) - { + if (StringUtils.isNotNull(cell)) { + if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) { val = cell.getNumericCellValue(); - if (DateUtil.isCellDateFormatted(cell)) - { + if (DateUtil.isCellDateFormatted(cell)) { val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 - } - else - { - if ((Double) val % 1 != 0) - { + } else { + if ((Double) val % 1 != 0) { val = new BigDecimal(val.toString()); - } - else - { + } else { val = new DecimalFormat("0").format(val); } } - } - else if (cell.getCellType() == CellType.STRING) - { + } else if (cell.getCellType() == CellType.STRING) { val = cell.getStringCellValue(); - } - else if (cell.getCellType() == CellType.BOOLEAN) - { + } else if (cell.getCellType() == CellType.BOOLEAN) { val = cell.getBooleanCellValue(); - } - else if (cell.getCellType() == CellType.ERROR) - { + } else if (cell.getCellType() == CellType.ERROR) { val = cell.getErrorCellValue(); } } - } - catch (Exception e) - { + } catch (Exception e) { return val; } return val; @@ -1580,120 +1362,42 @@ public class ExcelUtil /** * 判断是否是空行 - * + * * @param row 判断的行 * @return */ - private boolean isRowEmpty(Row row) - { - if (row == null) - { + private boolean isRowEmpty(Row row) { + if (row == null) { return true; } - for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) - { + for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) { Cell cell = row.getCell(i); - if (cell != null && cell.getCellType() != CellType.BLANK) - { + if (cell != null && cell.getCellType() != CellType.BLANK) { return false; } } return true; } - /** - * 获取Excel2003图片 - * - * @param sheet 当前sheet对象 - * @param workbook 工作簿对象 - * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData - */ - public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) - { - Map sheetIndexPicMap = new HashMap(); - List pictures = workbook.getAllPictures(); - if (!pictures.isEmpty()) - { - for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) - { - HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); - if (shape instanceof HSSFPicture) - { - HSSFPicture pic = (HSSFPicture) shape; - int pictureIndex = pic.getPictureIndex() - 1; - HSSFPictureData picData = pictures.get(pictureIndex); - String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); - sheetIndexPicMap.put(picIndex, picData); - } - } - return sheetIndexPicMap; - } - else - { - return sheetIndexPicMap; - } - } - - /** - * 获取Excel2007图片 - * - * @param sheet 当前sheet对象 - * @param workbook 工作簿对象 - * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData - */ - public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) - { - Map sheetIndexPicMap = new HashMap(); - for (POIXMLDocumentPart dr : sheet.getRelations()) - { - if (dr instanceof XSSFDrawing) - { - XSSFDrawing drawing = (XSSFDrawing) dr; - List shapes = drawing.getShapes(); - for (XSSFShape shape : shapes) - { - if (shape instanceof XSSFPicture) - { - XSSFPicture pic = (XSSFPicture) shape; - XSSFClientAnchor anchor = pic.getPreferredSize(); - CTMarker ctMarker = anchor.getFrom(); - String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); - sheetIndexPicMap.put(picIndex, pic.getPictureData()); - } - } - } - } - return sheetIndexPicMap; - } - /** * 格式化不同类型的日期对象 - * + * * @param dateFormat 日期格式 - * @param val 被格式化的日期对象 + * @param val 被格式化的日期对象 * @return 格式化后的日期字符 */ - public String parseDateToStr(String dateFormat, Object val) - { - if (val == null) - { + public String parseDateToStr(String dateFormat, Object val) { + if (val == null) { return ""; } String str; - if (val instanceof Date) - { + if (val instanceof Date) { str = DateUtils.parseDateToStr(dateFormat, (Date) val); - } - else if (val instanceof LocalDateTime) - { + } else if (val instanceof LocalDateTime) { str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); - } - else if (val instanceof LocalDate) - { + } else if (val instanceof LocalDate) { str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); - } - else - { + } else { str = val.toString(); } return str; @@ -1702,31 +1406,25 @@ public class ExcelUtil /** * 是否有对象的子列表 */ - public boolean isSubList() - { + public boolean isSubList() { return StringUtils.isNotNull(subFields) && subFields.size() > 0; } /** * 是否有对象的子列表,集合不为空 */ - public boolean isSubListValue(T vo) - { + public boolean isSubListValue(T vo) { return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; } /** * 获取集合的值 */ - public Collection getListCellValue(Object obj) - { + public Collection getListCellValue(Object obj) { Object value; - try - { - value = subMethod.invoke(obj, new Object[] {}); - } - catch (Exception e) - { + try { + value = subMethod.invoke(obj, new Object[]{}); + } catch (Exception e) { return new ArrayList(); } return (Collection) value; @@ -1734,23 +1432,19 @@ public class ExcelUtil /** * 获取对象的子列表方法 - * - * @param name 名称 + * + * @param name 名称 * @param pojoClass 类对象 * @return 子列表方法 */ - public Method getSubMethod(String name, Class pojoClass) - { + public Method getSubMethod(String name, Class pojoClass) { StringBuffer getMethodName = new StringBuffer("get"); getMethodName.append(name.substring(0, 1).toUpperCase()); getMethodName.append(name.substring(1)); Method method = null; - try - { - method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); - } - catch (Exception e) - { + try { + method = pojoClass.getMethod(getMethodName.toString(), new Class[]{}); + } catch (Exception e) { log.error("获取对象异常{}", e.getMessage()); } return method; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtilAiLiBaBa.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtilAiLiBaBa.java new file mode 100644 index 0000000..1cdd5f4 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtilAiLiBaBa.java @@ -0,0 +1,329 @@ +package com.ruoyi.common.utils.poi; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.resource.ClassPathResource; +import cn.hutool.core.util.IdUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.alibaba.excel.write.metadata.fill.FillWrapper; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import com.ruoyi.common.convert.ExcelBigNumberConvert; +import com.ruoyi.common.excel.CellMergeStrategy; +import com.ruoyi.common.excel.DefaultExcelListener; +import com.ruoyi.common.excel.ExcelListener; +import com.ruoyi.common.excel.ExcelResult; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * Excel相关处理 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ExcelUtilAiLiBaBa { + + /** + * 同步导入(适用于小数据量) + * + * @param is 输入流 + * @return 转换后集合 + */ + public static List importExcel(InputStream is, Class clazz) { + return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync(); + } + + + /** + * 使用校验监听器 异步导入 同步返回 + * + * @param is 输入流 + * @param clazz 对象类型 + * @param isValidate 是否 Validator 检验 默认为是 + * @return 转换后集合 + */ + public static ExcelResult importExcel(InputStream is, Class clazz, boolean isValidate) { + DefaultExcelListener listener = new DefaultExcelListener<>(isValidate); + EasyExcel.read(is, clazz, listener).sheet().doRead(); + return listener.getExcelResult(); + } + + /** + * 使用自定义监听器 异步导入 自定义返回 + * + * @param is 输入流 + * @param clazz 对象类型 + * @param listener 自定义监听器 + * @return 转换后集合 + */ + public static ExcelResult importExcel(InputStream is, Class clazz, ExcelListener listener) { + EasyExcel.read(is, clazz, listener).sheet().doRead(); + return listener.getExcelResult(); + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param response 响应体 + */ + public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, false, os); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param merge 是否合并单元格 + * @param response 响应体 + */ + public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, HttpServletResponse response) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + exportExcel(list, sheetName, clazz, merge, os); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param os 输出流 + */ + public static void exportExcel(List list, String sheetName, Class clazz, OutputStream os) { + exportExcel(list, sheetName, clazz, false, os); + } + + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param merge 是否合并单元格 + * @param os 输出流 + */ + public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, OutputStream os) { + ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz) + .autoCloseStream(false) + // 自动适配 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .sheet(sheetName); + if (merge) { + // 合并处理器 + builder.registerWriteHandler(new CellMergeStrategy(list, true)); + } + builder.doWrite(list); + } + + /** + * 单表多数据模板导出 模板格式为 {.属性} + * + * @param filename 文件名 + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param response 响应体 + */ + public static void exportTemplate(List data, String filename, String templatePath, HttpServletResponse response) { + try { + resetResponse(filename, response); + ServletOutputStream os = response.getOutputStream(); + exportTemplate(data, templatePath, os); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 单表多数据模板导出 模板格式为 {.属性} + * + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param os 输出流 + */ + public static void exportTemplate(List data, String templatePath, OutputStream os) { + ClassPathResource templateResource = new ClassPathResource(templatePath); + ExcelWriter excelWriter = EasyExcel.write(os) + .withTemplate(templateResource.getStream()) + .autoCloseStream(false) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } + // 单表多数据导出 模板格式为 {.属性} + for (Object d : data) { + excelWriter.fill(d, writeSheet); + } + excelWriter.finish(); + } + + /** + * 多表多数据模板导出 模板格式为 {key.属性} + * + * @param filename 文件名 + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param response 响应体 + */ + public static void exportTemplateMultiList(Map data, String filename, String templatePath, HttpServletResponse response) { + try { + resetResponse(filename, response); + ServletOutputStream os = response.getOutputStream(); + exportTemplateMultiList(data, templatePath, os); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + + /** + * 多表多数据模板导出 模板格式为 {key.属性} + * + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param os 输出流 + */ + public static void exportTemplateMultiList(Map data, String templatePath, OutputStream os) { + ClassPathResource templateResource = new ClassPathResource(templatePath); + ExcelWriter excelWriter = EasyExcel.write(os) + .withTemplate(templateResource.getStream()) + .autoCloseStream(false) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } + for (Map.Entry map : data.entrySet()) { + // 设置列表后续还有数据 + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + if (map.getValue() instanceof Collection) { + // 多表导出必须使用 FillWrapper + excelWriter.fill(new FillWrapper(map.getKey(), (Collection) map.getValue()), fillConfig, writeSheet); + } else { + excelWriter.fill(map.getValue(), writeSheet); + } + } + excelWriter.finish(); + } + + /** + * 重置响应体 + */ + private static void resetResponse(String sheetName, HttpServletResponse response) throws UnsupportedEncodingException { + String filename = encodingFilename(sheetName); + FileUtils.setAttachmentResponseHeader(response, filename); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(StringUtils.SEPARATORSTR); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[0].equals(value)) { + propertyString.append(itemArray[1] + separator); + break; + } + } + } else { + if (itemArray[0].equals(propertyValue)) { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(StringUtils.SEPARATORSTR); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[1].equals(value)) { + propertyString.append(itemArray[0] + separator); + break; + } + } + } else { + if (itemArray[1].equals(propertyValue)) { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 编码文件名 + */ + public static String encodingFilename(String filename) { + return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx"; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ProjectExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ProjectExcelUtil.java index c074481..101e9a4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ProjectExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ProjectExcelUtil.java @@ -7,7 +7,6 @@ import com.ruoyi.common.annotation.Excels; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.text.Convert; -import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.UtilException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DictUtils; @@ -75,7 +74,18 @@ import java.math.BigDecimal; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; import java.util.stream.Collectors; /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java index b19953e..d78aede 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java @@ -1,5 +1,13 @@ package com.ruoyi.common.utils.reflect; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.DateUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -7,22 +15,14 @@ import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Date; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.Validate; -import org.apache.poi.ss.usermodel.DateUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.ruoyi.common.core.text.Convert; -import com.ruoyi.common.utils.DateUtils; /** * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. - * + * * @author ruoyi */ @SuppressWarnings("rawtypes") -public class ReflectUtils -{ +public class ReflectUtils { private static final String SETTER_PREFIX = "set"; private static final String GETTER_PREFIX = "get"; @@ -36,13 +36,11 @@ public class ReflectUtils * 支持多级,如:对象名.对象名.方法 */ @SuppressWarnings("unchecked") - public static E invokeGetter(Object obj, String propertyName) - { + public static E invokeGetter(Object obj, String propertyName) { Object object = obj; - for (String name : StringUtils.split(propertyName, ".")) - { + for (String name : StringUtils.split(propertyName, ".")) { String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); - object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{}); } return (E) object; } @@ -51,21 +49,16 @@ public class ReflectUtils * 调用Setter方法, 仅匹配方法名。 * 支持多级,如:对象名.对象名.方法 */ - public static void invokeSetter(Object obj, String propertyName, E value) - { + public static void invokeSetter(Object obj, String propertyName, E value) { Object object = obj; String[] names = StringUtils.split(propertyName, "."); - for (int i = 0; i < names.length; i++) - { - if (i < names.length - 1) - { + for (int i = 0; i < names.length; i++) { + if (i < names.length - 1) { String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); - object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); - } - else - { + object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{}); + } else { String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); - invokeMethodByName(object, setterMethodName, new Object[] { value }); + invokeMethodByName(object, setterMethodName, new Object[]{value}); } } } @@ -74,21 +67,16 @@ public class ReflectUtils * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. */ @SuppressWarnings("unchecked") - public static E getFieldValue(final Object obj, final String fieldName) - { + public static E getFieldValue(final Object obj, final String fieldName) { Field field = getAccessibleField(obj, fieldName); - if (field == null) - { + if (field == null) { logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); return null; } E result = null; - try - { + try { result = (E) field.get(obj); - } - catch (IllegalAccessException e) - { + } catch (IllegalAccessException e) { logger.error("不可能抛出的异常{}", e.getMessage()); } return result; @@ -97,21 +85,16 @@ public class ReflectUtils /** * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. */ - public static void setFieldValue(final Object obj, final String fieldName, final E value) - { + public static void setFieldValue(final Object obj, final String fieldName, final E value) { Field field = getAccessibleField(obj, fieldName); - if (field == null) - { + if (field == null) { // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); return; } - try - { + try { field.set(obj, value); - } - catch (IllegalAccessException e) - { + } catch (IllegalAccessException e) { logger.error("不可能抛出的异常: {}", e.getMessage()); } } @@ -123,24 +106,18 @@ public class ReflectUtils */ @SuppressWarnings("unchecked") public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, - final Object[] args) - { - if (obj == null || methodName == null) - { + final Object[] args) { + if (obj == null || methodName == null) { return null; } Method method = getAccessibleMethod(obj, methodName, parameterTypes); - if (method == null) - { + if (method == null) { logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); return null; } - try - { + try { return (E) method.invoke(obj, args); - } - catch (Exception e) - { + } catch (Exception e) { String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; throw convertReflectionExceptionToUnchecked(msg, e); } @@ -152,68 +129,44 @@ public class ReflectUtils * 只匹配函数名,如果有多个同名函数调用第一个。 */ @SuppressWarnings("unchecked") - public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) - { + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) { Method method = getAccessibleMethodByName(obj, methodName, args.length); - if (method == null) - { + if (method == null) { // 如果为空不报错,直接返回空。 logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); return null; } - try - { + try { // 类型转换(将参数数据类型转换为目标方法参数类型) Class[] cs = method.getParameterTypes(); - for (int i = 0; i < cs.length; i++) - { - if (args[i] != null && !args[i].getClass().equals(cs[i])) - { - if (cs[i] == String.class) - { + for (int i = 0; i < cs.length; i++) { + if (args[i] != null && !args[i].getClass().equals(cs[i])) { + if (cs[i] == String.class) { args[i] = Convert.toStr(args[i]); - if (StringUtils.endsWith((String) args[i], ".0")) - { + if (StringUtils.endsWith((String) args[i], ".0")) { args[i] = StringUtils.substringBefore((String) args[i], ".0"); } - } - else if (cs[i] == Integer.class) - { + } else if (cs[i] == Integer.class) { args[i] = Convert.toInt(args[i]); - } - else if (cs[i] == Long.class) - { + } else if (cs[i] == Long.class) { args[i] = Convert.toLong(args[i]); - } - else if (cs[i] == Double.class) - { + } else if (cs[i] == Double.class) { args[i] = Convert.toDouble(args[i]); - } - else if (cs[i] == Float.class) - { + } else if (cs[i] == Float.class) { args[i] = Convert.toFloat(args[i]); - } - else if (cs[i] == Date.class) - { - if (args[i] instanceof String) - { + } else if (cs[i] == Date.class) { + if (args[i] instanceof String) { args[i] = DateUtils.parseDate(args[i]); - } - else - { + } else { args[i] = DateUtil.getJavaDate((Double) args[i]); } - } - else if (cs[i] == boolean.class || cs[i] == Boolean.class) - { + } else if (cs[i] == boolean.class || cs[i] == Boolean.class) { args[i] = Convert.toBool(args[i]); } } } return (E) method.invoke(obj, args); - } - catch (Exception e) - { + } catch (Exception e) { String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; throw convertReflectionExceptionToUnchecked(msg, e); } @@ -223,24 +176,18 @@ public class ReflectUtils * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. * 如向上转型到Object仍无法找到, 返回null. */ - public static Field getAccessibleField(final Object obj, final String fieldName) - { + public static Field getAccessibleField(final Object obj, final String fieldName) { // 为空不报错。直接返回 null - if (obj == null) - { + if (obj == null) { return null; } Validate.notBlank(fieldName, "fieldName can't be blank"); - for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) - { - try - { + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) { + try { Field field = superClass.getDeclaredField(fieldName); makeAccessible(field); return field; - } - catch (NoSuchFieldException e) - { + } catch (NoSuchFieldException e) { continue; } } @@ -254,24 +201,18 @@ public class ReflectUtils * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) */ public static Method getAccessibleMethod(final Object obj, final String methodName, - final Class... parameterTypes) - { + final Class... parameterTypes) { // 为空不报错。直接返回 null - if (obj == null) - { + if (obj == null) { return null; } Validate.notBlank(methodName, "methodName can't be blank"); - for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) - { - try - { + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) { + try { Method method = searchType.getDeclaredMethod(methodName, parameterTypes); makeAccessible(method); return method; - } - catch (NoSuchMethodException e) - { + } catch (NoSuchMethodException e) { continue; } } @@ -284,21 +225,16 @@ public class ReflectUtils * 只匹配函数名。 * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) */ - public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) - { + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) { // 为空不报错。直接返回 null - if (obj == null) - { + if (obj == null) { return null; } Validate.notBlank(methodName, "methodName can't be blank"); - for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) - { + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) { Method[] methods = searchType.getDeclaredMethods(); - for (Method method : methods) - { - if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) - { + for (Method method : methods) { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) { makeAccessible(method); return method; } @@ -310,11 +246,9 @@ public class ReflectUtils /** * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 */ - public static void makeAccessible(Method method) - { + public static void makeAccessible(Method method) { if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) - && !method.isAccessible()) - { + && !method.isAccessible()) { method.setAccessible(true); } } @@ -322,11 +256,9 @@ public class ReflectUtils /** * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 */ - public static void makeAccessible(Field field) - { + public static void makeAccessible(Field field) { if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) - || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) - { + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) { field.setAccessible(true); } } @@ -336,8 +268,7 @@ public class ReflectUtils * 如无法找到, 返回Object.class. */ @SuppressWarnings("unchecked") - public static Class getClassGenricType(final Class clazz) - { + public static Class getClassGenricType(final Class clazz) { return getClassGenricType(clazz, 0); } @@ -345,26 +276,22 @@ public class ReflectUtils * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. * 如无法找到, 返回Object.class. */ - public static Class getClassGenricType(final Class clazz, final int index) - { + public static Class getClassGenricType(final Class clazz, final int index) { Type genType = clazz.getGenericSuperclass(); - if (!(genType instanceof ParameterizedType)) - { + if (!(genType instanceof ParameterizedType)) { logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); - if (index >= params.length || index < 0) - { + if (index >= params.length || index < 0) { logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + params.length); return Object.class; } - if (!(params[index] instanceof Class)) - { + if (!(params[index] instanceof Class)) { logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); return Object.class; } @@ -372,18 +299,14 @@ public class ReflectUtils return (Class) params[index]; } - public static Class getUserClass(Object instance) - { - if (instance == null) - { + public static Class getUserClass(Object instance) { + if (instance == null) { throw new RuntimeException("Instance must not be null"); } Class clazz = instance.getClass(); - if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) - { + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) { Class superClass = clazz.getSuperclass(); - if (superClass != null && !Object.class.equals(superClass)) - { + if (superClass != null && !Object.class.equals(superClass)) { return superClass; } } @@ -394,15 +317,11 @@ public class ReflectUtils /** * 将反射时的checked exception转换为unchecked exception. */ - public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) - { + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) { if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException - || e instanceof NoSuchMethodException) - { + || e instanceof NoSuchMethodException) { return new IllegalArgumentException(msg, e); - } - else if (e instanceof InvocationTargetException) - { + } else if (e instanceof InvocationTargetException) { return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); } return new RuntimeException(msg, e); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java index ca1cd92..55659bc 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java @@ -2,75 +2,63 @@ package com.ruoyi.common.utils.sign; /** * Base64工具类 - * + * * @author ruoyi */ -public final class Base64 -{ - static private final int BASELENGTH = 128; - static private final int LOOKUPLENGTH = 64; - static private final int TWENTYFOURBITGROUP = 24; - static private final int EIGHTBIT = 8; - static private final int SIXTEENBIT = 16; - static private final int FOURBYTE = 4; - static private final int SIGN = -128; - static private final char PAD = '='; - static final private byte[] base64Alphabet = new byte[BASELENGTH]; - static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; - - static - { - for (int i = 0; i < BASELENGTH; ++i) - { +public final class Base64 { + static private final int BASELENGTH = 128; + static private final int LOOKUPLENGTH = 64; + static private final int TWENTYFOURBITGROUP = 24; + static private final int EIGHTBIT = 8; + static private final int SIXTEENBIT = 16; + static private final int FOURBYTE = 4; + static private final int SIGN = -128; + static private final char PAD = '='; + static final private byte[] base64Alphabet = new byte[BASELENGTH]; + static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; + + static { + for (int i = 0; i < BASELENGTH; ++i) { base64Alphabet[i] = -1; } - for (int i = 'Z'; i >= 'A'; i--) - { + for (int i = 'Z'; i >= 'A'; i--) { base64Alphabet[i] = (byte) (i - 'A'); } - for (int i = 'z'; i >= 'a'; i--) - { + for (int i = 'z'; i >= 'a'; i--) { base64Alphabet[i] = (byte) (i - 'a' + 26); } - for (int i = '9'; i >= '0'; i--) - { + for (int i = '9'; i >= '0'; i--) { base64Alphabet[i] = (byte) (i - '0' + 52); } base64Alphabet['+'] = 62; base64Alphabet['/'] = 63; - for (int i = 0; i <= 25; i++) - { + for (int i = 0; i <= 25; i++) { lookUpBase64Alphabet[i] = (char) ('A' + i); } - for (int i = 26, j = 0; i <= 51; i++, j++) - { + for (int i = 26, j = 0; i <= 51; i++, j++) { lookUpBase64Alphabet[i] = (char) ('a' + j); } - for (int i = 52, j = 0; i <= 61; i++, j++) - { + for (int i = 52, j = 0; i <= 61; i++, j++) { lookUpBase64Alphabet[i] = (char) ('0' + j); } lookUpBase64Alphabet[62] = (char) '+'; lookUpBase64Alphabet[63] = (char) '/'; } - private static boolean isWhiteSpace(char octect) - { + private static boolean isWhiteSpace(char octect) { return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); } - private static boolean isPad(char octect) - { + private static boolean isPad(char octect) { return (octect == PAD); } - private static boolean isData(char octect) - { + private static boolean isData(char octect) { return (octect < BASELENGTH && base64Alphabet[octect] != -1); } @@ -80,16 +68,13 @@ public final class Base64 * @param binaryData Array containing binaryData * @return Encoded Base64 array */ - public static String encode(byte[] binaryData) - { - if (binaryData == null) - { + public static String encode(byte[] binaryData) { + if (binaryData == null) { return null; } int lengthDataBits = binaryData.length * EIGHTBIT; - if (lengthDataBits == 0) - { + if (lengthDataBits == 0) { return ""; } @@ -105,8 +90,7 @@ public final class Base64 int encodedIndex = 0; int dataIndex = 0; - for (int i = 0; i < numberTriplets; i++) - { + for (int i = 0; i < numberTriplets; i++) { b1 = binaryData[dataIndex++]; b2 = binaryData[dataIndex++]; b3 = binaryData[dataIndex++]; @@ -125,8 +109,7 @@ public final class Base64 } // form integral number of 6-bit groups - if (fewerThan24bits == EIGHTBIT) - { + if (fewerThan24bits == EIGHTBIT) { b1 = binaryData[dataIndex]; k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); @@ -134,9 +117,7 @@ public final class Base64 encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; encodedData[encodedIndex++] = PAD; encodedData[encodedIndex++] = PAD; - } - else if (fewerThan24bits == SIXTEENBIT) - { + } else if (fewerThan24bits == SIXTEENBIT) { b1 = binaryData[dataIndex]; b2 = binaryData[dataIndex + 1]; l = (byte) (b2 & 0x0f); @@ -159,10 +140,8 @@ public final class Base64 * @param encoded string containing Base64 data * @return Array containind decoded data. */ - public static byte[] decode(String encoded) - { - if (encoded == null) - { + public static byte[] decode(String encoded) { + if (encoded == null) { return null; } @@ -170,15 +149,13 @@ public final class Base64 // remove white spaces int len = removeWhiteSpace(base64Data); - if (len % FOURBYTE != 0) - { + if (len % FOURBYTE != 0) { return null;// should be divisible by four } int numberQuadruple = (len / FOURBYTE); - if (numberQuadruple == 0) - { + if (numberQuadruple == 0) { return new byte[0]; } @@ -191,12 +168,10 @@ public final class Base64 int dataIndex = 0; decodedData = new byte[(numberQuadruple) * 3]; - for (; i < numberQuadruple - 1; i++) - { + for (; i < numberQuadruple - 1; i++) { if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])) - || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) - { + || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) { return null; } // if found "no data" just return null @@ -210,8 +185,7 @@ public final class Base64 decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); } - if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) - { + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) { return null;// if found "no data" just return null } @@ -220,10 +194,8 @@ public final class Base64 d3 = base64Data[dataIndex++]; d4 = base64Data[dataIndex++]; - if (!isData((d3)) || !isData((d4))) - {// Check if they are PAD characters - if (isPad(d3) && isPad(d4)) - { + if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters + if (isPad(d3) && isPad(d4)) { if ((b2 & 0xf) != 0)// last 4 bits should be zero { return null; @@ -232,9 +204,7 @@ public final class Base64 System.arraycopy(decodedData, 0, tmp, 0, i * 3); tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); return tmp; - } - else if (!isPad(d3) && isPad(d4)) - { + } else if (!isPad(d3) && isPad(d4)) { b3 = base64Alphabet[d3]; if ((b3 & 0x3) != 0)// last 2 bits should be zero { @@ -245,14 +215,10 @@ public final class Base64 tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); return tmp; - } - else - { + } else { return null; } - } - else - { // No PAD e.g 3cQl + } else { // No PAD e.g 3cQl b3 = base64Alphabet[d3]; b4 = base64Alphabet[d4]; decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); @@ -269,20 +235,16 @@ public final class Base64 * @param data the byte array of base64 data (with WS) * @return the new length */ - private static int removeWhiteSpace(char[] data) - { - if (data == null) - { + private static int removeWhiteSpace(char[] data) { + if (data == null) { return 0; } // count characters that's not whitespace int newSize = 0; int len = data.length; - for (int i = 0; i < len; i++) - { - if (!isWhiteSpace(data[i])) - { + for (int i = 0; i < len; i++) { + if (!isWhiteSpace(data[i])) { data[newSize++] = data[i]; } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java index c1c58db..93bb070 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java @@ -1,50 +1,42 @@ package com.ruoyi.common.utils.sign; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; + /** * Md5加密方法 - * + * * @author ruoyi */ -public class Md5Utils -{ +public class Md5Utils { private static final Logger log = LoggerFactory.getLogger(Md5Utils.class); - private static byte[] md5(String s) - { + private static byte[] md5(String s) { MessageDigest algorithm; - try - { + try { algorithm = MessageDigest.getInstance("MD5"); algorithm.reset(); algorithm.update(s.getBytes("UTF-8")); byte[] messageDigest = algorithm.digest(); return messageDigest; - } - catch (Exception e) - { + } catch (Exception e) { log.error("MD5 Error...", e); } return null; } - private static final String toHex(byte hash[]) - { - if (hash == null) - { + private static final String toHex(byte hash[]) { + if (hash == null) { return null; } StringBuffer buf = new StringBuffer(hash.length * 2); int i; - for (i = 0; i < hash.length; i++) - { - if ((hash[i] & 0xff) < 0x10) - { + for (i = 0; i < hash.length; i++) { + if ((hash[i] & 0xff) < 0x10) { buf.append("0"); } buf.append(Long.toString(hash[i] & 0xff, 16)); @@ -52,14 +44,10 @@ public class Md5Utils return buf.toString(); } - public static String hash(String s) - { - try - { + public static String hash(String s) { + try { return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); - } - catch (Exception e) - { + } catch (Exception e) { log.error("not supported charset...{}", e); return s; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java index f290ec3..023b977 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java @@ -1,5 +1,6 @@ package com.ruoyi.common.utils.spring; +import com.ruoyi.common.utils.StringUtils; import org.springframework.aop.framework.AopContext; import org.springframework.beans.BeansException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -8,44 +9,30 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; -import com.ruoyi.common.utils.StringUtils; /** * spring工具类 方便在非spring管理环境中获取bean - * + * * @author ruoyi */ @Component -public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware -{ - /** Spring应用上下文环境 */ +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ private static ConfigurableListableBeanFactory beanFactory; private static ApplicationContext applicationContext; - @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException - { - SpringUtils.beanFactory = beanFactory; - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException - { - SpringUtils.applicationContext = applicationContext; - } - /** * 获取对象 * * @param name * @return Object 一个以所给名字注册的bean的实例 * @throws org.springframework.beans.BeansException - * */ @SuppressWarnings("unchecked") - public static T getBean(String name) throws BeansException - { + public static T getBean(String name) throws BeansException { return (T) beanFactory.getBean(name); } @@ -55,10 +42,8 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC * @param clz * @return * @throws org.springframework.beans.BeansException - * */ - public static T getBean(Class clz) throws BeansException - { + public static T getBean(Class clz) throws BeansException { T result = (T) beanFactory.getBean(clz); return result; } @@ -69,8 +54,7 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC * @param name * @return boolean */ - public static boolean containsBean(String name) - { + public static boolean containsBean(String name) { return beanFactory.containsBean(name); } @@ -80,10 +64,8 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC * @param name * @return boolean * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException - * */ - public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException - { + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { return beanFactory.isSingleton(name); } @@ -91,10 +73,8 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC * @param name * @return Class 注册对象的类型 * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException - * */ - public static Class getType(String name) throws NoSuchBeanDefinitionException - { + public static Class getType(String name) throws NoSuchBeanDefinitionException { return beanFactory.getType(name); } @@ -104,22 +84,19 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC * @param name * @return * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException - * */ - public static String[] getAliases(String name) throws NoSuchBeanDefinitionException - { + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { return beanFactory.getAliases(name); } /** * 获取aop代理对象 - * + * * @param invoker * @return */ @SuppressWarnings("unchecked") - public static T getAopProxy(T invoker) - { + public static T getAopProxy(T invoker) { return (T) AopContext.currentProxy(); } @@ -128,8 +105,7 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC * * @return 当前的环境配置 */ - public static String[] getActiveProfiles() - { + public static String[] getActiveProfiles() { return applicationContext.getEnvironment().getActiveProfiles(); } @@ -138,8 +114,7 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC * * @return 当前的环境配置 */ - public static String getActiveProfile() - { + public static String getActiveProfile() { final String[] activeProfiles = getActiveProfiles(); return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; } @@ -149,10 +124,18 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC * * @param key 配置文件的key * @return 当前的配置文件的值 - * */ - public static String getRequiredProperty(String key) - { + public static String getRequiredProperty(String key) { return applicationContext.getEnvironment().getRequiredProperty(key); } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringUtils.applicationContext = applicationContext; + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java index 93b0347..90c665a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java @@ -5,37 +5,31 @@ import com.ruoyi.common.utils.StringUtils; /** * sql操作工具类 - * + * * @author ruoyi */ -public class SqlUtil -{ +public class SqlUtil { + /** + * 限制orderBy最大长度 + */ + private static final int ORDER_BY_MAX_LENGTH = 500; /** * 定义常用的 sql关键字 */ public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()"; - /** * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) */ public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; - /** - * 限制orderBy最大长度 - */ - private static final int ORDER_BY_MAX_LENGTH = 500; - /** * 检查字符,防止注入绕过 */ - public static String escapeOrderBySql(String value) - { - if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) - { + public static String escapeOrderBySql(String value) { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { throw new UtilException("参数不符合规范,不能进行查询"); } - if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) - { + if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) { throw new UtilException("参数已超过最大限制,不能进行查询"); } return value; @@ -44,25 +38,20 @@ public class SqlUtil /** * 验证 order by 语法是否符合规范 */ - public static boolean isValidOrderBySql(String value) - { + public static boolean isValidOrderBySql(String value) { return value.matches(SQL_PATTERN); } /** * SQL关键字检查 */ - public static void filterKeyword(String value) - { - if (StringUtils.isEmpty(value)) - { + public static void filterKeyword(String value) { + if (StringUtils.isEmpty(value)) { return; } String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); - for (String sqlKeyword : sqlKeywords) - { - if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) - { + for (String sqlKeyword : sqlKeywords) { + if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) { throw new UtilException("参数存在SQL注入风险"); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java index 2c84427..f5cd6ef 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java @@ -2,48 +2,43 @@ package com.ruoyi.common.utils.uuid; /** * ID生成器工具类 - * + * * @author ruoyi */ -public class IdUtils -{ +public class IdUtils { /** * 获取随机UUID - * + * * @return 随机UUID */ - public static String randomUUID() - { + public static String randomUUID() { return UUID.randomUUID().toString(); } /** * 简化的UUID,去掉了横线 - * + * * @return 简化的UUID,去掉了横线 */ - public static String simpleUUID() - { + public static String simpleUUID() { return UUID.randomUUID().toString(true); } /** * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID - * + * * @return 随机UUID */ - public static String fastUUID() - { + public static String fastUUID() { return UUID.fastUUID().toString(); } /** * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID - * + * * @return 简化的UUID,去掉了横线 */ - public static String fastSimpleUUID() - { + public static String fastSimpleUUID() { return UUID.fastUUID().toString(true); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java index bf99611..249df16 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java @@ -1,49 +1,43 @@ package com.ruoyi.common.utils.uuid; -import java.util.concurrent.atomic.AtomicInteger; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; +import java.util.concurrent.atomic.AtomicInteger; + /** * @author ruoyi 序列生成类 */ -public class Seq -{ +public class Seq { // 通用序列类型 public static final String commSeqType = "COMMON"; // 上传序列类型 public static final String uploadSeqType = "UPLOAD"; - + // 机器标识 + private static final String machineCode = "A"; // 通用接口序列数 private static AtomicInteger commSeq = new AtomicInteger(1); - // 上传接口序列数 private static AtomicInteger uploadSeq = new AtomicInteger(1); - // 机器标识 - private static final String machineCode = "A"; - /** * 获取通用序列号 - * + * * @return 序列值 */ - public static String getId() - { + public static String getId() { return getId(commSeqType); } - + /** * 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串 - * + * * @return 序列值 */ - public static String getId(String type) - { + public static String getId(String type) { AtomicInteger atomicInt = commSeq; - if (uploadSeqType.equals(type)) - { + if (uploadSeqType.equals(type)) { atomicInt = uploadSeq; } return getId(atomicInt, 3); @@ -51,13 +45,12 @@ public class Seq /** * 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串 - * + * * @param atomicInt 序列数 - * @param length 数值长度 + * @param length 数值长度 * @return 序列值 */ - public static String getId(AtomicInteger atomicInt, int length) - { + public static String getId(AtomicInteger atomicInt, int length) { String result = DateUtils.dateTimeNow(); result += machineCode; result += getSeq(atomicInt, length); @@ -66,18 +59,16 @@ public class Seq /** * 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数 - * + * * @return 序列值 */ - private synchronized static String getSeq(AtomicInteger atomicInt, int length) - { + private synchronized static String getSeq(AtomicInteger atomicInt, int length) { // 先取值再+1 int value = atomicInt.getAndIncrement(); // 如果更新后值>=10 的 (length)幂次方则重置为1 int maxSeq = (int) Math.pow(10, length); - if (atomicInt.get() >= maxSeq) - { + if (atomicInt.get() >= maxSeq) { atomicInt.set(1); } // 转字符串,用0左补齐 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java index a5585d6..b62b030 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java @@ -1,52 +1,42 @@ package com.ruoyi.common.utils.uuid; +import com.ruoyi.common.exception.UtilException; + import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; -import com.ruoyi.common.exception.UtilException; /** * 提供通用唯一识别码(universally unique identifier)(UUID)实现 * * @author ruoyi */ -public final class UUID implements java.io.Serializable, Comparable -{ +public final class UUID implements java.io.Serializable, Comparable { private static final long serialVersionUID = -1185015143654744140L; - /** - * SecureRandom 的单例 - * + * 此UUID的最高64有效位 */ - private static class Holder - { - static final SecureRandom numberGenerator = getSecureRandom(); - } - - /** 此UUID的最高64有效位 */ private final long mostSigBits; - - /** 此UUID的最低64有效位 */ + /** + * 此UUID的最低64有效位 + */ private final long leastSigBits; /** * 私有构造 - * + * * @param data 数据 */ - private UUID(byte[] data) - { + private UUID(byte[] data) { long msb = 0; long lsb = 0; assert data.length == 16 : "data must be 16 bytes in length"; - for (int i = 0; i < 8; i++) - { + for (int i = 0; i < 8; i++) { msb = (msb << 8) | (data[i] & 0xff); } - for (int i = 8; i < 16; i++) - { + for (int i = 8; i < 16; i++) { lsb = (lsb << 8) | (data[i] & 0xff); } this.mostSigBits = msb; @@ -56,43 +46,39 @@ public final class UUID implements java.io.Serializable, Comparable /** * 使用指定的数据构造新的 UUID。 * - * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位 + * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位 * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位 */ - public UUID(long mostSigBits, long leastSigBits) - { + public UUID(long mostSigBits, long leastSigBits) { this.mostSigBits = mostSigBits; this.leastSigBits = leastSigBits; } /** * 获取类型 4(伪随机生成的)UUID 的静态工厂。 - * + * * @return 随机生成的 {@code UUID} */ - public static UUID fastUUID() - { + public static UUID fastUUID() { return randomUUID(false); } /** * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 - * + * * @return 随机生成的 {@code UUID} */ - public static UUID randomUUID() - { + public static UUID randomUUID() { return randomUUID(true); } /** * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 - * + * * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能 * @return 随机生成的 {@code UUID} */ - public static UUID randomUUID(boolean isSecure) - { + public static UUID randomUUID(boolean isSecure) { final Random ng = isSecure ? Holder.numberGenerator : getRandom(); byte[] randomBytes = new byte[16]; @@ -108,18 +94,13 @@ public final class UUID implements java.io.Serializable, Comparable * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。 * * @param name 用于构造 UUID 的字节数组。 - * * @return 根据指定数组生成的 {@code UUID} */ - public static UUID nameUUIDFromBytes(byte[] name) - { + public static UUID nameUUIDFromBytes(byte[] name) { MessageDigest md; - try - { + try { md = MessageDigest.getInstance("MD5"); - } - catch (NoSuchAlgorithmException nsae) - { + } catch (NoSuchAlgorithmException nsae) { throw new InternalError("MD5 not supported"); } byte[] md5Bytes = md.digest(name); @@ -136,17 +117,13 @@ public final class UUID implements java.io.Serializable, Comparable * @param name 指定 {@code UUID} 字符串 * @return 具有指定值的 {@code UUID} * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常 - * */ - public static UUID fromString(String name) - { + public static UUID fromString(String name) { String[] components = name.split("-"); - if (components.length != 5) - { + if (components.length != 5) { throw new IllegalArgumentException("Invalid UUID string: " + name); } - for (int i = 0; i < 5; i++) - { + for (int i = 0; i < 5; i++) { components[i] = "0x" + components[i]; } @@ -163,13 +140,47 @@ public final class UUID implements java.io.Serializable, Comparable return new UUID(mostSigBits, leastSigBits); } + /** + * 返回指定数字对应的hex值 + * + * @param val 值 + * @param digits 位 + * @return 值 + */ + private static String digits(long val, int digits) { + long hi = 1L << (digits * 4); + return Long.toHexString(hi | (val & (hi - 1))).substring(1); + } + + /** + * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) + * + * @return {@link SecureRandom} + */ + public static SecureRandom getSecureRandom() { + try { + return SecureRandom.getInstance("SHA1PRNG"); + } catch (NoSuchAlgorithmException e) { + throw new UtilException(e); + } + } + + /** + * 获取随机数生成器对象
+ * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() { + return ThreadLocalRandom.current(); + } + /** * 返回此 UUID 的 128 位值中的最低有效 64 位。 * * @return 此 UUID 的 128 位值中的最低有效 64 位。 */ - public long getLeastSignificantBits() - { + public long getLeastSignificantBits() { return leastSigBits; } @@ -178,8 +189,7 @@ public final class UUID implements java.io.Serializable, Comparable * * @return 此 UUID 的 128 位值中最高有效 64 位。 */ - public long getMostSignificantBits() - { + public long getMostSignificantBits() { return mostSigBits; } @@ -196,8 +206,7 @@ public final class UUID implements java.io.Serializable, Comparable * * @return 此 {@code UUID} 的版本号 */ - public int version() - { + public int version() { // Version is bits masked by 0x000000000000F000 in MS long return (int) ((mostSigBits >> 12) & 0x0f); } @@ -215,8 +224,7 @@ public final class UUID implements java.io.Serializable, Comparable * * @return 此 {@code UUID} 相关联的变体号 */ - public int variant() - { + public int variant() { // This field is composed of a varying number of bits. // 0 - - Reserved for NCS backward compatibility // 1 0 - The IETF aka Leach-Salz variant (used by this class) @@ -238,8 +246,7 @@ public final class UUID implements java.io.Serializable, Comparable * * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。 */ - public long timestamp() throws UnsupportedOperationException - { + public long timestamp() throws UnsupportedOperationException { checkTimeBase(); return (mostSigBits & 0x0FFFL) << 48// | ((mostSigBits >> 16) & 0x0FFFFL) << 32// @@ -256,11 +263,9 @@ public final class UUID implements java.io.Serializable, Comparable * UnsupportedOperationException。 * * @return 此 {@code UUID} 的时钟序列 - * * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 */ - public int clockSequence() throws UnsupportedOperationException - { + public int clockSequence() throws UnsupportedOperationException { checkTimeBase(); return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); } @@ -275,11 +280,9 @@ public final class UUID implements java.io.Serializable, Comparable * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 * * @return 此 {@code UUID} 的节点值 - * * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 */ - public long node() throws UnsupportedOperationException - { + public long node() throws UnsupportedOperationException { checkTimeBase(); return leastSigBits & 0x0000FFFFFFFFFFFFL; } @@ -289,7 +292,7 @@ public final class UUID implements java.io.Serializable, Comparable * *

* UUID 的字符串表示形式由此 BNF 描述: - * + * *

      * {@code
      * UUID                   = ----
@@ -302,15 +305,14 @@ public final class UUID implements java.io.Serializable, Comparable
      * hexDigit               = [0-9a-fA-F]
      * }
      * 
- * + * * * * @return 此{@code UUID} 的字符串表现形式 * @see #toString(boolean) */ @Override - public String toString() - { + public String toString() { return toString(false); } @@ -319,7 +321,7 @@ public final class UUID implements java.io.Serializable, Comparable * *

* UUID 的字符串表示形式由此 BNF 描述: - * + * *

      * {@code
      * UUID                   = ----
@@ -332,37 +334,32 @@ public final class UUID implements java.io.Serializable, Comparable
      * hexDigit               = [0-9a-fA-F]
      * }
      * 
- * + * * * * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串 * @return 此{@code UUID} 的字符串表现形式 */ - public String toString(boolean isSimple) - { + public String toString(boolean isSimple) { final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); // time_low builder.append(digits(mostSigBits >> 32, 8)); - if (!isSimple) - { + if (!isSimple) { builder.append('-'); } // time_mid builder.append(digits(mostSigBits >> 16, 4)); - if (!isSimple) - { + if (!isSimple) { builder.append('-'); } // time_high_and_version builder.append(digits(mostSigBits, 4)); - if (!isSimple) - { + if (!isSimple) { builder.append('-'); } // variant_and_sequence builder.append(digits(leastSigBits >> 48, 4)); - if (!isSimple) - { + if (!isSimple) { builder.append('-'); } // node @@ -371,40 +368,39 @@ public final class UUID implements java.io.Serializable, Comparable return builder.toString(); } + // Comparison Operations + /** * 返回此 UUID 的哈希码。 * * @return UUID 的哈希码值。 */ @Override - public int hashCode() - { + public int hashCode() { long hilo = mostSigBits ^ leastSigBits; return ((int) (hilo >> 32)) ^ (int) hilo; } + // ------------------------------------------------------------------------------------------------------------------- + // Private method start + /** * 将此对象与指定对象比较。 *

* 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。 * * @param obj 要与之比较的对象 - * * @return 如果对象相同,则返回 {@code true};否则返回 {@code false} */ @Override - public boolean equals(Object obj) - { - if ((null == obj) || (obj.getClass() != UUID.class)) - { + public boolean equals(Object obj) { + if ((null == obj) || (obj.getClass() != UUID.class)) { return false; } UUID id = (UUID) obj; return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); } - // Comparison Operations - /** * 将此 UUID 与指定的 UUID 比较。 * @@ -412,13 +408,10 @@ public final class UUID implements java.io.Serializable, Comparable * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。 * * @param val 与此 UUID 比较的 UUID - * * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。 - * */ @Override - public int compareTo(UUID val) - { + public int compareTo(UUID val) { // The ordering is intentionally set up so that the UUIDs // can simply be numerically compared as two numbers return (this.mostSigBits < val.mostSigBits ? -1 : // @@ -428,57 +421,19 @@ public final class UUID implements java.io.Serializable, Comparable 0)))); } - // ------------------------------------------------------------------------------------------------------------------- - // Private method start - /** - * 返回指定数字对应的hex值 - * - * @param val 值 - * @param digits 位 - * @return 值 - */ - private static String digits(long val, int digits) - { - long hi = 1L << (digits * 4); - return Long.toHexString(hi | (val & (hi - 1))).substring(1); - } - /** * 检查是否为time-based版本UUID */ - private void checkTimeBase() - { - if (version() != 1) - { + private void checkTimeBase() { + if (version() != 1) { throw new UnsupportedOperationException("Not a time-based UUID"); } } /** - * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) - * - * @return {@link SecureRandom} - */ - public static SecureRandom getSecureRandom() - { - try - { - return SecureRandom.getInstance("SHA1PRNG"); - } - catch (NoSuchAlgorithmException e) - { - throw new UtilException(e); - } - } - - /** - * 获取随机数生成器对象
- * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 - * - * @return {@link ThreadLocalRandom} + * SecureRandom 的单例 */ - public static ThreadLocalRandom getRandom() - { - return ThreadLocalRandom.current(); + private static class Holder { + static final SecureRandom numberGenerator = getSecureRandom(); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java b/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java index 7bfdf04..46c7317 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java @@ -9,17 +9,16 @@ import java.lang.annotation.Target; /** * 自定义xss校验注解 - * + * * @author ruoyi */ @Retention(RetentionPolicy.RUNTIME) -@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER }) -@Constraint(validatedBy = { XssValidator.class }) -public @interface Xss -{ +@Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER}) +@Constraint(validatedBy = {XssValidator.class}) +public @interface Xss { String message() - default "不允许任何脚本运行"; + default "不允许任何脚本运行"; Class[] groups() default {}; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java b/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java index 42f425c..1767f64 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java @@ -1,6 +1,7 @@ package com.ruoyi.common.xss; import com.ruoyi.common.utils.StringUtils; + import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.regex.Matcher; @@ -8,32 +9,27 @@ import java.util.regex.Pattern; /** * 自定义xss校验注解实现 - * + * * @author ruoyi */ -public class XssValidator implements ConstraintValidator -{ +public class XssValidator implements ConstraintValidator { private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />"; - @Override - public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) - { - if (StringUtils.isBlank(value)) - { - return true; - } - return !containsHtml(value); - } - - public static boolean containsHtml(String value) - { + public static boolean containsHtml(String value) { StringBuilder sHtml = new StringBuilder(); Pattern pattern = Pattern.compile(HTML_PATTERN); Matcher matcher = pattern.matcher(value); - while (matcher.find()) - { + while (matcher.find()) { sHtml.append(matcher.group()); } return pattern.matcher(sHtml).matches(); } + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { + if (StringUtils.isBlank(value)) { + return true; + } + return !containsHtml(value); + } } \ No newline at end of file diff --git a/ruoyi-flowable/pom.xml b/ruoyi-flowable/pom.xml new file mode 100644 index 0000000..03db846 --- /dev/null +++ b/ruoyi-flowable/pom.xml @@ -0,0 +1,47 @@ + + + + ruoyi + com.ruoyi + 3.8.7 + + 4.0.0 + + ruoyi-flowable + + + flowable工作流 + + + + + + org.projectlombok + lombok + + + + com.ruoyi + ruoyi-common + + + + org.flowable + flowable-spring-boot-starter-process + + + + com.googlecode.aviator + aviator + 5.3.1 + + + + cn.hutool + hutool-all + 5.8.25 + + + diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/ProcessConstants.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/ProcessConstants.java new file mode 100644 index 0000000..320387e --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/ProcessConstants.java @@ -0,0 +1,82 @@ +package com.ruoyi.flowable.common.constant; + +/** + * 流程常量信息 + * + * @author Xuan xuan + * @date 2021/4/17 22:46 + */ +public class ProcessConstants { + + public static final String SUFFIX = ".bpmn"; + + /** + * 动态数据 + */ + public static final String DATA_TYPE = "dynamic"; + + /** + * 单个审批人 + */ + public static final String USER_TYPE_ASSIGNEE = "assignee"; + + + /** + * 候选人 + */ + public static final String USER_TYPE_USERS = "candidateUsers"; + + + /** + * 审批组 + */ + public static final String USER_TYPE_ROUPS = "candidateGroups"; + + /** + * 单个审批人 + */ + public static final String PROCESS_APPROVAL = "approval"; + + /** + * 会签人员 + */ + public static final String PROCESS_MULTI_INSTANCE_USER = "userList"; + + /** + * nameapace + */ + public static final String NAMASPASE = "http://flowable.org/bpmn"; + + /** + * 会签节点 + */ + public static final String PROCESS_MULTI_INSTANCE = "multiInstance"; + + /** + * 自定义属性 dataType + */ + public static final String PROCESS_CUSTOM_DATA_TYPE = "dataType"; + + /** + * 自定义属性 userType + */ + public static final String PROCESS_CUSTOM_USER_TYPE = "userType"; + + /** + * 自定义属性 localScope + */ + public static final String PROCESS_FORM_LOCAL_SCOPE = "localScope"; + + /** + * 自定义属性 流程状态 + */ + public static final String PROCESS_STATUS_KEY = "processStatus"; + + + /** + * 流程跳过 + */ + public static final String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; + + +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/TaskConstants.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/TaskConstants.java new file mode 100644 index 0000000..bf5e6d4 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/TaskConstants.java @@ -0,0 +1,23 @@ +package com.ruoyi.flowable.common.constant; + +/** + * @author konbai + * @createTime 2022/4/24 13:24 + */ +public class TaskConstants { + + /** + * 流程发起人 + */ + public static final String PROCESS_INITIATOR = "initiator"; + + /** + * 角色候选组前缀 + */ + public static final String ROLE_GROUP_PREFIX = "ROLE"; + + /** + * 部门候选组前缀 + */ + public static final String DEPT_GROUP_PREFIX = "DEPT"; +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/FlowComment.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/FlowComment.java new file mode 100644 index 0000000..165d695 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/FlowComment.java @@ -0,0 +1,44 @@ +package com.ruoyi.flowable.common.enums; + +/** + * 流程意见类型 + * + * @author Xuan xuan + * @date 2021/4/19 + */ +public enum FlowComment { + + /** + * 说明 + */ + NORMAL("1", "正常"), + REBACK("2", "退回"), + REJECT("3", "驳回"), + DELEGATE("4", "委派"), + TRANSFER("5", "转办"), + STOP("6", "终止"), + REVOKE("7", "撤回"); + + /** + * 类型 + */ + private final String type; + + /** + * 说明 + */ + private final String remark; + + FlowComment(String type, String remark) { + this.type = type; + this.remark = remark; + } + + public String getType() { + return type; + } + + public String getRemark() { + return remark; + } +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/FormType.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/FormType.java new file mode 100644 index 0000000..adce351 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/FormType.java @@ -0,0 +1,33 @@ +package com.ruoyi.flowable.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author KonBAI + * @createTime 2022/6/28 9:51 + */ +@Getter +@AllArgsConstructor +public enum FormType { + + /** + * 流程表单 + */ + PROCESS(0), + + /** + * 外置表单 + */ + EXTERNAL(1), + + /** + * 节点独立表单 + */ + INDEPENDENT(2); + + /** + * 表单类型 + */ + private final Integer type; +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/ProcessStatus.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/ProcessStatus.java new file mode 100644 index 0000000..08e89fa --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/enums/ProcessStatus.java @@ -0,0 +1,44 @@ +package com.ruoyi.flowable.common.enums; + +import com.ruoyi.common.utils.StringUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author konbai + * @since 2023/3/9 00:45 + */ +@Getter +@AllArgsConstructor +public enum ProcessStatus { + + /** + * 进行中(审批中) + */ + RUNNING("running"), + /** + * 已终止 + */ + TERMINATED("terminated"), + /** + * 已完成 + */ + COMPLETED("completed"), + /** + * 已取消 + */ + CANCELED("canceled"); + + private final String status; + + public static ProcessStatus getProcessStatus(String str) { + if (StringUtils.isNotBlank(str)) { + for (ProcessStatus value : values()) { + if (StringUtils.equalsIgnoreCase(str, value.getStatus())) { + return value; + } + } + } + return null; + } +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/config/GlobalEventListenerConfig.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/config/GlobalEventListenerConfig.java new file mode 100644 index 0000000..2c1f9cc --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/config/GlobalEventListenerConfig.java @@ -0,0 +1,28 @@ +package com.ruoyi.flowable.config; + +import com.ruoyi.flowable.listener.GlobalEventListener; +import lombok.AllArgsConstructor; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; +import org.flowable.engine.RuntimeService; +import org.springframework.context.ApplicationListener; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.event.ContextRefreshedEvent; + +/** + * flowable全局监听配置 + * + * @author ssc + */ +@Configuration +@AllArgsConstructor +public class GlobalEventListenerConfig implements ApplicationListener { + + private final GlobalEventListener globalEventListener; + private final RuntimeService runtimeService; + + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { + // 流程正常结束 + runtimeService.addEventListener(globalEventListener, FlowableEngineEventType.PROCESS_COMPLETED); + } +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/config/MyDefaultProcessDiagramCanvas.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/config/MyDefaultProcessDiagramCanvas.java new file mode 100644 index 0000000..8a77b92 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/config/MyDefaultProcessDiagramCanvas.java @@ -0,0 +1,94 @@ +package com.ruoyi.flowable.config; + +import org.flowable.bpmn.model.AssociationDirection; +import org.flowable.image.impl.DefaultProcessDiagramCanvas; + +import java.awt.*; +import java.awt.geom.Line2D; +import java.awt.geom.RoundRectangle2D; + +/** + * @author XuanXuan + * @date 2021-04-03 + */ +public class MyDefaultProcessDiagramCanvas extends DefaultProcessDiagramCanvas { + //设置高亮线的颜色 这里我设置成绿色 + protected static Color HIGHLIGHT_SEQUENCEFLOW_COLOR = Color.GREEN; + + public MyDefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + super(width, height, minX, minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + } + + public MyDefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType) { + super(width, height, minX, minY, imageType); + } + + + /** + * 画线颜色设置 + */ + @Override + public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, + AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { + + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(CONNECTION_COLOR); + if (connectionType.equals("association")) { + g.setStroke(ASSOCIATION_STROKE); + } else if (highLighted) { + //设置线的颜色 + g.setPaint(originalPaint); + g.setStroke(HIGHLIGHT_FLOW_STROKE); + } + + for (int i = 1; i < xPoints.length; i++) { + Integer sourceX = xPoints[i - 1]; + Integer sourceY = yPoints[i - 1]; + Integer targetX = xPoints[i]; + Integer targetY = yPoints[i]; + Line2D.Double line = new Line2D.Double(sourceX, sourceY, targetX, targetY); + g.draw(line); + } + + if (isDefault) { + Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); + drawDefaultSequenceFlowIndicator(line, scaleFactor); + } + + if (conditional) { + Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); + drawConditionalSequenceFlowIndicator(line, scaleFactor); + } + + if (associationDirection == AssociationDirection.ONE || associationDirection == AssociationDirection.BOTH) { + Line2D.Double line = new Line2D.Double(xPoints[xPoints.length - 2], yPoints[xPoints.length - 2], xPoints[xPoints.length - 1], yPoints[xPoints.length - 1]); + drawArrowHead(line, scaleFactor); + } + if (associationDirection == AssociationDirection.BOTH) { + Line2D.Double line = new Line2D.Double(xPoints[1], yPoints[1], xPoints[0], yPoints[0]); + drawArrowHead(line, scaleFactor); + } + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * 高亮节点设置 + */ + @Override + public void drawHighLight(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + //设置高亮节点的颜色 + g.setPaint(HIGHLIGHT_COLOR); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/core/FormConf.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/core/FormConf.java new file mode 100644 index 0000000..2deb259 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/core/FormConf.java @@ -0,0 +1,65 @@ +package com.ruoyi.flowable.core; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 表单属性类 + * + * @author KonBAI + * @createTime 2022/8/6 18:54 + */ +@Data +public class FormConf { + + /** + * 标题 + */ + private String title; + /** + * 表单名 + */ + private String formRef; + /** + * 表单模型 + */ + private String formModel; + /** + * 表单尺寸 + */ + private String size; + /** + * 标签对齐 + */ + private String labelPosition; + /** + * 标签宽度 + */ + private Integer labelWidth; + /** + * 校验模型 + */ + private String formRules; + /** + * 栅格间隔 + */ + private Integer gutter; + /** + * 禁用表单 + */ + private Boolean disabled = false; + /** + * 栅格占据的列数 + */ + private Integer span; + /** + * 表单按钮 + */ + private Boolean formBtns = true; + /** + * 表单项 + */ + private List> fields; +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/core/domain/ProcessQuery.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/core/domain/ProcessQuery.java new file mode 100644 index 0000000..fea7619 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/core/domain/ProcessQuery.java @@ -0,0 +1,41 @@ +package com.ruoyi.flowable.core.domain; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +/** + * 流程查询实体对象 + * + * @author KonBAI + * @createTime 2022/6/11 01:15 + */ +@Data +public class ProcessQuery { + + /** + * 流程标识 + */ + private String processKey; + + /** + * 流程名称 + */ + private String processName; + + /** + * 流程分类 + */ + private String category; + + /** + * 状态 + */ + private String state; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/factory/FlowServiceFactory.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/factory/FlowServiceFactory.java new file mode 100644 index 0000000..9f69ad8 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/factory/FlowServiceFactory.java @@ -0,0 +1,52 @@ +package com.ruoyi.flowable.factory; + +import lombok.Getter; +import org.flowable.engine.FormService; +import org.flowable.engine.HistoryService; +import org.flowable.engine.IdentityService; +import org.flowable.engine.ManagementService; +import org.flowable.engine.ProcessEngine; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * flowable 引擎注入封装 + * + * @author XuanXuan + * @date 2021-04-03 + */ +@Component +@Getter +public class FlowServiceFactory { + + @Resource + protected RepositoryService repositoryService; + + @Resource + protected RuntimeService runtimeService; + + @Resource + protected IdentityService identityService; + + @Resource + protected TaskService taskService; + + @Resource + protected FormService formService; + + @Resource + protected HistoryService historyService; + + @Resource + protected ManagementService managementService; + + @Qualifier("processEngine") + @Resource + protected ProcessEngine processEngine; + +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/CustomProcessDiagramCanvas.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/CustomProcessDiagramCanvas.java new file mode 100644 index 0000000..f73fc60 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/CustomProcessDiagramCanvas.java @@ -0,0 +1,378 @@ +package com.ruoyi.flowable.flow; + +import org.flowable.bpmn.model.AssociationDirection; +import org.flowable.bpmn.model.GraphicInfo; +import org.flowable.image.impl.DefaultProcessDiagramCanvas; +import org.flowable.image.util.ReflectUtil; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.font.FontRenderContext; +import java.awt.font.LineBreakMeasurer; +import java.awt.font.TextAttribute; +import java.awt.font.TextLayout; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.text.AttributedCharacterIterator; +import java.text.AttributedString; + +/** + * @author XuanXuan + * @date 2021/4/4 23:58 + */ +public class CustomProcessDiagramCanvas extends DefaultProcessDiagramCanvas { + //定义走过流程连线颜色为绿色 + protected static Color HIGHLIGHT_SequenceFlow_COLOR = Color.GREEN; + //设置未走过流程的连接线颜色 + protected static Color CONNECTION_COLOR = Color.BLACK; + //设置flows连接线字体颜色red + protected static Color LABEL_COLOR = new Color(0, 0, 0); + //高亮显示task框颜色 + protected static Color HIGHLIGHT_COLOR = Color.GREEN; + protected static Color HIGHLIGHT_COLOR1 = Color.RED; + protected static Color EVENT_COLOR = new Color(255, 255, 255); + + public CustomProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + super(width, height, minX, minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + this.initialize(imageType); + } + + /** + * 重写绘制连线的方式,设置绘制颜色 + * + * @param xPoints + * @param yPoints + * @param conditional + * @param isDefault + * @param connectionType + * @param associationDirection + * @param highLighted + * @param scaleFactor + */ + @Override + public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { + Paint originalPaint = this.g.getPaint(); + Stroke originalStroke = this.g.getStroke(); + this.g.setPaint(CONNECTION_COLOR); + if (connectionType.equals("association")) { + this.g.setStroke(ASSOCIATION_STROKE); + } else if (highLighted) { + this.g.setPaint(HIGHLIGHT_SequenceFlow_COLOR); + this.g.setStroke(HIGHLIGHT_FLOW_STROKE); + } + + for (int i = 1; i < xPoints.length; ++i) { + int sourceX = xPoints[i - 1]; + int sourceY = yPoints[i - 1]; + int targetX = xPoints[i]; + int targetY = yPoints[i]; + java.awt.geom.Line2D.Double line = new java.awt.geom.Line2D.Double((double) sourceX, (double) sourceY, (double) targetX, (double) targetY); + this.g.draw(line); + } + + java.awt.geom.Line2D.Double line; + if (isDefault) { + line = new java.awt.geom.Line2D.Double((double) xPoints[0], (double) yPoints[0], (double) xPoints[1], (double) yPoints[1]); + this.drawDefaultSequenceFlowIndicator(line, scaleFactor); + } + + if (conditional) { + line = new java.awt.geom.Line2D.Double((double) xPoints[0], (double) yPoints[0], (double) xPoints[1], (double) yPoints[1]); + this.drawConditionalSequenceFlowIndicator(line, scaleFactor); + } + + if (associationDirection.equals(AssociationDirection.ONE) || associationDirection.equals(AssociationDirection.BOTH)) { + line = new java.awt.geom.Line2D.Double((double) xPoints[xPoints.length - 2], (double) yPoints[xPoints.length - 2], (double) xPoints[xPoints.length - 1], (double) yPoints[xPoints.length - 1]); + this.drawArrowHead(line, scaleFactor); + } + + if (associationDirection.equals(AssociationDirection.BOTH)) { + line = new java.awt.geom.Line2D.Double((double) xPoints[1], (double) yPoints[1], (double) xPoints[0], (double) yPoints[0]); + this.drawArrowHead(line, scaleFactor); + } + + this.g.setPaint(originalPaint); + this.g.setStroke(originalStroke); + } + + /** + * 设置字体大小图标颜色 + * + * @param imageType + */ + @Override + public void initialize(String imageType) { + if ("png".equalsIgnoreCase(imageType)) { + this.processDiagram = new BufferedImage(this.canvasWidth, this.canvasHeight, 2); + } else { + this.processDiagram = new BufferedImage(this.canvasWidth, this.canvasHeight, 1); + } + + this.g = this.processDiagram.createGraphics(); + if (!"png".equalsIgnoreCase(imageType)) { + this.g.setBackground(new Color(255, 255, 255, 0)); + this.g.clearRect(0, 0, this.canvasWidth, this.canvasHeight); + } + + this.g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + //修改图标颜色,修改图标字体大小 + this.g.setPaint(Color.black); + Font font = new Font(this.activityFontName, 10, 14); + this.g.setFont(font); + this.fontMetrics = this.g.getFontMetrics(); + //修改连接线字体大小 + LABEL_FONT = new Font(this.labelFontName, 10, 15); + ANNOTATION_FONT = new Font(this.annotationFontName, 0, 11); + + try { + USERTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/userTask.png", this.customClassLoader)); + SCRIPTTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/scriptTask.png", this.customClassLoader)); + SERVICETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/serviceTask.png", this.customClassLoader)); + RECEIVETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/receiveTask.png", this.customClassLoader)); + SENDTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/sendTask.png", this.customClassLoader)); + MANUALTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/manualTask.png", this.customClassLoader)); + BUSINESS_RULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/businessRuleTask.png", this.customClassLoader)); + SHELL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/shellTask.png", this.customClassLoader)); + DMN_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/dmnTask.png", this.customClassLoader)); + CAMEL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/camelTask.png", this.customClassLoader)); + MULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/muleTask.png", this.customClassLoader)); + HTTP_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/httpTask.png", this.customClassLoader)); + TIMER_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/timer.png", this.customClassLoader)); + COMPENSATE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/compensate-throw.png", this.customClassLoader)); + COMPENSATE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/compensate.png", this.customClassLoader)); + ERROR_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/error-throw.png", this.customClassLoader)); + ERROR_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/error.png", this.customClassLoader)); + MESSAGE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/message-throw.png", this.customClassLoader)); + MESSAGE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/message.png", this.customClassLoader)); + SIGNAL_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/signal-throw.png", this.customClassLoader)); + SIGNAL_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/signal.png", this.customClassLoader)); + } catch (IOException var4) { + LOGGER.warn("Could not load image for process diagram creation: {}", var4.getMessage()); + } + + } + + /** + * 设置连接线字体 + * + * @param text + * @param graphicInfo + * @param centered + */ + @Override + public void drawLabel(String text, GraphicInfo graphicInfo, boolean centered) { + float interline = 1.0f; + + // text + if (text != null && text.length() > 0) { + Paint originalPaint = g.getPaint(); + Font originalFont = g.getFont(); + + g.setPaint(LABEL_COLOR); + g.setFont(LABEL_FONT); + + int wrapWidth = 100; + int textY = (int) graphicInfo.getY(); + + // TODO: use drawMultilineText() + AttributedString as = new AttributedString(text); + as.addAttribute(TextAttribute.FOREGROUND, g.getPaint()); + as.addAttribute(TextAttribute.FONT, g.getFont()); + AttributedCharacterIterator aci = as.getIterator(); + FontRenderContext frc = new FontRenderContext(null, true, false); + LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc); + + while (lbm.getPosition() < text.length()) { + TextLayout tl = lbm.nextLayout(wrapWidth); + textY += tl.getAscent(); + + Rectangle2D bb = tl.getBounds(); + double tX = graphicInfo.getX(); + + if (centered) { + tX += (int) (graphicInfo.getWidth() / 2 - bb.getWidth() / 2); + } + tl.draw(g, (float) tX, textY); + textY += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.getAscent(); + } + + // restore originals + g.setFont(originalFont); + g.setPaint(originalPaint); + } + } + + /** + * 高亮显示task框完成的 + * + * @param x + * @param y + * @param width + * @param height + */ + @Override + public void drawHighLight(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(HIGHLIGHT_COLOR); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * 自定义task框当前的位置 + * + * @param x + * @param y + * @param width + * @param height + */ + public void drawHighLightNow(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(HIGHLIGHT_COLOR1); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * 自定义结束节点 + * + * @param x + * @param y + * @param width + * @param height + */ + public void drawHighLightEnd(int x, int y, int width, int height) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + + g.setPaint(HIGHLIGHT_COLOR); + g.setStroke(THICK_TASK_BORDER_STROKE); + + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); + g.draw(rect); + + g.setPaint(originalPaint); + g.setStroke(originalStroke); + } + + /** + * task框自定义文字 + * + * @param name + * @param graphicInfo + * @param thickBorder + * @param scaleFactor + */ + @Override + protected void drawTask(String name, GraphicInfo graphicInfo, boolean thickBorder, double scaleFactor) { + + Paint originalPaint = g.getPaint(); + int x = (int) graphicInfo.getX(); + int y = (int) graphicInfo.getY(); + int width = (int) graphicInfo.getWidth(); + int height = (int) graphicInfo.getHeight(); + + // Create a new gradient paint for every task box, gradient depends on x and y and is not relative + g.setPaint(TASK_BOX_COLOR); + + int arcR = 6; + if (thickBorder) { + arcR = 3; + } + + // shape + RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, arcR, arcR); + g.fill(rect); + g.setPaint(TASK_BORDER_COLOR); + + if (thickBorder) { + Stroke originalStroke = g.getStroke(); + g.setStroke(THICK_TASK_BORDER_STROKE); + g.draw(rect); + g.setStroke(originalStroke); + } else { + g.draw(rect); + } + + g.setPaint(originalPaint); + // text + if (scaleFactor == 1.0 && name != null && name.length() > 0) { + int boxWidth = width - (2 * TEXT_PADDING); + int boxHeight = height - 16 - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2; + int boxX = x + width / 2 - boxWidth / 2; + int boxY = y + height / 2 - boxHeight / 2 + ICON_PADDING + ICON_PADDING - 2 - 2; + + drawMultilineCentredText(name, boxX, boxY, boxWidth, boxHeight); + } + } + + /** + * 重写开始事件 + * + * @param graphicInfo + * @param image + * @param scaleFactor + */ + @Override + public void drawStartEvent(GraphicInfo graphicInfo, BufferedImage image, double scaleFactor) { + Paint originalPaint = g.getPaint(); + g.setPaint(EVENT_COLOR); + Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + graphicInfo.getWidth(), graphicInfo.getHeight()); + g.fill(circle); + g.setPaint(EVENT_BORDER_COLOR); + g.draw(circle); + g.setPaint(originalPaint); + if (image != null) { + // calculate coordinates to center image + int imageX = (int) Math.round(graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / (2 * scaleFactor))); + int imageY = (int) Math.round(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / (2 * scaleFactor))); + g.drawImage(image, imageX, imageY, + (int) (image.getWidth() / scaleFactor), (int) (image.getHeight() / scaleFactor), null); + } + + } + + /** + * 重写结束事件 + * + * @param graphicInfo + * @param scaleFactor + */ + @Override + public void drawNoneEndEvent(GraphicInfo graphicInfo, double scaleFactor) { + Paint originalPaint = g.getPaint(); + Stroke originalStroke = g.getStroke(); + g.setPaint(EVENT_COLOR); + Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + graphicInfo.getWidth(), graphicInfo.getHeight()); + g.fill(circle); + g.setPaint(EVENT_BORDER_COLOR); +// g.setPaint(HIGHLIGHT_COLOR); + if (scaleFactor == 1.0) { + g.setStroke(END_EVENT_STROKE); + } else { + g.setStroke(new BasicStroke(2.0f)); + } + g.draw(circle); + g.setStroke(originalStroke); + g.setPaint(originalPaint); + } +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/CustomProcessDiagramGenerator.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/CustomProcessDiagramGenerator.java new file mode 100644 index 0000000..2a2daed --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/CustomProcessDiagramGenerator.java @@ -0,0 +1,416 @@ +package com.ruoyi.flowable.flow; + + +import org.flowable.bpmn.model.Activity; +import org.flowable.bpmn.model.Artifact; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.CallActivity; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.FlowElementsContainer; +import org.flowable.bpmn.model.FlowNode; +import org.flowable.bpmn.model.Gateway; +import org.flowable.bpmn.model.GraphicInfo; +import org.flowable.bpmn.model.Lane; +import org.flowable.bpmn.model.MultiInstanceLoopCharacteristics; +import org.flowable.bpmn.model.Pool; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.SequenceFlow; +import org.flowable.bpmn.model.SubProcess; +import org.flowable.image.impl.DefaultProcessDiagramCanvas; +import org.flowable.image.impl.DefaultProcessDiagramGenerator; + +import java.util.Iterator; +import java.util.List; + +/** + * @author XuanXuan + * @date 2021/4/5 0:31 + */ +public class CustomProcessDiagramGenerator extends DefaultProcessDiagramGenerator { + protected static DefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { + double minX = 1.7976931348623157E308D; + double maxX = 0.0D; + double minY = 1.7976931348623157E308D; + double maxY = 0.0D; + + GraphicInfo nrOfLanes; + for (Iterator flowNodes = bpmnModel.getPools().iterator(); flowNodes.hasNext(); maxY = nrOfLanes.getY() + nrOfLanes.getHeight()) { + Pool artifacts = (Pool) flowNodes.next(); + nrOfLanes = bpmnModel.getGraphicInfo(artifacts.getId()); + minX = nrOfLanes.getX(); + maxX = nrOfLanes.getX() + nrOfLanes.getWidth(); + minY = nrOfLanes.getY(); + } + + List var23 = gatherAllFlowNodes(bpmnModel); + Iterator var24 = var23.iterator(); + + label155: + while (var24.hasNext()) { + FlowNode var26 = (FlowNode) var24.next(); + GraphicInfo artifact = bpmnModel.getGraphicInfo(var26.getId()); + if (artifact.getX() + artifact.getWidth() > maxX) { + maxX = artifact.getX() + artifact.getWidth(); + } + + if (artifact.getX() < minX) { + minX = artifact.getX(); + } + + if (artifact.getY() + artifact.getHeight() > maxY) { + maxY = artifact.getY() + artifact.getHeight(); + } + + if (artifact.getY() < minY) { + minY = artifact.getY(); + } + + Iterator process = var26.getOutgoingFlows().iterator(); + + while (true) { + List l; + do { + if (!process.hasNext()) { + continue label155; + } + + SequenceFlow graphicInfoList = (SequenceFlow) process.next(); + l = bpmnModel.getFlowLocationGraphicInfo(graphicInfoList.getId()); + } while (l == null); + + Iterator graphicInfo = l.iterator(); + + while (graphicInfo.hasNext()) { + GraphicInfo graphicInfo1 = (GraphicInfo) graphicInfo.next(); + if (graphicInfo1.getX() > maxX) { + maxX = graphicInfo1.getX(); + } + + if (graphicInfo1.getX() < minX) { + minX = graphicInfo1.getX(); + } + + if (graphicInfo1.getY() > maxY) { + maxY = graphicInfo1.getY(); + } + + if (graphicInfo1.getY() < minY) { + minY = graphicInfo1.getY(); + } + } + } + } + + List var25 = gatherAllArtifacts(bpmnModel); + Iterator var27 = var25.iterator(); + + GraphicInfo var37; + while (var27.hasNext()) { + Artifact var29 = (Artifact) var27.next(); + GraphicInfo var31 = bpmnModel.getGraphicInfo(var29.getId()); + if (var31 != null) { + if (var31.getX() + var31.getWidth() > maxX) { + maxX = var31.getX() + var31.getWidth(); + } + + if (var31.getX() < minX) { + minX = var31.getX(); + } + + if (var31.getY() + var31.getHeight() > maxY) { + maxY = var31.getY() + var31.getHeight(); + } + + if (var31.getY() < minY) { + minY = var31.getY(); + } + } + + List var33 = bpmnModel.getFlowLocationGraphicInfo(var29.getId()); + if (var33 != null) { + Iterator var35 = var33.iterator(); + + while (var35.hasNext()) { + var37 = (GraphicInfo) var35.next(); + if (var37.getX() > maxX) { + maxX = var37.getX(); + } + + if (var37.getX() < minX) { + minX = var37.getX(); + } + + if (var37.getY() > maxY) { + maxY = var37.getY(); + } + + if (var37.getY() < minY) { + minY = var37.getY(); + } + } + } + } + + int var28 = 0; + Iterator var30 = bpmnModel.getProcesses().iterator(); + + while (var30.hasNext()) { + Process var32 = (Process) var30.next(); + Iterator var34 = var32.getLanes().iterator(); + + while (var34.hasNext()) { + Lane var36 = (Lane) var34.next(); + ++var28; + var37 = bpmnModel.getGraphicInfo(var36.getId()); + if (var37.getX() + var37.getWidth() > maxX) { + maxX = var37.getX() + var37.getWidth(); + } + + if (var37.getX() < minX) { + minX = var37.getX(); + } + + if (var37.getY() + var37.getHeight() > maxY) { + maxY = var37.getY() + var37.getHeight(); + } + + if (var37.getY() < minY) { + minY = var37.getY(); + } + } + } + + if (var23.isEmpty() && bpmnModel.getPools().isEmpty() && var28 == 0) { + minX = 0.0D; + minY = 0.0D; + } + + return new CustomProcessDiagramCanvas((int) maxX + 10, (int) maxY + 10, (int) minX, (int) minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + } + + private static void drawHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + private static void drawHighLightNow(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLightNow((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + private static void drawHighLightEnd(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { + processDiagramCanvas.drawHighLightEnd((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); + + } + + @Override + protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { + this.prepareBpmnModel(bpmnModel); + DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); + Iterator var13 = bpmnModel.getPools().iterator(); + + while (var13.hasNext()) { + Pool process = (Pool) var13.next(); + GraphicInfo subProcesses = bpmnModel.getGraphicInfo(process.getId()); + processDiagramCanvas.drawPoolOrLane(process.getName(), subProcesses, scaleFactor); + } + + var13 = bpmnModel.getProcesses().iterator(); + + Process process1; + Iterator subProcesses1; + while (var13.hasNext()) { + process1 = (Process) var13.next(); + subProcesses1 = process1.getLanes().iterator(); + + while (subProcesses1.hasNext()) { + Lane artifact = (Lane) subProcesses1.next(); + GraphicInfo subProcess = bpmnModel.getGraphicInfo(artifact.getId()); + processDiagramCanvas.drawPoolOrLane(artifact.getName(), subProcess, scaleFactor); + } + } + + var13 = bpmnModel.getProcesses().iterator(); + + while (var13.hasNext()) { + process1 = (Process) var13.next(); + subProcesses1 = process1.findFlowElementsOfType(FlowNode.class).iterator(); + + while (subProcesses1.hasNext()) { + FlowNode artifact1 = (FlowNode) subProcesses1.next(); + if (!this.isPartOfCollapsedSubProcess(artifact1, bpmnModel)) { + this.drawActivity(processDiagramCanvas, bpmnModel, artifact1, highLightedActivities, highLightedFlows, scaleFactor, Boolean.valueOf(drawSequenceFlowNameWithNoLabelDI)); + } + } + } + + var13 = bpmnModel.getProcesses().iterator(); + + label75: + while (true) { + List subProcesses2; + do { + if (!var13.hasNext()) { + return processDiagramCanvas; + } + + process1 = (Process) var13.next(); + subProcesses1 = process1.getArtifacts().iterator(); + + while (subProcesses1.hasNext()) { + Artifact artifact2 = (Artifact) subProcesses1.next(); + this.drawArtifact(processDiagramCanvas, bpmnModel, artifact2); + } + + subProcesses2 = process1.findFlowElementsOfType(SubProcess.class, true); + } while (subProcesses2 == null); + + Iterator artifact3 = subProcesses2.iterator(); + + while (true) { + GraphicInfo graphicInfo; + SubProcess subProcess1; + do { + do { + if (!artifact3.hasNext()) { + continue label75; + } + + subProcess1 = (SubProcess) artifact3.next(); + graphicInfo = bpmnModel.getGraphicInfo(subProcess1.getId()); + } while (graphicInfo != null && graphicInfo.getExpanded() != null && !graphicInfo.getExpanded().booleanValue()); + } while (this.isPartOfCollapsedSubProcess(subProcess1, bpmnModel)); + + Iterator var19 = subProcess1.getArtifacts().iterator(); + + while (var19.hasNext()) { + Artifact subProcessArtifact = (Artifact) var19.next(); + this.drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact); + } + } + } + } + + @Override + protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, + FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor, Boolean drawSequenceFlowNameWithNoLabelDI) { + + ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass()); + if (drawInstruction != null) { + + drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode); + + // Gather info on the multi instance marker + boolean multiInstanceSequential = false; + boolean multiInstanceParallel = false; + boolean collapsed = false; + if (flowNode instanceof Activity) { + Activity activity = (Activity) flowNode; + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics(); + if (multiInstanceLoopCharacteristics != null) { + multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential(); + multiInstanceParallel = !multiInstanceSequential; + } + } + + // Gather info on the collapsed marker + GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); + if (flowNode instanceof SubProcess) { + collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded(); + } else if (flowNode instanceof CallActivity) { + collapsed = true; + } + + if (scaleFactor == 1.0) { + // Actually draw the markers + processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), + multiInstanceSequential, multiInstanceParallel, collapsed); + } + + // Draw highlighted activities + if (highLightedActivities.contains(flowNode.getId())) { + + if (highLightedActivities.get(highLightedActivities.size() - 1).equals(flowNode.getId()) + && !"endenv".equals(flowNode.getId())) { + if ((flowNode.getId().contains("Event_"))) { + drawHighLightEnd((CustomProcessDiagramCanvas) processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } else { + drawHighLightNow((CustomProcessDiagramCanvas) processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } + } else { + drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); + } + + + } + + } + + // Outgoing transitions of activity + for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { + boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId())); + String defaultFlow = null; + if (flowNode instanceof Activity) { + defaultFlow = ((Activity) flowNode).getDefaultFlow(); + } else if (flowNode instanceof Gateway) { + defaultFlow = ((Gateway) flowNode).getDefaultFlow(); + } + + boolean isDefault = false; + if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) { + isDefault = true; + } + boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway); + + String sourceRef = sequenceFlow.getSourceRef(); + String targetRef = sequenceFlow.getTargetRef(); + FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef); + FlowElement targetElement = bpmnModel.getFlowElement(targetRef); + List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); + if (graphicInfoList != null && graphicInfoList.size() > 0) { + graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); + int xPoints[] = new int[graphicInfoList.size()]; + int yPoints[] = new int[graphicInfoList.size()]; + + for (int i = 1; i < graphicInfoList.size(); i++) { + GraphicInfo graphicInfo = graphicInfoList.get(i); + GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); + + if (i == 1) { + xPoints[0] = (int) previousGraphicInfo.getX(); + yPoints[0] = (int) previousGraphicInfo.getY(); + } + xPoints[i] = (int) graphicInfo.getX(); + yPoints[i] = (int) graphicInfo.getY(); + + } + + processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor); + + + // Draw sequenceflow label + GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId()); + if (labelGraphicInfo != null) { + processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false); + } else { + if (drawSequenceFlowNameWithNoLabelDI) { + GraphicInfo lineCenter = getLineCenter(graphicInfoList); + processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false); + } + + } + } + } + + // Nested elements + if (flowNode instanceof FlowElementsContainer) { + for (FlowElement nestedFlowElement : ((FlowElementsContainer) flowNode).getFlowElements()) { + if (nestedFlowElement instanceof FlowNode && !isPartOfCollapsedSubProcess(nestedFlowElement, bpmnModel)) { + drawActivity(processDiagramCanvas, bpmnModel, (FlowNode) nestedFlowElement, + highLightedActivities, highLightedFlows, scaleFactor, drawSequenceFlowNameWithNoLabelDI); + } + } + } + } +} + diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FindNextNodeUtil.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FindNextNodeUtil.java new file mode 100644 index 0000000..d26c62c --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FindNextNodeUtil.java @@ -0,0 +1,234 @@ +package com.ruoyi.flowable.flow; + +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.Expression; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.CallActivity; +import org.flowable.bpmn.model.EndEvent; +import org.flowable.bpmn.model.ExclusiveGateway; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.Gateway; +import org.flowable.bpmn.model.ParallelGateway; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.ReceiveTask; +import org.flowable.bpmn.model.SequenceFlow; +import org.flowable.bpmn.model.ServiceTask; +import org.flowable.bpmn.model.StartEvent; +import org.flowable.bpmn.model.SubProcess; +import org.flowable.bpmn.model.Task; +import org.flowable.bpmn.model.UserTask; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.repository.ProcessDefinition; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * @author Xuan xuan + * @date 2021/4/19 20:51 + */ +public class FindNextNodeUtil { + + /** + * 获取下一步骤的用户任务 + * + * @param repositoryService + * @param map + * @return + */ + public static List getNextUserTasks(RepositoryService repositoryService, org.flowable.task.api.Task task, Map map) { + List data = new ArrayList<>(); + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + Process mainProcess = bpmnModel.getMainProcess(); + Collection flowElements = mainProcess.getFlowElements(); + String key = task.getTaskDefinitionKey(); + FlowElement flowElement = bpmnModel.getFlowElement(key); + next(flowElements, flowElement, map, data); + return data; + } + + public static void next(Collection flowElements, FlowElement flowElement, Map map, List nextUser) { + //如果是结束节点 + if (flowElement instanceof EndEvent) { + //如果是子任务的结束节点 + if (getSubProcess(flowElements, flowElement) != null) { + flowElement = getSubProcess(flowElements, flowElement); + } + } + //获取Task的出线信息--可以拥有多个 + List outGoingFlows = null; + if (flowElement instanceof Task) { + outGoingFlows = ((Task) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof Gateway) { + outGoingFlows = ((Gateway) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof StartEvent) { + outGoingFlows = ((StartEvent) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof SubProcess) { + outGoingFlows = ((SubProcess) flowElement).getOutgoingFlows(); + } else if (flowElement instanceof CallActivity) { + outGoingFlows = ((CallActivity) flowElement).getOutgoingFlows(); + } + if (outGoingFlows != null && outGoingFlows.size() > 0) { + //遍历所有的出线--找到可以正确执行的那一条 + for (SequenceFlow sequenceFlow : outGoingFlows) { + //1.有表达式,且为true + //2.无表达式 + String expression = sequenceFlow.getConditionExpression(); + if (expression == null || expressionResult(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))) { + //出线的下一节点 + String nextFlowElementID = sequenceFlow.getTargetRef(); + if (checkSubProcess(nextFlowElementID, flowElements, nextUser)) { + continue; + } + + //查询下一节点的信息 + FlowElement nextFlowElement = getFlowElementById(nextFlowElementID, flowElements); + //调用流程 + if (nextFlowElement instanceof CallActivity) { + CallActivity ca = (CallActivity) nextFlowElement; + if (ca.getLoopCharacteristics() != null) { + UserTask userTask = new UserTask(); + userTask.setId(ca.getId()); + + userTask.setId(ca.getId()); + userTask.setLoopCharacteristics(ca.getLoopCharacteristics()); + userTask.setName(ca.getName()); + nextUser.add(userTask); + } + next(flowElements, nextFlowElement, map, nextUser); + } + //用户任务 + if (nextFlowElement instanceof UserTask) { + nextUser.add((UserTask) nextFlowElement); + } + //排他网关 + else if (nextFlowElement instanceof ExclusiveGateway) { + next(flowElements, nextFlowElement, map, nextUser); + } + //并行网关 + else if (nextFlowElement instanceof ParallelGateway) { + next(flowElements, nextFlowElement, map, nextUser); + } + //接收任务 + else if (nextFlowElement instanceof ReceiveTask) { + next(flowElements, nextFlowElement, map, nextUser); + } + //服务任务 + else if (nextFlowElement instanceof ServiceTask) { + next(flowElements, nextFlowElement, map, nextUser); + } + //子任务的起点 + else if (nextFlowElement instanceof StartEvent) { + next(flowElements, nextFlowElement, map, nextUser); + } + //结束节点 + else if (nextFlowElement instanceof EndEvent) { + next(flowElements, nextFlowElement, map, nextUser); + } + } + } + } + } + + /** + * 判断是否是多实例子流程并且需要设置集合类型变量 + */ + public static boolean checkSubProcess(String Id, Collection flowElements, List nextUser) { + for (FlowElement flowElement1 : flowElements) { + if (flowElement1 instanceof SubProcess && flowElement1.getId().equals(Id)) { + + SubProcess sp = (SubProcess) flowElement1; + if (sp.getLoopCharacteristics() != null) { + String inputDataItem = sp.getLoopCharacteristics().getInputDataItem(); + UserTask userTask = new UserTask(); + userTask.setId(sp.getId()); + userTask.setLoopCharacteristics(sp.getLoopCharacteristics()); + userTask.setName(sp.getName()); + nextUser.add(userTask); + return true; + } + } + } + + return false; + + } + + /** + * 查询一个节点的是否子任务中的节点,如果是,返回子任务 + * + * @param flowElements 全流程的节点集合 + * @param flowElement 当前节点 + * @return + */ + public static FlowElement getSubProcess(Collection flowElements, FlowElement flowElement) { + for (FlowElement flowElement1 : flowElements) { + if (flowElement1 instanceof SubProcess) { + for (FlowElement flowElement2 : ((SubProcess) flowElement1).getFlowElements()) { + if (flowElement.equals(flowElement2)) { + return flowElement1; + } + } + } + } + return null; + } + + + /** + * 根据ID查询流程节点对象, 如果是子任务,则返回子任务的开始节点 + * + * @param Id 节点ID + * @param flowElements 流程节点集合 + * @return + */ + public static FlowElement getFlowElementById(String Id, Collection flowElements) { + for (FlowElement flowElement : flowElements) { + if (flowElement.getId().equals(Id)) { + //如果是子任务,则查询出子任务的开始节点 + if (flowElement instanceof SubProcess) { + return getStartFlowElement(((SubProcess) flowElement).getFlowElements()); + } + return flowElement; + } + if (flowElement instanceof SubProcess) { + FlowElement flowElement1 = getFlowElementById(Id, ((SubProcess) flowElement).getFlowElements()); + if (flowElement1 != null) { + return flowElement1; + } + } + } + return null; + } + + /** + * 返回流程的开始节点 + * + * @param flowElements 节点集合 + * @description: + */ + public static FlowElement getStartFlowElement(Collection flowElements) { + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof StartEvent) { + return flowElement; + } + } + return null; + } + + /** + * 校验el表达式 + * + * @param map + * @param expression + * @return + */ + public static boolean expressionResult(Map map, String expression) { + Expression exp = AviatorEvaluator.compile(expression); + final Object execute = exp.execute(map); + return Boolean.parseBoolean(String.valueOf(execute)); + } +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FlowableConfig.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FlowableConfig.java new file mode 100644 index 0000000..05501ad --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FlowableConfig.java @@ -0,0 +1,23 @@ +package com.ruoyi.flowable.flow; + +import org.flowable.spring.SpringProcessEngineConfiguration; +import org.flowable.spring.boot.EngineConfigurationConfigurer; +import org.springframework.context.annotation.Configuration; + + +/** + * @author XuanXuan + * @date 2021/4/5 01:32 + */ +@Configuration +public class FlowableConfig implements EngineConfigurationConfigurer { + + @Override + public void configure(SpringProcessEngineConfiguration engineConfiguration) { + engineConfiguration.setActivityFontName("宋体"); + engineConfiguration.setLabelFontName("宋体"); + engineConfiguration.setAnnotationFontName("宋体"); + + } +} + diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FlowableUtils.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FlowableUtils.java new file mode 100644 index 0000000..9e1565b --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FlowableUtils.java @@ -0,0 +1,733 @@ +package com.ruoyi.flowable.flow; + +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.exception.ServiceException; +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.EndEvent; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.FlowNode; +import org.flowable.bpmn.model.Gateway; +import org.flowable.bpmn.model.SequenceFlow; +import org.flowable.bpmn.model.StartEvent; +import org.flowable.bpmn.model.SubProcess; +import org.flowable.bpmn.model.UserTask; +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; +import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; +import org.flowable.task.api.history.HistoricTaskInstance; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.Stack; + +/** + * @author XuanXuan + * @date 2021-04-03 23:57 + */ +@Slf4j +public class FlowableUtils { + + /** + * 根据节点,获取入口连线 + * + * @param source + * @return + */ + public static List getElementIncomingFlows(FlowElement source) { + List sequenceFlows = null; + if (source instanceof FlowNode) { + sequenceFlows = ((FlowNode) source).getIncomingFlows(); + } else if (source instanceof Gateway) { + sequenceFlows = ((Gateway) source).getIncomingFlows(); + } else if (source instanceof SubProcess) { + sequenceFlows = ((SubProcess) source).getIncomingFlows(); + } else if (source instanceof StartEvent) { + sequenceFlows = ((StartEvent) source).getIncomingFlows(); + } else if (source instanceof EndEvent) { + sequenceFlows = ((EndEvent) source).getIncomingFlows(); + } + return sequenceFlows; + } + + /** + * 根据节点,获取出口连线 + * + * @param source + * @return + */ + public static List getElementOutgoingFlows(FlowElement source) { + List sequenceFlows = null; + if (source instanceof FlowNode) { + sequenceFlows = ((FlowNode) source).getOutgoingFlows(); + } else if (source instanceof Gateway) { + sequenceFlows = ((Gateway) source).getOutgoingFlows(); + } else if (source instanceof SubProcess) { + sequenceFlows = ((SubProcess) source).getOutgoingFlows(); + } else if (source instanceof StartEvent) { + sequenceFlows = ((StartEvent) source).getOutgoingFlows(); + } else if (source instanceof EndEvent) { + sequenceFlows = ((EndEvent) source).getOutgoingFlows(); + } + return sequenceFlows; + } + + /** + * 获取全部节点列表,包含子流程节点 + * + * @param flowElements + * @param allElements + * @return + */ + public static Collection getAllElements(Collection flowElements, Collection allElements) { + allElements = allElements == null ? new ArrayList<>() : allElements; + + for (FlowElement flowElement : flowElements) { + allElements.add(flowElement); + if (flowElement instanceof SubProcess) { + // 继续深入子流程,进一步获取子流程 + allElements = FlowableUtils.getAllElements(((SubProcess) flowElement).getFlowElements(), allElements); + } + } + return allElements; + } + + /** + * 迭代获取父级任务节点列表,向前找 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param userTaskList 已找到的用户任务节点 + * @return + */ + public static List iteratorFindParentUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) { + userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + userTaskList = iteratorFindParentUserTasks(source.getSubProcess(), hasSequenceFlow, userTaskList); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 类型为用户节点,则新增父级节点 + if (sequenceFlow.getSourceFlowElement() instanceof UserTask) { + userTaskList.add((UserTask) sequenceFlow.getSourceFlowElement()); + continue; + } + // 类型为子流程,则添加子流程开始节点出口处相连的节点 + if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { + // 获取子流程用户任务节点 + List childUserTaskList = findChildProcessUserTasks((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + userTaskList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + userTaskList = iteratorFindParentUserTasks(sequenceFlow.getSourceFlowElement(), hasSequenceFlow, userTaskList); + } + } + return userTaskList; + } + + /** + * 根据正在运行的任务节点,迭代获取子级任务节点列表,向后找 + * + * @param source 起始节点 + * @param runTaskKeyList 正在运行的任务 Key,用于校验任务节点是否是正在运行的节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param userTaskList 需要撤回的用户任务列表 + * @return + */ + public static List iteratorFindChildUserTasks(FlowElement source, List runTaskKeyList, Set hasSequenceFlow, List userTaskList) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + userTaskList = iteratorFindChildUserTasks(source.getSubProcess(), runTaskKeyList, hasSequenceFlow, userTaskList); + } + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果为用户任务类型,且任务节点的 Key 正在运行的任务中存在,添加 + if (sequenceFlow.getTargetFlowElement() instanceof UserTask && runTaskKeyList.contains((sequenceFlow.getTargetFlowElement()).getId())) { + userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement()); + continue; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + List childUserTaskList = iteratorFindChildUserTasks((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), runTaskKeyList, hasSequenceFlow, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + userTaskList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + userTaskList = iteratorFindChildUserTasks(sequenceFlow.getTargetFlowElement(), runTaskKeyList, hasSequenceFlow, userTaskList); + } + } + return userTaskList; + } + + /** + * 迭代获取子流程用户任务节点 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param userTaskList 需要撤回的用户任务列表 + * @return + */ + public static List findChildProcessUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果为用户任务类型,且任务节点的 Key 正在运行的任务中存在,添加 + if (sequenceFlow.getTargetFlowElement() instanceof UserTask) { + userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement()); + continue; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + List childUserTaskList = findChildProcessUserTasks((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childUserTaskList != null && childUserTaskList.size() > 0) { + userTaskList.addAll(childUserTaskList); + continue; + } + } + // 继续迭代 + userTaskList = findChildProcessUserTasks(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, userTaskList); + } + } + return userTaskList; + } + + /** + * 从后向前寻路,获取所有脏线路上的点 + * + * @param source 起始节点 + * @param passRoads 已经经过的点集合 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targets 目标脏线路终点 + * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储 + * @return + */ + public static Set iteratorFindDirtyRoads(FlowElement source, List passRoads, Set hasSequenceFlow, List targets, Set dirtyRoads) { + passRoads = passRoads == null ? new ArrayList<>() : passRoads; + dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + dirtyRoads = iteratorFindDirtyRoads(source.getSubProcess(), passRoads, hasSequenceFlow, targets, dirtyRoads); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 新增经过的路线 + passRoads.add(sequenceFlow.getSourceFlowElement().getId()); + // 如果此点为目标点,确定经过的路线为脏线路,添加点到脏线路中,然后找下个连线 + if (targets.contains(sequenceFlow.getSourceFlowElement().getId())) { + dirtyRoads.addAll(passRoads); + continue; + } + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { + dirtyRoads = findChildProcessAllDirtyRoad((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, dirtyRoads); + // 是否存在子流程上,true 是,false 否 + Boolean isInChildProcess = dirtyTargetInChildProcess((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, targets, null); + if (isInChildProcess) { + // 已在子流程上找到,该路线结束 + continue; + } + } + // 继续迭代 + dirtyRoads = iteratorFindDirtyRoads(sequenceFlow.getSourceFlowElement(), passRoads, hasSequenceFlow, targets, dirtyRoads); + } + } + return dirtyRoads; + } + + /** + * 迭代获取子流程脏路线 + * 说明,假如回退的点就是子流程,那么也肯定会回退到子流程最初的用户任务节点,因此子流程中的节点全是脏路线 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param dirtyRoads 确定为脏数据的点,因为不需要重复,因此使用 set 存储 + * @return + */ + public static Set findChildProcessAllDirtyRoad(FlowElement source, Set hasSequenceFlow, Set dirtyRoads) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 添加脏路线 + dirtyRoads.add(sequenceFlow.getTargetFlowElement().getId()); + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + dirtyRoads = findChildProcessAllDirtyRoad((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, dirtyRoads); + } + // 继续迭代 + dirtyRoads = findChildProcessAllDirtyRoad(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, dirtyRoads); + } + } + return dirtyRoads; + } + + /** + * 判断脏路线结束节点是否在子流程上 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targets 判断脏路线节点是否存在子流程上,只要存在一个,说明脏路线只到子流程为止 + * @param inChildProcess 是否存在子流程上,true 是,false 否 + * @return + */ + public static Boolean dirtyTargetInChildProcess(FlowElement source, Set hasSequenceFlow, List targets, Boolean inChildProcess) { + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + inChildProcess = inChildProcess == null ? false : inChildProcess; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null && !inChildProcess) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果发现目标点在子流程上存在,说明只到子流程为止 + if (targets.contains(sequenceFlow.getTargetFlowElement().getId())) { + inChildProcess = true; + break; + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { + inChildProcess = dirtyTargetInChildProcess((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, targets, inChildProcess); + } + // 继续迭代 + inChildProcess = dirtyTargetInChildProcess(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, targets, inChildProcess); + } + } + return inChildProcess; + } + + /** + * 迭代从后向前扫描,判断目标节点相对于当前节点是否是串行 + * 不存在直接回退到子流程中的情况,但存在从子流程出去到父流程情况 + * + * @param source 起始节点 + * @param isSequential 是否串行 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param targetKsy 目标节点 + * @return + */ + public static Boolean iteratorCheckSequentialReferTarget(FlowElement source, String targetKsy, Set hasSequenceFlow, Boolean isSequential) { + isSequential = isSequential == null ? true : isSequential; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + isSequential = iteratorCheckSequentialReferTarget(source.getSubProcess(), targetKsy, hasSequenceFlow, isSequential); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 如果目标节点已被判断为并行,后面都不需要执行,直接返回 + if (isSequential == false) { + break; + } + // 这条线路存在目标节点,这条线路完成,进入下个线路 + if (targetKsy.equals(sequenceFlow.getSourceFlowElement().getId())) { + continue; + } + if (sequenceFlow.getSourceFlowElement() instanceof StartEvent) { + isSequential = false; + break; + } + // 否则就继续迭代 + isSequential = iteratorCheckSequentialReferTarget(sequenceFlow.getSourceFlowElement(), targetKsy, hasSequenceFlow, isSequential); + } + } + return isSequential; + } + + /** + * 从后向前寻路,获取到达节点的所有路线 + * 不存在直接回退到子流程,但是存在回退到父级流程的情况 + * + * @param source 起始节点 + * @param passRoads 已经经过的点集合 + * @param roads 路线 + * @return + */ + public static List> findRoad(FlowElement source, List passRoads, Set hasSequenceFlow, List> roads) { + passRoads = passRoads == null ? new ArrayList<>() : passRoads; + roads = roads == null ? new ArrayList<>() : roads; + hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; + + // 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代 + if (source instanceof StartEvent && source.getSubProcess() != null) { + roads = findRoad(source.getSubProcess(), passRoads, hasSequenceFlow, roads); + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null && sequenceFlows.size() != 0) { + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + // 添加经过路线 + if (sequenceFlow.getSourceFlowElement() instanceof UserTask) { + passRoads.add((UserTask) sequenceFlow.getSourceFlowElement()); + } + // 继续迭代 + roads = findRoad(sequenceFlow.getSourceFlowElement(), passRoads, hasSequenceFlow, roads); + } + } else { + // 添加路线 + roads.add(passRoads); + } + return roads; + } + + /** + * 历史节点数据清洗,清洗掉又回滚导致的脏数据 + * + * @param allElements 全部节点信息 + * @param historicTaskInstanceList 历史任务实例信息,数据采用开始时间升序 + * @return + */ + public static List historicTaskInstanceClean(Collection allElements, List historicTaskInstanceList) { + // 会签节点收集 + List multiTask = new ArrayList<>(); + allElements.forEach(flowElement -> { + if (flowElement instanceof UserTask) { + // 如果该节点的行为为会签行为,说明该节点为会签节点 + if (((UserTask) flowElement).getBehavior() instanceof ParallelMultiInstanceBehavior || ((UserTask) flowElement).getBehavior() instanceof SequentialMultiInstanceBehavior) { + multiTask.add(flowElement.getId()); + } + } + }); + // 循环放入栈,栈 LIFO:后进先出 + Stack stack = new Stack<>(); + historicTaskInstanceList.forEach(item -> stack.push(item)); + // 清洗后的历史任务实例 + List lastHistoricTaskInstanceList = new ArrayList<>(); + // 网关存在可能只走了部分分支情况,且还存在跳转废弃数据以及其他分支数据的干扰,因此需要对历史节点数据进行清洗 + // 临时用户任务 key + StringBuilder userTaskKey = null; + // 临时被删掉的任务 key,存在并行情况 + List deleteKeyList = new ArrayList<>(); + // 临时脏数据线路 + List> dirtyDataLineList = new ArrayList<>(); + // 由某个点跳到会签点,此时出现多个会签实例对应 1 个跳转情况,需要把这些连续脏数据都找到 + // 会签特殊处理下标 + int multiIndex = -1; + // 会签特殊处理 key + StringBuilder multiKey = null; + // 会签特殊处理操作标识 + boolean multiOpera = false; + while (!stack.empty()) { + // 从这里开始 userTaskKey 都还是上个栈的 key + // 是否是脏数据线路上的点 + final boolean[] isDirtyData = {false}; + for (Set oldDirtyDataLine : dirtyDataLineList) { + if (oldDirtyDataLine.contains(stack.peek().getTaskDefinitionKey())) { + isDirtyData[0] = true; + } + } + // 删除原因不为空,说明从这条数据开始回跳或者回退的 + // MI_END:会签完成后,其他未签到节点的删除原因,不在处理范围内 + if (stack.peek().getDeleteReason() != null && !stack.peek().getDeleteReason().equals("MI_END")) { + // 可以理解为脏线路起点 + String dirtyPoint = ""; + if (stack.peek().getDeleteReason().indexOf("Change activity to ") >= 0) { + dirtyPoint = stack.peek().getDeleteReason().replace("Change activity to ", ""); + } + // 会签回退删除原因有点不同 + if (stack.peek().getDeleteReason().indexOf("Change parent activity to ") >= 0) { + dirtyPoint = stack.peek().getDeleteReason().replace("Change parent activity to ", ""); + } + FlowElement dirtyTask = null; + // 获取变更节点的对应的入口处连线 + // 如果是网关并行回退情况,会变成两条脏数据路线,效果一样 + for (FlowElement flowElement : allElements) { + if (flowElement.getId().equals(stack.peek().getTaskDefinitionKey())) { + dirtyTask = flowElement; + } + } + // 获取脏数据线路 + Set dirtyDataLine = FlowableUtils.iteratorFindDirtyRoads(dirtyTask, null, null, Arrays.asList(dirtyPoint.split(",")), null); + // 自己本身也是脏线路上的点,加进去 + dirtyDataLine.add(stack.peek().getTaskDefinitionKey()); + log.info(stack.peek().getTaskDefinitionKey() + "点脏路线集合:" + dirtyDataLine); + // 是全新的需要添加的脏线路 + boolean isNewDirtyData = true; + for (int i = 0; i < dirtyDataLineList.size(); i++) { + // 如果发现他的上个节点在脏线路内,说明这个点可能是并行的节点,或者连续驳回 + // 这时,都以之前的脏线路节点为标准,只需合并脏线路即可,也就是路线补全 + if (dirtyDataLineList.get(i).contains(userTaskKey.toString())) { + isNewDirtyData = false; + dirtyDataLineList.get(i).addAll(dirtyDataLine); + } + } + // 已确定时全新的脏线路 + if (isNewDirtyData) { + // deleteKey 单一路线驳回到并行,这种同时生成多个新实例记录情况,这时 deleteKey 其实是由多个值组成 + // 按照逻辑,回退后立刻生成的实例记录就是回退的记录 + // 至于驳回所生成的 Key,直接从删除原因中获取,因为存在驳回到并行的情况 + deleteKeyList.add(dirtyPoint + ","); + dirtyDataLineList.add(dirtyDataLine); + } + // 添加后,现在这个点变成脏线路上的点了 + isDirtyData[0] = true; + } + // 如果不是脏线路上的点,说明是有效数据,添加历史实例 Key + if (!isDirtyData[0]) { + lastHistoricTaskInstanceList.add(stack.peek().getTaskDefinitionKey()); + } + // 校验脏线路是否结束 + for (int i = 0; i < deleteKeyList.size(); i++) { + // 如果发现脏数据属于会签,记录下下标与对应 Key,以备后续比对,会签脏数据范畴开始 + if (multiKey == null && multiTask.contains(stack.peek().getTaskDefinitionKey()) + && deleteKeyList.get(i).contains(stack.peek().getTaskDefinitionKey())) { + multiIndex = i; + multiKey = new StringBuilder(stack.peek().getTaskDefinitionKey()); + } + // 会签脏数据处理,节点退回会签清空 + // 如果在会签脏数据范畴中发现 Key改变,说明会签脏数据在上个节点就结束了,可以把会签脏数据删掉 + if (multiKey != null && !multiKey.toString().equals(stack.peek().getTaskDefinitionKey())) { + deleteKeyList.set(multiIndex, deleteKeyList.get(multiIndex).replace(stack.peek().getTaskDefinitionKey() + ",", "")); + multiKey = null; + // 结束进行下校验删除 + multiOpera = true; + } + // 其他脏数据处理 + // 发现该路线最后一条脏数据,说明这条脏数据线路处理完了,删除脏数据信息 + // 脏数据产生的新实例中是否包含这条数据 + if (multiKey == null && deleteKeyList.get(i).contains(stack.peek().getTaskDefinitionKey())) { + // 删除匹配到的部分 + deleteKeyList.set(i, deleteKeyList.get(i).replace(stack.peek().getTaskDefinitionKey() + ",", "")); + } + // 如果每组中的元素都以匹配过,说明脏数据结束 + if ("".equals(deleteKeyList.get(i))) { + // 同时删除脏数据 + deleteKeyList.remove(i); + dirtyDataLineList.remove(i); + break; + } + } + // 会签数据处理需要在循环外处理,否则可能导致溢出 + // 会签的数据肯定是之前放进去的所以理论上不会溢出,但还是校验下 + if (multiOpera && deleteKeyList.size() > multiIndex && "".equals(deleteKeyList.get(multiIndex))) { + // 同时删除脏数据 + deleteKeyList.remove(multiIndex); + dirtyDataLineList.remove(multiIndex); + multiIndex = -1; + multiOpera = false; + } + // pop() 方法与 peek() 方法不同,在返回值的同时,会把值从栈中移除 + // 保存新的 userTaskKey 在下个循环中使用 + userTaskKey = new StringBuilder(stack.pop().getTaskDefinitionKey()); + } + log.info("清洗后的历史节点数据:" + lastHistoricTaskInstanceList); + return lastHistoricTaskInstanceList; + } + + /** + * 深搜递归获取流程未通过的节点 + * + * @param bpmnModel 流程模型 + * @param unfinishedTaskSet 未结束的任务节点 + * @param finishedSequenceFlowSet 已经完成的连线 + * @param finishedTaskSet 已完成的任务节点 + * @return + */ + public static Set dfsFindRejects(BpmnModel bpmnModel, Set unfinishedTaskSet, Set finishedSequenceFlowSet, Set finishedTaskSet) { + if (ObjectUtil.isNull(bpmnModel)) { + throw new ServiceException("流程模型不存在"); + } + Collection allElements = getAllElements(bpmnModel.getMainProcess().getFlowElements(), null); + Set rejectedSet = new HashSet<>(); + for (FlowElement flowElement : allElements) { + // 用户节点且未结束元素 + if (flowElement instanceof UserTask && unfinishedTaskSet.contains(flowElement.getId())) { + List hasSequenceFlow = iteratorFindFinishes(flowElement, null); + List rejects = iteratorFindRejects(flowElement, finishedSequenceFlowSet, finishedTaskSet, hasSequenceFlow, null); + rejectedSet.addAll(rejects); + } + } + return rejectedSet; + } + + /** + * 迭代获取父级节点列表,向前找 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的ID,用于判断线路是否重复 + * @return + */ + public static List iteratorFindFinishes(FlowElement source, List hasSequenceFlow) { + hasSequenceFlow = hasSequenceFlow == null ? new ArrayList<>() : hasSequenceFlow; + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + FlowElement finishedElement = sequenceFlow.getSourceFlowElement(); + // 类型为子流程,则添加子流程开始节点出口处相连的节点 + if (finishedElement instanceof SubProcess) { + FlowElement firstElement = (StartEvent) ((SubProcess) finishedElement).getFlowElements().toArray()[0]; + // 获取子流程的连线 + hasSequenceFlow.addAll(iteratorFindFinishes(firstElement, null)); + } + // 继续迭代 + hasSequenceFlow = iteratorFindFinishes(finishedElement, hasSequenceFlow); + } + } + return hasSequenceFlow; + } + + /** + * 根据正在运行的任务节点,迭代获取子级任务节点列表,向后找 + * + * @param source 起始节点 + * @param finishedSequenceFlowSet 已经完成的连线 + * @param finishedTaskSet 已经完成的任务节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param rejectedList 未通过的元素 + * @return + */ + public static List iteratorFindRejects(FlowElement source, Set finishedSequenceFlowSet, Set finishedTaskSet + , List hasSequenceFlow, List rejectedList) { + hasSequenceFlow = hasSequenceFlow == null ? new ArrayList<>() : hasSequenceFlow; + rejectedList = rejectedList == null ? new ArrayList<>() : rejectedList; + + // 根据类型,获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + + if (sequenceFlows != null) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + FlowElement targetElement = sequenceFlow.getTargetFlowElement(); + // 添加未完成的节点 + if (finishedTaskSet.contains(targetElement.getId())) { + rejectedList.add(targetElement.getId()); + } + // 添加未完成的连线 + if (finishedSequenceFlowSet.contains(sequenceFlow.getId())) { + rejectedList.add(sequenceFlow.getId()); + } + // 如果节点为子流程节点情况,则从节点中的第一个节点开始获取 + if (targetElement instanceof SubProcess) { + FlowElement firstElement = (FlowElement) (((SubProcess) targetElement).getFlowElements().toArray()[0]); + List childList = iteratorFindRejects(firstElement, finishedSequenceFlowSet, finishedTaskSet, hasSequenceFlow, null); + // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 + if (childList != null && childList.size() > 0) { + rejectedList.addAll(childList); + continue; + } + } + // 继续迭代 + rejectedList = iteratorFindRejects(targetElement, finishedSequenceFlowSet, finishedTaskSet, hasSequenceFlow, rejectedList); + } + } + return rejectedList; + } + +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/GlobalEventListener.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/GlobalEventListener.java new file mode 100644 index 0000000..04ffc1c --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/GlobalEventListener.java @@ -0,0 +1,38 @@ +package com.ruoyi.flowable.listener; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.flowable.common.constant.ProcessConstants; +import com.ruoyi.flowable.common.enums.ProcessStatus; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Flowable 全局监听器 + * + * @author konbai + * @since 2023/3/8 22:45 + */ +@Component +public class GlobalEventListener extends AbstractFlowableEngineEventListener { + + @Autowired + private RuntimeService runtimeService; + + /** + * 流程结束监听器 + */ + @Override + protected void processCompleted(FlowableEngineEntityEvent event) { + String processInstanceId = event.getProcessInstanceId(); + Object variable = runtimeService.getVariable(processInstanceId, ProcessConstants.PROCESS_STATUS_KEY); + ProcessStatus status = ProcessStatus.getProcessStatus(Convert.toStr(variable)); + if (ObjectUtil.isNotNull(status) && ProcessStatus.RUNNING == status) { + runtimeService.setVariable(processInstanceId, ProcessConstants.PROCESS_STATUS_KEY, ProcessStatus.COMPLETED.getStatus()); + } + super.processCompleted(event); + } +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/UserTaskListener.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/UserTaskListener.java new file mode 100644 index 0000000..71e7963 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/UserTaskListener.java @@ -0,0 +1,26 @@ +package com.ruoyi.flowable.listener; + +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +/** + * 用户任务监听器 + * + * @author KonBAI + * @since 2023/5/13 + */ +@Component(value = "userTaskListener") +public class UserTaskListener implements TaskListener { + + /** + * 注入字段(名称与流程设计时字段名称一致) + */ + // private FixedValue field; + @Override + public void notify(DelegateTask delegateTask) { + //TODO 实现你的任务监听器逻辑 + System.out.println("执行任务监听器..."); + } + +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ModelUtils.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ModelUtils.java new file mode 100644 index 0000000..2407f29 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ModelUtils.java @@ -0,0 +1,399 @@ +package com.ruoyi.flowable.utils; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.BaseElement; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.EndEvent; +import org.flowable.bpmn.model.EventSubProcess; +import org.flowable.bpmn.model.ExtensionAttribute; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.FlowElementsContainer; +import org.flowable.bpmn.model.FlowNode; +import org.flowable.bpmn.model.ParallelGateway; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.SequenceFlow; +import org.flowable.bpmn.model.StartEvent; +import org.flowable.bpmn.model.SubProcess; +import org.flowable.bpmn.model.UserTask; +import org.flowable.common.engine.impl.util.io.StringStreamSource; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +/** + * @author KonBAI + * @createTime 2022/3/26 19:04 + */ +public class ModelUtils { + + private static final BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter(); + + /** + * xml转bpmnModel对象 + * + * @param xml xml + * @return bpmnModel对象 + */ + public static BpmnModel getBpmnModel(String xml) { + return bpmnXMLConverter.convertToBpmnModel(new StringStreamSource(xml), false, false); + } + + /** + * bpmnModel转xml字符串 + * + * @param bpmnModel bpmnModel对象 + * @return xml字符串 + * @deprecated 存在会丢失 bpmn 连线问题 + */ + @Deprecated + public static String getBpmnXmlStr(BpmnModel bpmnModel) { + return StrUtil.utf8Str(getBpmnXml(bpmnModel)); + } + + /** + * bpmnModel转xml对象 + * + * @param bpmnModel bpmnModel对象 + * @return xml + * @deprecated 存在丢失 bpmn 连线问题 + */ + @Deprecated + public static byte[] getBpmnXml(BpmnModel bpmnModel) { + return bpmnXMLConverter.convertToXML(bpmnModel); + } + + /** + * 根据节点,获取入口连线 + * + * @param source 起始节点 + * @return 入口连线列表 + */ + public static List getElementIncomingFlows(FlowElement source) { + List sequenceFlows = new ArrayList<>(); + if (source instanceof FlowNode) { + sequenceFlows = ((FlowNode) source).getIncomingFlows(); + } + return sequenceFlows; + } + + + /** + * 根据节点,获取出口连线 + * + * @param source 起始节点 + * @return 出口连线列表 + */ + public static List getElementOutgoingFlows(FlowElement source) { + List sequenceFlows = new ArrayList<>(); + if (source instanceof FlowNode) { + sequenceFlows = ((FlowNode) source).getOutgoingFlows(); + } + return sequenceFlows; + } + + /** + * 获取开始节点 + * + * @param model bpmnModel对象 + * @return 开始节点(未找到开始节点,返回null) + */ + public static StartEvent getStartEvent(BpmnModel model) { + Process process = model.getMainProcess(); + FlowElement startElement = process.getInitialFlowElement(); + if (startElement instanceof StartEvent) { + return (StartEvent) startElement; + } + return getStartEvent(process.getFlowElements()); + } + + /** + * 获取开始节点 + * + * @param flowElements 流程元素集合 + * @return 开始节点(未找到开始节点,返回null) + */ + public static StartEvent getStartEvent(Collection flowElements) { + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof StartEvent) { + return (StartEvent) flowElement; + } + } + return null; + } + + /** + * 获取结束节点 + * + * @param model bpmnModel对象 + * @return 结束节点(未找到开始节点,返回null) + */ + public static EndEvent getEndEvent(BpmnModel model) { + Process process = model.getMainProcess(); + return getEndEvent(process.getFlowElements()); + } + + /** + * 获取结束节点 + * + * @param flowElements 流程元素集合 + * @return 结束节点(未找到开始节点,返回null) + */ + public static EndEvent getEndEvent(Collection flowElements) { + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof EndEvent) { + return (EndEvent) flowElement; + } + } + return null; + } + + public static UserTask getUserTaskByKey(BpmnModel model, String taskKey) { + Process process = model.getMainProcess(); + FlowElement flowElement = process.getFlowElement(taskKey); + if (flowElement instanceof UserTask) { + return (UserTask) flowElement; + } + return null; + } + + /** + * 获取流程元素信息 + * + * @param model bpmnModel对象 + * @param flowElementId 元素ID + * @return 元素信息 + */ + public static FlowElement getFlowElementById(BpmnModel model, String flowElementId) { + Process process = model.getMainProcess(); + return process.getFlowElement(flowElementId); + } + + /** + * 获取元素表单Key(限开始节点和用户节点可用) + * + * @param flowElement 元素 + * @return 表单Key + */ + public static String getFormKey(FlowElement flowElement) { + if (flowElement != null) { + if (flowElement instanceof StartEvent) { + return ((StartEvent) flowElement).getFormKey(); + } else if (flowElement instanceof UserTask) { + return ((UserTask) flowElement).getFormKey(); + } + } + return null; + } + + /** + * 获取开始节点属性值 + * + * @param model bpmnModel对象 + * @param name 属性名 + * @return 属性值 + */ + public static String getStartEventAttributeValue(BpmnModel model, String name) { + StartEvent startEvent = getStartEvent(model); + return getElementAttributeValue(startEvent, name); + } + + /** + * 获取结束节点属性值 + * + * @param model bpmnModel对象 + * @param name 属性名 + * @return 属性值 + */ + public static String getEndEventAttributeValue(BpmnModel model, String name) { + EndEvent endEvent = getEndEvent(model); + return getElementAttributeValue(endEvent, name); + } + + /** + * 获取用户任务节点属性值 + * + * @param model bpmnModel对象 + * @param taskKey 任务Key + * @param name 属性名 + * @return 属性值 + */ + public static String getUserTaskAttributeValue(BpmnModel model, String taskKey, String name) { + UserTask userTask = getUserTaskByKey(model, taskKey); + return getElementAttributeValue(userTask, name); + } + + /** + * 获取元素属性值 + * + * @param baseElement 流程元素 + * @param name 属性名 + * @return 属性值 + */ + public static String getElementAttributeValue(BaseElement baseElement, String name) { + if (baseElement != null) { + List attributes = baseElement.getAttributes().get(name); + if (attributes != null && !attributes.isEmpty()) { + attributes.iterator().next().getValue(); + Iterator attrIterator = attributes.iterator(); + if (attrIterator.hasNext()) { + ExtensionAttribute attribute = attrIterator.next(); + return attribute.getValue(); + } + } + } + return null; + } + + public static boolean isMultiInstance(BpmnModel model, String taskKey) { + UserTask userTask = getUserTaskByKey(model, taskKey); + if (ObjectUtil.isNotNull(userTask)) { + return userTask.hasMultiInstanceLoopCharacteristics(); + } + return false; + } + + /** + * 获取所有用户任务节点 + * + * @param model bpmnModel对象 + * @return 用户任务节点列表 + */ + public static Collection getAllUserTaskEvent(BpmnModel model) { + Process process = model.getMainProcess(); + Collection flowElements = process.getFlowElements(); + return getAllUserTaskEvent(flowElements, null); + } + + /** + * 获取所有用户任务节点 + * + * @param flowElements 流程元素集合 + * @param allElements 所有流程元素集合 + * @return 用户任务节点列表 + */ + public static Collection getAllUserTaskEvent(Collection flowElements, Collection allElements) { + allElements = allElements == null ? new ArrayList<>() : allElements; + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof UserTask) { + allElements.add((UserTask) flowElement); + } + if (flowElement instanceof SubProcess) { + // 继续深入子流程,进一步获取子流程 + allElements = getAllUserTaskEvent(((SubProcess) flowElement).getFlowElements(), allElements); + } + } + return allElements; + } + + /** + * 查找起始节点下一个用户任务列表列表 + * + * @param source 起始节点 + * @return 结果 + */ + public static List findNextUserTasks(FlowElement source) { + return findNextUserTasks(source, null, null); + } + + /** + * 查找起始节点下一个用户任务列表列表 + * + * @param source 起始节点 + * @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复 + * @param userTaskList 用户任务列表 + * @return 结果 + */ + public static List findNextUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) { + hasSequenceFlow = Optional.ofNullable(hasSequenceFlow).orElse(new HashSet<>()); + userTaskList = Optional.ofNullable(userTaskList).orElse(new ArrayList<>()); + // 获取出口连线 + List sequenceFlows = getElementOutgoingFlows(source); + if (!sequenceFlows.isEmpty()) { + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (hasSequenceFlow.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + hasSequenceFlow.add(sequenceFlow.getId()); + FlowElement targetFlowElement = sequenceFlow.getTargetFlowElement(); + if (targetFlowElement instanceof UserTask) { + // 若节点为用户任务,加入到结果列表中 + userTaskList.add((UserTask) targetFlowElement); + } else { + // 若节点非用户任务,继续递归查找下一个节点 + findNextUserTasks(targetFlowElement, hasSequenceFlow, userTaskList); + } + } + } + return userTaskList; + } + + /** + * 迭代从后向前扫描,判断目标节点相对于当前节点是否是串行 + * 不存在直接回退到子流程中的情况,但存在从子流程出去到父流程情况 + * + * @param source 起始节点 + * @param target 目标节点 + * @param visitedElements 已经经过的连线的 ID,用于判断线路是否重复 + * @return 结果 + */ + public static boolean isSequentialReachable(FlowElement source, FlowElement target, Set visitedElements) { + visitedElements = visitedElements == null ? new HashSet<>() : visitedElements; + if (source instanceof StartEvent && isInEventSubprocess(source)) { + return false; + } + + // 根据类型,获取入口连线 + List sequenceFlows = getElementIncomingFlows(source); + if (sequenceFlows != null && sequenceFlows.size() > 0) { + // 循环找到目标元素 + for (SequenceFlow sequenceFlow : sequenceFlows) { + // 如果发现连线重复,说明循环了,跳过这个循环 + if (visitedElements.contains(sequenceFlow.getId())) { + continue; + } + // 添加已经走过的连线 + visitedElements.add(sequenceFlow.getId()); + FlowElement sourceFlowElement = sequenceFlow.getSourceFlowElement(); + // 这条线路存在目标节点,这条线路完成,进入下个线路 + if (target.getId().equals(sourceFlowElement.getId())) { + continue; + } + // 如果目标节点为并行网关,则不继续 + if (sourceFlowElement instanceof ParallelGateway) { + return false; + } + // 否则就继续迭代 + boolean isSequential = isSequentialReachable(sourceFlowElement, target, visitedElements); + if (!isSequential) { + return false; + } + } + } + return true; + } + + protected static boolean isInEventSubprocess(FlowElement flowElement) { + FlowElementsContainer flowElementsContainer = flowElement.getParentContainer(); + while (flowElementsContainer != null) { + if (flowElementsContainer instanceof EventSubProcess) { + return true; + } + + if (flowElementsContainer instanceof FlowElement) { + flowElementsContainer = ((FlowElement) flowElementsContainer).getParentContainer(); + } else { + flowElementsContainer = null; + } + } + return false; + } +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ProcessFormUtils.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ProcessFormUtils.java new file mode 100644 index 0000000..0bc0d14 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ProcessFormUtils.java @@ -0,0 +1,50 @@ +package com.ruoyi.flowable.utils; + +import cn.hutool.core.convert.Convert; +import com.ruoyi.flowable.core.FormConf; + +import java.util.List; +import java.util.Map; + +/** + * 流程表单工具类 + * + * @author KonBAI + * @createTime 2022/8/7 17:09 + */ +public class ProcessFormUtils { + + private static final String CONFIG = "__config__"; + private static final String MODEL = "__vModel__"; + + /** + * 填充表单项内容 + * + * @param formConf 表单配置信息 + * @param data 表单内容 + */ + public static void fillFormData(FormConf formConf, Map data) { + for (Map field : formConf.getFields()) { + recursiveFillField(field, data); + } + } + + @SuppressWarnings("unchecked") + private static void recursiveFillField(final Map field, final Map data) { + if (!field.containsKey(CONFIG)) { + return; + } + Map configMap = (Map) field.get(CONFIG); + if (configMap.containsKey("children")) { + List> childrens = (List>) configMap.get("children"); + for (Map children : childrens) { + recursiveFillField(children, data); + } + } + String modelKey = Convert.toStr(field.get(MODEL)); + Object value = data.get(modelKey); + if (value != null) { + configMap.put("defaultValue", value); + } + } +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ProcessUtils.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ProcessUtils.java new file mode 100644 index 0000000..3d9387d --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ProcessUtils.java @@ -0,0 +1,115 @@ +package com.ruoyi.flowable.utils; + +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.flowable.core.domain.ProcessQuery; +import org.flowable.common.engine.api.query.Query; +import org.flowable.common.engine.impl.db.SuspensionState; +import org.flowable.engine.history.HistoricProcessInstanceQuery; +import org.flowable.engine.repository.ProcessDefinitionQuery; +import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstanceQuery; + +import java.util.Map; + +/** + * 流程工具类 + * + * @author konbai + * @since 2022/12/11 03:35 + */ +public class ProcessUtils { + + public static void buildProcessSearch(Query query, ProcessQuery process) { + if (query instanceof ProcessDefinitionQuery) { + buildProcessDefinitionSearch((ProcessDefinitionQuery) query, process); + } else if (query instanceof TaskQuery) { + buildTaskSearch((TaskQuery) query, process); + } else if (query instanceof HistoricTaskInstanceQuery) { + buildHistoricTaskInstanceSearch((HistoricTaskInstanceQuery) query, process); + } else if (query instanceof HistoricProcessInstanceQuery) { + buildHistoricProcessInstanceSearch((HistoricProcessInstanceQuery) query, process); + } + } + + /** + * 构建流程定义搜索 + */ + public static void buildProcessDefinitionSearch(ProcessDefinitionQuery query, ProcessQuery process) { + // 流程标识 + if (StringUtils.isNotBlank(process.getProcessKey())) { + query.processDefinitionKeyLike("%" + process.getProcessKey() + "%"); + } + // 流程名称 + if (StringUtils.isNotBlank(process.getProcessName())) { + query.processDefinitionNameLike("%" + process.getProcessName() + "%"); + } + // 流程分类 + if (StringUtils.isNotBlank(process.getCategory())) { + query.processDefinitionCategory(process.getCategory()); + } + // 流程状态 + if (StringUtils.isNotBlank(process.getState())) { + if (SuspensionState.ACTIVE.toString().equals(process.getState())) { + query.active(); + } else if (SuspensionState.SUSPENDED.toString().equals(process.getState())) { + query.suspended(); + } + } + } + + /** + * 构建任务搜索 + */ + public static void buildTaskSearch(TaskQuery query, ProcessQuery process) { + Map params = process.getParams(); + if (StringUtils.isNotBlank(process.getProcessKey())) { + query.processDefinitionKeyLike("%" + process.getProcessKey() + "%"); + } + if (StringUtils.isNotBlank(process.getProcessName())) { + query.processDefinitionNameLike("%" + process.getProcessName() + "%"); + } + if (params.get("beginTime") != null && params.get("endTime") != null) { + query.taskCreatedAfter(DateUtils.parseDate(params.get("beginTime"))); + query.taskCreatedBefore(DateUtils.parseDate(params.get("endTime"))); + } + } + + private static void buildHistoricTaskInstanceSearch(HistoricTaskInstanceQuery query, ProcessQuery process) { + Map params = process.getParams(); + if (StringUtils.isNotBlank(process.getProcessKey())) { + query.processDefinitionKeyLike("%" + process.getProcessKey() + "%"); + } + if (StringUtils.isNotBlank(process.getProcessName())) { + query.processDefinitionNameLike("%" + process.getProcessName() + "%"); + } + if (params.get("beginTime") != null && params.get("endTime") != null) { + query.taskCompletedAfter(DateUtils.parseDate(params.get("beginTime"))); + query.taskCompletedBefore(DateUtils.parseDate(params.get("endTime"))); + } + } + + /** + * 构建历史流程实例搜索 + */ + public static void buildHistoricProcessInstanceSearch(HistoricProcessInstanceQuery query, ProcessQuery process) { + Map params = process.getParams(); + // 流程标识 + if (StringUtils.isNotBlank(process.getProcessKey())) { + query.processDefinitionKey(process.getProcessKey()); + } + // 流程名称 + if (StringUtils.isNotBlank(process.getProcessName())) { + query.processDefinitionName(process.getProcessName()); + } + // 流程名称 + if (StringUtils.isNotBlank(process.getCategory())) { + query.processDefinitionCategory(process.getCategory()); + } + if (params.get("beginTime") != null && params.get("endTime") != null) { + query.startedAfter(DateUtils.parseDate(params.get("beginTime"))); + query.startedBefore(DateUtils.parseDate(params.get("endTime"))); + } + } + +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/TaskUtils.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/TaskUtils.java new file mode 100644 index 0000000..bf86d08 --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/TaskUtils.java @@ -0,0 +1,41 @@ +package com.ruoyi.flowable.utils; + +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.flowable.common.constant.TaskConstants; + +import java.util.ArrayList; +import java.util.List; + +/** + * 工作流任务工具类 + * + * @author konbai + * @createTime 2022/4/24 12:42 + */ +public class TaskUtils { + + public static String getUserId() { + return String.valueOf(SecurityUtils.getUserId()); + } + + /** + * 获取用户组信息 + * + * @return candidateGroup + */ + public static List getCandidateGroup() { + List list = new ArrayList<>(); + LoginUser user = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNotNull(user)) { + if (ObjectUtil.isNotEmpty(user.getRoles())) { + user.getRoles().forEach(role -> list.add(TaskConstants.ROLE_GROUP_PREFIX + role)); + } + if (ObjectUtil.isNotNull(user.getDeptId())) { + list.add(TaskConstants.DEPT_GROUP_PREFIX + user.getDeptId()); + } + } + return list; + } +} diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index a81c38c..baf09d3 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -1,6 +1,6 @@ - ruoyi @@ -18,7 +18,7 @@ - + org.springframework.boot spring-boot-starter-web diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java index 1bc2f69..21856f4 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java @@ -1,11 +1,5 @@ package com.ruoyi.framework.aspectj; -import java.util.ArrayList; -import java.util.List; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.springframework.stereotype.Component; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.entity.SysRole; @@ -15,6 +9,13 @@ import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.security.context.PermissionContextHolder; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; /** * 数据过滤处理 @@ -23,8 +24,7 @@ import com.ruoyi.framework.security.context.PermissionContextHolder; */ @Aspect @Component -public class DataScopeAspect -{ +public class DataScopeAspect { /** * 全部数据权限 */ @@ -55,86 +55,46 @@ public class DataScopeAspect */ public static final String DATA_SCOPE = "dataScope"; - @Before("@annotation(controllerDataScope)") - public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable - { - clearDataScope(point); - handleDataScope(point, controllerDataScope); - } - - protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) - { - // 获取当前的用户 - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNotNull(loginUser)) - { - SysUser currentUser = loginUser.getUser(); - // 如果是超级管理员,则不过滤数据 - if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) - { - String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext()); - dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), - controllerDataScope.userAlias(), permission); - } - } - } - /** * 数据范围过滤 * - * @param joinPoint 切点 - * @param user 用户 - * @param deptAlias 部门别名 - * @param userAlias 用户别名 + * @param joinPoint 切点 + * @param user 用户 + * @param deptAlias 部门别名 + * @param userAlias 用户别名 * @param permission 权限字符 */ - public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission) - { + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission) { StringBuilder sqlString = new StringBuilder(); List conditions = new ArrayList(); - for (SysRole role : user.getRoles()) - { + for (SysRole role : user.getRoles()) { String dataScope = role.getDataScope(); - if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) - { + if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) { continue; } if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(role.getPermissions()) - && !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) - { + && !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) { continue; } - if (DATA_SCOPE_ALL.equals(dataScope)) - { + if (DATA_SCOPE_ALL.equals(dataScope)) { sqlString = new StringBuilder(); conditions.add(dataScope); break; - } - else if (DATA_SCOPE_CUSTOM.equals(dataScope)) - { + } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { sqlString.append(StringUtils.format( " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getRoleId())); - } - else if (DATA_SCOPE_DEPT.equals(dataScope)) - { + } else if (DATA_SCOPE_DEPT.equals(dataScope)) { sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId())); - } - else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) - { + } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { sqlString.append(StringUtils.format( " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", deptAlias, user.getDeptId(), user.getDeptId())); - } - else if (DATA_SCOPE_SELF.equals(dataScope)) - { - if (StringUtils.isNotBlank(userAlias)) - { + } else if (DATA_SCOPE_SELF.equals(dataScope)) { + if (StringUtils.isNotBlank(userAlias)) { sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId())); - } - else - { + } else { // 数据权限为仅本人且没有userAlias别名不查询任何数据 sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); } @@ -143,30 +103,45 @@ public class DataScopeAspect } // 多角色情况下,所有角色都不包含传递过来的权限字符,这个时候sqlString也会为空,所以要限制一下,不查询任何数据 - if (StringUtils.isEmpty(conditions)) - { + if (StringUtils.isEmpty(conditions)) { sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); } - if (StringUtils.isNotBlank(sqlString.toString())) - { + if (StringUtils.isNotBlank(sqlString.toString())) { Object params = joinPoint.getArgs()[0]; - if (StringUtils.isNotNull(params) && params instanceof BaseEntity) - { + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) { BaseEntity baseEntity = (BaseEntity) params; baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); } } } + @Before("@annotation(controllerDataScope)") + public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable { + clearDataScope(point); + handleDataScope(point, controllerDataScope); + } + + protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) { + // 获取当前的用户 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNotNull(loginUser)) { + SysUser currentUser = loginUser.getUser(); + // 如果是超级管理员,则不过滤数据 + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { + String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext()); + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), + controllerDataScope.userAlias(), permission); + } + } + } + /** * 拼接权限sql前先清空params.dataScope参数防止注入 */ - private void clearDataScope(final JoinPoint joinPoint) - { + private void clearDataScope(final JoinPoint joinPoint) { Object params = joinPoint.getArgs()[0]; - if (StringUtils.isNotNull(params) && params instanceof BaseEntity) - { + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) { BaseEntity baseEntity = (BaseEntity) params; baseEntity.getParams().put(DATA_SCOPE, ""); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java index 8c2c9f4..121c1e3 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java @@ -1,6 +1,8 @@ package com.ruoyi.framework.aspectj; -import java.util.Objects; +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -11,45 +13,37 @@ import org.slf4j.LoggerFactory; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.ruoyi.common.annotation.DataSource; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder; + +import java.util.Objects; /** * 多数据源处理 - * + * * @author ruoyi */ @Aspect @Order(1) @Component -public class DataSourceAspect -{ +public class DataSourceAspect { protected Logger logger = LoggerFactory.getLogger(getClass()); @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)" + "|| @within(com.ruoyi.common.annotation.DataSource)") - public void dsPointCut() - { + public void dsPointCut() { } @Around("dsPointCut()") - public Object around(ProceedingJoinPoint point) throws Throwable - { + public Object around(ProceedingJoinPoint point) throws Throwable { DataSource dataSource = getDataSource(point); - if (StringUtils.isNotNull(dataSource)) - { + if (StringUtils.isNotNull(dataSource)) { DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); } - try - { + try { return point.proceed(); - } - finally - { + } finally { // 销毁数据源 在执行方法之后 DynamicDataSourceContextHolder.clearDataSourceType(); } @@ -58,12 +52,10 @@ public class DataSourceAspect /** * 获取需要切换的数据源 */ - public DataSource getDataSource(ProceedingJoinPoint point) - { + public DataSource getDataSource(ProceedingJoinPoint point) { MethodSignature signature = (MethodSignature) point.getSignature(); DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); - if (Objects.nonNull(dataSource)) - { + if (Objects.nonNull(dataSource)) { return dataSource; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java index 5f55cab..2c4f12c 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -1,21 +1,5 @@ package com.ruoyi.framework.aspectj; -import java.util.Collection; -import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.AfterReturning; -import org.aspectj.lang.annotation.AfterThrowing; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.NamedThreadLocal; -import org.springframework.stereotype.Component; -import org.springframework.validation.BindingResult; -import org.springframework.web.multipart.MultipartFile; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.entity.SysUser; @@ -30,30 +14,47 @@ import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.framework.manager.AsyncManager; import com.ruoyi.framework.manager.factory.AsyncFactory; import com.ruoyi.system.domain.SysOperLog; +import org.apache.commons.lang3.ArrayUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.NamedThreadLocal; +import org.springframework.stereotype.Component; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Collection; +import java.util.Map; /** * 操作日志记录处理 - * + * * @author ruoyi */ @Aspect @Component -public class LogAspect -{ +public class LogAspect { + /** + * 排除敏感属性字段 + */ + public static final String[] EXCLUDE_PROPERTIES = {"password", "oldPassword", "newPassword", "confirmPassword"}; private static final Logger log = LoggerFactory.getLogger(LogAspect.class); - - /** 排除敏感属性字段 */ - public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; - - /** 计算操作消耗时间 */ + /** + * 计算操作消耗时间 + */ private static final ThreadLocal TIME_THREADLOCAL = new NamedThreadLocal("Cost Time"); /** * 处理请求前执行 */ @Before(value = "@annotation(controllerLog)") - public void boBefore(JoinPoint joinPoint, Log controllerLog) - { + public void boBefore(JoinPoint joinPoint, Log controllerLog) { TIME_THREADLOCAL.set(System.currentTimeMillis()); } @@ -63,27 +64,23 @@ public class LogAspect * @param joinPoint 切点 */ @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") - public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) - { + public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) { handleLog(joinPoint, controllerLog, null, jsonResult); } /** * 拦截异常操作 - * + * * @param joinPoint 切点 - * @param e 异常 + * @param e 异常 */ @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") - public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) - { + public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) { handleLog(joinPoint, controllerLog, e, null); } - protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) - { - try - { + protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) { + try { // 获取当前的用户 LoginUser loginUser = SecurityUtils.getLoginUser(); @@ -94,18 +91,15 @@ public class LogAspect String ip = IpUtils.getIpAddr(); operLog.setOperIp(ip); operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); - if (loginUser != null) - { + if (loginUser != null) { operLog.setOperName(loginUser.getUsername()); SysUser currentUser = loginUser.getUser(); - if (StringUtils.isNotNull(currentUser) && StringUtils.isNotNull(currentUser.getDept())) - { + if (StringUtils.isNotNull(currentUser) && StringUtils.isNotNull(currentUser.getDept())) { operLog.setDeptName(currentUser.getDept().getDeptName()); } } - if (e != null) - { + if (e != null) { operLog.setStatus(BusinessStatus.FAIL.ordinal()); operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); } @@ -121,28 +115,23 @@ public class LogAspect // operLog.setCostTime(System.currentTimeMillis() - TIME_THREADLOCAL.get()); // 保存数据库 AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); - } - catch (Exception exp) - { + } catch (Exception exp) { // 记录本地异常日志 log.error("异常信息:{}", exp.getMessage()); exp.printStackTrace(); - } - finally - { + } finally { TIME_THREADLOCAL.remove(); } } /** * 获取注解中对方法的描述信息 用于Controller层注解 - * - * @param log 日志 + * + * @param log 日志 * @param operLog 操作日志 * @throws Exception */ - public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception - { + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception { // 设置action动作 operLog.setBusinessType(log.businessType().ordinal()); // 设置标题 @@ -150,36 +139,30 @@ public class LogAspect // 设置操作人类别 operLog.setOperatorType(log.operatorType().ordinal()); // 是否需要保存request,参数和值 - if (log.isSaveRequestData()) - { + if (log.isSaveRequestData()) { // 获取参数的信息,传入到数据库中。 setRequestValue(joinPoint, operLog, log.excludeParamNames()); } // 是否需要保存response,参数和值 - if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) - { + if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) { operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000)); } } /** * 获取请求的参数,放到log中 - * + * * @param operLog 操作日志 * @throws Exception 异常 */ - private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog, String[] excludeParamNames) throws Exception - { + private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog, String[] excludeParamNames) throws Exception { Map paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest()); String requestMethod = operLog.getRequestMethod(); if (StringUtils.isEmpty(paramsMap) - && (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))) - { + && (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))) { String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames); operLog.setOperParam(StringUtils.substring(params, 0, 2000)); - } - else - { + } else { operLog.setOperParam(StringUtils.substring(JSON.toJSONString(paramsMap, excludePropertyPreFilter(excludeParamNames)), 0, 2000)); } } @@ -187,22 +170,15 @@ public class LogAspect /** * 参数拼装 */ - private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) - { + private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) { String params = ""; - if (paramsArray != null && paramsArray.length > 0) - { - for (Object o : paramsArray) - { - if (StringUtils.isNotNull(o) && !isFilterObject(o)) - { - try - { + if (paramsArray != null && paramsArray.length > 0) { + for (Object o : paramsArray) { + if (StringUtils.isNotNull(o) && !isFilterObject(o)) { + try { String jsonObj = JSON.toJSONString(o, excludePropertyPreFilter(excludeParamNames)); params += jsonObj.toString() + " "; - } - catch (Exception e) - { + } catch (Exception e) { } } } @@ -213,38 +189,29 @@ public class LogAspect /** * 忽略敏感属性 */ - public PropertyPreExcludeFilter excludePropertyPreFilter(String[] excludeParamNames) - { + public PropertyPreExcludeFilter excludePropertyPreFilter(String[] excludeParamNames) { return new PropertyPreExcludeFilter().addExcludes(ArrayUtils.addAll(EXCLUDE_PROPERTIES, excludeParamNames)); } /** * 判断是否需要过滤的对象。 - * + * * @param o 对象信息。 * @return 如果是需要过滤的对象,则返回true;否则返回false。 */ @SuppressWarnings("rawtypes") - public boolean isFilterObject(final Object o) - { + public boolean isFilterObject(final Object o) { Class clazz = o.getClass(); - if (clazz.isArray()) - { + if (clazz.isArray()) { return clazz.getComponentType().isAssignableFrom(MultipartFile.class); - } - else if (Collection.class.isAssignableFrom(clazz)) - { + } else if (Collection.class.isAssignableFrom(clazz)) { Collection collection = (Collection) o; - for (Object value : collection) - { + for (Object value : collection) { return value instanceof MultipartFile; } - } - else if (Map.class.isAssignableFrom(clazz)) - { + } else if (Map.class.isAssignableFrom(clazz)) { Map map = (Map) o; - for (Object value : map.entrySet()) - { + for (Object value : map.entrySet()) { Map.Entry entry = (Map.Entry) value; return entry.getValue() instanceof MultipartFile; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java index b720bc1..ccc16ca 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -1,8 +1,10 @@ package com.ruoyi.framework.aspectj; -import java.lang.reflect.Method; -import java.util.Collections; -import java.util.List; +import com.ruoyi.common.annotation.RateLimiter; +import com.ruoyi.common.enums.LimitType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.IpUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @@ -13,11 +15,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.RedisScript; import org.springframework.stereotype.Component; -import com.ruoyi.common.annotation.RateLimiter; -import com.ruoyi.common.enums.LimitType; -import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.ip.IpUtils; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; /** * 限流处理 @@ -26,8 +27,7 @@ import com.ruoyi.common.utils.ip.IpUtils; */ @Aspect @Component -public class RateLimiterAspect -{ +public class RateLimiterAspect { private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class); private RedisTemplate redisTemplate; @@ -35,49 +35,38 @@ public class RateLimiterAspect private RedisScript limitScript; @Autowired - public void setRedisTemplate1(RedisTemplate redisTemplate) - { + public void setRedisTemplate1(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } @Autowired - public void setLimitScript(RedisScript limitScript) - { + public void setLimitScript(RedisScript limitScript) { this.limitScript = limitScript; } @Before("@annotation(rateLimiter)") - public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable - { + public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable { int time = rateLimiter.time(); int count = rateLimiter.count(); String combineKey = getCombineKey(rateLimiter, point); List keys = Collections.singletonList(combineKey); - try - { + try { Long number = redisTemplate.execute(limitScript, keys, count, time); - if (StringUtils.isNull(number) || number.intValue() > count) - { + if (StringUtils.isNull(number) || number.intValue() > count) { throw new ServiceException("访问过于频繁,请稍候再试"); } log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), combineKey); - } - catch (ServiceException e) - { + } catch (ServiceException e) { throw e; - } - catch (Exception e) - { + } catch (Exception e) { throw new RuntimeException("服务器限流异常,请稍候再试"); } } - public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) - { + public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) { StringBuffer stringBuffer = new StringBuffer(rateLimiter.key()); - if (rateLimiter.limitType() == LimitType.IP) - { + if (rateLimiter.limitType() == LimitType.IP) { stringBuffer.append(IpUtils.getIpAddr()).append("-"); } MethodSignature signature = (MethodSignature) point.getSignature(); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java index 1d4dc1f..1424a8f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java @@ -1,12 +1,13 @@ package com.ruoyi.framework.config; -import java.util.TimeZone; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; +import java.util.TimeZone; + /** * 程序注解配置 * @@ -17,14 +18,12 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy; @EnableAspectJAutoProxy(exposeProxy = true) // 指定要扫描的Mapper类的包的路径 @MapperScan("com.ruoyi.**.mapper") -public class ApplicationConfig -{ +public class ApplicationConfig { /** * 时区配置 */ @Bean - public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() - { + public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java index f6abac1..4703338 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java @@ -1,20 +1,5 @@ package com.ruoyi.framework.config; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.sql.DataSource; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; @@ -23,19 +8,33 @@ import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.config.properties.DruidProperties; import com.ruoyi.framework.datasource.DynamicDataSource; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.sql.DataSource; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; /** * druid 配置多数据源 - * + * * @author ruoyi */ @Configuration -public class DruidConfig -{ +public class DruidConfig { @Bean @ConfigurationProperties("spring.datasource.druid.master") - public DataSource masterDataSource(DruidProperties druidProperties) - { + public DataSource masterDataSource(DruidProperties druidProperties) { DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); return druidProperties.dataSource(dataSource); } @@ -43,49 +42,42 @@ public class DruidConfig @Bean @ConfigurationProperties("spring.datasource.druid.slave") @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") - public DataSource slaveDataSource(DruidProperties druidProperties) - { + public DataSource slaveDataSource(DruidProperties druidProperties) { DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); return druidProperties.dataSource(dataSource); } @Bean(name = "dynamicDataSource") @Primary - public DynamicDataSource dataSource(DataSource masterDataSource) - { + public DynamicDataSource dataSource(DataSource masterDataSource) { Map targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); return new DynamicDataSource(masterDataSource, targetDataSources); } - + /** * 设置数据源 - * + * * @param targetDataSources 备选数据源集合 - * @param sourceName 数据源名称 - * @param beanName bean名称 + * @param sourceName 数据源名称 + * @param beanName bean名称 */ - public void setDataSource(Map targetDataSources, String sourceName, String beanName) - { - try - { + public void setDataSource(Map targetDataSources, String sourceName, String beanName) { + try { DataSource dataSource = SpringUtils.getBean(beanName); targetDataSources.put(sourceName, dataSource); - } - catch (Exception e) - { + } catch (Exception e) { } } /** * 去除监控页面底部的广告 */ - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({"rawtypes", "unchecked"}) @Bean @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") - public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) - { + public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) { // 获取web监控页面的参数 DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); // 提取common.js的配置路径 @@ -93,16 +85,14 @@ public class DruidConfig String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); final String filePath = "support/http/resources/js/common.js"; // 创建filter进行过滤 - Filter filter = new Filter() - { + Filter filter = new Filter() { @Override - public void init(javax.servlet.FilterConfig filterConfig) throws ServletException - { + public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { } + @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException - { + throws IOException, ServletException { chain.doFilter(request, response); // 重置缓冲区,响应头不会被重置 response.resetBuffer(); @@ -113,9 +103,9 @@ public class DruidConfig text = text.replaceAll("powered.*?shrek.wang", ""); response.getWriter().write(text); } + @Override - public void destroy() - { + public void destroy() { } }; FilterRegistrationBean registrationBean = new FilterRegistrationBean(); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java index 4adbb7f..7c260b2 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java @@ -1,48 +1,43 @@ package com.ruoyi.framework.config; -import java.nio.charset.Charset; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.SerializationException; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONReader; import com.alibaba.fastjson2.JSONWriter; import com.alibaba.fastjson2.filter.Filter; import com.ruoyi.common.constant.Constants; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; + +import java.nio.charset.Charset; /** * Redis使用FastJson序列化 - * + * * @author ruoyi */ -public class FastJson2JsonRedisSerializer implements RedisSerializer -{ +public class FastJson2JsonRedisSerializer implements RedisSerializer { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); static final Filter AUTO_TYPE_FILTER = JSONReader.autoTypeFilter(Constants.JSON_WHITELIST_STR); private Class clazz; - public FastJson2JsonRedisSerializer(Class clazz) - { + public FastJson2JsonRedisSerializer(Class clazz) { super(); this.clazz = clazz; } @Override - public byte[] serialize(T t) throws SerializationException - { - if (t == null) - { + public byte[] serialize(T t) throws SerializationException { + if (t == null) { return new byte[0]; } return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET); } @Override - public T deserialize(byte[] bytes) throws SerializationException - { - if (bytes == null || bytes.length <= 0) - { + public T deserialize(byte[] bytes) throws SerializationException { + if (bytes == null || bytes.length <= 0) { return null; } String str = new String(bytes, DEFAULT_CHARSET); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java index bb14c04..a67ede6 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java @@ -1,16 +1,17 @@ package com.ruoyi.framework.config; -import java.util.HashMap; -import java.util.Map; -import javax.servlet.DispatcherType; +import com.ruoyi.common.filter.RepeatableFilter; +import com.ruoyi.common.filter.XssFilter; +import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.ruoyi.common.filter.RepeatableFilter; -import com.ruoyi.common.filter.XssFilter; -import com.ruoyi.common.utils.StringUtils; + +import javax.servlet.DispatcherType; +import java.util.HashMap; +import java.util.Map; /** * Filter配置 @@ -18,19 +19,17 @@ import com.ruoyi.common.utils.StringUtils; * @author ruoyi */ @Configuration -public class FilterConfig -{ +public class FilterConfig { @Value("${xss.excludes}") private String excludes; @Value("${xss.urlPatterns}") private String urlPatterns; - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({"rawtypes", "unchecked"}) @Bean @ConditionalOnProperty(value = "xss.enabled", havingValue = "true") - public FilterRegistrationBean xssFilterRegistration() - { + public FilterRegistrationBean xssFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setDispatcherTypes(DispatcherType.REQUEST); registration.setFilter(new XssFilter()); @@ -43,10 +42,9 @@ public class FilterConfig return registration; } - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({"rawtypes", "unchecked"}) @Bean - public FilterRegistrationBean someFilterRegistration() - { + public FilterRegistrationBean someFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new RepeatableFilter()); registration.addUrlPatterns("/*"); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java index 163fd01..87debec 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java @@ -1,5 +1,6 @@ package com.ruoyi.framework.config; +import com.ruoyi.common.constant.Constants; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.LocaleResolver; @@ -7,19 +8,16 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.i18n.SessionLocaleResolver; -import com.ruoyi.common.constant.Constants; /** * 资源文件配置加载 - * + * * @author ruoyi */ @Configuration -public class I18nConfig implements WebMvcConfigurer -{ +public class I18nConfig implements WebMvcConfigurer { @Bean - public LocaleResolver localeResolver() - { + public LocaleResolver localeResolver() { SessionLocaleResolver slr = new SessionLocaleResolver(); // 默认语言 slr.setDefaultLocale(Constants.DEFAULT_LOCALE); @@ -27,8 +25,7 @@ public class I18nConfig implements WebMvcConfigurer } @Bean - public LocaleChangeInterceptor localeChangeInterceptor() - { + public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); // 参数名 lci.setParamName("lang"); @@ -36,8 +33,7 @@ public class I18nConfig implements WebMvcConfigurer } @Override - public void addInterceptors(InterceptorRegistry registry) - { + public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java index 7f8e1d5..5795a7f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java @@ -1,61 +1,49 @@ package com.ruoyi.framework.config; -import java.util.Random; import com.google.code.kaptcha.text.impl.DefaultTextCreator; +import java.util.Random; + /** * 验证码文本生成器 * * @author ruoyi */ -public class KaptchaTextCreator extends DefaultTextCreator -{ +public class KaptchaTextCreator extends DefaultTextCreator { private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); @Override - public String getText() - { + public String getText() { Integer result = 0; Random random = new Random(); int x = random.nextInt(10); int y = random.nextInt(10); StringBuilder suChinese = new StringBuilder(); int randomoperands = random.nextInt(3); - if (randomoperands == 0) - { + if (randomoperands == 0) { result = x * y; suChinese.append(CNUMBERS[x]); suChinese.append("*"); suChinese.append(CNUMBERS[y]); - } - else if (randomoperands == 1) - { - if ((x != 0) && y % x == 0) - { + } else if (randomoperands == 1) { + if ((x != 0) && y % x == 0) { result = y / x; suChinese.append(CNUMBERS[y]); suChinese.append("/"); suChinese.append(CNUMBERS[x]); - } - else - { + } else { result = x + y; suChinese.append(CNUMBERS[x]); suChinese.append("+"); suChinese.append(CNUMBERS[y]); } - } - else - { - if (x >= y) - { + } else { + if (x >= y) { result = x - y; suChinese.append(CNUMBERS[x]); suChinese.append("-"); suChinese.append(CNUMBERS[y]); - } - else - { + } else { result = y - x; suChinese.append(CNUMBERS[y]); suChinese.append("-"); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java index 40b37fb..d2e1374 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java @@ -28,82 +28,59 @@ import java.util.List; * @author ruoyi */ @Configuration -public class MyBatisConfig -{ +public class MyBatisConfig { + static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; @Autowired private Environment env; - static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; - - public static String setTypeAliasesPackage(String typeAliasesPackage) - { + public static String setTypeAliasesPackage(String typeAliasesPackage) { ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver); List allResult = new ArrayList(); - try - { - for (String aliasesPackage : typeAliasesPackage.split(",")) - { + try { + for (String aliasesPackage : typeAliasesPackage.split(",")) { List result = new ArrayList(); aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN; Resource[] resources = resolver.getResources(aliasesPackage); - if (resources != null && resources.length > 0) - { + if (resources != null && resources.length > 0) { MetadataReader metadataReader = null; - for (Resource resource : resources) - { - if (resource.isReadable()) - { + for (Resource resource : resources) { + if (resource.isReadable()) { metadataReader = metadataReaderFactory.getMetadataReader(resource); - try - { + try { result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); - } - catch (ClassNotFoundException e) - { + } catch (ClassNotFoundException e) { e.printStackTrace(); } } } } - if (result.size() > 0) - { + if (result.size() > 0) { HashSet hashResult = new HashSet(result); allResult.addAll(hashResult); } } - if (allResult.size() > 0) - { + if (allResult.size() > 0) { typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0])); - } - else - { + } else { throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包"); } - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } return typeAliasesPackage; } - public Resource[] resolveMapperLocations(String[] mapperLocations) - { + public Resource[] resolveMapperLocations(String[] mapperLocations) { ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); List resources = new ArrayList(); - if (mapperLocations != null) - { - for (String mapperLocation : mapperLocations) - { - try - { + if (mapperLocations != null) { + for (String mapperLocation : mapperLocations) { + try { Resource[] mappers = resourceResolver.getResources(mapperLocation); resources.addAll(Arrays.asList(mappers)); - } - catch (IOException e) - { + } catch (IOException e) { // ignore } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyMetaObjectHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyMetaObjectHandler.java index 3584a7c..a852b32 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyMetaObjectHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyMetaObjectHandler.java @@ -34,7 +34,7 @@ public class MyMetaObjectHandler implements MetaObjectHandler { if (!Objects.equals(userName, "")) { this.strictInsertFill(metaObject, "createBy", String.class, userName); } - if (userId!=null) { + if (userId != null) { this.strictInsertFill(metaObject, "createId", Long.class, userId); } this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); @@ -51,7 +51,7 @@ public class MyMetaObjectHandler implements MetaObjectHandler { userId = SecurityUtils.getUserId(); } catch (Exception ignored) { } - if (userId!=null) { + if (userId != null) { this.strictUpdateFill(metaObject, "updateId", Long.class, userId); } if (!Objects.equals(userName, "")) { diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java index 3f4f485..f563201 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java @@ -11,17 +11,15 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; /** * redis配置 - * + * * @author ruoyi */ @Configuration @EnableCaching -public class RedisConfig extends CachingConfigurerSupport -{ +public class RedisConfig extends CachingConfigurerSupport { @Bean - @SuppressWarnings(value = { "unchecked", "rawtypes" }) - public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) - { + @SuppressWarnings(value = {"unchecked", "rawtypes"}) + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); @@ -40,8 +38,7 @@ public class RedisConfig extends CachingConfigurerSupport } @Bean - public DefaultRedisScript limitScript() - { + public DefaultRedisScript limitScript() { DefaultRedisScript redisScript = new DefaultRedisScript<>(); redisScript.setScriptText(limitScriptText()); redisScript.setResultType(Long.class); @@ -51,8 +48,7 @@ public class RedisConfig extends CachingConfigurerSupport /** * 限流脚本 */ - private String limitScriptText() - { + private String limitScriptText() { return "local key = KEYS[1]\n" + "local count = tonumber(ARGV[1])\n" + "local time = tonumber(ARGV[2])\n" + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java index 74fb93e..945c563 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java @@ -1,6 +1,8 @@ package com.ruoyi.framework.config; -import java.util.concurrent.TimeUnit; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -11,24 +13,21 @@ import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; + +import java.util.concurrent.TimeUnit; /** * 通用配置 - * + * * @author ruoyi */ @Configuration -public class ResourcesConfig implements WebMvcConfigurer -{ +public class ResourcesConfig implements WebMvcConfigurer { @Autowired private RepeatSubmitInterceptor repeatSubmitInterceptor; @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) - { + public void addResourceHandlers(ResourceHandlerRegistry registry) { /** 本地文件上传路径 */ registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**") .addResourceLocations("file:" + RuoYiConfig.getProfile() + "/"); @@ -36,15 +35,15 @@ public class ResourcesConfig implements WebMvcConfigurer /** swagger配置 */ registry.addResourceHandler("/swagger-ui/**") .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") - .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());; + .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic()); + ; } /** * 自定义拦截规则 */ @Override - public void addInterceptors(InterceptorRegistry registry) - { + public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**"); } @@ -52,8 +51,7 @@ public class ResourcesConfig implements WebMvcConfigurer * 跨域配置 */ @Bean - public CorsFilter corsFilter() - { + public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); // 设置访问源地址 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index b78c5d9..998fd2b 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -1,5 +1,9 @@ package com.ruoyi.framework.config; +import com.ruoyi.framework.config.properties.PermitAllUrlProperties; +import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter; +import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl; +import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpMethod; @@ -15,25 +19,20 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.logout.LogoutFilter; import org.springframework.web.filter.CorsFilter; -import com.ruoyi.framework.config.properties.PermitAllUrlProperties; -import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter; -import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl; -import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl; /** * spring security配置 - * + * * @author ruoyi */ @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) -public class SecurityConfig extends WebSecurityConfigurerAdapter -{ +public class SecurityConfig extends WebSecurityConfigurerAdapter { /** * 自定义用户认证逻辑 */ @Autowired private UserDetailsService userDetailsService; - + /** * 认证失败处理类 */ @@ -51,7 +50,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter */ @Autowired private JwtAuthenticationTokenFilter authenticationTokenFilter; - + /** * 跨域过滤器 */ @@ -72,8 +71,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter */ @Bean @Override - public AuthenticationManager authenticationManagerBean() throws Exception - { + public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } @@ -93,8 +91,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter * authenticated | 用户登录后可访问 */ @Override - protected void configure(HttpSecurity httpSecurity) throws Exception - { + protected void configure(HttpSecurity httpSecurity) throws Exception { // 注解标记允许匿名访问的url ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests(); permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll()); @@ -111,7 +108,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter // 过滤请求 .authorizeRequests() // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - .antMatchers("/login", "/register", "/captchaImage","/system/singlelogin/**").permitAll() + .antMatchers("/login", "/register", "/captchaImage", "/system/singlelogin/**").permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() @@ -121,8 +118,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter // .antMatchers("/jjh/**").permitAll() - - // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() @@ -140,8 +135,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter * 强散列哈希加密实现 */ @Bean - public BCryptPasswordEncoder bCryptPasswordEncoder() - { + public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } @@ -149,8 +143,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter * 身份认证接口 */ @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception - { + protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java index b5b7de3..3a8c8e3 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java @@ -1,32 +1,30 @@ package com.ruoyi.framework.config; -import javax.servlet.http.HttpServletRequest; -import org.springframework.stereotype.Component; import com.ruoyi.common.utils.ServletUtils; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; /** * 服务相关配置 - * + * * @author ruoyi */ @Component -public class ServerConfig -{ +public class ServerConfig { + public static String getDomain(HttpServletRequest request) { + StringBuffer url = request.getRequestURL(); + String contextPath = request.getServletContext().getContextPath(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); + } + /** * 获取完整的请求路径,包括:域名,端口,上下文访问路径 - * + * * @return 服务地址 */ - public String getUrl() - { + public String getUrl() { HttpServletRequest request = ServletUtils.getRequest(); return getDomain(request); } - - public static String getDomain(HttpServletRequest request) - { - StringBuffer url = request.getRequestURL(); - String contextPath = request.getServletContext().getContextPath(); - return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); - } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java index 7840141..1f59b4c 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java @@ -5,6 +5,7 @@ import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor; @@ -15,8 +16,7 @@ import java.util.concurrent.ThreadPoolExecutor; * @author ruoyi **/ @Configuration -public class ThreadPoolConfig -{ +public class ThreadPoolConfig { // 核心线程池大小 private int corePoolSize = 50; @@ -30,8 +30,7 @@ public class ThreadPoolConfig private int keepAliveSeconds = 300; @Bean(name = "threadPoolTaskExecutor") - public ThreadPoolTaskExecutor threadPoolTaskExecutor() - { + public ThreadPoolTaskExecutor threadPoolTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setMaxPoolSize(maxPoolSize); executor.setCorePoolSize(corePoolSize); @@ -46,15 +45,12 @@ public class ThreadPoolConfig * 执行周期性或定时任务 */ @Bean(name = "scheduledExecutorService") - protected ScheduledExecutorService scheduledExecutorService() - { + protected ScheduledExecutorService scheduledExecutorService() { return new ScheduledThreadPoolExecutor(corePoolSize, new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), - new ThreadPoolExecutor.CallerRunsPolicy()) - { + new ThreadPoolExecutor.CallerRunsPolicy()) { @Override - protected void afterExecute(Runnable r, Throwable t) - { + protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); Threads.printException(r, t); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java index c8a5c8a..1d7bdcf 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java @@ -1,17 +1,16 @@ package com.ruoyi.framework.config.properties; +import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; -import com.alibaba.druid.pool.DruidDataSource; /** * druid 配置属性 - * + * * @author ruoyi */ @Configuration -public class DruidProperties -{ +public class DruidProperties { @Value("${spring.datasource.druid.initialSize}") private int initialSize; @@ -51,8 +50,7 @@ public class DruidProperties @Value("${spring.datasource.druid.testOnReturn}") private boolean testOnReturn; - public DruidDataSource dataSource(DruidDataSource datasource) - { + public DruidDataSource dataSource(DruidDataSource datasource) { /** 配置初始化大小、最小、最大 */ datasource.setInitialSize(initialSize); datasource.setMaxActive(maxActive); @@ -60,10 +58,10 @@ public class DruidProperties /** 配置获取连接等待超时的时间 */ datasource.setMaxWait(maxWait); - + /** 配置驱动连接超时时间,检测数据库建立连接的超时时间,单位是毫秒 */ datasource.setConnectTimeout(connectTimeout); - + /** 配置网络超时时间,等待数据库操作完成的网络超时时间,单位是毫秒 */ datasource.setSocketTimeout(socketTimeout); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java index 29118fa..10f8e4d 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java @@ -1,11 +1,6 @@ package com.ruoyi.framework.config.properties; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.regex.Pattern; +import com.ruoyi.common.annotation.Anonymous; import org.apache.commons.lang3.RegExUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; @@ -16,27 +11,28 @@ import org.springframework.core.annotation.AnnotationUtils; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.mvc.method.RequestMappingInfo; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import com.ruoyi.common.annotation.Anonymous; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.regex.Pattern; /** * 设置Anonymous注解允许匿名访问的url - * + * * @author ruoyi */ @Configuration -public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware -{ +public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware { private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}"); - + public String ASTERISK = "*"; private ApplicationContext applicationContext; - private List urls = new ArrayList<>(); - public String ASTERISK = "*"; - @Override - public void afterPropertiesSet() - { + public void afterPropertiesSet() { RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class); Map map = mapping.getHandlerMethods(); @@ -56,18 +52,15 @@ public class PermitAllUrlProperties implements InitializingBean, ApplicationCont } @Override - public void setApplicationContext(ApplicationContext context) throws BeansException - { + public void setApplicationContext(ApplicationContext context) throws BeansException { this.applicationContext = context; } - public List getUrls() - { + public List getUrls() { return urls; } - public void setUrls(List urls) - { + public void setUrls(List urls) { this.urls = urls; } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java index e70b8cf..33f41d9 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java @@ -1,26 +1,24 @@ package com.ruoyi.framework.datasource; -import java.util.Map; -import javax.sql.DataSource; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; +import javax.sql.DataSource; +import java.util.Map; + /** * 动态数据源 - * + * * @author ruoyi */ -public class DynamicDataSource extends AbstractRoutingDataSource -{ - public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) - { +public class DynamicDataSource extends AbstractRoutingDataSource { + public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) { super.setDefaultTargetDataSource(defaultTargetDataSource); super.setTargetDataSources(targetDataSources); super.afterPropertiesSet(); } @Override - protected Object determineCurrentLookupKey() - { + protected Object determineCurrentLookupKey() { return DynamicDataSourceContextHolder.getDataSourceType(); } } \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java index 9770af6..e0c7662 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java @@ -5,11 +5,10 @@ import org.slf4j.LoggerFactory; /** * 数据源切换处理 - * + * * @author ruoyi */ -public class DynamicDataSourceContextHolder -{ +public class DynamicDataSourceContextHolder { public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class); /** @@ -19,27 +18,24 @@ public class DynamicDataSourceContextHolder private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); /** - * 设置数据源的变量 + * 获得数据源的变量 */ - public static void setDataSourceType(String dsType) - { - log.info("切换到{}数据源", dsType); - CONTEXT_HOLDER.set(dsType); + public static String getDataSourceType() { + return CONTEXT_HOLDER.get(); } /** - * 获得数据源的变量 + * 设置数据源的变量 */ - public static String getDataSourceType() - { - return CONTEXT_HOLDER.get(); + public static void setDataSourceType(String dsType) { + log.info("切换到{}数据源", dsType); + CONTEXT_HOLDER.set(dsType); } /** * 清空数据源变量 */ - public static void clearDataSourceType() - { + public static void clearDataSourceType() { CONTEXT_HOLDER.remove(); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java index c49eaf4..b4d2d81 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java @@ -1,15 +1,16 @@ package com.ruoyi.framework.interceptor; -import java.lang.reflect.Method; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.ServletUtils; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Method; /** * 防止重复提交拦截器 @@ -17,29 +18,22 @@ import com.ruoyi.common.utils.ServletUtils; * @author ruoyi */ @Component -public abstract class RepeatSubmitInterceptor implements HandlerInterceptor -{ +public abstract class RepeatSubmitInterceptor implements HandlerInterceptor { @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception - { - if (handler instanceof HandlerMethod) - { + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); - if (annotation != null) - { - if (this.isRepeatSubmit(request, annotation)) - { + if (annotation != null) { + if (this.isRepeatSubmit(request, annotation)) { AjaxResult ajaxResult = AjaxResult.error(annotation.message()); ServletUtils.renderString(response, JSON.toJSONString(ajaxResult)); return false; } } return true; - } - else - { + } else { return true; } } @@ -47,7 +41,7 @@ public abstract class RepeatSubmitInterceptor implements HandlerInterceptor /** * 验证是否重复提交由子类实现具体的防重复提交的规则 * - * @param request 请求信息 + * @param request 请求信息 * @param annotation 防重复注解参数 * @return 结果 * @throws Exception diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java index 9dc9511..6dd1c73 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java @@ -1,12 +1,5 @@ package com.ruoyi.framework.interceptor.impl; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import javax.servlet.http.HttpServletRequest; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.constant.CacheConstants; @@ -15,16 +8,23 @@ import com.ruoyi.common.filter.RepeatedlyRequestWrapper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpHelper; import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; /** * 判断请求url和数据是否和上一次相同, * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。 - * + * * @author ruoyi */ @Component -public class SameUrlDataInterceptor extends RepeatSubmitInterceptor -{ +public class SameUrlDataInterceptor extends RepeatSubmitInterceptor { public final String REPEAT_PARAMS = "repeatParams"; public final String REPEAT_TIME = "repeatTime"; @@ -38,18 +38,15 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor @SuppressWarnings("unchecked") @Override - public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) - { + public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) { String nowParams = ""; - if (request instanceof RepeatedlyRequestWrapper) - { + if (request instanceof RepeatedlyRequestWrapper) { RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request; nowParams = HttpHelper.getBodyString(repeatedlyRequest); } // body参数为空,获取Parameter的数据 - if (StringUtils.isEmpty(nowParams)) - { + if (StringUtils.isEmpty(nowParams)) { nowParams = JSON.toJSONString(request.getParameterMap()); } Map nowDataMap = new HashMap(); @@ -66,14 +63,11 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey; Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); - if (sessionObj != null) - { + if (sessionObj != null) { Map sessionMap = (Map) sessionObj; - if (sessionMap.containsKey(url)) - { + if (sessionMap.containsKey(url)) { Map preDataMap = (Map) sessionMap.get(url); - if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) - { + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) { return true; } } @@ -87,8 +81,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor /** * 判断参数是否相同 */ - private boolean compareParams(Map nowMap, Map preMap) - { + private boolean compareParams(Map nowMap, Map preMap) { String nowParams = (String) nowMap.get(REPEAT_PARAMS); String preParams = (String) preMap.get(REPEAT_PARAMS); return nowParams.equals(preParams); @@ -97,12 +90,10 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor /** * 判断两次间隔时间 */ - private boolean compareTime(Map nowMap, Map preMap, int interval) - { + private boolean compareTime(Map nowMap, Map preMap, int interval) { long time1 = (Long) nowMap.get(REPEAT_TIME); long time2 = (Long) preMap.get(REPEAT_TIME); - if ((time1 - time2) < interval) - { + if ((time1 - time2) < interval) { return true; } return false; diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java index 7387a02..5dfa423 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java @@ -1,23 +1,23 @@ package com.ruoyi.framework.manager; +import com.ruoyi.common.utils.Threads; +import com.ruoyi.common.utils.spring.SpringUtils; + import java.util.TimerTask; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import com.ruoyi.common.utils.Threads; -import com.ruoyi.common.utils.spring.SpringUtils; /** * 异步任务管理器 - * + * * @author ruoyi */ -public class AsyncManager -{ +public class AsyncManager { + private static AsyncManager me = new AsyncManager(); /** * 操作延迟10毫秒 */ private final int OPERATE_DELAY_TIME = 10; - /** * 异步操作任务调度线程池 */ @@ -26,30 +26,26 @@ public class AsyncManager /** * 单例模式 */ - private AsyncManager(){} - - private static AsyncManager me = new AsyncManager(); + private AsyncManager() { + } - public static AsyncManager me() - { + public static AsyncManager me() { return me; } /** * 执行任务 - * + * * @param task 任务 */ - public void execute(TimerTask task) - { + public void execute(TimerTask task) { executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); } /** * 停止任务线程池 */ - public void shutdown() - { + public void shutdown() { Threads.shutdownAndAwaitTermination(executor); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java index e36ca3c..0d6a67b 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java @@ -3,6 +3,7 @@ package com.ruoyi.framework.manager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; + import javax.annotation.PreDestroy; /** @@ -11,28 +12,22 @@ import javax.annotation.PreDestroy; * @author ruoyi */ @Component -public class ShutdownManager -{ +public class ShutdownManager { private static final Logger logger = LoggerFactory.getLogger("sys-user"); @PreDestroy - public void destroy() - { + public void destroy() { shutdownAsyncManager(); } /** * 停止异步执行任务 */ - private void shutdownAsyncManager() - { - try - { + private void shutdownAsyncManager() { + try { logger.info("====关闭后台任务任务线程池===="); AsyncManager.me().shutdown(); - } - catch (Exception e) - { + } catch (Exception e) { logger.error(e.getMessage(), e); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java index 267e305..07731a6 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java @@ -1,8 +1,5 @@ package com.ruoyi.framework.manager.factory; -import java.util.TimerTask; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.LogUtils; import com.ruoyi.common.utils.ServletUtils; @@ -15,35 +12,35 @@ import com.ruoyi.system.domain.SysOperLog; import com.ruoyi.system.service.ISysLogininforService; import com.ruoyi.system.service.ISysOperLogService; import eu.bitwalker.useragentutils.UserAgent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.TimerTask; /** * 异步工厂(产生任务用) - * + * * @author ruoyi */ -public class AsyncFactory -{ +public class AsyncFactory { private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user"); /** * 记录登录信息 - * + * * @param username 用户名 - * @param status 状态 - * @param message 消息 - * @param args 列表 + * @param status 状态 + * @param message 消息 + * @param args 列表 * @return 任务task */ public static TimerTask recordLogininfor(final String username, final String status, final String message, - final Object... args) - { + final Object... args) { final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); final String ip = IpUtils.getIpAddr(); - return new TimerTask() - { + return new TimerTask() { @Override - public void run() - { + public void run() { String address = AddressUtils.getRealAddressByIP(ip); StringBuilder s = new StringBuilder(); s.append(LogUtils.getBlock(ip)); @@ -66,12 +63,9 @@ public class AsyncFactory logininfor.setOs(os); logininfor.setMsg(message); // 日志状态 - if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) - { + if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { logininfor.setStatus(Constants.SUCCESS); - } - else if (Constants.LOGIN_FAIL.equals(status)) - { + } else if (Constants.LOGIN_FAIL.equals(status)) { logininfor.setStatus(Constants.FAIL); } // 插入数据 @@ -82,17 +76,14 @@ public class AsyncFactory /** * 操作日志记录 - * + * * @param operLog 操作日志信息 * @return 任务task */ - public static TimerTask recordOper(final SysOperLog operLog) - { - return new TimerTask() - { + public static TimerTask recordOper(final SysOperLog operLog) { + return new TimerTask() { @Override - public void run() - { + public void run() { // 远程查询操作地点 operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/AuthenticationContextHolder.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/AuthenticationContextHolder.java index 6c776ce..688c3ee 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/AuthenticationContextHolder.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/AuthenticationContextHolder.java @@ -4,25 +4,21 @@ import org.springframework.security.core.Authentication; /** * 身份验证信息 - * + * * @author ruoyi */ -public class AuthenticationContextHolder -{ +public class AuthenticationContextHolder { private static final ThreadLocal contextHolder = new ThreadLocal<>(); - public static Authentication getContext() - { + public static Authentication getContext() { return contextHolder.get(); } - public static void setContext(Authentication context) - { + public static void setContext(Authentication context) { contextHolder.set(context); } - public static void clearContext() - { + public static void clearContext() { contextHolder.remove(); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java index 5472f3d..a034f24 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java @@ -1,27 +1,24 @@ package com.ruoyi.framework.security.context; +import com.ruoyi.common.core.text.Convert; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; -import com.ruoyi.common.core.text.Convert; /** * 权限信息 - * + * * @author ruoyi */ -public class PermissionContextHolder -{ +public class PermissionContextHolder { private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT"; - public static void setContext(String permission) - { - RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission, - RequestAttributes.SCOPE_REQUEST); - } - - public static String getContext() - { + public static String getContext() { return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES, RequestAttributes.SCOPE_REQUEST)); } + + public static void setContext(String permission) { + RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission, + RequestAttributes.SCOPE_REQUEST); + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java index 3eb2495..f261f25 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java @@ -1,39 +1,37 @@ package com.ruoyi.framework.security.filter; -import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.web.service.TokenService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.framework.web.service.TokenService; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; /** * token过滤器 验证token有效性 - * + * * @author ruoyi */ @Component -public class JwtAuthenticationTokenFilter extends OncePerRequestFilter -{ +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { @Autowired private TokenService tokenService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) - throws ServletException, IOException - { + throws ServletException, IOException { LoginUser loginUser = tokenService.getLoginUser(request); - if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) - { + if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) { tokenService.verifyToken(loginUser); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java index 93b7032..4c518b2 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java @@ -1,32 +1,31 @@ package com.ruoyi.framework.security.handle; -import java.io.IOException; -import java.io.Serializable; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.stereotype.Component; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.Serializable; /** * 认证失败处理类 返回未授权 - * + * * @author ruoyi */ @Component -public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable -{ +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable { private static final long serialVersionUID = -8970718410437077606L; @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) - throws IOException - { + throws IOException { int code = HttpStatus.UNAUTHORIZED; String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg))); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java index 2f89a91..95ea733 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java @@ -1,13 +1,5 @@ package com.ruoyi.framework.security.handle; -import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.core.Authentication; -import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; @@ -18,30 +10,36 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.manager.AsyncManager; import com.ruoyi.framework.manager.factory.AsyncFactory; import com.ruoyi.framework.web.service.TokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; /** * 自定义退出处理类 返回成功 - * + * * @author ruoyi */ @Configuration -public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler -{ +public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { @Autowired private TokenService tokenService; /** * 退出处理 - * + * * @return */ @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) - throws IOException, ServletException - { + throws IOException, ServletException { LoginUser loginUser = tokenService.getLoginUser(request); - if (StringUtils.isNotNull(loginUser)) - { + if (StringUtils.isNotNull(loginUser)) { String userName = loginUser.getUsername(); // 删除用户缓存记录 tokenService.delLoginUser(loginUser.getToken()); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java index 63b03da..9cda8cd 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java @@ -1,9 +1,5 @@ package com.ruoyi.framework.web.domain; -import java.net.UnknownHostException; -import java.util.LinkedList; -import java.util.List; -import java.util.Properties; import com.ruoyi.common.utils.Arith; import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.framework.web.domain.server.Cpu; @@ -21,15 +17,19 @@ import oshi.software.os.OSFileStore; import oshi.software.os.OperatingSystem; import oshi.util.Util; +import java.net.UnknownHostException; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; + /** * 服务器相关信息 - * + * * @author ruoyi */ -public class Server -{ +public class Server { private static final int OSHI_WAIT_SECOND = 1000; - + /** * CPU相关信息 */ @@ -55,58 +55,69 @@ public class Server */ private List sysFiles = new LinkedList(); - public Cpu getCpu() - { + public Cpu getCpu() { return cpu; } - public void setCpu(Cpu cpu) - { + public void setCpu(Cpu cpu) { this.cpu = cpu; } - public Mem getMem() - { + public Mem getMem() { return mem; } - public void setMem(Mem mem) - { + public void setMem(Mem mem) { this.mem = mem; } - public Jvm getJvm() - { + public Jvm getJvm() { return jvm; } - public void setJvm(Jvm jvm) - { + public void setJvm(Jvm jvm) { this.jvm = jvm; } - public Sys getSys() - { + public Sys getSys() { return sys; } - public void setSys(Sys sys) - { + public void setSys(Sys sys) { this.sys = sys; } - public List getSysFiles() - { + public List getSysFiles() { return sysFiles; } - public void setSysFiles(List sysFiles) - { + public void setSysFiles(List sysFiles) { this.sysFiles = sysFiles; } - public void copyTo() throws Exception - { + /** + * 设置磁盘信息 + */ + private void setSysFiles(OperatingSystem os) { + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + for (OSFileStore fs : fsArray) { + long free = fs.getUsableSpace(); + long total = fs.getTotalSpace(); + long used = total - free; + SysFile sysFile = new SysFile(); + sysFile.setDirName(fs.getMount()); + sysFile.setSysTypeName(fs.getType()); + sysFile.setTypeName(fs.getName()); + sysFile.setTotal(convertFileSize(total)); + sysFile.setFree(convertFileSize(free)); + sysFile.setUsed(convertFileSize(used)); + sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100)); + sysFiles.add(sysFile); + } + } + + public void copyTo() throws Exception { SystemInfo si = new SystemInfo(); HardwareAbstractionLayer hal = si.getHardware(); @@ -124,8 +135,7 @@ public class Server /** * 设置CPU信息 */ - private void setCpuInfo(CentralProcessor processor) - { + private void setCpuInfo(CentralProcessor processor) { // CPU信息 long[] prevTicks = processor.getSystemCpuLoadTicks(); Util.sleep(OSHI_WAIT_SECOND); @@ -150,8 +160,7 @@ public class Server /** * 设置内存信息 */ - private void setMemInfo(GlobalMemory memory) - { + private void setMemInfo(GlobalMemory memory) { mem.setTotal(memory.getTotal()); mem.setUsed(memory.getTotal() - memory.getAvailable()); mem.setFree(memory.getAvailable()); @@ -160,8 +169,7 @@ public class Server /** * 设置服务器信息 */ - private void setSysInfo() - { + private void setSysInfo() { Properties props = System.getProperties(); sys.setComputerName(IpUtils.getHostName()); sys.setComputerIp(IpUtils.getHostIp()); @@ -173,8 +181,7 @@ public class Server /** * 设置Java虚拟机 */ - private void setJvmInfo() throws UnknownHostException - { + private void setJvmInfo() throws UnknownHostException { Properties props = System.getProperties(); jvm.setTotal(Runtime.getRuntime().totalMemory()); jvm.setMax(Runtime.getRuntime().maxMemory()); @@ -183,57 +190,25 @@ public class Server jvm.setHome(props.getProperty("java.home")); } - /** - * 设置磁盘信息 - */ - private void setSysFiles(OperatingSystem os) - { - FileSystem fileSystem = os.getFileSystem(); - List fsArray = fileSystem.getFileStores(); - for (OSFileStore fs : fsArray) - { - long free = fs.getUsableSpace(); - long total = fs.getTotalSpace(); - long used = total - free; - SysFile sysFile = new SysFile(); - sysFile.setDirName(fs.getMount()); - sysFile.setSysTypeName(fs.getType()); - sysFile.setTypeName(fs.getName()); - sysFile.setTotal(convertFileSize(total)); - sysFile.setFree(convertFileSize(free)); - sysFile.setUsed(convertFileSize(used)); - sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100)); - sysFiles.add(sysFile); - } - } - /** * 字节转换 - * + * * @param size 字节大小 * @return 转换后值 */ - public String convertFileSize(long size) - { + public String convertFileSize(long size) { long kb = 1024; long mb = kb * 1024; long gb = mb * 1024; - if (size >= gb) - { + if (size >= gb) { return String.format("%.1f GB", (float) size / gb); - } - else if (size >= mb) - { + } else if (size >= mb) { float f = (float) size / mb; return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); - } - else if (size >= kb) - { + } else if (size >= kb) { float f = (float) size / kb; return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); - } - else - { + } else { return String.format("%d B", size); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java index a13a66c..4878bbd 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java @@ -4,11 +4,10 @@ import com.ruoyi.common.utils.Arith; /** * CPU相关信息 - * + * * @author ruoyi */ -public class Cpu -{ +public class Cpu { /** * 核心数 */ @@ -39,63 +38,51 @@ public class Cpu */ private double free; - public int getCpuNum() - { + public int getCpuNum() { return cpuNum; } - public void setCpuNum(int cpuNum) - { + public void setCpuNum(int cpuNum) { this.cpuNum = cpuNum; } - public double getTotal() - { + public double getTotal() { return Arith.round(Arith.mul(total, 100), 2); } - public void setTotal(double total) - { + public void setTotal(double total) { this.total = total; } - public double getSys() - { + public double getSys() { return Arith.round(Arith.mul(sys / total, 100), 2); } - public void setSys(double sys) - { + public void setSys(double sys) { this.sys = sys; } - public double getUsed() - { + public double getUsed() { return Arith.round(Arith.mul(used / total, 100), 2); } - public void setUsed(double used) - { + public void setUsed(double used) { this.used = used; } - public double getWait() - { + public double getWait() { return Arith.round(Arith.mul(wait / total, 100), 2); } - public void setWait(double wait) - { + public void setWait(double wait) { this.wait = wait; } - public double getFree() - { + public double getFree() { return Arith.round(Arith.mul(free / total, 100), 2); } - public void setFree(double free) - { + public void setFree(double free) { this.free = free; } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java index 1fdc6ac..bcd4d10 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java @@ -1,16 +1,16 @@ package com.ruoyi.framework.web.domain.server; -import java.lang.management.ManagementFactory; import com.ruoyi.common.utils.Arith; import com.ruoyi.common.utils.DateUtils; +import java.lang.management.ManagementFactory; + /** * JVM相关信息 - * + * * @author ruoyi */ -public class Jvm -{ +public class Jvm { /** * 当前JVM占用的内存总数(M) */ @@ -36,95 +36,79 @@ public class Jvm */ private String home; - public double getTotal() - { + public double getTotal() { return Arith.div(total, (1024 * 1024), 2); } - public void setTotal(double total) - { + public void setTotal(double total) { this.total = total; } - public double getMax() - { + public double getMax() { return Arith.div(max, (1024 * 1024), 2); } - public void setMax(double max) - { + public void setMax(double max) { this.max = max; } - public double getFree() - { + public double getFree() { return Arith.div(free, (1024 * 1024), 2); } - public void setFree(double free) - { + public void setFree(double free) { this.free = free; } - public double getUsed() - { + public double getUsed() { return Arith.div(total - free, (1024 * 1024), 2); } - public double getUsage() - { + public double getUsage() { return Arith.mul(Arith.div(total - free, total, 4), 100); } /** * 获取JDK名称 */ - public String getName() - { + public String getName() { return ManagementFactory.getRuntimeMXBean().getVmName(); } - public String getVersion() - { + public String getVersion() { return version; } - public void setVersion(String version) - { + public void setVersion(String version) { this.version = version; } - public String getHome() - { + public String getHome() { return home; } - public void setHome(String home) - { + public void setHome(String home) { this.home = home; } /** * JDK启动时间 */ - public String getStartTime() - { + public String getStartTime() { return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate()); } /** * JDK运行时间 */ - public String getRunTime() - { + public String getRunTime() { return DateUtils.timeDistance(DateUtils.getNowDate(), DateUtils.getServerStartDate()); } /** * 运行参数 */ - public String getInputArgs() - { + public String getInputArgs() { return ManagementFactory.getRuntimeMXBean().getInputArguments().toString(); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java index 13eec52..f065d81 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java @@ -4,11 +4,10 @@ import com.ruoyi.common.utils.Arith; /** * 內存相关信息 - * + * * @author ruoyi */ -public class Mem -{ +public class Mem { /** * 内存总量 */ @@ -24,38 +23,31 @@ public class Mem */ private double free; - public double getTotal() - { + public double getTotal() { return Arith.div(total, (1024 * 1024 * 1024), 2); } - public void setTotal(long total) - { + public void setTotal(long total) { this.total = total; } - public double getUsed() - { + public double getUsed() { return Arith.div(used, (1024 * 1024 * 1024), 2); } - public void setUsed(long used) - { + public void setUsed(long used) { this.used = used; } - public double getFree() - { + public double getFree() { return Arith.div(free, (1024 * 1024 * 1024), 2); } - public void setFree(long free) - { + public void setFree(long free) { this.free = free; } - public double getUsage() - { + public double getUsage() { return Arith.mul(Arith.div(used, total, 4), 100); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java index 45d64d9..7c3857e 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java @@ -2,11 +2,10 @@ package com.ruoyi.framework.web.domain.server; /** * 系统相关信息 - * + * * @author ruoyi */ -public class Sys -{ +public class Sys { /** * 服务器名称 */ @@ -32,53 +31,43 @@ public class Sys */ private String osArch; - public String getComputerName() - { + public String getComputerName() { return computerName; } - public void setComputerName(String computerName) - { + public void setComputerName(String computerName) { this.computerName = computerName; } - public String getComputerIp() - { + public String getComputerIp() { return computerIp; } - public void setComputerIp(String computerIp) - { + public void setComputerIp(String computerIp) { this.computerIp = computerIp; } - public String getUserDir() - { + public String getUserDir() { return userDir; } - public void setUserDir(String userDir) - { + public void setUserDir(String userDir) { this.userDir = userDir; } - public String getOsName() - { + public String getOsName() { return osName; } - public void setOsName(String osName) - { + public void setOsName(String osName) { this.osName = osName; } - public String getOsArch() - { + public String getOsArch() { return osArch; } - public void setOsArch(String osArch) - { + public void setOsArch(String osArch) { this.osArch = osArch; } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java index 1320cde..0c4710a 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java @@ -2,11 +2,10 @@ package com.ruoyi.framework.web.domain.server; /** * 系统文件相关信息 - * + * * @author ruoyi */ -public class SysFile -{ +public class SysFile { /** * 盘符路径 */ @@ -42,73 +41,59 @@ public class SysFile */ private double usage; - public String getDirName() - { + public String getDirName() { return dirName; } - public void setDirName(String dirName) - { + public void setDirName(String dirName) { this.dirName = dirName; } - public String getSysTypeName() - { + public String getSysTypeName() { return sysTypeName; } - public void setSysTypeName(String sysTypeName) - { + public void setSysTypeName(String sysTypeName) { this.sysTypeName = sysTypeName; } - public String getTypeName() - { + public String getTypeName() { return typeName; } - public void setTypeName(String typeName) - { + public void setTypeName(String typeName) { this.typeName = typeName; } - public String getTotal() - { + public String getTotal() { return total; } - public void setTotal(String total) - { + public void setTotal(String total) { this.total = total; } - public String getFree() - { + public String getFree() { return free; } - public void setFree(String free) - { + public void setFree(String free) { this.free = free; } - public String getUsed() - { + public String getUsed() { return used; } - public void setUsed(String used) - { + public void setUsed(String used) { this.used = used; } - public double getUsage() - { + public double getUsage() { return usage; } - public void setUsage(double usage) - { + public void setUsage(double usage) { this.usage = usage; } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index a3ec182..d066abf 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -1,6 +1,10 @@ package com.ruoyi.framework.web.exception; -import javax.servlet.http.HttpServletRequest; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.exception.DemoModeException; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.access.AccessDeniedException; @@ -11,28 +15,23 @@ import org.springframework.web.bind.MissingPathVariableException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import com.ruoyi.common.constant.HttpStatus; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.exception.DemoModeException; -import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.StringUtils; + +import javax.servlet.http.HttpServletRequest; /** * 全局异常处理器 - * + * * @author ruoyi */ @RestControllerAdvice -public class GlobalExceptionHandler -{ +public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** * 权限校验异常 */ @ExceptionHandler(AccessDeniedException.class) - public AjaxResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) - { + public AjaxResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage()); return AjaxResult.error(HttpStatus.FORBIDDEN, "没有权限,请联系管理员授权"); @@ -43,8 +42,7 @@ public class GlobalExceptionHandler */ @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, - HttpServletRequest request) - { + HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); return AjaxResult.error(e.getMessage()); @@ -54,8 +52,7 @@ public class GlobalExceptionHandler * 业务异常 */ @ExceptionHandler(ServiceException.class) - public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) - { + public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) { log.error(e.getMessage(), e); Integer code = e.getCode(); return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); @@ -65,8 +62,7 @@ public class GlobalExceptionHandler * 请求路径中缺少必需的路径变量 */ @ExceptionHandler(MissingPathVariableException.class) - public AjaxResult handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) - { + public AjaxResult handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI, e); return AjaxResult.error(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName())); @@ -76,8 +72,7 @@ public class GlobalExceptionHandler * 请求参数类型不匹配 */ @ExceptionHandler(MethodArgumentTypeMismatchException.class) - public AjaxResult handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, HttpServletRequest request) - { + public AjaxResult handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI, e); return AjaxResult.error(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), e.getValue())); @@ -87,8 +82,7 @@ public class GlobalExceptionHandler * 拦截未知的运行时异常 */ @ExceptionHandler(RuntimeException.class) - public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) - { + public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',发生未知异常.", requestURI, e); return AjaxResult.error(e.getMessage()); @@ -98,8 +92,7 @@ public class GlobalExceptionHandler * 系统异常 */ @ExceptionHandler(Exception.class) - public AjaxResult handleException(Exception e, HttpServletRequest request) - { + public AjaxResult handleException(Exception e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',发生系统异常.", requestURI, e); return AjaxResult.error(e.getMessage()); @@ -109,8 +102,7 @@ public class GlobalExceptionHandler * 自定义验证异常 */ @ExceptionHandler(BindException.class) - public AjaxResult handleBindException(BindException e) - { + public AjaxResult handleBindException(BindException e) { log.error(e.getMessage(), e); String message = e.getAllErrors().get(0).getDefaultMessage(); return AjaxResult.error(message); @@ -120,8 +112,7 @@ public class GlobalExceptionHandler * 自定义验证异常 */ @ExceptionHandler(MethodArgumentNotValidException.class) - public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) - { + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { log.error(e.getMessage(), e); String message = e.getBindingResult().getFieldError().getDefaultMessage(); return AjaxResult.error(message); @@ -131,8 +122,7 @@ public class GlobalExceptionHandler * 演示模式异常 */ @ExceptionHandler(DemoModeException.class) - public AjaxResult handleDemoModeException(DemoModeException e) - { + public AjaxResult handleDemoModeException(DemoModeException e) { return AjaxResult.error("演示模式,不允许操作"); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java index 07d259a..c510d10 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java @@ -1,38 +1,35 @@ package com.ruoyi.framework.web.service; -import java.util.Set; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.security.context.PermissionContextHolder; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.Set; /** * RuoYi首创 自定义权限实现,ss取自SpringSecurity首字母 - * + * * @author ruoyi */ @Service("ss") -public class PermissionService -{ +public class PermissionService { /** * 验证用户是否具备某权限 - * + * * @param permission 权限字符串 * @return 用户是否具备某权限 */ - public boolean hasPermi(String permission) - { - if (StringUtils.isEmpty(permission)) - { + public boolean hasPermi(String permission) { + if (StringUtils.isEmpty(permission)) { return false; } LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) - { + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) { return false; } PermissionContextHolder.setContext(permission); @@ -45,8 +42,7 @@ public class PermissionService * @param permission 权限字符串 * @return 用户是否不具备某权限 */ - public boolean lacksPermi(String permission) - { + public boolean lacksPermi(String permission) { return hasPermi(permission) != true; } @@ -56,23 +52,18 @@ public class PermissionService * @param permissions 以 PERMISSION_DELIMETER 为分隔符的权限列表 * @return 用户是否具有以下任意一个权限 */ - public boolean hasAnyPermi(String permissions) - { - if (StringUtils.isEmpty(permissions)) - { + public boolean hasAnyPermi(String permissions) { + if (StringUtils.isEmpty(permissions)) { return false; } LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) - { + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) { return false; } PermissionContextHolder.setContext(permissions); Set authorities = loginUser.getPermissions(); - for (String permission : permissions.split(Constants.PERMISSION_DELIMETER)) - { - if (permission != null && hasPermissions(authorities, permission)) - { + for (String permission : permissions.split(Constants.PERMISSION_DELIMETER)) { + if (permission != null && hasPermissions(authorities, permission)) { return true; } } @@ -81,26 +72,21 @@ public class PermissionService /** * 判断用户是否拥有某个角色 - * + * * @param role 角色字符串 * @return 用户是否具备某角色 */ - public boolean hasRole(String role) - { - if (StringUtils.isEmpty(role)) - { + public boolean hasRole(String role) { + if (StringUtils.isEmpty(role)) { return false; } LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) - { + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) { return false; } - for (SysRole sysRole : loginUser.getUser().getRoles()) - { + for (SysRole sysRole : loginUser.getUser().getRoles()) { String roleKey = sysRole.getRoleKey(); - if (Constants.SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) - { + if (Constants.SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) { return true; } } @@ -113,8 +99,7 @@ public class PermissionService * @param role 角色名称 * @return 用户是否不具备某角色 */ - public boolean lacksRole(String role) - { + public boolean lacksRole(String role) { return hasRole(role) != true; } @@ -124,21 +109,16 @@ public class PermissionService * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 * @return 用户是否具有以下任意一个角色 */ - public boolean hasAnyRoles(String roles) - { - if (StringUtils.isEmpty(roles)) - { + public boolean hasAnyRoles(String roles) { + if (StringUtils.isEmpty(roles)) { return false; } LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) - { + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) { return false; } - for (String role : roles.split(Constants.ROLE_DELIMETER)) - { - if (hasRole(role)) - { + for (String role : roles.split(Constants.ROLE_DELIMETER)) { + if (hasRole(role)) { return true; } } @@ -147,13 +127,12 @@ public class PermissionService /** * 判断是否包含权限 - * + * * @param permissions 权限列表 - * @param permission 权限字符串 + * @param permission 权限字符串 * @return 用户是否具备某权限 */ - private boolean hasPermissions(Set permissions, String permission) - { + private boolean hasPermissions(Set permissions, String permission) { return permissions.contains(Constants.ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission)); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java index d1fb4ed..9928aae 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java @@ -1,24 +1,24 @@ package com.ruoyi.framework.web.service; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; /** * 用户权限处理 - * + * * @author ruoyi */ @Component -public class SysPermissionService -{ +public class SysPermissionService { @Autowired private ISysRoleService roleService; @@ -27,20 +27,16 @@ public class SysPermissionService /** * 获取角色数据权限 - * + * * @param user 用户信息 * @return 角色权限信息 */ - public Set getRolePermission(SysUser user) - { + public Set getRolePermission(SysUser user) { Set roles = new HashSet(); // 管理员拥有所有权限 - if (user.isAdmin()) - { + if (user.isAdmin()) { roles.add("admin"); - } - else - { + } else { roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId())); } return roles; @@ -48,33 +44,25 @@ public class SysPermissionService /** * 获取菜单数据权限 - * + * * @param user 用户信息 * @return 菜单权限信息 */ - public Set getMenuPermission(SysUser user) - { + public Set getMenuPermission(SysUser user) { Set perms = new HashSet(); // 管理员拥有所有权限 - if (user.isAdmin()) - { + if (user.isAdmin()) { perms.add("*:*:*"); - } - else - { + } else { List roles = user.getRoles(); - if (!CollectionUtils.isEmpty(roles)) - { + if (!CollectionUtils.isEmpty(roles)) { // 多角色设置permissions属性,以便数据权限匹配权限 - for (SysRole role : roles) - { + for (SysRole role : roles) { Set rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId()); role.setPermissions(rolePerms); perms.addAll(rolePerms); } - } - else - { + } else { perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java index 008b8e1..a63ccb5 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java @@ -1,7 +1,5 @@ package com.ruoyi.framework.web.service; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; @@ -17,17 +15,18 @@ import com.ruoyi.framework.manager.AsyncManager; import com.ruoyi.framework.manager.factory.AsyncFactory; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * 注册校验方法 - * + * * @author ruoyi */ @Component -public class SysRegisterService -{ +public class SysRegisterService { @Autowired private ISysUserService userService; @@ -43,54 +42,38 @@ public class SysRegisterService /** * 注册 */ - public String register(RegisterBody registerBody) - { + public String register(RegisterBody registerBody) { String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); SysUser sysUser = new SysUser(); sysUser.setUserName(username); // 验证码开关 boolean captchaEnabled = configService.selectCaptchaEnabled(); - if (captchaEnabled) - { + if (captchaEnabled) { validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); } - if (StringUtils.isEmpty(username)) - { + if (StringUtils.isEmpty(username)) { msg = "用户名不能为空"; - } - else if (StringUtils.isEmpty(password)) - { + } else if (StringUtils.isEmpty(password)) { msg = "用户密码不能为空"; - } - else if (username.length() < UserConstants.USERNAME_MIN_LENGTH - || username.length() > UserConstants.USERNAME_MAX_LENGTH) - { + } else if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) { msg = "账户长度必须在2到20个字符之间"; - } - else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH - || password.length() > UserConstants.PASSWORD_MAX_LENGTH) - { + } else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) { msg = "密码长度必须在5到20个字符之间"; - } - else if (!userService.checkUserNameUnique(sysUser)) - { + } else if (!userService.checkUserNameUnique(sysUser)) { msg = "保存用户'" + username + "'失败,注册账号已存在"; sysLoginService.addRecord(username, Constants.LOGIN_FAIL, "注册失败"); - } - else - { + } else { sysUser.setNickName(username); sysUser.setPassword(SecurityUtils.encryptPassword(password)); boolean regFlag = userService.registerUser(sysUser); - if (!regFlag) - { + if (!regFlag) { msg = "注册失败,请联系系统管理人员"; sysLoginService.addRecord(username, Constants.LOGIN_FAIL, "注册失败"); - } - else - { + } else { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"))); sysLoginService.addRecord(username, Constants.LOGIN_FAIL, "注册成功"); } @@ -100,23 +83,20 @@ public class SysRegisterService /** * 校验验证码 - * + * * @param username 用户名 - * @param code 验证码 - * @param uuid 唯一标识 + * @param code 验证码 + * @param uuid 唯一标识 * @return 结果 */ - public void validateCaptcha(String username, String code, String uuid) - { + public void validateCaptcha(String username, String code, String uuid) { String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); String captcha = redisCache.getCacheObject(verifyKey); redisCache.deleteObject(verifyKey); - if (captcha == null) - { + if (captcha == null) { throw new CaptchaExpireException(); } - if (!code.equalsIgnoreCase(captcha)) - { + if (!code.equalsIgnoreCase(captcha)) { throw new CaptchaException(); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java index 732c83d..ba487bb 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java @@ -1,14 +1,5 @@ package com.ruoyi.framework.web.service; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import javax.servlet.http.HttpServletRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.model.LoginUser; @@ -22,6 +13,16 @@ import eu.bitwalker.useragentutils.UserAgent; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; /** * token验证处理 @@ -29,28 +30,20 @@ import io.jsonwebtoken.SignatureAlgorithm; * @author ruoyi */ @Component -public class TokenService -{ +public class TokenService { + protected static final long MILLIS_SECOND = 1000; + protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; private static final Logger log = LoggerFactory.getLogger(TokenService.class); - + private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; // 令牌自定义标识 @Value("${token.header}") private String header; - // 令牌秘钥 @Value("${token.secret}") private String secret; - // 令牌有效期(默认30分钟) @Value("${token.expireTime}") private int expireTime; - - protected static final long MILLIS_SECOND = 1000; - - protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; - - private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; - @Autowired private RedisCache redisCache; @@ -59,23 +52,18 @@ public class TokenService * * @return 用户信息 */ - public LoginUser getLoginUser(HttpServletRequest request) - { + public LoginUser getLoginUser(HttpServletRequest request) { // 获取请求携带的令牌 String token = getToken(request); - if (StringUtils.isNotEmpty(token)) - { - try - { + if (StringUtils.isNotEmpty(token)) { + try { Claims claims = parseToken(token); // 解析对应的权限以及用户信息 String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); String userKey = getTokenKey(uuid); LoginUser user = redisCache.getCacheObject(userKey); return user; - } - catch (Exception e) - { + } catch (Exception e) { log.error("获取用户信息异常'{}'", e.getMessage()); } } @@ -85,10 +73,8 @@ public class TokenService /** * 设置用户身份信息 */ - public void setLoginUser(LoginUser loginUser) - { - if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) - { + public void setLoginUser(LoginUser loginUser) { + if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) { refreshToken(loginUser); } } @@ -96,10 +82,8 @@ public class TokenService /** * 删除用户身份信息 */ - public void delLoginUser(String token) - { - if (StringUtils.isNotEmpty(token)) - { + public void delLoginUser(String token) { + if (StringUtils.isNotEmpty(token)) { String userKey = getTokenKey(token); redisCache.deleteObject(userKey); } @@ -134,12 +118,10 @@ public class TokenService * @param loginUser * @return 令牌 */ - public void verifyToken(LoginUser loginUser) - { + public void verifyToken(LoginUser loginUser) { long expireTime = loginUser.getExpireTime(); long currentTime = System.currentTimeMillis(); - if (expireTime - currentTime <= MILLIS_MINUTE_TEN) - { + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { refreshToken(loginUser); } } @@ -149,8 +131,7 @@ public class TokenService * * @param loginUser 登录信息 */ - public void refreshToken(LoginUser loginUser) - { + public void refreshToken(LoginUser loginUser) { loginUser.setLoginTime(System.currentTimeMillis()); loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); // 根据uuid将loginUser缓存 @@ -163,8 +144,7 @@ public class TokenService * * @param loginUser 登录信息 */ - public void setUserAgent(LoginUser loginUser) - { + public void setUserAgent(LoginUser loginUser) { UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); String ip = IpUtils.getIpAddr(); loginUser.setIpaddr(ip); @@ -179,8 +159,7 @@ public class TokenService * @param claims 数据声明 * @return 令牌 */ - private String createToken(Map claims) - { + private String createToken(Map claims) { String token = Jwts.builder() .setClaims(claims) .signWith(SignatureAlgorithm.HS512, secret).compact(); @@ -193,8 +172,7 @@ public class TokenService * @param token 令牌 * @return 数据声明 */ - private Claims parseToken(String token) - { + private Claims parseToken(String token) { return Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) @@ -207,8 +185,7 @@ public class TokenService * @param token 令牌 * @return 用户名 */ - public String getUsernameFromToken(String token) - { + public String getUsernameFromToken(String token) { Claims claims = parseToken(token); return claims.getSubject(); } @@ -219,18 +196,15 @@ public class TokenService * @param request * @return token */ - private String getToken(HttpServletRequest request) - { + private String getToken(HttpServletRequest request) { String token = request.getHeader(header); - if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) - { + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { token = token.replace(Constants.TOKEN_PREFIX, ""); } return token; } - private String getTokenKey(String uuid) - { + private String getTokenKey(String uuid) { return CacheConstants.LOGIN_TOKEN_KEY + uuid; } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java index 17632f2..a899f2f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java @@ -1,12 +1,5 @@ package com.ruoyi.framework.web.service; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.UserStatus; @@ -14,6 +7,13 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.service.ISysUserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; /** * 用户验证处理 @@ -21,13 +21,12 @@ import com.ruoyi.system.service.ISysUserService; * @author ruoyi */ @Service -public class UserDetailsServiceImpl implements UserDetailsService -{ +public class UserDetailsServiceImpl implements UserDetailsService { private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); @Autowired private ISysUserService userService; - + @Autowired private SysPasswordService passwordService; @@ -35,21 +34,15 @@ public class UserDetailsServiceImpl implements UserDetailsService private SysPermissionService permissionService; @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException - { + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { SysUser user = userService.selectUserByUserName(username); - if (StringUtils.isNull(user)) - { + if (StringUtils.isNull(user)) { log.info("登录用户:{} 不存在.", username); throw new ServiceException(MessageUtils.message("user.not.exists")); - } - else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) - { + } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { log.info("登录用户:{} 已被删除.", username); throw new ServiceException(MessageUtils.message("user.password.delete")); - } - else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) - { + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { log.info("登录用户:{} 已被停用.", username); throw new ServiceException(MessageUtils.message("user.blocked")); } @@ -59,8 +52,7 @@ public class UserDetailsServiceImpl implements UserDetailsService return createLoginUser(user); } - public UserDetails createLoginUser(SysUser user) - { + public UserDetails createLoginUser(SysUser user) { return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); } diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml index 04b679e..a4da824 100644 --- a/ruoyi-generator/pom.xml +++ b/ruoyi-generator/pom.xml @@ -1,6 +1,6 @@ - ruoyi diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java index cc4cd14..7baa6cd 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java @@ -7,67 +7,66 @@ import org.springframework.stereotype.Component; /** * 读取代码生成相关配置 - * + * * @author ruoyi */ @Component @ConfigurationProperties(prefix = "gen") -@PropertySource(value = { "classpath:generator.yml" }) -public class GenConfig -{ - /** 作者 */ +@PropertySource(value = {"classpath:generator.yml"}) +public class GenConfig { + /** + * 作者 + */ public static String author; - /** 生成包路径 */ + /** + * 生成包路径 + */ public static String packageName; - /** 自动去除表前缀,默认是false */ + /** + * 自动去除表前缀,默认是false + */ public static boolean autoRemovePre; - /** 表前缀(类名不会包含表前缀) */ + /** + * 表前缀(类名不会包含表前缀) + */ public static String tablePrefix; - public static String getAuthor() - { + public static String getAuthor() { return author; } @Value("${author}") - public void setAuthor(String author) - { + public void setAuthor(String author) { GenConfig.author = author; } - public static String getPackageName() - { + public static String getPackageName() { return packageName; } @Value("${packageName}") - public void setPackageName(String packageName) - { + public void setPackageName(String packageName) { GenConfig.packageName = packageName; } - public static boolean getAutoRemovePre() - { + public static boolean getAutoRemovePre() { return autoRemovePre; } @Value("${autoRemovePre}") - public void setAutoRemovePre(boolean autoRemovePre) - { + public void setAutoRemovePre(boolean autoRemovePre) { GenConfig.autoRemovePre = autoRemovePre; } - public static String getTablePrefix() - { + public static String getTablePrefix() { return tablePrefix; } @Value("${tablePrefix}") - public void setTablePrefix(String tablePrefix) - { + public void setTablePrefix(String tablePrefix) { GenConfig.tablePrefix = tablePrefix; } } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java index ed20937..fa532d4 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java @@ -1,23 +1,5 @@ package com.ruoyi.generator.controller; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.servlet.http.HttpServletResponse; -import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import com.alibaba.druid.DbType; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; @@ -34,16 +16,32 @@ import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; import com.ruoyi.generator.service.IGenTableColumnService; import com.ruoyi.generator.service.IGenTableService; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 代码生成 操作处理 - * + * * @author ruoyi */ @RestController @RequestMapping("/tool/gen") -public class GenController extends BaseController -{ +public class GenController extends BaseController { @Autowired private IGenTableService genTableService; @@ -55,8 +53,7 @@ public class GenController extends BaseController */ @PreAuthorize("@ss.hasPermi('tool:gen:list')") @GetMapping("/list") - public TableDataInfo genList(GenTable genTable) - { + public TableDataInfo genList(GenTable genTable) { startPage(); List list = genTableService.selectGenTableList(genTable); return getDataTable(list); @@ -67,8 +64,7 @@ public class GenController extends BaseController */ @PreAuthorize("@ss.hasPermi('tool:gen:query')") @GetMapping(value = "/{tableId}") - public AjaxResult getInfo(@PathVariable Long tableId) - { + public AjaxResult getInfo(@PathVariable Long tableId) { GenTable table = genTableService.selectGenTableById(tableId); List tables = genTableService.selectGenTableAll(); List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); @@ -84,8 +80,7 @@ public class GenController extends BaseController */ @PreAuthorize("@ss.hasPermi('tool:gen:list')") @GetMapping("/db/list") - public TableDataInfo dataList(GenTable genTable) - { + public TableDataInfo dataList(GenTable genTable) { startPage(); List list = genTableService.selectDbTableList(genTable); return getDataTable(list); @@ -96,8 +91,7 @@ public class GenController extends BaseController */ @PreAuthorize("@ss.hasPermi('tool:gen:list')") @GetMapping(value = "/column/{tableId}") - public TableDataInfo columnList(Long tableId) - { + public TableDataInfo columnList(Long tableId) { TableDataInfo dataInfo = new TableDataInfo(); List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); dataInfo.setRows(list); @@ -111,8 +105,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:import')") @Log(title = "代码生成", businessType = BusinessType.IMPORT) @PostMapping("/importTable") - public AjaxResult importTableSave(String tables) - { + public AjaxResult importTableSave(String tables) { String[] tableNames = Convert.toStrArray(tables); // 查询表信息 List tableList = genTableService.selectDbTableListByNames(tableNames); @@ -126,20 +119,15 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasRole('admin')") @Log(title = "创建表", businessType = BusinessType.OTHER) @PostMapping("/createTable") - public AjaxResult createTableSave(String sql) - { - try - { + public AjaxResult createTableSave(String sql) { + try { SqlUtil.filterKeyword(sql); List sqlStatements = SQLUtils.parseStatements(sql, DbType.mysql); List tableNames = new ArrayList<>(); - for (SQLStatement sqlStatement : sqlStatements) - { - if (sqlStatement instanceof MySqlCreateTableStatement) - { + for (SQLStatement sqlStatement : sqlStatements) { + if (sqlStatement instanceof MySqlCreateTableStatement) { MySqlCreateTableStatement createTableStatement = (MySqlCreateTableStatement) sqlStatement; - if (genTableService.createTable(createTableStatement.toString())) - { + if (genTableService.createTable(createTableStatement.toString())) { String tableName = createTableStatement.getTableName().replaceAll("`", ""); tableNames.add(tableName); } @@ -149,9 +137,7 @@ public class GenController extends BaseController String operName = SecurityUtils.getUsername(); genTableService.importGenTable(tableList, operName); return AjaxResult.success(); - } - catch (Exception e) - { + } catch (Exception e) { logger.error(e.getMessage(), e); return AjaxResult.error("创建表结构异常"); } @@ -163,8 +149,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:edit')") @Log(title = "代码生成", businessType = BusinessType.UPDATE) @PostMapping("/edit") - public AjaxResult editSave(@Validated @RequestBody GenTable genTable) - { + public AjaxResult editSave(@Validated @RequestBody GenTable genTable) { genTableService.validateEdit(genTable); genTableService.updateGenTable(genTable); return success(); @@ -176,8 +161,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:remove')") @Log(title = "代码生成", businessType = BusinessType.DELETE) @PostMapping("/{tableIds}") - public AjaxResult remove(@PathVariable Long[] tableIds) - { + public AjaxResult remove(@PathVariable Long[] tableIds) { genTableService.deleteGenTableByIds(tableIds); return success(); } @@ -187,8 +171,7 @@ public class GenController extends BaseController */ @PreAuthorize("@ss.hasPermi('tool:gen:preview')") @GetMapping("/preview/{tableId}") - public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException - { + public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException { Map dataMap = genTableService.previewCode(tableId); return success(dataMap); } @@ -199,8 +182,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:code')") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/download/{tableName}") - public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException - { + public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { byte[] data = genTableService.downloadCode(tableName); genCode(response, data); } @@ -211,8 +193,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:code')") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/genCode/{tableName}") - public AjaxResult genCode(@PathVariable("tableName") String tableName) - { + public AjaxResult genCode(@PathVariable("tableName") String tableName) { genTableService.generatorCode(tableName); return success(); } @@ -223,8 +204,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:edit')") @Log(title = "代码生成", businessType = BusinessType.UPDATE) @GetMapping("/synchDb/{tableName}") - public AjaxResult synchDb(@PathVariable("tableName") String tableName) - { + public AjaxResult synchDb(@PathVariable("tableName") String tableName) { genTableService.synchDb(tableName); return success(); } @@ -235,8 +215,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:code')") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/batchGenCode") - public void batchGenCode(HttpServletResponse response, String tables) throws IOException - { + public void batchGenCode(HttpServletResponse response, String tables) throws IOException { String[] tableNames = Convert.toStrArray(tables); byte[] data = genTableService.downloadCode(tableNames); genCode(response, data); @@ -245,8 +224,7 @@ public class GenController extends BaseController /** * 生成zip文件 */ - private void genCode(HttpServletResponse response, byte[] data) throws IOException - { + private void genCode(HttpServletResponse response, byte[] data) throws IOException { response.reset(); response.addHeader("Access-Control-Allow-Origin", "*"); response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java index 50d834c..101f0cc 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java @@ -1,385 +1,376 @@ package com.ruoyi.generator.domain; -import java.util.List; -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import org.apache.commons.lang3.ArrayUtils; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import java.util.List; /** * 业务表 gen_table - * + * * @author ruoyi */ -public class GenTable extends BaseEntity -{ +public class GenTable extends BaseEntity { private static final long serialVersionUID = 1L; - /** 编号 */ + /** + * 编号 + */ private Long tableId; - /** 表名称 */ + /** + * 表名称 + */ @NotBlank(message = "表名称不能为空") private String tableName; - /** 表描述 */ + /** + * 表描述 + */ @NotBlank(message = "表描述不能为空") private String tableComment; - /** 关联父表的表名 */ + /** + * 关联父表的表名 + */ private String subTableName; - /** 本表关联父表的外键名 */ + /** + * 本表关联父表的外键名 + */ private String subTableFkName; - /** 实体类名称(首字母大写) */ + /** + * 实体类名称(首字母大写) + */ @NotBlank(message = "实体类名称不能为空") private String className; - /** 使用的模板(crud单表操作 tree树表操作 sub主子表操作) */ + /** + * 使用的模板(crud单表操作 tree树表操作 sub主子表操作) + */ private String tplCategory; - /** 前端类型(element-ui模版 element-plus模版) */ + /** + * 前端类型(element-ui模版 element-plus模版) + */ private String tplWebType; - /** 生成包路径 */ + /** + * 生成包路径 + */ @NotBlank(message = "生成包路径不能为空") private String packageName; - /** 生成模块名 */ + /** + * 生成模块名 + */ @NotBlank(message = "生成模块名不能为空") private String moduleName; - /** 生成业务名 */ + /** + * 生成业务名 + */ @NotBlank(message = "生成业务名不能为空") private String businessName; - /** 生成功能名 */ + /** + * 生成功能名 + */ @NotBlank(message = "生成功能名不能为空") private String functionName; - /** 生成作者 */ + /** + * 生成作者 + */ @NotBlank(message = "作者不能为空") private String functionAuthor; - /** 生成代码方式(0zip压缩包 1自定义路径) */ + /** + * 生成代码方式(0zip压缩包 1自定义路径) + */ private String genType; - /** 生成路径(不填默认项目路径) */ + /** + * 生成路径(不填默认项目路径) + */ private String genPath; - /** 主键信息 */ + /** + * 主键信息 + */ private GenTableColumn pkColumn; - /** 子表信息 */ + /** + * 子表信息 + */ private GenTable subTable; - /** 表列信息 */ + /** + * 表列信息 + */ @Valid private List columns; - /** 其它生成选项 */ + /** + * 其它生成选项 + */ private String options; - /** 树编码字段 */ + /** + * 树编码字段 + */ private String treeCode; - /** 树父编码字段 */ + /** + * 树父编码字段 + */ private String treeParentCode; - /** 树名称字段 */ + /** + * 树名称字段 + */ private String treeName; - /** 上级菜单ID字段 */ + /** + * 上级菜单ID字段 + */ private String parentMenuId; - /** 上级菜单名称字段 */ + /** + * 上级菜单名称字段 + */ private String parentMenuName; - public Long getTableId() - { + public static boolean isSub(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); + } + + public static boolean isTree(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + + public static boolean isCrud(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + + public static boolean isSuperColumn(String tplCategory, String javaField) { + if (isTree(tplCategory)) { + return StringUtils.equalsAnyIgnoreCase(javaField, + ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); + } + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + } + + public Long getTableId() { return tableId; } - public void setTableId(Long tableId) - { + public void setTableId(Long tableId) { this.tableId = tableId; } - public String getTableName() - { + public String getTableName() { return tableName; } - public void setTableName(String tableName) - { + public void setTableName(String tableName) { this.tableName = tableName; } - public String getTableComment() - { + public String getTableComment() { return tableComment; } - public void setTableComment(String tableComment) - { + public void setTableComment(String tableComment) { this.tableComment = tableComment; } - public String getSubTableName() - { + public String getSubTableName() { return subTableName; } - public void setSubTableName(String subTableName) - { + public void setSubTableName(String subTableName) { this.subTableName = subTableName; } - public String getSubTableFkName() - { + public String getSubTableFkName() { return subTableFkName; } - public void setSubTableFkName(String subTableFkName) - { + public void setSubTableFkName(String subTableFkName) { this.subTableFkName = subTableFkName; } - public String getClassName() - { + public String getClassName() { return className; } - public void setClassName(String className) - { + public void setClassName(String className) { this.className = className; } - public String getTplCategory() - { + public String getTplCategory() { return tplCategory; } - public void setTplCategory(String tplCategory) - { + public void setTplCategory(String tplCategory) { this.tplCategory = tplCategory; } - public String getTplWebType() - { + public String getTplWebType() { return tplWebType; } - public void setTplWebType(String tplWebType) - { + public void setTplWebType(String tplWebType) { this.tplWebType = tplWebType; } - public String getPackageName() - { + public String getPackageName() { return packageName; } - public void setPackageName(String packageName) - { + public void setPackageName(String packageName) { this.packageName = packageName; } - public String getModuleName() - { + public String getModuleName() { return moduleName; } - public void setModuleName(String moduleName) - { + public void setModuleName(String moduleName) { this.moduleName = moduleName; } - public String getBusinessName() - { + public String getBusinessName() { return businessName; } - public void setBusinessName(String businessName) - { + public void setBusinessName(String businessName) { this.businessName = businessName; } - public String getFunctionName() - { + public String getFunctionName() { return functionName; } - public void setFunctionName(String functionName) - { + public void setFunctionName(String functionName) { this.functionName = functionName; } - public String getFunctionAuthor() - { + public String getFunctionAuthor() { return functionAuthor; } - public void setFunctionAuthor(String functionAuthor) - { + public void setFunctionAuthor(String functionAuthor) { this.functionAuthor = functionAuthor; } - public String getGenType() - { + public String getGenType() { return genType; } - public void setGenType(String genType) - { + public void setGenType(String genType) { this.genType = genType; } - public String getGenPath() - { + public String getGenPath() { return genPath; } - public void setGenPath(String genPath) - { + public void setGenPath(String genPath) { this.genPath = genPath; } - public GenTableColumn getPkColumn() - { + public GenTableColumn getPkColumn() { return pkColumn; } - public void setPkColumn(GenTableColumn pkColumn) - { + public void setPkColumn(GenTableColumn pkColumn) { this.pkColumn = pkColumn; } - public GenTable getSubTable() - { + public GenTable getSubTable() { return subTable; } - public void setSubTable(GenTable subTable) - { + public void setSubTable(GenTable subTable) { this.subTable = subTable; } - public List getColumns() - { + public List getColumns() { return columns; } - public void setColumns(List columns) - { + public void setColumns(List columns) { this.columns = columns; } - public String getOptions() - { + public String getOptions() { return options; } - public void setOptions(String options) - { + public void setOptions(String options) { this.options = options; } - public String getTreeCode() - { + public String getTreeCode() { return treeCode; } - public void setTreeCode(String treeCode) - { + public void setTreeCode(String treeCode) { this.treeCode = treeCode; } - public String getTreeParentCode() - { + public String getTreeParentCode() { return treeParentCode; } - public void setTreeParentCode(String treeParentCode) - { + public void setTreeParentCode(String treeParentCode) { this.treeParentCode = treeParentCode; } - public String getTreeName() - { + public String getTreeName() { return treeName; } - public void setTreeName(String treeName) - { + public void setTreeName(String treeName) { this.treeName = treeName; } - public String getParentMenuId() - { + public String getParentMenuId() { return parentMenuId; } - public void setParentMenuId(String parentMenuId) - { + public void setParentMenuId(String parentMenuId) { this.parentMenuId = parentMenuId; } - public String getParentMenuName() - { + public String getParentMenuName() { return parentMenuName; } - public void setParentMenuName(String parentMenuName) - { + public void setParentMenuName(String parentMenuName) { this.parentMenuName = parentMenuName; } - public boolean isSub() - { + public boolean isSub() { return isSub(this.tplCategory); } - public static boolean isSub(String tplCategory) - { - return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); - } - - public boolean isTree() - { + public boolean isTree() { return isTree(this.tplCategory); } - public static boolean isTree(String tplCategory) - { - return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); - } - - public boolean isCrud() - { + public boolean isCrud() { return isCrud(this.tplCategory); } - public static boolean isCrud(String tplCategory) - { - return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); - } - - public boolean isSuperColumn(String javaField) - { + public boolean isSuperColumn(String javaField) { return isSuperColumn(this.tplCategory, javaField); } - - public static boolean isSuperColumn(String tplCategory, String javaField) - { - if (isTree(tplCategory)) - { - return StringUtils.equalsAnyIgnoreCase(javaField, - ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); - } - return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); - } } \ No newline at end of file diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java index d1733b6..ed0c90b 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java @@ -1,372 +1,347 @@ package com.ruoyi.generator.domain; -import javax.validation.constraints.NotBlank; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.utils.StringUtils; +import javax.validation.constraints.NotBlank; + /** * 代码生成业务字段表 gen_table_column - * + * * @author ruoyi */ -public class GenTableColumn extends BaseEntity -{ +public class GenTableColumn extends BaseEntity { private static final long serialVersionUID = 1L; - /** 编号 */ + /** + * 编号 + */ private Long columnId; - /** 归属表编号 */ + /** + * 归属表编号 + */ private Long tableId; - /** 列名称 */ + /** + * 列名称 + */ private String columnName; - /** 列描述 */ + /** + * 列描述 + */ private String columnComment; - /** 列类型 */ + /** + * 列类型 + */ private String columnType; - /** JAVA类型 */ + /** + * JAVA类型 + */ private String javaType; - /** JAVA字段名 */ + /** + * JAVA字段名 + */ @NotBlank(message = "Java属性不能为空") private String javaField; - /** 是否主键(1是) */ + /** + * 是否主键(1是) + */ private String isPk; - /** 是否自增(1是) */ + /** + * 是否自增(1是) + */ private String isIncrement; - /** 是否必填(1是) */ + /** + * 是否必填(1是) + */ private String isRequired; - /** 是否为插入字段(1是) */ + /** + * 是否为插入字段(1是) + */ private String isInsert; - /** 是否编辑字段(1是) */ + /** + * 是否编辑字段(1是) + */ private String isEdit; - /** 是否列表字段(1是) */ + /** + * 是否列表字段(1是) + */ private String isList; - /** 是否查询字段(1是) */ + /** + * 是否查询字段(1是) + */ private String isQuery; - /** 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) */ + /** + * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) + */ private String queryType; - /** 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) */ + /** + * 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) + */ private String htmlType; - /** 字典类型 */ + /** + * 字典类型 + */ private String dictType; - /** 排序 */ + /** + * 排序 + */ private Integer sort; - public void setColumnId(Long columnId) - { - this.columnId = columnId; + public static boolean isSuperColumn(String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", "remark", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); } - public Long getColumnId() - { + public static boolean isUsableColumn(String javaField) { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public Long getColumnId() { return columnId; } - public void setTableId(Long tableId) - { - this.tableId = tableId; + public void setColumnId(Long columnId) { + this.columnId = columnId; } - public Long getTableId() - { + public Long getTableId() { return tableId; } - public void setColumnName(String columnName) - { - this.columnName = columnName; + public void setTableId(Long tableId) { + this.tableId = tableId; } - public String getColumnName() - { + public String getColumnName() { return columnName; } - public void setColumnComment(String columnComment) - { - this.columnComment = columnComment; + public void setColumnName(String columnName) { + this.columnName = columnName; } - public String getColumnComment() - { + public String getColumnComment() { return columnComment; } - public void setColumnType(String columnType) - { - this.columnType = columnType; + public void setColumnComment(String columnComment) { + this.columnComment = columnComment; } - public String getColumnType() - { + public String getColumnType() { return columnType; } - public void setJavaType(String javaType) - { - this.javaType = javaType; + public void setColumnType(String columnType) { + this.columnType = columnType; } - public String getJavaType() - { + public String getJavaType() { return javaType; } - public void setJavaField(String javaField) - { - this.javaField = javaField; + public void setJavaType(String javaType) { + this.javaType = javaType; } - public String getJavaField() - { + public String getJavaField() { return javaField; } - public String getCapJavaField() - { - return StringUtils.capitalize(javaField); + public void setJavaField(String javaField) { + this.javaField = javaField; } - public void setIsPk(String isPk) - { - this.isPk = isPk; + public String getCapJavaField() { + return StringUtils.capitalize(javaField); } - public String getIsPk() - { + public String getIsPk() { return isPk; } - public boolean isPk() - { + public void setIsPk(String isPk) { + this.isPk = isPk; + } + + public boolean isPk() { return isPk(this.isPk); } - public boolean isPk(String isPk) - { + public boolean isPk(String isPk) { return isPk != null && StringUtils.equals("1", isPk); } - public String getIsIncrement() - { + public String getIsIncrement() { return isIncrement; } - public void setIsIncrement(String isIncrement) - { + public void setIsIncrement(String isIncrement) { this.isIncrement = isIncrement; } - public boolean isIncrement() - { + public boolean isIncrement() { return isIncrement(this.isIncrement); } - public boolean isIncrement(String isIncrement) - { + public boolean isIncrement(String isIncrement) { return isIncrement != null && StringUtils.equals("1", isIncrement); } - public void setIsRequired(String isRequired) - { - this.isRequired = isRequired; + public String getIsRequired() { + return isRequired; } - public String getIsRequired() - { - return isRequired; + public void setIsRequired(String isRequired) { + this.isRequired = isRequired; } - public boolean isRequired() - { + public boolean isRequired() { return isRequired(this.isRequired); } - public boolean isRequired(String isRequired) - { + public boolean isRequired(String isRequired) { return isRequired != null && StringUtils.equals("1", isRequired); } - public void setIsInsert(String isInsert) - { - this.isInsert = isInsert; + public String getIsInsert() { + return isInsert; } - public String getIsInsert() - { - return isInsert; + public void setIsInsert(String isInsert) { + this.isInsert = isInsert; } - public boolean isInsert() - { + public boolean isInsert() { return isInsert(this.isInsert); } - public boolean isInsert(String isInsert) - { + public boolean isInsert(String isInsert) { return isInsert != null && StringUtils.equals("1", isInsert); } - public void setIsEdit(String isEdit) - { - this.isEdit = isEdit; + public String getIsEdit() { + return isEdit; } - public String getIsEdit() - { - return isEdit; + public void setIsEdit(String isEdit) { + this.isEdit = isEdit; } - public boolean isEdit() - { + public boolean isEdit() { return isInsert(this.isEdit); } - public boolean isEdit(String isEdit) - { + public boolean isEdit(String isEdit) { return isEdit != null && StringUtils.equals("1", isEdit); } - public void setIsList(String isList) - { - this.isList = isList; + public String getIsList() { + return isList; } - public String getIsList() - { - return isList; + public void setIsList(String isList) { + this.isList = isList; } - public boolean isList() - { + public boolean isList() { return isList(this.isList); } - public boolean isList(String isList) - { + public boolean isList(String isList) { return isList != null && StringUtils.equals("1", isList); } - public void setIsQuery(String isQuery) - { - this.isQuery = isQuery; + public String getIsQuery() { + return isQuery; } - public String getIsQuery() - { - return isQuery; + public void setIsQuery(String isQuery) { + this.isQuery = isQuery; } - public boolean isQuery() - { + public boolean isQuery() { return isQuery(this.isQuery); } - public boolean isQuery(String isQuery) - { + public boolean isQuery(String isQuery) { return isQuery != null && StringUtils.equals("1", isQuery); } - public void setQueryType(String queryType) - { - this.queryType = queryType; + public String getQueryType() { + return queryType; } - public String getQueryType() - { - return queryType; + public void setQueryType(String queryType) { + this.queryType = queryType; } - public String getHtmlType() - { + public String getHtmlType() { return htmlType; } - public void setHtmlType(String htmlType) - { + public void setHtmlType(String htmlType) { this.htmlType = htmlType; } - public void setDictType(String dictType) - { - this.dictType = dictType; - } - - public String getDictType() - { + public String getDictType() { return dictType; } - public void setSort(Integer sort) - { - this.sort = sort; + public void setDictType(String dictType) { + this.dictType = dictType; } - public Integer getSort() - { + public Integer getSort() { return sort; } - public boolean isSuperColumn() - { - return isSuperColumn(this.javaField); + public void setSort(Integer sort) { + this.sort = sort; } - public static boolean isSuperColumn(String javaField) - { - return StringUtils.equalsAnyIgnoreCase(javaField, - // BaseEntity - "createBy", "createTime", "updateBy", "updateTime", "remark", - // TreeEntity - "parentName", "parentId", "orderNum", "ancestors"); + public boolean isSuperColumn() { + return isSuperColumn(this.javaField); } - public boolean isUsableColumn() - { + public boolean isUsableColumn() { return isUsableColumn(javaField); } - public static boolean isUsableColumn(String javaField) - { - // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 - return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); - } - - public String readConverterExp() - { + public String readConverterExp() { String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); StringBuffer sb = new StringBuffer(); - if (StringUtils.isNotEmpty(remarks)) - { - for (String value : remarks.split(" ")) - { - if (StringUtils.isNotEmpty(value)) - { + if (StringUtils.isNotEmpty(remarks)) { + for (String value : remarks.split(" ")) { + if (StringUtils.isNotEmpty(value)) { Object startStr = value.subSequence(0, 1); String endStr = value.substring(1); sb.append("").append(startStr).append("=").append(endStr).append(","); } } return sb.deleteCharAt(sb.length() - 1).toString(); - } - else - { + } else { return this.columnComment; } } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java index 951e166..2b9470f 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java @@ -1,18 +1,18 @@ package com.ruoyi.generator.mapper; -import java.util.List; import com.ruoyi.generator.domain.GenTableColumn; +import java.util.List; + /** * 业务字段 数据层 - * + * * @author ruoyi */ -public interface GenTableColumnMapper -{ +public interface GenTableColumnMapper { /** * 根据表名称查询列信息 - * + * * @param tableName 表名称 * @return 列信息 */ @@ -20,7 +20,7 @@ public interface GenTableColumnMapper /** * 查询业务字段列表 - * + * * @param tableId 业务字段编号 * @return 业务字段集合 */ @@ -28,7 +28,7 @@ public interface GenTableColumnMapper /** * 新增业务字段 - * + * * @param genTableColumn 业务字段信息 * @return 结果 */ @@ -36,7 +36,7 @@ public interface GenTableColumnMapper /** * 修改业务字段 - * + * * @param genTableColumn 业务字段信息 * @return 结果 */ @@ -44,7 +44,7 @@ public interface GenTableColumnMapper /** * 删除业务字段 - * + * * @param genTableColumns 列数据 * @return 结果 */ @@ -52,7 +52,7 @@ public interface GenTableColumnMapper /** * 批量删除业务字段 - * + * * @param ids 需要删除的数据ID * @return 结果 */ diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java index 937656d..1eed653 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -1,18 +1,18 @@ package com.ruoyi.generator.mapper; -import java.util.List; import com.ruoyi.generator.domain.GenTable; +import java.util.List; + /** * 业务 数据层 - * + * * @author ruoyi */ -public interface GenTableMapper -{ +public interface GenTableMapper { /** * 查询业务列表 - * + * * @param genTable 业务信息 * @return 业务集合 */ @@ -20,7 +20,7 @@ public interface GenTableMapper /** * 查询据库列表 - * + * * @param genTable 业务信息 * @return 数据库表集合 */ @@ -28,7 +28,7 @@ public interface GenTableMapper /** * 查询据库列表 - * + * * @param tableNames 表名称组 * @return 数据库表集合 */ @@ -36,14 +36,14 @@ public interface GenTableMapper /** * 查询所有表信息 - * + * * @return 表信息集合 */ public List selectGenTableAll(); /** * 查询表ID业务信息 - * + * * @param id 业务ID * @return 业务信息 */ @@ -51,7 +51,7 @@ public interface GenTableMapper /** * 查询表名称业务信息 - * + * * @param tableName 表名称 * @return 业务信息 */ @@ -59,7 +59,7 @@ public interface GenTableMapper /** * 新增业务 - * + * * @param genTable 业务信息 * @return 结果 */ @@ -67,7 +67,7 @@ public interface GenTableMapper /** * 修改业务 - * + * * @param genTable 业务信息 * @return 结果 */ @@ -75,7 +75,7 @@ public interface GenTableMapper /** * 批量删除业务 - * + * * @param ids 需要删除的数据ID * @return 结果 */ diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java index 0679689..fed997c 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java @@ -1,68 +1,64 @@ package com.ruoyi.generator.service; -import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; import com.ruoyi.common.core.text.Convert; import com.ruoyi.generator.domain.GenTableColumn; import com.ruoyi.generator.mapper.GenTableColumnMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; /** * 业务字段 服务层实现 - * + * * @author ruoyi */ @Service -public class GenTableColumnServiceImpl implements IGenTableColumnService -{ - @Autowired - private GenTableColumnMapper genTableColumnMapper; +public class GenTableColumnServiceImpl implements IGenTableColumnService { + @Autowired + private GenTableColumnMapper genTableColumnMapper; - /** + /** * 查询业务字段列表 - * + * * @param tableId 业务字段编号 * @return 业务字段集合 */ - @Override - public List selectGenTableColumnListByTableId(Long tableId) - { - return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); - } - + @Override + public List selectGenTableColumnListByTableId(Long tableId) { + return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); + } + /** * 新增业务字段 - * + * * @param genTableColumn 业务字段信息 * @return 结果 */ - @Override - public int insertGenTableColumn(GenTableColumn genTableColumn) - { - return genTableColumnMapper.insertGenTableColumn(genTableColumn); - } - - /** + @Override + public int insertGenTableColumn(GenTableColumn genTableColumn) { + return genTableColumnMapper.insertGenTableColumn(genTableColumn); + } + + /** * 修改业务字段 - * + * * @param genTableColumn 业务字段信息 * @return 结果 */ - @Override - public int updateGenTableColumn(GenTableColumn genTableColumn) - { - return genTableColumnMapper.updateGenTableColumn(genTableColumn); - } + @Override + public int updateGenTableColumn(GenTableColumn genTableColumn) { + return genTableColumnMapper.updateGenTableColumn(genTableColumn); + } - /** + /** * 删除业务字段对象 - * + * * @param ids 需要删除的数据ID * @return 结果 */ - @Override - public int deleteGenTableColumnByIds(String ids) - { - return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); - } + @Override + public int deleteGenTableColumnByIds(String ids) { + return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + } } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index 3fb6383..bd2750c 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -1,26 +1,5 @@ package com.ruoyi.generator.service; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.StringWriter; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.Velocity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.constant.Constants; @@ -35,15 +14,36 @@ import com.ruoyi.generator.mapper.GenTableMapper; import com.ruoyi.generator.util.GenUtils; import com.ruoyi.generator.util.VelocityInitializer; import com.ruoyi.generator.util.VelocityUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * 业务 服务层实现 - * + * * @author ruoyi */ @Service -public class GenTableServiceImpl implements IGenTableService -{ +public class GenTableServiceImpl implements IGenTableService { private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class); @Autowired @@ -52,15 +52,29 @@ public class GenTableServiceImpl implements IGenTableService @Autowired private GenTableColumnMapper genTableColumnMapper; + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } + /** * 查询业务信息 - * + * * @param id 业务ID * @return 业务信息 */ @Override - public GenTable selectGenTableById(Long id) - { + public GenTable selectGenTableById(Long id) { GenTable genTable = genTableMapper.selectGenTableById(id); setTableFromOptions(genTable); return genTable; @@ -68,68 +82,61 @@ public class GenTableServiceImpl implements IGenTableService /** * 查询业务列表 - * + * * @param genTable 业务信息 * @return 业务集合 */ @Override - public List selectGenTableList(GenTable genTable) - { + public List selectGenTableList(GenTable genTable) { return genTableMapper.selectGenTableList(genTable); } /** * 查询据库列表 - * + * * @param genTable 业务信息 * @return 数据库表集合 */ @Override - public List selectDbTableList(GenTable genTable) - { + public List selectDbTableList(GenTable genTable) { return genTableMapper.selectDbTableList(genTable); } /** * 查询据库列表 - * + * * @param tableNames 表名称组 * @return 数据库表集合 */ @Override - public List selectDbTableListByNames(String[] tableNames) - { + public List selectDbTableListByNames(String[] tableNames) { return genTableMapper.selectDbTableListByNames(tableNames); } /** * 查询所有表信息 - * + * * @return 表信息集合 */ @Override - public List selectGenTableAll() - { + public List selectGenTableAll() { return genTableMapper.selectGenTableAll(); } /** * 修改业务 - * + * * @param genTable 业务信息 * @return 结果 */ @Override @Transactional - public void updateGenTable(GenTable genTable) - { + public void updateGenTable(GenTable genTable) { String options = JSON.toJSONString(genTable.getParams()); genTable.setOptions(options); int row = genTableMapper.updateGenTable(genTable); - if (row > 0) - { - for (GenTableColumn cenTableColumn : genTable.getColumns()) - { + if (row > 0) { + for (GenTableColumn cenTableColumn : genTable.getColumns()) { genTableColumnMapper.updateGenTableColumn(cenTableColumn); } } @@ -137,14 +144,13 @@ public class GenTableServiceImpl implements IGenTableService /** * 删除业务对象 - * + * * @param tableIds 需要删除的数据ID * @return 结果 */ @Override @Transactional - public void deleteGenTableByIds(Long[] tableIds) - { + public void deleteGenTableByIds(Long[] tableIds) { genTableMapper.deleteGenTableByIds(tableIds); genTableColumnMapper.deleteGenTableColumnByIds(tableIds); } @@ -156,54 +162,45 @@ public class GenTableServiceImpl implements IGenTableService * @return 结果 */ @Override - public boolean createTable(String sql) - { + public boolean createTable(String sql) { return genTableMapper.createTable(sql) == 0; } /** * 导入表结构 - * + * * @param tableList 导入表列表 */ @Override @Transactional - public void importGenTable(List tableList, String operName) - { - try - { - for (GenTable table : tableList) - { + public void importGenTable(List tableList, String operName) { + try { + for (GenTable table : tableList) { String tableName = table.getTableName(); GenUtils.initTable(table, operName); int row = genTableMapper.insertGenTable(table); - if (row > 0) - { + if (row > 0) { // 保存列信息 List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); - for (GenTableColumn column : genTableColumns) - { + for (GenTableColumn column : genTableColumns) { GenUtils.initColumnField(column, table); genTableColumnMapper.insertGenTableColumn(column); } } } - } - catch (Exception e) - { + } catch (Exception e) { throw new ServiceException("导入失败:" + e.getMessage()); } } /** * 预览代码 - * + * * @param tableId 表编号 * @return 预览数据列表 */ @Override - public Map previewCode(Long tableId) - { + public Map previewCode(Long tableId) { Map dataMap = new LinkedHashMap<>(); // 查询表信息 GenTable table = genTableMapper.selectGenTableById(tableId); @@ -217,8 +214,7 @@ public class GenTableServiceImpl implements IGenTableService // 获取模板列表 List templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType()); - for (String template : templates) - { + for (String template : templates) { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, Constants.UTF8); @@ -230,13 +226,12 @@ public class GenTableServiceImpl implements IGenTableService /** * 生成代码(下载方式) - * + * * @param tableName 表名称 * @return 数据 */ @Override - public byte[] downloadCode(String tableName) - { + public byte[] downloadCode(String tableName) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(outputStream); generatorCode(tableName, zip); @@ -246,12 +241,11 @@ public class GenTableServiceImpl implements IGenTableService /** * 生成代码(自定义路径) - * + * * @param tableName 表名称 */ @Override - public void generatorCode(String tableName) - { + public void generatorCode(String tableName) { // 查询表信息 GenTable table = genTableMapper.selectGenTableByName(tableName); // 设置主子表信息 @@ -265,21 +259,16 @@ public class GenTableServiceImpl implements IGenTableService // 获取模板列表 List templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType()); - for (String template : templates) - { - if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) - { + for (String template : templates) { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, Constants.UTF8); tpl.merge(context, sw); - try - { + try { String path = getGenPath(table, template); FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); - } - catch (IOException e) - { + } catch (IOException e) { throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); } } @@ -288,72 +277,62 @@ public class GenTableServiceImpl implements IGenTableService /** * 同步数据库 - * + * * @param tableName 表名称 */ @Override @Transactional - public void synchDb(String tableName) - { + public void synchDb(String tableName) { GenTable table = genTableMapper.selectGenTableByName(tableName); List tableColumns = table.getColumns(); Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); - if (StringUtils.isEmpty(dbTableColumns)) - { + if (StringUtils.isEmpty(dbTableColumns)) { throw new ServiceException("同步数据失败,原表结构不存在"); } List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); dbTableColumns.forEach(column -> { GenUtils.initColumnField(column, table); - if (tableColumnMap.containsKey(column.getColumnName())) - { + if (tableColumnMap.containsKey(column.getColumnName())) { GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); column.setColumnId(prevColumn.getColumnId()); - if (column.isList()) - { + if (column.isList()) { // 如果是列表,继续保留查询方式/字典类型选项 column.setDictType(prevColumn.getDictType()); column.setQueryType(prevColumn.getQueryType()); } if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() && (column.isInsert() || column.isEdit()) - && ((column.isUsableColumn()) || (!column.isSuperColumn()))) - { + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) { // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 column.setIsRequired(prevColumn.getIsRequired()); column.setHtmlType(prevColumn.getHtmlType()); } genTableColumnMapper.updateGenTableColumn(column); - } - else - { + } else { genTableColumnMapper.insertGenTableColumn(column); } }); List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); - if (StringUtils.isNotEmpty(delColumns)) - { + if (StringUtils.isNotEmpty(delColumns)) { genTableColumnMapper.deleteGenTableColumns(delColumns); } } /** * 批量生成代码(下载方式) - * + * * @param tableNames 表数组 * @return 数据 */ @Override - public byte[] downloadCode(String[] tableNames) - { + public byte[] downloadCode(String[] tableNames) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(outputStream); - for (String tableName : tableNames) - { + for (String tableName : tableNames) { generatorCode(tableName, zip); } IOUtils.closeQuietly(zip); @@ -363,8 +342,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 查询表信息并生成代码 */ - private void generatorCode(String tableName, ZipOutputStream zip) - { + private void generatorCode(String tableName, ZipOutputStream zip) { // 查询表信息 GenTable table = genTableMapper.selectGenTableByName(tableName); // 设置主子表信息 @@ -378,23 +356,19 @@ public class GenTableServiceImpl implements IGenTableService // 获取模板列表 List templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType()); - for (String template : templates) - { + for (String template : templates) { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, Constants.UTF8); tpl.merge(context, sw); - try - { + try { // 添加到zip zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); IOUtils.write(sw.toString(), zip, Constants.UTF8); IOUtils.closeQuietly(sw); zip.flush(); zip.closeEntry(); - } - catch (IOException e) - { + } catch (IOException e) { log.error("渲染模板失败,表名:" + table.getTableName(), e); } } @@ -402,36 +376,24 @@ public class GenTableServiceImpl implements IGenTableService /** * 修改保存参数校验 - * + * * @param genTable 业务信息 */ @Override - public void validateEdit(GenTable genTable) - { - if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) - { + public void validateEdit(GenTable genTable) { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { String options = JSON.toJSONString(genTable.getParams()); JSONObject paramsObj = JSON.parseObject(options); - if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) - { + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) { throw new ServiceException("树编码字段不能为空"); - } - else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) - { + } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) { throw new ServiceException("树父编码字段不能为空"); - } - else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) - { + } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) { throw new ServiceException("树名称字段不能为空"); - } - else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) - { - if (StringUtils.isEmpty(genTable.getSubTableName())) - { + } else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) { + if (StringUtils.isEmpty(genTable.getSubTableName())) { throw new ServiceException("关联子表的表名不能为空"); - } - else if (StringUtils.isEmpty(genTable.getSubTableFkName())) - { + } else if (StringUtils.isEmpty(genTable.getSubTableFkName())) { throw new ServiceException("子表关联的外键名不能为空"); } } @@ -440,35 +402,27 @@ public class GenTableServiceImpl implements IGenTableService /** * 设置主键列信息 - * + * * @param table 业务表信息 */ - public void setPkColumn(GenTable table) - { - for (GenTableColumn column : table.getColumns()) - { - if (column.isPk()) - { + public void setPkColumn(GenTable table) { + for (GenTableColumn column : table.getColumns()) { + if (column.isPk()) { table.setPkColumn(column); break; } } - if (StringUtils.isNull(table.getPkColumn())) - { + if (StringUtils.isNull(table.getPkColumn())) { table.setPkColumn(table.getColumns().get(0)); } - if (GenConstants.TPL_SUB.equals(table.getTplCategory())) - { - for (GenTableColumn column : table.getSubTable().getColumns()) - { - if (column.isPk()) - { + if (GenConstants.TPL_SUB.equals(table.getTplCategory())) { + for (GenTableColumn column : table.getSubTable().getColumns()) { + if (column.isPk()) { table.getSubTable().setPkColumn(column); break; } } - if (StringUtils.isNull(table.getSubTable().getPkColumn())) - { + if (StringUtils.isNull(table.getSubTable().getPkColumn())) { table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); } } @@ -476,28 +430,24 @@ public class GenTableServiceImpl implements IGenTableService /** * 设置主子表信息 - * + * * @param table 业务表信息 */ - public void setSubTable(GenTable table) - { + public void setSubTable(GenTable table) { String subTableName = table.getSubTableName(); - if (StringUtils.isNotEmpty(subTableName)) - { + if (StringUtils.isNotEmpty(subTableName)) { table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); } } /** * 设置代码生成其他选项值 - * + * * @param genTable 设置后的生成对象 */ - public void setTableFromOptions(GenTable genTable) - { + public void setTableFromOptions(GenTable genTable) { JSONObject paramsObj = JSON.parseObject(genTable.getOptions()); - if (StringUtils.isNotNull(paramsObj)) - { + if (StringUtils.isNotNull(paramsObj)) { String treeCode = paramsObj.getString(GenConstants.TREE_CODE); String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); String treeName = paramsObj.getString(GenConstants.TREE_NAME); @@ -511,21 +461,4 @@ public class GenTableServiceImpl implements IGenTableService genTable.setParentMenuName(parentMenuName); } } - - /** - * 获取代码生成地址 - * - * @param table 业务表信息 - * @param template 模板文件路径 - * @return 生成地址 - */ - public static String getGenPath(GenTable table, String template) - { - String genPath = table.getGenPath(); - if (StringUtils.equals(genPath, "/")) - { - return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); - } - return genPath + File.separator + VelocityUtils.getFileName(template, table); - } } \ No newline at end of file diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java index 3037f70..f957b33 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java @@ -1,18 +1,18 @@ package com.ruoyi.generator.service; -import java.util.List; import com.ruoyi.generator.domain.GenTableColumn; +import java.util.List; + /** * 业务字段 服务层 - * + * * @author ruoyi */ -public interface IGenTableColumnService -{ +public interface IGenTableColumnService { /** * 查询业务字段列表 - * + * * @param tableId 业务字段编号 * @return 业务字段集合 */ @@ -20,7 +20,7 @@ public interface IGenTableColumnService /** * 新增业务字段 - * + * * @param genTableColumn 业务字段信息 * @return 结果 */ @@ -28,7 +28,7 @@ public interface IGenTableColumnService /** * 修改业务字段 - * + * * @param genTableColumn 业务字段信息 * @return 结果 */ @@ -36,7 +36,7 @@ public interface IGenTableColumnService /** * 删除业务字段信息 - * + * * @param ids 需要删除的数据ID * @return 结果 */ diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java index 695426e..a8a23f7 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -1,19 +1,19 @@ package com.ruoyi.generator.service; +import com.ruoyi.generator.domain.GenTable; + import java.util.List; import java.util.Map; -import com.ruoyi.generator.domain.GenTable; /** * 业务 服务层 - * + * * @author ruoyi */ -public interface IGenTableService -{ +public interface IGenTableService { /** * 查询业务列表 - * + * * @param genTable 业务信息 * @return 业务集合 */ @@ -21,7 +21,7 @@ public interface IGenTableService /** * 查询据库列表 - * + * * @param genTable 业务信息 * @return 数据库表集合 */ @@ -29,7 +29,7 @@ public interface IGenTableService /** * 查询据库列表 - * + * * @param tableNames 表名称组 * @return 数据库表集合 */ @@ -37,14 +37,14 @@ public interface IGenTableService /** * 查询所有表信息 - * + * * @return 表信息集合 */ public List selectGenTableAll(); /** * 查询业务信息 - * + * * @param id 业务ID * @return 业务信息 */ @@ -52,7 +52,7 @@ public interface IGenTableService /** * 修改业务 - * + * * @param genTable 业务信息 * @return 结果 */ @@ -60,7 +60,7 @@ public interface IGenTableService /** * 删除业务信息 - * + * * @param tableIds 需要删除的表数据ID * @return 结果 */ @@ -78,13 +78,13 @@ public interface IGenTableService * 导入表结构 * * @param tableList 导入表列表 - * @param operName 操作人员 + * @param operName 操作人员 */ public void importGenTable(List tableList, String operName); /** * 预览代码 - * + * * @param tableId 表编号 * @return 预览数据列表 */ @@ -92,7 +92,7 @@ public interface IGenTableService /** * 生成代码(下载方式) - * + * * @param tableName 表名称 * @return 数据 */ @@ -100,7 +100,7 @@ public interface IGenTableService /** * 生成代码(自定义路径) - * + * * @param tableName 表名称 * @return 数据 */ @@ -108,14 +108,14 @@ public interface IGenTableService /** * 同步数据库 - * + * * @param tableName 表名称 */ public void synchDb(String tableName); /** * 批量生成代码(下载方式) - * + * * @param tableNames 表数组 * @return 数据 */ @@ -123,7 +123,7 @@ public interface IGenTableService /** * 修改保存参数校验 - * + * * @param genTable 业务信息 */ public void validateEdit(GenTable genTable); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java index e7ebc20..048243d 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java @@ -1,25 +1,24 @@ package com.ruoyi.generator.util; -import java.util.Arrays; -import org.apache.commons.lang3.RegExUtils; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.generator.config.GenConfig; import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; +import org.apache.commons.lang3.RegExUtils; + +import java.util.Arrays; /** * 代码生成器 工具类 - * + * * @author ruoyi */ -public class GenUtils -{ +public class GenUtils { /** * 初始化表信息 */ - public static void initTable(GenTable genTable, String operName) - { + public static void initTable(GenTable genTable, String operName) { genTable.setClassName(convertClassName(genTable.getTableName())); genTable.setPackageName(GenConfig.getPackageName()); genTable.setModuleName(getModuleName(GenConfig.getPackageName())); @@ -32,8 +31,7 @@ public class GenUtils /** * 初始化列属性字段 */ - public static void initColumnField(GenTableColumn column, GenTable table) - { + public static void initColumnField(GenTableColumn column, GenTable table) { String dataType = getDbType(column.getColumnType()); String columnName = column.getColumnName(); column.setTableId(table.getTableId()); @@ -44,36 +42,28 @@ public class GenUtils column.setJavaType(GenConstants.TYPE_STRING); column.setQueryType(GenConstants.QUERY_EQ); - if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) - { + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { // 字符串长度超过500设置为文本域 Integer columnLength = getColumnLength(column.getColumnType()); String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; column.setHtmlType(htmlType); - } - else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) - { + } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) { column.setJavaType(GenConstants.TYPE_DATE); column.setHtmlType(GenConstants.HTML_DATETIME); - } - else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) - { + } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) { column.setHtmlType(GenConstants.HTML_INPUT); // 如果是浮点型 统一用BigDecimal String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); - if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) - { + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) { column.setJavaType(GenConstants.TYPE_BIGDECIMAL); } // 如果是整形 - else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) - { + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) { column.setJavaType(GenConstants.TYPE_INTEGER); } // 长整形 - else - { + else { column.setJavaType(GenConstants.TYPE_LONG); } } @@ -82,74 +72,63 @@ public class GenUtils column.setIsInsert(GenConstants.REQUIRE); // 编辑字段 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) - { + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) { column.setIsEdit(GenConstants.REQUIRE); } // 列表字段 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) - { + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) { column.setIsList(GenConstants.REQUIRE); } // 查询字段 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) - { + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) { column.setIsQuery(GenConstants.REQUIRE); } // 查询字段类型 - if (StringUtils.endsWithIgnoreCase(columnName, "name")) - { + if (StringUtils.endsWithIgnoreCase(columnName, "name")) { column.setQueryType(GenConstants.QUERY_LIKE); } // 状态字段设置单选框 - if (StringUtils.endsWithIgnoreCase(columnName, "status")) - { + if (StringUtils.endsWithIgnoreCase(columnName, "status")) { column.setHtmlType(GenConstants.HTML_RADIO); } // 类型&性别字段设置下拉框 else if (StringUtils.endsWithIgnoreCase(columnName, "type") - || StringUtils.endsWithIgnoreCase(columnName, "sex")) - { + || StringUtils.endsWithIgnoreCase(columnName, "sex")) { column.setHtmlType(GenConstants.HTML_SELECT); } // 图片字段设置图片上传控件 - else if (StringUtils.endsWithIgnoreCase(columnName, "image")) - { + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) { column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); } // 文件字段设置文件上传控件 - else if (StringUtils.endsWithIgnoreCase(columnName, "file")) - { + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) { column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); } // 内容字段设置富文本控件 - else if (StringUtils.endsWithIgnoreCase(columnName, "content")) - { + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { column.setHtmlType(GenConstants.HTML_EDITOR); } } /** * 校验数组是否包含指定值 - * - * @param arr 数组 + * + * @param arr 数组 * @param targetValue 值 * @return 是否包含 */ - public static boolean arraysContains(String[] arr, String targetValue) - { + public static boolean arraysContains(String[] arr, String targetValue) { return Arrays.asList(arr).contains(targetValue); } /** * 获取模块名 - * + * * @param packageName 包名 * @return 模块名 */ - public static String getModuleName(String packageName) - { + public static String getModuleName(String packageName) { int lastIndex = packageName.lastIndexOf("."); int nameLength = packageName.length(); return StringUtils.substring(packageName, lastIndex + 1, nameLength); @@ -157,12 +136,11 @@ public class GenUtils /** * 获取业务名 - * + * * @param tableName 表名 * @return 业务名 */ - public static String getBusinessName(String tableName) - { + public static String getBusinessName(String tableName) { int lastIndex = tableName.lastIndexOf("_"); int nameLength = tableName.length(); return StringUtils.substring(tableName, lastIndex + 1, nameLength); @@ -170,16 +148,14 @@ public class GenUtils /** * 表名转换成Java类名 - * + * * @param tableName 表名称 * @return 类名 */ - public static String convertClassName(String tableName) - { + public static String convertClassName(String tableName) { boolean autoRemovePre = GenConfig.getAutoRemovePre(); String tablePrefix = GenConfig.getTablePrefix(); - if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) - { + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { String[] searchList = StringUtils.split(tablePrefix, ","); tableName = replaceFirst(tableName, searchList); } @@ -188,18 +164,15 @@ public class GenUtils /** * 批量替换前缀 - * + * * @param replacementm 替换值 - * @param searchList 替换列表 + * @param searchList 替换列表 * @return */ - public static String replaceFirst(String replacementm, String[] searchList) - { + public static String replaceFirst(String replacementm, String[] searchList) { String text = replacementm; - for (String searchString : searchList) - { - if (replacementm.startsWith(searchString)) - { + for (String searchString : searchList) { + if (replacementm.startsWith(searchString)) { text = replacementm.replaceFirst(searchString, ""); break; } @@ -209,48 +182,39 @@ public class GenUtils /** * 关键字替换 - * + * * @param text 需要被替换的名字 * @return 替换后的名字 */ - public static String replaceText(String text) - { + public static String replaceText(String text) { return RegExUtils.replaceAll(text, "(?:表|若依)", ""); } /** * 获取数据库类型字段 - * + * * @param columnType 列类型 * @return 截取后的列类型 */ - public static String getDbType(String columnType) - { - if (StringUtils.indexOf(columnType, "(") > 0) - { + public static String getDbType(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { return StringUtils.substringBefore(columnType, "("); - } - else - { + } else { return columnType; } } /** * 获取字段长度 - * + * * @param columnType 列类型 * @return 截取后的列类型 */ - public static Integer getColumnLength(String columnType) - { - if (StringUtils.indexOf(columnType, "(") > 0) - { + public static Integer getColumnLength(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { String length = StringUtils.substringBetween(columnType, "(", ")"); return Integer.valueOf(length); - } - else - { + } else { return 0; } } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java index 9f69403..93d8b46 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java @@ -1,33 +1,29 @@ package com.ruoyi.generator.util; -import java.util.Properties; -import org.apache.velocity.app.Velocity; import com.ruoyi.common.constant.Constants; +import org.apache.velocity.app.Velocity; + +import java.util.Properties; /** * VelocityEngine工厂 - * + * * @author ruoyi */ -public class VelocityInitializer -{ +public class VelocityInitializer { /** * 初始化vm方法 */ - public static void initVelocity() - { + public static void initVelocity() { Properties p = new Properties(); - try - { + try { // 加载classpath目录下的vm文件 p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); // 定义字符集 p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); // 初始化Velocity引擎,指定配置Properties Velocity.init(p); - } - catch (Exception e) - { + } catch (Exception e) { throw new RuntimeException(e); } } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index 1a14681..bb379cc 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -1,10 +1,5 @@ package com.ruoyi.generator.util; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.apache.velocity.VelocityContext; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.constant.GenConstants; @@ -12,21 +7,32 @@ import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; +import org.apache.velocity.VelocityContext; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; /** * 模板处理工具类 - * + * * @author ruoyi */ -public class VelocityUtils -{ - /** 项目空间路径 */ +public class VelocityUtils { + /** + * 项目空间路径 + */ private static final String PROJECT_PATH = "main/java"; - /** mybatis空间路径 */ + /** + * mybatis空间路径 + */ private static final String MYBATIS_PATH = "main/resources/mapper"; - /** 默认上级菜单,系统工具 */ + /** + * 默认上级菜单,系统工具 + */ private static final String DEFAULT_PARENT_MENU_ID = "3"; /** @@ -34,8 +40,7 @@ public class VelocityUtils * * @return 模板列表 */ - public static VelocityContext prepareContext(GenTable genTable) - { + public static VelocityContext prepareContext(GenTable genTable) { String moduleName = genTable.getModuleName(); String businessName = genTable.getBusinessName(); String packageName = genTable.getPackageName(); @@ -62,27 +67,23 @@ public class VelocityUtils velocityContext.put("table", genTable); velocityContext.put("dicts", getDicts(genTable)); setMenuVelocityContext(velocityContext, genTable); - if (GenConstants.TPL_TREE.equals(tplCategory)) - { + if (GenConstants.TPL_TREE.equals(tplCategory)) { setTreeVelocityContext(velocityContext, genTable); } - if (GenConstants.TPL_SUB.equals(tplCategory)) - { + if (GenConstants.TPL_SUB.equals(tplCategory)) { setSubVelocityContext(velocityContext, genTable); } return velocityContext; } - public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) - { + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { String options = genTable.getOptions(); JSONObject paramsObj = JSON.parseObject(options); String parentMenuId = getParentMenuId(paramsObj); context.put("parentMenuId", parentMenuId); } - public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) - { + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { String options = genTable.getOptions(); JSONObject paramsObj = JSON.parseObject(options); String treeCode = getTreecode(paramsObj); @@ -93,18 +94,15 @@ public class VelocityUtils context.put("treeParentCode", treeParentCode); context.put("treeName", treeName); context.put("expandColumn", getExpandColumn(genTable)); - if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) - { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); } - if (paramsObj.containsKey(GenConstants.TREE_NAME)) - { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); } } - public static void setSubVelocityContext(VelocityContext context, GenTable genTable) - { + public static void setSubVelocityContext(VelocityContext context, GenTable genTable) { GenTable subTable = genTable.getSubTable(); String subTableName = genTable.getSubTableName(); String subTableFkName = genTable.getSubTableFkName(); @@ -123,15 +121,14 @@ public class VelocityUtils /** * 获取模板信息 + * * @param tplCategory 生成的模板 - * @param tplWebType 前端类型 + * @param tplWebType 前端类型 * @return 模板列表 */ - public static List getTemplateList(String tplCategory, String tplWebType) - { + public static List getTemplateList(String tplCategory, String tplWebType) { String useWebType = "vm/vue"; - if ("element-plus".equals(tplWebType)) - { + if ("element-plus".equals(tplWebType)) { useWebType = "vm/vue/v3"; } List templates = new ArrayList(); @@ -143,16 +140,11 @@ public class VelocityUtils templates.add("vm/xml/mapper.xml.vm"); templates.add("vm/sql/sql.vm"); templates.add("vm/js/api.js.vm"); - if (GenConstants.TPL_CRUD.equals(tplCategory)) - { + if (GenConstants.TPL_CRUD.equals(tplCategory)) { templates.add(useWebType + "/index.vue.vm"); - } - else if (GenConstants.TPL_TREE.equals(tplCategory)) - { + } else if (GenConstants.TPL_TREE.equals(tplCategory)) { templates.add(useWebType + "/index-tree.vue.vm"); - } - else if (GenConstants.TPL_SUB.equals(tplCategory)) - { + } else if (GenConstants.TPL_SUB.equals(tplCategory)) { templates.add(useWebType + "/index.vue.vm"); templates.add("vm/java/sub-domain.java.vm"); } @@ -162,8 +154,7 @@ public class VelocityUtils /** * 获取文件名 */ - public static String getFileName(String template, GenTable genTable) - { + public static String getFileName(String template, GenTable genTable) { // 文件名称 String fileName = ""; // 包路径 @@ -179,48 +170,28 @@ public class VelocityUtils String mybatisPath = MYBATIS_PATH + "/" + moduleName; String vuePath = "vue"; - if (template.contains("domain.java.vm")) - { + if (template.contains("domain.java.vm")) { fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); } - if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) - { + if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) { fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); - } - else if (template.contains("mapper.java.vm")) - { + } else if (template.contains("mapper.java.vm")) { fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); - } - else if (template.contains("service.java.vm")) - { + } else if (template.contains("service.java.vm")) { fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); - } - else if (template.contains("serviceImpl.java.vm")) - { + } else if (template.contains("serviceImpl.java.vm")) { fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); - } - else if (template.contains("controller.java.vm")) - { + } else if (template.contains("controller.java.vm")) { fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); - } - else if (template.contains("mapper.xml.vm")) - { + } else if (template.contains("mapper.xml.vm")) { fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); - } - else if (template.contains("sql.vm")) - { + } else if (template.contains("sql.vm")) { fileName = businessName + "Menu.sql"; - } - else if (template.contains("api.js.vm")) - { + } else if (template.contains("api.js.vm")) { fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); - } - else if (template.contains("index.vue.vm")) - { + } else if (template.contains("index.vue.vm")) { fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); - } - else if (template.contains("index-tree.vue.vm")) - { + } else if (template.contains("index-tree.vue.vm")) { fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); } return fileName; @@ -232,36 +203,29 @@ public class VelocityUtils * @param packageName 包名称 * @return 包前缀名称 */ - public static String getPackagePrefix(String packageName) - { + public static String getPackagePrefix(String packageName) { int lastIndex = packageName.lastIndexOf("."); return StringUtils.substring(packageName, 0, lastIndex); } /** * 根据列类型获取导入包 - * + * * @param genTable 业务表对象 * @return 返回需要导入的包列表 */ - public static HashSet getImportList(GenTable genTable) - { + public static HashSet getImportList(GenTable genTable) { List columns = genTable.getColumns(); GenTable subGenTable = genTable.getSubTable(); HashSet importList = new HashSet(); - if (StringUtils.isNotNull(subGenTable)) - { + if (StringUtils.isNotNull(subGenTable)) { importList.add("java.util.List"); } - for (GenTableColumn column : columns) - { - if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) - { + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { importList.add("java.util.Date"); importList.add("com.fasterxml.jackson.annotation.JsonFormat"); - } - else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) - { + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { importList.add("java.math.BigDecimal"); } } @@ -270,17 +234,15 @@ public class VelocityUtils /** * 根据列类型获取字典组 - * + * * @param genTable 业务表对象 * @return 返回字典组 */ - public static String getDicts(GenTable genTable) - { + public static String getDicts(GenTable genTable) { List columns = genTable.getColumns(); Set dicts = new HashSet(); addDicts(dicts, columns); - if (StringUtils.isNotNull(genTable.getSubTable())) - { + if (StringUtils.isNotNull(genTable.getSubTable())) { List subColumns = genTable.getSubTable().getColumns(); addDicts(dicts, subColumns); } @@ -289,18 +251,15 @@ public class VelocityUtils /** * 添加字典列表 - * - * @param dicts 字典列表 + * + * @param dicts 字典列表 * @param columns 列集合 */ - public static void addDicts(Set dicts, List columns) - { - for (GenTableColumn column : columns) - { + public static void addDicts(Set dicts, List columns) { + for (GenTableColumn column : columns) { if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( column.getHtmlType(), - new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) - { + new String[]{GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX})) { dicts.add("'" + column.getDictType() + "'"); } } @@ -309,12 +268,11 @@ public class VelocityUtils /** * 获取权限前缀 * - * @param moduleName 模块名称 + * @param moduleName 模块名称 * @param businessName 业务名称 * @return 返回权限前缀 */ - public static String getPermissionPrefix(String moduleName, String businessName) - { + public static String getPermissionPrefix(String moduleName, String businessName) { return StringUtils.format("{}:{}", moduleName, businessName); } @@ -324,11 +282,9 @@ public class VelocityUtils * @param paramsObj 生成其他选项 * @return 上级菜单ID字段 */ - public static String getParentMenuId(JSONObject paramsObj) - { + public static String getParentMenuId(JSONObject paramsObj) { if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) - && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) - { + && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) { return paramsObj.getString(GenConstants.PARENT_MENU_ID); } return DEFAULT_PARENT_MENU_ID; @@ -340,10 +296,8 @@ public class VelocityUtils * @param paramsObj 生成其他选项 * @return 树编码 */ - public static String getTreecode(JSONObject paramsObj) - { - if (paramsObj.containsKey(GenConstants.TREE_CODE)) - { + public static String getTreecode(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_CODE)) { return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); } return StringUtils.EMPTY; @@ -355,10 +309,8 @@ public class VelocityUtils * @param paramsObj 生成其他选项 * @return 树父编码 */ - public static String getTreeParentCode(JSONObject paramsObj) - { - if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) - { + public static String getTreeParentCode(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); } return StringUtils.EMPTY; @@ -370,10 +322,8 @@ public class VelocityUtils * @param paramsObj 生成其他选项 * @return 树名称 */ - public static String getTreeName(JSONObject paramsObj) - { - if (paramsObj.containsKey(GenConstants.TREE_NAME)) - { + public static String getTreeName(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); } return StringUtils.EMPTY; @@ -385,20 +335,16 @@ public class VelocityUtils * @param genTable 业务表对象 * @return 展开按钮列序号 */ - public static int getExpandColumn(GenTable genTable) - { + public static int getExpandColumn(GenTable genTable) { String options = genTable.getOptions(); JSONObject paramsObj = JSON.parseObject(options); String treeName = paramsObj.getString(GenConstants.TREE_NAME); int num = 0; - for (GenTableColumn column : genTable.getColumns()) - { - if (column.isList()) - { + for (GenTableColumn column : genTable.getColumns()) { + if (column.isList()) { num++; String columnName = column.getColumnName(); - if (columnName.equals(treeName)) - { + if (columnName.equals(treeName)) { break; } } diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml index 52857e8..0daba12 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -1,36 +1,38 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, + is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, + create_by, create_time, update_by, update_time from gen_table_column + select column_name, (case when (is_nullable = 'no' column_key != 'PRI') then '1' else '0' end) + as is_required, (case when column_key = 'PRI' then '1' else '0' end) as is_pk, ordinal_position as sort, + column_comment, (case when extra = 'auto_increment' then '1' else '0' end) as is_increment, column_type + from information_schema.columns where table_schema = (select database()) and table_name = (#{tableName}) + order by ordinal_position + insert into gen_table_column ( - table_id, - column_name, - column_comment, - column_type, - java_type, - java_field, - is_pk, - is_increment, - is_required, - is_insert, - is_edit, - is_list, - is_query, - query_type, - html_type, - dict_type, - sort, - create_by, - create_time - )values( - #{tableId}, - #{columnName}, - #{columnComment}, - #{columnType}, - #{javaType}, - #{javaField}, - #{isPk}, - #{isIncrement}, - #{isRequired}, - #{isInsert}, - #{isEdit}, - #{isList}, - #{isQuery}, - #{queryType}, - #{htmlType}, - #{dictType}, - #{sort}, - #{createBy}, - sysdate() - ) + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml index 253212e..6d515a8 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -1,180 +1,191 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, tpl_web_type, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, + tpl_web_type, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, + options, create_by, create_time, update_by, update_time, remark from gen_table - + + + + + AND lower(table_name) like lower(concat('%', #{tableName}, '%')) + + + AND lower(table_comment) like lower(concat('%', #{tableComment}, '%')) + + + AND date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') + + + AND date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') + + + - + select table_name, table_comment, create_time, update_time from information_schema.tables + where table_schema = (select database()) + AND table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'gen_%' + AND table_name NOT IN (select table_name from gen_table) + + AND lower(table_name) like lower(concat('%', #{tableName}, '%')) + + + AND lower(table_comment) like lower(concat('%', #{tableComment}, '%')) + + + AND date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') + + + AND date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') + order by create_time desc - - - - - - - - - - - - - + + + + + + + + + + + + + insert into gen_table ( - table_name, - table_comment, - class_name, - tpl_category, - tpl_web_type, - package_name, - module_name, - business_name, - function_name, - function_author, - gen_type, - gen_path, - remark, - create_by, - create_time - )values( - #{tableName}, - #{tableComment}, - #{className}, - #{tplCategory}, - #{tplWebType}, - #{packageName}, - #{moduleName}, - #{businessName}, - #{functionName}, - #{functionAuthor}, - #{genType}, - #{genPath}, - #{remark}, - #{createBy}, - sysdate() - ) + table_name, + table_comment, + class_name, + tpl_category, + tpl_web_type, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{tplWebType}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) - + ${sql} - + update gen_table @@ -199,9 +210,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where table_id = #{tableId} - + - delete from gen_table where table_id in + delete from gen_table where table_id in #{tableId} diff --git a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm index 55a3f2c..feacc74 100644 --- a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -2,6 +2,7 @@ package ${packageName}.controller; import java.util.List; import javax.servlet.http.HttpServletResponse; + import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -26,36 +27,33 @@ import com.ruoyi.common.core.page.TableDataInfo; /** * ${functionName}Controller - * + * * @author ${author} * @date ${datetime} */ @RestController @RequestMapping("/${moduleName}/${businessName}") -public class ${ClassName}Controller extends BaseController -{ +public class ${ClassName}Controller extends BaseController { @Autowired private I${ClassName}Service ${className}Service; - /** - * 查询${functionName}列表 - */ - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") - @GetMapping("/list") -#if($table.crud || $table.sub) - public TableDataInfo list(${ClassName} ${className}) - { +/** + * 查询${functionName}列表 + */ +@PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") +@GetMapping("/list") + #if($table.crud || $table.sub) + public TableDataInfo list(${ClassName} ${className}) { startPage(); List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); return getDataTable(list); } -#elseif($table.tree) - public AjaxResult list(${ClassName} ${className}) - { - List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); - return success(list); - } -#end + #elseif($table.tree) + public AjaxResult list(${ClassName} ${className}) { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return success(list); + } + #end /** * 导出${functionName}列表 @@ -63,10 +61,9 @@ public class ${ClassName}Controller extends BaseController @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") @Log(title = "${functionName}", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(HttpServletResponse response, ${ClassName} ${className}) - { + public void export(HttpServletResponse response, ${ClassName} ${className}) { List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); - ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}. class); util.exportExcel(response, list, "${functionName}数据"); } @@ -75,8 +72,7 @@ public class ${ClassName}Controller extends BaseController */ @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") @GetMapping(value = "/{${pkColumn.javaField}}") - public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) - { + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) { return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); } @@ -86,8 +82,7 @@ public class ${ClassName}Controller extends BaseController @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") @Log(title = "${functionName}", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody ${ClassName} ${className}) - { + public AjaxResult add(@RequestBody ${ClassName} ${className}) { return toAjax(${className}Service.insert${ClassName}(${className})); } @@ -97,8 +92,7 @@ public class ${ClassName}Controller extends BaseController @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") @Log(title = "${functionName}", businessType = BusinessType.UPDATE) @PostMapping("/edit") - public AjaxResult edit(@RequestBody ${ClassName} ${className}) - { + public AjaxResult edit(@RequestBody ${ClassName} ${className}) { return toAjax(${className}Service.update${ClassName}(${className})); } @@ -107,9 +101,8 @@ public class ${ClassName}Controller extends BaseController */ @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") @Log(title = "${functionName}", businessType = BusinessType.DELETE) - @PostMapping("/{${pkColumn.javaField}s}") - public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) - { + @PostMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) { return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); } } diff --git a/ruoyi-generator/src/main/resources/vm/java/domain.java.vm b/ruoyi-generator/src/main/resources/vm/java/domain.java.vm index bd51c17..34c18cf 100644 --- a/ruoyi-generator/src/main/resources/vm/java/domain.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/domain.java.vm @@ -14,92 +14,88 @@ import com.ruoyi.common.core.domain.TreeEntity; /** * ${functionName}对象 ${tableName} - * + * * @author ${author} * @date ${datetime} */ #if($table.crud || $table.sub) -#set($Entity="BaseEntity") + #set($Entity="BaseEntity") #elseif($table.tree) -#set($Entity="TreeEntity") + #set($Entity="TreeEntity") #end public class ${ClassName} extends ${Entity} -{ - private static final long serialVersionUID = 1L; + { +private static final long serialVersionUID = 1L; -#foreach ($column in $columns) -#if(!$table.isSuperColumn($column.javaField)) - /** $column.columnComment */ -#if($column.list) -#set($parentheseIndex=$column.columnComment.indexOf("(")) -#if($parentheseIndex != -1) -#set($comment=$column.columnComment.substring(0, $parentheseIndex)) -#else -#set($comment=$column.columnComment) -#end -#if($parentheseIndex != -1) - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") -#elseif($column.javaType == 'Date') - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") -#else - @Excel(name = "${comment}") -#end -#end - private $column.javaType $column.javaField; + #foreach ($column in $columns) + #if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ + #if($column.list) + #set($parentheseIndex=$column.columnComment.indexOf("(")) + #if($parentheseIndex != -1) + #set($comment=$column.columnComment.substring(0, $parentheseIndex)) + #else + #set($comment=$column.columnComment) + #end + #if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + #elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") + #else + @Excel(name = "${comment}") + #end + #end + private $column.javaType $column.javaField; -#end -#end -#if($table.sub) + #end + #end + #if($table.sub) /** $table.subTable.functionName信息 */ private List<${subClassName}> ${subclassName}List; -#end -#foreach ($column in $columns) -#if(!$table.isSuperColumn($column.javaField)) -#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) -#set($AttrName=$column.javaField) -#else -#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) -#end - public void set${AttrName}($column.javaType $column.javaField) - { - this.$column.javaField = $column.javaField; - } + #end + #foreach ($column in $columns) + #if(!$table.isSuperColumn($column.javaField)) + #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$column.javaField) + #else + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #end + public void set${AttrName}($column.javaType $column.javaField) { + this.$column.javaField = $column.javaField; + } - public $column.javaType get${AttrName}() - { - return $column.javaField; - } -#end -#end + public $column.javaType get${AttrName}() { + return $column.javaField; + } + #end + #end -#if($table.sub) - public List<${subClassName}> get${subClassName}List() - { + #if($table.sub) + public List<${subClassName}> get${subClassName}List() { return ${subclassName}List; } - public void set${subClassName}List(List<${subClassName}> ${subclassName}List) - { + public void set${subClassName}List(List<${subClassName}> ${subclassName}List) { this.${subclassName}List = ${subclassName}List; } -#end - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) -#foreach ($column in $columns) -#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) -#set($AttrName=$column.javaField) -#else -#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) -#end - .append("${column.javaField}", get${AttrName}()) -#end -#if($table.sub) - .append("${subclassName}List", get${subClassName}List()) -#end + #end +@Override +public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + #foreach ($column in $columns) + #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$column.javaField) + #else + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #end + .append("${column.javaField}", get${AttrName}()) + #end + #if($table.sub) + .append("${subclassName}List", get${subClassName}List()) + #end .toString(); - } +} } diff --git a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm index 7e7d7c2..aeb46cd 100644 --- a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm @@ -1,22 +1,22 @@ package ${packageName}.mapper; import java.util.List; + import ${packageName}.domain.${ClassName}; #if($table.sub) -import ${packageName}.domain.${subClassName}; +import ${packageName}.domain .${subClassName}; #end /** * ${functionName}Mapper接口 - * + * * @author ${author} * @date ${datetime} */ -public interface ${ClassName}Mapper -{ +public interface ${ClassName}Mapper { /** * 查询${functionName} - * + * * @param ${pkColumn.javaField} ${functionName}主键 * @return ${functionName} */ @@ -24,7 +24,7 @@ public interface ${ClassName}Mapper /** * 查询${functionName}列表 - * + * * @param ${className} ${functionName} * @return ${functionName}集合 */ @@ -32,7 +32,7 @@ public interface ${ClassName}Mapper /** * 新增${functionName} - * + * * @param ${className} ${functionName} * @return 结果 */ @@ -40,7 +40,7 @@ public interface ${ClassName}Mapper /** * 修改${functionName} - * + * * @param ${className} ${functionName} * @return 结果 */ @@ -48,7 +48,7 @@ public interface ${ClassName}Mapper /** * 删除${functionName} - * + * * @param ${pkColumn.javaField} ${functionName}主键 * @return 结果 */ @@ -56,36 +56,36 @@ public interface ${ClassName}Mapper /** * 批量删除${functionName} - * + * * @param ${pkColumn.javaField}s 需要删除的数据主键集合 * @return 结果 */ public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); -#if($table.sub) + #if($table.sub) - /** - * 批量删除${subTable.functionName} - * - * @param ${pkColumn.javaField}s 需要删除的数据主键集合 - * @return 结果 - */ - public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); - - /** - * 批量新增${subTable.functionName} - * - * @param ${subclassName}List ${subTable.functionName}列表 - * @return 结果 - */ - public int batch${subClassName}(List<${subClassName}> ${subclassName}List); - + /** + * 批量删除${subTable.functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); - /** - * 通过${functionName}主键删除${subTable.functionName}信息 - * - * @param ${pkColumn.javaField} ${functionName}ID - * @return 结果 - */ - public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); -#end + /** + * 批量新增${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}列表 + * @return 结果 + */ + public int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 通过${functionName}主键删除${subTable.functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); + #end } diff --git a/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-generator/src/main/resources/vm/java/service.java.vm index 264882b..4649dd5 100644 --- a/ruoyi-generator/src/main/resources/vm/java/service.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/service.java.vm @@ -1,19 +1,19 @@ package ${packageName}.service; import java.util.List; -import ${packageName}.domain.${ClassName}; + +import ${packageName}.domain .${ClassName}; /** * ${functionName}Service接口 - * + * * @author ${author} * @date ${datetime} */ -public interface I${ClassName}Service -{ +public interface I${ClassName}Service { /** * 查询${functionName} - * + * * @param ${pkColumn.javaField} ${functionName}主键 * @return ${functionName} */ @@ -21,7 +21,7 @@ public interface I${ClassName}Service /** * 查询${functionName}列表 - * + * * @param ${className} ${functionName} * @return ${functionName}集合 */ @@ -29,7 +29,7 @@ public interface I${ClassName}Service /** * 新增${functionName} - * + * * @param ${className} ${functionName} * @return 结果 */ @@ -37,7 +37,7 @@ public interface I${ClassName}Service /** * 修改${functionName} - * + * * @param ${className} ${functionName} * @return 结果 */ @@ -45,7 +45,7 @@ public interface I${ClassName}Service /** * 批量删除${functionName} - * + * * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 * @return 结果 */ @@ -53,7 +53,7 @@ public interface I${ClassName}Service /** * 删除${functionName}信息 - * + * * @param ${pkColumn.javaField} ${functionName}主键 * @return 结果 */ diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm index 14746e1..6b25cbe 100644 --- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -1,169 +1,161 @@ package ${packageName}.service.impl; import java.util.List; -#foreach ($column in $columns) -#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') -import com.ruoyi.common.utils.DateUtils; -#break -#end -#end + #foreach ($column in $columns) + #if($column.javaField == 'createTime' || $column.javaField == 'updateTime') + import com.ruoyi.common.utils.DateUtils; + #break + #end + #end import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -#if($table.sub) -import java.util.ArrayList; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.transaction.annotation.Transactional; -import ${packageName}.domain.${subClassName}; -#end + #if($table.sub) + import java.util.ArrayList; + + import com.ruoyi.common.utils.StringUtils; + import org.springframework.transaction.annotation.Transactional; + import ${packageName}.domain.${subClassName}; + #end import ${packageName}.mapper.${ClassName}Mapper; import ${packageName}.domain.${ClassName}; import ${packageName}.service.I${ClassName}Service; /** * ${functionName}Service业务层处理 - * + * * @author ${author} * @date ${datetime} */ @Service -public class ${ClassName}ServiceImpl implements I${ClassName}Service -{ +public class ${ClassName}ServiceImpl implements I${ClassName}Service { @Autowired private ${ClassName}Mapper ${className}Mapper; /** * 查询${functionName} - * + * * @param ${pkColumn.javaField} ${functionName}主键 * @return ${functionName} */ @Override - public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) - { + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) { return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); } /** * 查询${functionName}列表 - * + * * @param ${className} ${functionName} * @return ${functionName} */ @Override - public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) - { + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) { return ${className}Mapper.select${ClassName}List(${className}); } /** * 新增${functionName} - * + * * @param ${className} ${functionName} * @return 结果 */ -#if($table.sub) - @Transactional -#end + #if($table.sub) + @Transactional + #end @Override - public int insert${ClassName}(${ClassName} ${className}) - { -#foreach ($column in $columns) -#if($column.javaField == 'createTime') - ${className}.setCreateTime(DateUtils.getNowDate()); -#end -#end -#if($table.sub) - int rows = ${className}Mapper.insert${ClassName}(${className}); - insert${subClassName}(${className}); - return rows; -#else - return ${className}Mapper.insert${ClassName}(${className}); -#end + public int insert${ClassName}(${ClassName} ${className}) { + #foreach ($column in $columns) + #if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); + #end + #end + #if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; + #else + return ${className}Mapper.insert${ClassName}(${className}); + #end } /** * 修改${functionName} - * + * * @param ${className} ${functionName} * @return 结果 */ -#if($table.sub) - @Transactional -#end + #if($table.sub) + @Transactional + #end @Override - public int update${ClassName}(${ClassName} ${className}) - { -#foreach ($column in $columns) -#if($column.javaField == 'updateTime') - ${className}.setUpdateTime(DateUtils.getNowDate()); -#end -#end -#if($table.sub) - ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); - insert${subClassName}(${className}); -#end + public int update${ClassName}(${ClassName} ${className}) { + #foreach ($column in $columns) + #if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); + #end + #end + #if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()) + ; + insert${subClassName}(${className}); + #end return ${className}Mapper.update${ClassName}(${className}); } /** * 批量删除${functionName} - * + * * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 * @return 结果 */ -#if($table.sub) - @Transactional -#end + #if($table.sub) + @Transactional + #end @Override - public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) - { -#if($table.sub) - ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); -#end + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) { + #if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); + #end return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); } /** * 删除${functionName}信息 - * + * * @param ${pkColumn.javaField} ${functionName}主键 * @return 结果 */ -#if($table.sub) - @Transactional -#end + #if($table.sub) + @Transactional + #end @Override - public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) - { -#if($table.sub) - ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); -#end + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) { + #if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); + #end return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); } -#if($table.sub) + #if($table.sub) - /** - * 新增${subTable.functionName}信息 - * - * @param ${className} ${functionName}对象 - */ - public void insert${subClassName}(${ClassName} ${className}) - { - List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); - ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); - if (StringUtils.isNotNull(${subclassName}List)) - { - List<${subClassName}> list = new ArrayList<${subClassName}>(); - for (${subClassName} ${subclassName} : ${subclassName}List) - { - ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); - list.add(${subclassName}); - } - if (list.size() > 0) - { - ${className}Mapper.batch${subClassName}(list); + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public void insert${subClassName}(${ClassName} ${className}) { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} :${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) { + ${className}Mapper.batch${subClassName}(list); + } } } - } -#end + #end } diff --git a/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm b/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm index a3f53eb..ed5c774 100644 --- a/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm @@ -1,8 +1,8 @@ package ${packageName}.domain; -#foreach ($import in $subImportList) -import ${import}; -#end + #foreach ($import in $subImportList) + import ${import}; + #end import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -10,67 +10,68 @@ import com.ruoyi.common.core.domain.BaseEntity; /** * ${subTable.functionName}对象 ${subTableName} - * + * * @author ${author} * @date ${datetime} */ -public class ${subClassName} extends BaseEntity -{ +public class ${subClassName} extends + +BaseEntity { private static final long serialVersionUID = 1L; -#foreach ($column in $subTable.columns) -#if(!$table.isSuperColumn($column.javaField)) - /** $column.columnComment */ -#if($column.list) -#set($parentheseIndex=$column.columnComment.indexOf("(")) -#if($parentheseIndex != -1) -#set($comment=$column.columnComment.substring(0, $parentheseIndex)) -#else -#set($comment=$column.columnComment) -#end -#if($parentheseIndex != -1) - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") -#elseif($column.javaType == 'Date') - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") -#else - @Excel(name = "${comment}") -#end -#end - private $column.javaType $column.javaField; + #foreach ($column in $subTable.columns) + #if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ + #if($column.list) + #set($parentheseIndex=$column.columnComment.indexOf("(")) + #if($parentheseIndex != -1) + #set($comment=$column.columnComment.substring(0, $parentheseIndex)) + #else + #set($comment=$column.columnComment) + #end + #if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + #elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") + #else + @Excel(name = "${comment}") + #end + #end + private $column.javaType $column.javaField; -#end -#end -#foreach ($column in $subTable.columns) -#if(!$table.isSuperColumn($column.javaField)) -#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) -#set($AttrName=$column.javaField) -#else -#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) -#end - public void set${AttrName}($column.javaType $column.javaField) - { - this.$column.javaField = $column.javaField; - } + #end + #end + #foreach ($column in $subTable.columns) + #if(!$table.isSuperColumn($column.javaField)) + #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$column.javaField) + #else + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } - public $column.javaType get${AttrName}() - { - return $column.javaField; - } -#end -#end + public $column.javaType get${AttrName}() + { + return $column.javaField; + } + #end + #end @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) -#foreach ($column in $subTable.columns) -#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) -#set($AttrName=$column.javaField) -#else -#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) -#end - .append("${column.javaField}", get${AttrName}()) -#end - .toString(); + public String toString () { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + #foreach ($column in $subTable.columns) + #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$column.javaField) + #else + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #end + .append("${column.javaField}", get${AttrName}()) + #end + .toString(); } } diff --git a/ruoyi-generator/src/main/resources/vm/js/api.js.vm b/ruoyi-generator/src/main/resources/vm/js/api.js.vm index 9295524..346c95e 100644 --- a/ruoyi-generator/src/main/resources/vm/js/api.js.vm +++ b/ruoyi-generator/src/main/resources/vm/js/api.js.vm @@ -2,43 +2,43 @@ import request from '@/utils/request' // 查询${functionName}列表 export function list${BusinessName}(query) { - return request({ - url: '/${moduleName}/${businessName}/list', - method: 'get', - params: query - }) + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) } // 查询${functionName}详细 export function get${BusinessName}(${pkColumn.javaField}) { - return request({ - url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, - method: 'get' - }) + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) } // 新增${functionName} export function add${BusinessName}(data) { - return request({ - url: '/${moduleName}/${businessName}', - method: 'post', - data: data - }) + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) } // 修改${functionName} export function update${BusinessName}(data) { - return request({ - url: '/${moduleName}/${businessName}', - method: 'put', - data: data - }) + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) } // 删除${functionName} export function del${BusinessName}(${pkColumn.javaField}) { - return request({ - url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, - method: 'delete' - }) + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) } diff --git a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm index 4819c2a..6baa7f8 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm +++ b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -1,68 +1,68 @@ diff --git a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm index 6296014..8f40940 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm +++ b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm @@ -1,66 +1,66 @@ diff --git a/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm index c54d62b..b25bb9b 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm +++ b/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm @@ -1,65 +1,65 @@