From 28088d43a8a6b2f34513ec6055c4e1b687cd96cb Mon Sep 17 00:00:00 2001
From: wkc <978997012@qq.com>
Date: Tue, 14 Apr 2026 15:13:51 +0800
Subject: [PATCH] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E9=A1=B9=E7=9B=AE=E5=88=B0?=
=?UTF-8?q?=20RuoYi-Vue=20springboot2=20=E5=9F=BA=E7=BA=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 91 +-
.../page-2026-04-11T07-16-36-054Z.yml | 18 +
.../page-2026-04-11T07-17-14-786Z.yml | 20 +
.../page-2026-04-11T07-18-09-957Z.yml | 1 +
.../page-2026-04-11T07-18-43-284Z.yml | 191 +
.../page-2026-04-11T07-25-40-868Z.yml | 18 +
.../page-2026-04-11T07-25-55-827Z.yml | 1 +
.../page-2026-04-11T07-26-20-300Z.yml | 1 +
.../page-2026-04-11T07-26-34-973Z.yml | 1 +
.../page-2026-04-14T05-22-21-308Z.yml | 28 +
.../page-2026-04-14T05-39-30-657Z.yml | 18 +
README.md | 33 +-
bin/.DS_Store | Bin 8196 -> 0 bytes
bin/clean.bat | 22 +-
bin/package.bat | 22 +-
bin/prod/restart_java_test.sh | 0
bin/restart_java_backend_test.sh | 0
bin/run.bat | 26 +-
...ocal-tomcat-remote-tongweb-backend-plan.md | 43 +
...4-13-local-tomcat-remote-tongweb-design.md | 147 +
...-13-tongweb-replace-tomcat-backend-plan.md | 39 +
...4-14-ruoyi-vue-springboot2-backend-plan.md | 41 +
...-14-ruoyi-vue-springboot2-frontend-plan.md | 37 +
...-ruoyi-vue-springboot2-migration-design.md | 120 +
...-2026-04-13-local-tomcat-remote-tongweb.md | 34 +
...eport-2026-04-13-tongweb-replace-tomcat.md | 25 +
...6-04-14-ruoyi-vue-springboot2-migration.md | 105 +
pom.xml | 513 +-
ruoyi-admin/.DS_Store | Bin 8196 -> 0 bytes
ruoyi-admin/pom.xml | 175 +-
.../main/java/com/ruoyi/RuoYiApplication.java | 60 +-
.../com/ruoyi/RuoYiServletInitializer.java | 36 +-
.../controller/common/CaptchaController.java | 188 +-
.../controller/common/CommonController.java | 324 +-
.../controller/monitor/CacheController.java | 66 +-
.../controller/monitor/ServerController.java | 54 +-
.../monitor/SysLogininforController.java | 164 +-
.../monitor/SysOperlogController.java | 138 +-
.../monitor/SysUserOnlineController.java | 166 +-
.../system/SysConfigController.java | 266 +-
.../controller/system/SysDeptController.java | 279 +-
.../system/SysDictDataController.java | 242 +-
.../system/SysDictTypeController.java | 262 +-
.../controller/system/SysIndexController.java | 93 +-
.../controller/system/SysLoginController.java | 283 +-
.../controller/system/SysMenuController.java | 313 +-
.../system/SysNoticeController.java | 229 +-
.../controller/system/SysPostController.java | 258 +-
.../system/SysProfileController.java | 302 +-
.../system/SysRegisterController.java | 81 +-
.../controller/system/SysRoleController.java | 524 +-
.../controller/system/SysUserController.java | 518 +-
.../web/controller/tool/TestController.java | 358 +-
.../ruoyi/web/core/config/SwaggerConfig.java | 189 +-
.../src/main/resources/application-druid.yml | 61 +
.../src/main/resources/application.yml | 33 +-
ruoyi-admin/src/main/resources/banner.txt | 46 +-
.../main/resources/i18n/messages.properties | 76 +-
ruoyi-admin/src/main/resources/logback.xml | 184 +-
.../main/resources/mybatis/mybatis-config.xml | 40 +-
.../static/swagger-ui/swagger-initializer.js | 19 -
.../monitor/CacheControllerTest.java | 44 -
...ysLoginControllerPasswordTransferTest.java | 40 -
...ProfileControllerPasswordTransferTest.java | 72 -
...egisterControllerPasswordTransferTest.java | 50 -
...SysUserControllerPasswordTransferTest.java | 113 -
ruoyi-common/pom.xml | 248 +-
.../ruoyi/common/annotation/Anonymous.java | 38 +-
.../ruoyi/common/annotation/DataScope.java | 76 +-
.../ruoyi/common/annotation/DataSource.java | 56 +-
.../com/ruoyi/common/annotation/Excel.java | 393 +-
.../com/ruoyi/common/annotation/Excels.java | 36 +-
.../java/com/ruoyi/common/annotation/Log.java | 102 +-
.../ruoyi/common/annotation/RateLimiter.java | 80 +-
.../ruoyi/common/annotation/RepeatSubmit.java | 62 +-
.../com/ruoyi/common/config/RuoYiConfig.java | 244 +-
.../ruoyi/common/constant/CacheConstants.java | 88 +-
.../com/ruoyi/common/constant/Constants.java | 377 +-
.../ruoyi/common/constant/GenConstants.java | 237 +-
.../com/ruoyi/common/constant/HttpStatus.java | 188 +-
.../common/constant/ScheduleConstants.java | 100 +-
.../ruoyi/common/constant/UserConstants.java | 162 +-
.../common/core/cache/InMemoryCacheEntry.java | 23 +-
.../common/core/cache/InMemoryCacheStats.java | 62 +-
.../common/core/cache/InMemoryCacheStore.java | 95 +-
.../core/controller/BaseController.java | 404 +-
.../ruoyi/common/core/domain/AjaxResult.java | 432 +-
.../ruoyi/common/core/domain/BaseEntity.java | 236 +-
.../ruoyi/common/core/domain/TreeEntity.java | 158 +-
.../ruoyi/common/core/domain/TreeSelect.java | 186 +-
.../common/core/domain/entity/SysDept.java | 406 +-
.../core/domain/entity/SysDictData.java | 352 +-
.../core/domain/entity/SysDictType.java | 192 +-
.../common/core/domain/entity/SysMenu.java | 548 +-
.../common/core/domain/entity/SysRole.java | 482 +-
.../common/core/domain/entity/SysUser.java | 674 +-
.../common/core/domain/model/LoginBody.java | 138 +-
.../common/core/domain/model/LoginUser.java | 532 +-
.../core/domain/model/RegisterBody.java | 22 +-
.../ruoyi/common/core/page/TableDataInfo.java | 170 +-
.../ruoyi/common/core/page/TableSupport.java | 112 +-
.../ruoyi/common/core/redis/RedisCache.java | 12 +-
.../ruoyi/common/core/text/CharsetKit.java | 172 +-
.../com/ruoyi/common/core/text/Convert.java | 2036 +-
.../ruoyi/common/core/text/StrFormatter.java | 184 +-
.../ruoyi/common/enums/BusinessStatus.java | 40 +-
.../com/ruoyi/common/enums/BusinessType.java | 118 +-
.../ruoyi/common/enums/DataSourceType.java | 38 +-
.../com/ruoyi/common/enums/HttpMethod.java | 72 +-
.../com/ruoyi/common/enums/LimitType.java | 40 +-
.../com/ruoyi/common/enums/OperatorType.java | 48 +-
.../com/ruoyi/common/enums/UserStatus.java | 60 +-
.../common/exception/DemoModeException.java | 30 +-
.../common/exception/GlobalException.java | 114 +-
.../common/exception/ServiceException.java | 146 +-
.../ruoyi/common/exception/UtilException.java | 52 +-
.../common/exception/base/BaseException.java | 194 +-
.../common/exception/file/FileException.java | 38 +-
.../FileNameLengthLimitExceededException.java | 32 +-
.../file/FileSizeLimitExceededException.java | 32 +-
.../file/InvalidExtensionException.java | 160 +-
.../common/exception/job/TaskException.java | 66 +-
.../exception/user/CaptchaException.java | 32 +-
.../user/CaptchaExpireException.java | 32 +-
.../common/exception/user/UserException.java | 36 +-
.../user/UserPasswordNotMatchException.java | 32 +-
...UserPasswordRetryLimitExceedException.java | 32 +-
.../filter/PropertyPreExcludeFilter.java | 48 +-
.../ruoyi/common/filter/RefererFilter.java | 16 +-
.../ruoyi/common/filter/RepeatableFilter.java | 104 +-
.../filter/RepeatedlyRequestWrapper.java | 152 +-
.../com/ruoyi/common/filter/XssFilter.java | 148 +-
.../filter/XssHttpServletRequestWrapper.java | 220 +-
.../com/ruoyi/common/utils/DateUtils.java | 383 +-
.../com/ruoyi/common/utils/DictUtils.java | 438 +-
.../com/ruoyi/common/utils/ExceptionUtil.java | 78 +-
.../java/com/ruoyi/common/utils/LogUtils.java | 36 +-
.../com/ruoyi/common/utils/MessageUtils.java | 52 +-
.../com/ruoyi/common/utils/SecurityUtils.java | 376 +-
.../com/ruoyi/common/utils/ServletUtils.java | 436 +-
.../com/ruoyi/common/utils/StringUtils.java | 1443 +-
.../java/com/ruoyi/common/utils/Threads.java | 198 +-
.../ruoyi/common/utils/bean/BeanUtils.java | 220 +-
.../common/utils/bean/BeanValidators.java | 48 +-
.../common/utils/file/FileTypeUtils.java | 150 +-
.../common/utils/file/FileUploadUtils.java | 520 +-
.../ruoyi/common/utils/file/FileUtils.java | 606 +-
.../ruoyi/common/utils/file/ImageUtils.java | 196 +-
.../common/utils/file/MimeTypeUtils.java | 118 +-
.../ruoyi/common/utils/html/EscapeUtil.java | 334 +-
.../ruoyi/common/utils/html/HTMLFilter.java | 1138 +-
.../ruoyi/common/utils/http/HttpHelper.java | 110 +-
.../ruoyi/common/utils/http/HttpUtils.java | 664 +-
.../ruoyi/common/utils/ip/AddressUtils.java | 112 +-
.../com/ruoyi/common/utils/ip/IpUtils.java | 762 +-
.../common/utils/poi/ExcelHandlerAdapter.java | 48 +-
.../ruoyi/common/utils/poi/ExcelSheet.java | 85 +
.../com/ruoyi/common/utils/poi/ExcelUtil.java | 4010 +-
.../common/utils/reflect/ReflectUtils.java | 822 +-
.../com/ruoyi/common/utils/sign/Base64.java | 582 +-
.../com/ruoyi/common/utils/sign/Md5Utils.java | 134 +-
.../common/utils/spring/SpringUtils.java | 328 +-
.../com/ruoyi/common/utils/sql/SqlUtil.java | 141 +-
.../com/ruoyi/common/utils/uuid/IdUtils.java | 98 +-
.../java/com/ruoyi/common/utils/uuid/Seq.java | 172 +-
.../com/ruoyi/common/utils/uuid/UUID.java | 968 +-
.../main/java/com/ruoyi/common/xss/Xss.java | 54 +-
.../com/ruoyi/common/xss/XssValidator.java | 76 +-
.../core/cache/InMemoryCacheStoreTest.java | 53 -
.../common/core/redis/RedisCacheTest.java | 52 -
.../com/ruoyi/common/utils/DictUtilsTest.java | 45 -
ruoyi-framework/pom.xml | 134 +-
.../framework/aspectj/DataScopeAspect.java | 344 +-
.../framework/aspectj/DataSourceAspect.java | 144 +-
.../ruoyi/framework/aspectj/LogAspect.java | 528 +-
.../framework/aspectj/RateLimiterAspect.java | 164 +-
.../framework/config/ApplicationConfig.java | 60 +-
.../ruoyi/framework/config/DruidConfig.java | 252 +-
.../config/FastJson2JsonRedisSerializer.java | 52 +
.../ruoyi/framework/config/FilterConfig.java | 160 +-
.../ruoyi/framework/config/MyBatisConfig.java | 132 +
.../framework/config/MybatisPlusConfig.java | 63 -
.../ruoyi/framework/config/RedisConfig.java | 69 +
.../framework/config/ResourcesConfig.java | 142 +-
.../framework/config/SecurityConfig.java | 267 +-
.../ruoyi/framework/config/ServerConfig.java | 64 +-
.../framework/config/ThreadPoolConfig.java | 126 +-
.../config/handler/MyMetaHandler.java | 33 -
.../config/properties/DruidProperties.java | 179 +-
.../properties/PermitAllUrlProperties.java | 146 +-
.../datasource/DynamicDataSource.java | 50 +-
.../DynamicDataSourceContextHolder.java | 90 +-
.../interceptor/RepeatSubmitInterceptor.java | 112 +-
.../impl/SameUrlDataInterceptor.java | 220 +-
.../ruoyi/framework/manager/AsyncManager.java | 110 +-
.../framework/manager/ShutdownManager.java | 78 +-
.../manager/factory/AsyncFactory.java | 204 +-
.../context/AuthenticationContextHolder.java | 56 +-
.../context/PermissionContextHolder.java | 54 +-
.../filter/JwtAuthenticationTokenFilter.java | 88 +-
.../handle/AuthenticationEntryPointImpl.java | 68 +-
.../handle/LogoutSuccessHandlerImpl.java | 106 +-
.../ruoyi/framework/web/domain/Server.java | 480 +-
.../framework/web/domain/server/Cpu.java | 202 +-
.../framework/web/domain/server/Jvm.java | 260 +-
.../framework/web/domain/server/Mem.java | 122 +-
.../framework/web/domain/server/Sys.java | 168 +-
.../framework/web/domain/server/SysFile.java | 228 +-
.../web/exception/GlobalExceptionHandler.java | 290 +-
.../PasswordTransferCryptoService.java | 30 -
.../web/service/PermissionService.java | 318 +-
.../web/service/SysLoginService.java | 396 +-
.../web/service/SysPasswordService.java | 172 +-
.../web/service/SysPermissionService.java | 178 +-
.../web/service/SysRegisterService.java | 234 +-
.../framework/web/service/TokenService.java | 464 +-
.../web/service/UserDetailsServiceImpl.java | 132 +-
.../aspectj/RateLimiterAspectTest.java | 49 -
.../PasswordTransferCryptoServiceTest.java | 47 -
.../service/TokenServiceLocalCacheTest.java | 117 -
ruoyi-generator/pom.xml | 78 +-
.../com/ruoyi/generator/config/GenConfig.java | 174 +-
.../generator/controller/GenController.java | 525 +-
.../com/ruoyi/generator/domain/GenTable.java | 794 +-
.../generator/domain/GenTableColumn.java | 746 +-
.../mapper/GenTableColumnMapper.java | 120 +-
.../generator/mapper/GenTableMapper.java | 182 +-
.../service/GenTableColumnServiceImpl.java | 136 +-
.../service/GenTableServiceImpl.java | 1093 +-
.../service/IGenTableColumnService.java | 88 +-
.../generator/service/IGenTableService.java | 261 +-
.../com/ruoyi/generator/util/GenUtils.java | 514 +-
.../generator/util/VelocityInitializer.java | 68 +-
.../ruoyi/generator/util/VelocityUtils.java | 900 +-
.../src/main/resources/generator.yml | 22 +-
.../mapper/generator/GenTableColumnMapper.xml | 252 +-
.../mapper/generator/GenTableMapper.xml | 422 +-
.../main/resources/vm/java/controller.java.vm | 2 +-
.../src/main/resources/vm/java/domain.java.vm | 210 +-
.../main/resources/vm/java/service.java.vm | 122 +-
.../resources/vm/java/serviceImpl.java.vm | 338 +-
.../main/resources/vm/java/sub-domain.java.vm | 152 +-
.../src/main/resources/vm/js/api.js.vm | 88 +-
.../src/main/resources/vm/sql/sql.vm | 42 +-
.../src/main/resources/vm/ts/api.ts.vm | 51 +
.../src/main/resources/vm/ts/index.ts.vm | 9 +
.../src/main/resources/vm/ts/type.ts.vm | 51 +
.../main/resources/vm/vue/index-tree.vue.vm | 1070 +-
.../src/main/resources/vm/vue/index.vue.vm | 1262 +-
.../resources/vm/vue/v3/index-tree.vue.vm | 226 +-
.../src/main/resources/vm/vue/v3/index.vue.vm | 221 +-
.../src/main/resources/vm/vue/v3/view.vue.vm | 83 +
.../resources/vm/vue/v3ts/index-tree.vue.vm | 528 +
.../main/resources/vm/vue/v3ts/index.vue.vm | 644 +
.../main/resources/vm/vue/v3ts/view.vue.vm | 84 +
.../src/main/resources/vm/vue/view.vue.vm | 86 +
.../src/main/resources/vm/xml/mapper.xml.vm | 278 +-
ruoyi-loan-pricing/pom.xml | 7 +-
.../loanpricing/config/MybatisPlusConfig.java | 19 +
.../config/handler/MyMetaHandler.java | 40 +
.../LoanPricingWorkflowController.java | 28 +-
.../LoanRatePricingMockController.java | 5 -
.../dto/CorporateLoanPricingCreateDTO.java | 19 +-
.../dto/PersonalLoanPricingCreateDTO.java | 18 +-
.../domain/entity/LoanPricingWorkflow.java | 2 +-
.../mapper/LoanPricingWorkflowMapper.java | 7 +-
.../service/ILoanPricingWorkflowService.java | 7 +-
.../service/LoanPricingModelService.java | 2 +-
.../LoanPricingSensitiveDisplayService.java | 26 +-
.../loanpricing/service/ModelService.java | 35 +-
.../impl/LoanPricingWorkflowServiceImpl.java | 15 +-
.../LoanPricingWorkflowServiceImplTest.java | 20 +-
ruoyi-quartz/pom.xml | 72 +-
.../ruoyi/quartz/config/ScheduleConfig.java | 114 +-
.../quartz/controller/SysJobController.java | 370 +-
.../controller/SysJobLogController.java | 184 +-
.../java/com/ruoyi/quartz/domain/SysJob.java | 342 +-
.../com/ruoyi/quartz/domain/SysJobLog.java | 313 +-
.../ruoyi/quartz/mapper/SysJobLogMapper.java | 128 +-
.../com/ruoyi/quartz/mapper/SysJobMapper.java | 134 +-
.../quartz/service/ISysJobLogService.java | 112 +-
.../ruoyi/quartz/service/ISysJobService.java | 204 +-
.../service/impl/SysJobLogServiceImpl.java | 174 +-
.../service/impl/SysJobServiceImpl.java | 522 +-
.../java/com/ruoyi/quartz/task/RyTask.java | 56 +-
.../ruoyi/quartz/util/AbstractQuartzJob.java | 212 +-
.../java/com/ruoyi/quartz/util/CronUtils.java | 126 +-
.../com/ruoyi/quartz/util/JobInvokeUtil.java | 364 +-
.../QuartzDisallowConcurrentExecution.java | 42 +-
.../ruoyi/quartz/util/QuartzJobExecution.java | 38 +-
.../com/ruoyi/quartz/util/ScheduleUtils.java | 282 +-
.../mapper/quartz/SysJobLogMapper.xml | 192 +-
.../resources/mapper/quartz/SysJobMapper.xml | 220 +-
ruoyi-system/pom.xml | 54 +-
.../com/ruoyi/system/domain/SysCache.java | 162 +-
.../com/ruoyi/system/domain/SysConfig.java | 222 +-
.../ruoyi/system/domain/SysLogininfor.java | 288 +-
.../com/ruoyi/system/domain/SysNotice.java | 219 +-
.../ruoyi/system/domain/SysNoticeRead.java | 76 +
.../com/ruoyi/system/domain/SysOperLog.java | 538 +-
.../java/com/ruoyi/system/domain/SysPost.java | 248 +-
.../com/ruoyi/system/domain/SysRoleDept.java | 92 +-
.../com/ruoyi/system/domain/SysRoleMenu.java | 92 +-
.../ruoyi/system/domain/SysUserOnline.java | 226 +-
.../com/ruoyi/system/domain/SysUserPost.java | 92 +-
.../com/ruoyi/system/domain/SysUserRole.java | 92 +-
.../com/ruoyi/system/domain/vo/MetaVo.java | 212 +-
.../com/ruoyi/system/domain/vo/RouterVo.java | 296 +-
.../ruoyi/system/mapper/SysConfigMapper.java | 152 +-
.../ruoyi/system/mapper/SysDeptMapper.java | 243 +-
.../system/mapper/SysDictDataMapper.java | 190 +-
.../system/mapper/SysDictTypeMapper.java | 166 +-
.../system/mapper/SysLogininforMapper.java | 84 +-
.../ruoyi/system/mapper/SysMenuMapper.java | 275 +-
.../ruoyi/system/mapper/SysNoticeMapper.java | 120 +-
.../system/mapper/SysNoticeReadMapper.java | 65 +
.../ruoyi/system/mapper/SysOperLogMapper.java | 96 +-
.../ruoyi/system/mapper/SysPostMapper.java | 198 +-
.../system/mapper/SysRoleDeptMapper.java | 88 +-
.../ruoyi/system/mapper/SysRoleMapper.java | 214 +-
.../system/mapper/SysRoleMenuMapper.java | 88 +-
.../ruoyi/system/mapper/SysUserMapper.java | 294 +-
.../system/mapper/SysUserPostMapper.java | 88 +-
.../system/mapper/SysUserRoleMapper.java | 124 +-
.../system/service/ISysConfigService.java | 178 +-
.../ruoyi/system/service/ISysDeptService.java | 256 +-
.../system/service/ISysDictDataService.java | 120 +-
.../system/service/ISysDictTypeService.java | 196 +-
.../system/service/ISysLogininforService.java | 80 +-
.../ruoyi/system/service/ISysMenuService.java | 312 +-
.../system/service/ISysNoticeReadService.java | 52 +
.../system/service/ISysNoticeService.java | 120 +-
.../system/service/ISysOperLogService.java | 96 +-
.../ruoyi/system/service/ISysPostService.java | 198 +-
.../ruoyi/system/service/ISysRoleService.java | 346 +-
.../system/service/ISysUserOnlineService.java | 96 +-
.../ruoyi/system/service/ISysUserService.java | 434 +-
.../service/impl/SysConfigServiceImpl.java | 461 +-
.../service/impl/SysDeptServiceImpl.java | 701 +-
.../service/impl/SysDictDataServiceImpl.java | 222 +-
.../service/impl/SysDictTypeServiceImpl.java | 446 +-
.../impl/SysLogininforServiceImpl.java | 130 +-
.../service/impl/SysMenuServiceImpl.java | 29 +
.../impl/SysNoticeReadServiceImpl.java | 73 +
.../service/impl/SysNoticeServiceImpl.java | 184 +-
.../service/impl/SysOperLogServiceImpl.java | 152 +-
.../service/impl/SysPostServiceImpl.java | 356 +-
.../service/impl/SysRoleServiceImpl.java | 852 +-
.../impl/SysUserOnlineServiceImpl.java | 192 +-
.../service/impl/SysUserServiceImpl.java | 1130 +-
.../mapper/system/SysConfigMapper.xml | 232 +-
.../resources/mapper/system/SysDeptMapper.xml | 322 +-
.../mapper/system/SysDictDataMapper.xml | 246 +-
.../mapper/system/SysDictTypeMapper.xml | 208 +-
.../mapper/system/SysLogininforMapper.xml | 112 +-
.../resources/mapper/system/SysMenuMapper.xml | 424 +-
.../mapper/system/SysNoticeMapper.xml | 177 +-
.../mapper/system/SysNoticeReadMapper.xml | 66 +
.../mapper/system/SysOperLogMapper.xml | 172 +-
.../resources/mapper/system/SysPostMapper.xml | 242 +-
.../mapper/system/SysRoleDeptMapper.xml | 66 +-
.../resources/mapper/system/SysRoleMapper.xml | 302 +-
.../mapper/system/SysRoleMenuMapper.xml | 66 +-
.../resources/mapper/system/SysUserMapper.xml | 452 +-
.../mapper/system/SysUserPostMapper.xml | 66 +-
.../mapper/system/SysUserRoleMapper.xml | 86 +-
ruoyi-ui/.editorconfig | 44 +-
ruoyi-ui/.env.development | 23 +-
ruoyi-ui/.env.production | 17 +-
ruoyi-ui/.env.staging | 25 +-
ruoyi-ui/.gitignore | 46 +-
ruoyi-ui/README.md | 58 +-
ruoyi-ui/babel.config.js | 24 +-
ruoyi-ui/bin/package.bat | 22 +-
ruoyi-ui/bin/run-web.bat | 22 +-
ruoyi-ui/build/index.js | 70 +-
ruoyi-ui/dist.zip | Bin 3702977 -> 0 bytes
ruoyi-ui/package-lock.json | 32951 +++++++---------
ruoyi-ui/package.json | 154 +-
ruoyi-ui/public/html/ie.html | 90 +-
ruoyi-ui/public/index.html | 416 +-
ruoyi-ui/public/robots.txt | 2 +-
ruoyi-ui/src/App.vue | 40 +-
ruoyi-ui/src/api/login.js | 131 +-
ruoyi-ui/src/api/menu.js | 16 +-
ruoyi-ui/src/api/monitor/cache.js | 114 +-
ruoyi-ui/src/api/monitor/logininfor.js | 68 +-
ruoyi-ui/src/api/monitor/online.js | 36 +-
ruoyi-ui/src/api/monitor/operlog.js | 52 +-
ruoyi-ui/src/api/monitor/server.js | 16 +-
ruoyi-ui/src/api/system/config.js | 120 +-
ruoyi-ui/src/api/system/dept.js | 111 +-
ruoyi-ui/src/api/system/dict/data.js | 104 +-
ruoyi-ui/src/api/system/dict/type.js | 118 +-
ruoyi-ui/src/api/system/menu.js | 127 +-
ruoyi-ui/src/api/system/notice.js | 114 +-
ruoyi-ui/src/api/system/post.js | 88 +-
ruoyi-ui/src/api/system/role.js | 238 +-
ruoyi-ui/src/api/system/user.js | 274 +-
ruoyi-ui/src/api/tool/gen.js | 170 +-
ruoyi-ui/src/assets/icons/index.js | 18 +-
ruoyi-ui/src/assets/icons/svg/bell.svg | 1 +
ruoyi-ui/src/assets/icons/svg/monitor.svg | 2 +-
ruoyi-ui/src/assets/icons/svg/system.svg | 2 +-
ruoyi-ui/src/assets/icons/svgo.yml | 44 +-
ruoyi-ui/src/assets/images/dark.svg | 76 +-
ruoyi-ui/src/assets/images/light.svg | 76 +-
ruoyi-ui/src/assets/styles/btn.scss | 198 +-
.../src/assets/styles/element-variables.scss | 62 +-
ruoyi-ui/src/assets/styles/mixin.scss | 132 +-
ruoyi-ui/src/assets/styles/ruoyi.scss | 197 +-
ruoyi-ui/src/assets/styles/sidebar.scss | 550 +-
ruoyi-ui/src/assets/styles/transition.scss | 98 +-
ruoyi-ui/src/assets/styles/variables.scss | 93 +-
ruoyi-ui/src/components/Crontab/min.vue | 230 +-
ruoyi-ui/src/components/DictData/index.js | 96 +-
.../components/ExcelImportDialog/index.vue | 126 +
ruoyi-ui/src/components/Hamburger/index.vue | 88 +-
.../src/components/HeaderSearch/index.vue | 661 +-
.../src/components/IconSelect/requireIcons.js | 22 +-
ruoyi-ui/src/components/ImageUpload/index.vue | 544 +-
ruoyi-ui/src/components/Pagination/index.vue | 226 +-
ruoyi-ui/src/components/PanThumb/index.vue | 282 +-
.../src/components/RightToolbar/index.vue | 439 +-
ruoyi-ui/src/components/RuoYi/Doc/index.vue | 40 +-
ruoyi-ui/src/components/RuoYi/Git/index.vue | 40 +-
ruoyi-ui/src/components/Screenfull/index.vue | 114 +-
ruoyi-ui/src/components/SizeSelect/index.vue | 110 +-
ruoyi-ui/src/components/SvgIcon/index.vue | 122 +-
ruoyi-ui/src/components/TreePanel/index.vue | 709 +
ruoyi-ui/src/components/iFrame/index.vue | 72 +-
ruoyi-ui/src/directive/dialog/drag.js | 126 +-
ruoyi-ui/src/directive/dialog/dragHeight.js | 68 +-
ruoyi-ui/src/directive/dialog/dragWidth.js | 60 +-
ruoyi-ui/src/directive/index.js | 46 +-
ruoyi-ui/src/directive/permission/hasPermi.js | 56 +-
ruoyi-ui/src/directive/permission/hasRole.js | 56 +-
ruoyi-ui/src/layout/components/AppMain.vue | 10 +-
.../layout/components/HeaderNotice/index.vue | 229 +
.../layout/components/IframeToggle/index.vue | 66 +-
.../src/layout/components/InnerLink/index.vue | 94 +-
ruoyi-ui/src/layout/components/Navbar.vue | 501 +-
.../src/layout/components/Settings/index.vue | 819 +-
.../layout/components/Sidebar/FixiOSBug.js | 50 +-
.../src/layout/components/Sidebar/Item.vue | 66 +-
.../src/layout/components/Sidebar/Link.vue | 86 +-
.../src/layout/components/Sidebar/Logo.vue | 190 +-
.../layout/components/Sidebar/SidebarItem.vue | 198 +-
.../src/layout/components/Sidebar/index.vue | 114 +-
.../layout/components/TagsView/ScrollPane.vue | 79 +-
.../src/layout/components/TagsView/index.vue | 1097 +-
.../{ => layout}/components/TopNav/index.vue | 0
ruoyi-ui/src/layout/components/index.js | 10 +-
ruoyi-ui/src/layout/index.vue | 2 +-
ruoyi-ui/src/layout/mixin/ResizeHandler.js | 90 +-
ruoyi-ui/src/main.js | 166 +-
ruoyi-ui/src/permission.js | 7 +
ruoyi-ui/src/plugins/auth.js | 120 +-
ruoyi-ui/src/plugins/cache.js | 158 +-
ruoyi-ui/src/plugins/index.js | 40 +-
ruoyi-ui/src/plugins/modal.js | 166 +-
ruoyi-ui/src/plugins/tab.js | 146 +-
ruoyi-ui/src/router/index.js | 6 +
ruoyi-ui/src/settings.js | 122 +-
ruoyi-ui/src/store/getters.js | 44 +-
ruoyi-ui/src/store/index.js | 52 +-
ruoyi-ui/src/store/modules/app.js | 132 +-
ruoyi-ui/src/store/modules/dict.js | 100 +-
ruoyi-ui/src/store/modules/lock.js | 34 +
ruoyi-ui/src/store/modules/permission.js | 244 +-
ruoyi-ui/src/store/modules/settings.js | 102 +-
ruoyi-ui/src/store/modules/tagsView.js | 503 +-
ruoyi-ui/src/store/modules/user.js | 252 +-
ruoyi-ui/src/utils/auth.js | 30 +-
ruoyi-ui/src/utils/dict/Dict.js | 164 +-
ruoyi-ui/src/utils/dict/DictConverter.js | 34 +-
ruoyi-ui/src/utils/dict/DictData.js | 26 +-
ruoyi-ui/src/utils/dict/DictMeta.js | 76 +-
ruoyi-ui/src/utils/dict/DictOptions.js | 102 +-
ruoyi-ui/src/utils/dict/index.js | 66 +-
ruoyi-ui/src/utils/generator/config.js | 876 +-
ruoyi-ui/src/utils/generator/css.js | 36 +-
ruoyi-ui/src/utils/generator/render.js | 252 +-
ruoyi-ui/src/utils/index.js | 780 +-
ruoyi-ui/src/utils/passwordTransfer.js | 14 -
ruoyi-ui/src/utils/permission.js | 92 +-
ruoyi-ui/src/utils/scroll-to.js | 116 +-
ruoyi-ui/src/utils/validate.js | 228 +-
ruoyi-ui/src/views/dashboard/BarChart.vue | 204 +-
ruoyi-ui/src/views/dashboard/LineChart.vue | 270 +-
ruoyi-ui/src/views/dashboard/PanelGroup.vue | 362 +-
ruoyi-ui/src/views/dashboard/PieChart.vue | 158 +-
ruoyi-ui/src/views/dashboard/RaddarChart.vue | 232 +-
ruoyi-ui/src/views/dashboard/mixins/resize.js | 112 +-
ruoyi-ui/src/views/error/401.vue | 176 +-
ruoyi-ui/src/views/error/404.vue | 466 +-
ruoyi-ui/src/views/index.vue | 1226 +-
ruoyi-ui/src/views/index_v1.vue | 196 +-
ruoyi-ui/src/views/lock.vue | 375 +
ruoyi-ui/src/views/login.vue | 446 +-
ruoyi-ui/src/views/monitor/cache/index.vue | 271 +-
ruoyi-ui/src/views/monitor/cache/list.vue | 494 +-
ruoyi-ui/src/views/monitor/druid/index.vue | 30 +-
ruoyi-ui/src/views/monitor/job/detail.vue | 197 +
ruoyi-ui/src/views/monitor/job/index.vue | 64 +-
ruoyi-ui/src/views/monitor/job/log.vue | 36 +-
ruoyi-ui/src/views/monitor/online/index.vue | 244 +-
ruoyi-ui/src/views/monitor/operlog/detail.vue | 147 +
ruoyi-ui/src/views/monitor/operlog/index.vue | 64 +-
ruoyi-ui/src/views/register.vue | 426 +-
ruoyi-ui/src/views/system/config/index.vue | 8 +-
ruoyi-ui/src/views/system/dept/index.vue | 62 +-
ruoyi-ui/src/views/system/dict/data.vue | 802 +-
ruoyi-ui/src/views/system/dict/detail.vue | 203 +
ruoyi-ui/src/views/system/dict/index.vue | 720 +-
ruoyi-ui/src/views/system/menu/index.vue | 88 +-
ruoyi-ui/src/views/system/notice/index.vue | 8 +-
ruoyi-ui/src/views/system/post/index.vue | 8 +-
ruoyi-ui/src/views/system/role/authUser.vue | 396 +-
ruoyi-ui/src/views/system/role/index.vue | 1208 +-
ruoyi-ui/src/views/system/role/selectUser.vue | 272 +-
ruoyi-ui/src/views/system/user/authRole.vue | 244 +-
ruoyi-ui/src/views/system/user/index.vue | 1041 +-
.../src/views/system/user/profile/index.vue | 190 +-
.../views/system/user/profile/resetPwd.vue | 138 +-
.../views/system/user/profile/userInfo.vue | 176 +-
ruoyi-ui/src/views/system/user/view.vue | 177 +
.../src/views/tool/build/DraggableItem.vue | 200 +-
ruoyi-ui/src/views/tool/build/IconsDialog.vue | 246 +-
ruoyi-ui/src/views/tool/build/RightPanel.vue | 1892 +-
ruoyi-ui/src/views/tool/gen/basicInfoForm.vue | 120 +-
ruoyi-ui/src/views/tool/gen/createTable.vue | 2 +-
ruoyi-ui/src/views/tool/gen/editTable.vue | 1 +
ruoyi-ui/src/views/tool/gen/genInfoForm.vue | 648 +-
ruoyi-ui/src/views/tool/gen/importTable.vue | 240 +-
ruoyi-ui/src/views/tool/gen/index.vue | 9 +-
ruoyi-ui/src/views/tool/swagger/index.vue | 30 +-
.../tests/login-default-credentials.test.js | 30 -
...sonal-final-calculate-rate-display.test.js | 21 -
.../tests/workflow-detail-card-order.test.js | 27 -
ruoyi-ui/tests/workflow-index-refresh.test.js | 52 -
ruoyi-ui/vue.config.js | 272 +-
ry.bat | 134 +-
sql/ry_20260330.sql | 722 +
544 files changed, 73860 insertions(+), 70367 deletions(-)
create mode 100644 .playwright-cli/page-2026-04-11T07-16-36-054Z.yml
create mode 100644 .playwright-cli/page-2026-04-11T07-17-14-786Z.yml
create mode 100644 .playwright-cli/page-2026-04-11T07-18-09-957Z.yml
create mode 100644 .playwright-cli/page-2026-04-11T07-18-43-284Z.yml
create mode 100644 .playwright-cli/page-2026-04-11T07-25-40-868Z.yml
create mode 100644 .playwright-cli/page-2026-04-11T07-25-55-827Z.yml
create mode 100644 .playwright-cli/page-2026-04-11T07-26-20-300Z.yml
create mode 100644 .playwright-cli/page-2026-04-11T07-26-34-973Z.yml
create mode 100644 .playwright-cli/page-2026-04-14T05-22-21-308Z.yml
create mode 100644 .playwright-cli/page-2026-04-14T05-39-30-657Z.yml
delete mode 100644 bin/.DS_Store
mode change 100644 => 100755 bin/prod/restart_java_test.sh
mode change 100644 => 100755 bin/restart_java_backend_test.sh
create mode 100644 doc/2026-04-13-local-tomcat-remote-tongweb-backend-plan.md
create mode 100644 doc/2026-04-13-local-tomcat-remote-tongweb-design.md
create mode 100644 doc/2026-04-13-tongweb-replace-tomcat-backend-plan.md
create mode 100644 doc/2026-04-14-ruoyi-vue-springboot2-backend-plan.md
create mode 100644 doc/2026-04-14-ruoyi-vue-springboot2-frontend-plan.md
create mode 100644 doc/2026-04-14-ruoyi-vue-springboot2-migration-design.md
create mode 100644 doc/implementation-report-2026-04-13-local-tomcat-remote-tongweb.md
create mode 100644 doc/implementation-report-2026-04-13-tongweb-replace-tomcat.md
create mode 100644 doc/implementation-report-2026-04-14-ruoyi-vue-springboot2-migration.md
delete mode 100644 ruoyi-admin/.DS_Store
create mode 100644 ruoyi-admin/src/main/resources/application-druid.yml
delete mode 100644 ruoyi-admin/src/main/resources/static/swagger-ui/swagger-initializer.js
delete mode 100644 ruoyi-admin/src/test/java/com/ruoyi/web/controller/monitor/CacheControllerTest.java
delete mode 100644 ruoyi-admin/src/test/java/com/ruoyi/web/controller/system/SysLoginControllerPasswordTransferTest.java
delete mode 100644 ruoyi-admin/src/test/java/com/ruoyi/web/controller/system/SysProfileControllerPasswordTransferTest.java
delete mode 100644 ruoyi-admin/src/test/java/com/ruoyi/web/controller/system/SysRegisterControllerPasswordTransferTest.java
delete mode 100644 ruoyi-admin/src/test/java/com/ruoyi/web/controller/system/SysUserControllerPasswordTransferTest.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelSheet.java
delete mode 100644 ruoyi-common/src/test/java/com/ruoyi/common/core/cache/InMemoryCacheStoreTest.java
delete mode 100644 ruoyi-common/src/test/java/com/ruoyi/common/core/redis/RedisCacheTest.java
delete mode 100644 ruoyi-common/src/test/java/com/ruoyi/common/utils/DictUtilsTest.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java
delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/handler/MyMetaHandler.java
delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PasswordTransferCryptoService.java
delete mode 100644 ruoyi-framework/src/test/java/com/ruoyi/framework/aspectj/RateLimiterAspectTest.java
delete mode 100644 ruoyi-framework/src/test/java/com/ruoyi/framework/web/service/PasswordTransferCryptoServiceTest.java
delete mode 100644 ruoyi-framework/src/test/java/com/ruoyi/framework/web/service/TokenServiceLocalCacheTest.java
create mode 100644 ruoyi-generator/src/main/resources/vm/ts/api.ts.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/ts/index.ts.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/ts/type.ts.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/vue/v3/view.vue.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/vue/v3ts/index-tree.vue.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/vue/v3ts/index.vue.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/vue/v3ts/view.vue.vm
create mode 100644 ruoyi-generator/src/main/resources/vm/vue/view.vue.vm
create mode 100644 ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/config/MybatisPlusConfig.java
create mode 100644 ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/config/handler/MyMetaHandler.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNoticeRead.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeReadMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeReadService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeReadServiceImpl.java
create mode 100644 ruoyi-system/src/main/resources/mapper/system/SysNoticeReadMapper.xml
delete mode 100644 ruoyi-ui/dist.zip
create mode 100644 ruoyi-ui/src/assets/icons/svg/bell.svg
create mode 100644 ruoyi-ui/src/components/ExcelImportDialog/index.vue
create mode 100644 ruoyi-ui/src/components/TreePanel/index.vue
create mode 100644 ruoyi-ui/src/layout/components/HeaderNotice/index.vue
rename ruoyi-ui/src/{ => layout}/components/TopNav/index.vue (100%)
create mode 100644 ruoyi-ui/src/store/modules/lock.js
delete mode 100644 ruoyi-ui/src/utils/passwordTransfer.js
create mode 100644 ruoyi-ui/src/views/lock.vue
create mode 100644 ruoyi-ui/src/views/monitor/job/detail.vue
create mode 100644 ruoyi-ui/src/views/monitor/operlog/detail.vue
create mode 100644 ruoyi-ui/src/views/system/dict/detail.vue
create mode 100644 ruoyi-ui/src/views/system/user/view.vue
delete mode 100644 ruoyi-ui/tests/login-default-credentials.test.js
delete mode 100644 ruoyi-ui/tests/personal-final-calculate-rate-display.test.js
delete mode 100644 ruoyi-ui/tests/workflow-detail-card-order.test.js
delete mode 100644 ruoyi-ui/tests/workflow-index-refresh.test.js
create mode 100644 sql/ry_20260330.sql
diff --git a/.gitignore b/.gitignore
index 2adcb2b..4dbf738 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,53 +1,48 @@
-######################################################################
-# Build Tools
-
-.gradle
-/build/
-!gradle/wrapper/gradle-wrapper.jar
-
-target/
-!.mvn/wrapper/maven-wrapper.jar
-
-######################################################################
-# IDE
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### JRebel ###
-rebel.xml
-
-### NetBeans ###
-nbproject/private/
-build/*
-nbbuild/
-dist/
-nbdist/
-.nb-gradle/
-
+######################################################################
+# Build Tools
+
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+######################################################################
+# IDE
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### JRebel ###
+rebel.xml
+
+### NetBeans ###
+nbproject/private/
+build/*
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
######################################################################
# Others
+.DS_Store
*.log
*.xml.versionsBackup
*.swp
-
-!*/build/*.java
-!*/build/*.html
-!*/build/*.xml
-
-
-logs/
-ruoyi-ui/dist.zip
-
-.playwright-cli
\ No newline at end of file
+
+!*/build/*.java
+!*/build/*.html
+!*/build/*.xml
diff --git a/.playwright-cli/page-2026-04-11T07-16-36-054Z.yml b/.playwright-cli/page-2026-04-11T07-16-36-054Z.yml
new file mode 100644
index 0000000..711875f
--- /dev/null
+++ b/.playwright-cli/page-2026-04-11T07-16-36-054Z.yml
@@ -0,0 +1,18 @@
+- generic [ref=e2]:
+ - generic [ref=e3]:
+ - generic [ref=e4]:
+ - heading "上虞利率定价系统" [level=3] [ref=e5]
+ - generic [ref=e8]:
+ - textbox "账号" [ref=e9]
+ - img [ref=e11]
+ - generic [ref=e15]:
+ - textbox "密码" [ref=e16]
+ - img [ref=e18]
+ - generic [ref=e20] [cursor=pointer]:
+ - generic [ref=e21]:
+ - checkbox "记住密码"
+ - generic [ref=e23]: 记住密码
+ - button "登 录" [ref=e26] [cursor=pointer]:
+ - generic [ref=e27]: 登 录
+ - generic [ref=e28]: Copyright © 2018-2026 RuoYi. All Rights Reserved.
+ - text:
\ No newline at end of file
diff --git a/.playwright-cli/page-2026-04-11T07-17-14-786Z.yml b/.playwright-cli/page-2026-04-11T07-17-14-786Z.yml
new file mode 100644
index 0000000..429f91e
--- /dev/null
+++ b/.playwright-cli/page-2026-04-11T07-17-14-786Z.yml
@@ -0,0 +1,20 @@
+- generic [ref=e2]:
+ - generic [ref=e3]:
+ - generic [ref=e4]:
+ - heading "上虞利率定价系统" [level=3] [ref=e5]
+ - generic [ref=e8]:
+ - textbox "账号" [ref=e9]: admin123admin
+ - img [ref=e11]
+ - generic [ref=e14]:
+ - generic [ref=e15]:
+ - textbox "密码" [ref=e16]
+ - img [ref=e18]
+ - generic [ref=e29]: 请输入您的密码
+ - generic [ref=e20] [cursor=pointer]:
+ - generic [ref=e21]:
+ - checkbox "记住密码"
+ - generic [ref=e23]: 记住密码
+ - button "登 录" [active] [ref=e26] [cursor=pointer]:
+ - generic [ref=e27]: 登 录
+ - generic [ref=e28]: Copyright © 2018-2026 RuoYi. All Rights Reserved.
+ - text:
\ No newline at end of file
diff --git a/.playwright-cli/page-2026-04-11T07-18-09-957Z.yml b/.playwright-cli/page-2026-04-11T07-18-09-957Z.yml
new file mode 100644
index 0000000..7de5200
--- /dev/null
+++ b/.playwright-cli/page-2026-04-11T07-18-09-957Z.yml
@@ -0,0 +1 @@
+- generic [ref=e2]:
\ No newline at end of file
diff --git a/.playwright-cli/page-2026-04-11T07-18-43-284Z.yml b/.playwright-cli/page-2026-04-11T07-18-43-284Z.yml
new file mode 100644
index 0000000..7a036c1
--- /dev/null
+++ b/.playwright-cli/page-2026-04-11T07-18-43-284Z.yml
@@ -0,0 +1,191 @@
+- generic [ref=e2]:
+ - generic [ref=e3]:
+ - generic [ref=e4]:
+ - link "上虞利率定价系统" [ref=e6] [cursor=pointer]:
+ - /url: /
+ - img [ref=e7]
+ - heading "上虞利率定价系统" [level=1] [ref=e8]
+ - menubar [ref=e12]:
+ - link "流程列表" [ref=e14] [cursor=pointer]:
+ - /url: /index
+ - menuitem "流程列表" [ref=e15]:
+ - img [ref=e16]
+ - text: 流程列表
+ - menuitem "系统管理 " [ref=e19]:
+ - generic [ref=e20] [cursor=pointer]:
+ - img [ref=e21]
+ - text: 系统管理
+ - generic [ref=e23]:
+ - text:
+ - generic [ref=e25]:
+ - generic [ref=e26]:
+ - generic [ref=e27]:
+ - img [ref=e29] [cursor=pointer]
+ - navigation "Breadcrumb" [ref=e31]:
+ - generic:
+ - generic [ref=e32]:
+ - link "首页" [ref=e33]
+ - text: /
+ - generic [ref=e379]:
+ - link "利率定价管理" [ref=e380]
+ - text: /
+ - link "流程列表" [ref=e382]
+ - generic [ref=e36]:
+ - img [ref=e38] [cursor=pointer]
+ - img [ref=e41] [cursor=pointer]
+ - button [ref=e44] [cursor=pointer]:
+ - img [ref=e45]
+ - button "若依" [ref=e48] [cursor=pointer]:
+ - img [ref=e49]
+ - text: 若依
+ - generic [ref=e50]:
+ - generic [ref=e53]:
+ - generic [ref=e54] [cursor=pointer]: 流程列表
+ - generic [ref=e383] [cursor=pointer]:
+ - text: 流程详情
+ - generic [ref=e384]:
+ - text:
+ - generic [ref=e385]:
+ - generic [ref=e386]:
+ - heading "流程详情" [level=2] [ref=e387]
+ - button " 返回" [ref=e388] [cursor=pointer]:
+ - generic [ref=e389]:
+ - text: 返回
+ - generic [ref=e391]:
+ - generic [ref=e393]:
+ - generic [ref=e396]: 关键信息
+ - table [ref=e400]:
+ - rowgroup [ref=e401]:
+ - row "业务方流水号" [ref=e402]:
+ - columnheader "业务方流水号" [ref=e403]
+ - row "20260410150311114" [ref=e404]:
+ - cell "20260410150311114" [ref=e405]
+ - rowgroup [ref=e406]:
+ - row "客户名称" [ref=e407]:
+ - columnheader "客户名称" [ref=e408]
+ - row "t***" [ref=e409]:
+ - cell "t***" [ref=e410]
+ - rowgroup [ref=e411]:
+ - row "客户类型" [ref=e412]:
+ - columnheader "客户类型" [ref=e413]
+ - row "个人" [ref=e414]:
+ - cell "个人" [ref=e415]
+ - rowgroup [ref=e416]:
+ - row "申请金额" [ref=e417]:
+ - columnheader "申请金额" [ref=e418]
+ - row "1000 元" [ref=e419]:
+ - cell "1000 元" [ref=e420]
+ - rowgroup [ref=e421]:
+ - row "基准利率" [ref=e422]:
+ - columnheader "基准利率" [ref=e423]
+ - row "4.35 %" [ref=e424]:
+ - cell "4.35 %" [ref=e425]
+ - rowgroup [ref=e426]:
+ - row "浮动BP" [ref=e427]:
+ - columnheader "浮动BP" [ref=e428]
+ - row "350" [ref=e429]:
+ - cell "350" [ref=e430]
+ - rowgroup [ref=e431]:
+ - row "最终测算利率" [ref=e432]:
+ - columnheader "最终测算利率" [ref=e433]
+ - row "6.05 %" [ref=e434]:
+ - cell "6.05 %" [ref=e435]
+ - rowgroup [ref=e436]:
+ - row "执行利率" [ref=e437]:
+ - columnheader "执行利率" [ref=e438]
+ - row "% 确定" [ref=e439]:
+ - cell "% 确定" [ref=e440]:
+ - generic [ref=e441]:
+ - generic [ref=e442]:
+ - textbox "请输入执行利率" [ref=e443]
+ - generic [ref=e444]: "%"
+ - button "确定" [ref=e445] [cursor=pointer]
+ - generic [ref=e446]:
+ - generic [ref=e447]:
+ - generic [ref=e450]: 流程详情
+ - generic [ref=e451]:
+ - generic [ref=e452]:
+ - heading "基本信息" [level=4] [ref=e453]
+ - table [ref=e456]:
+ - rowgroup [ref=e457]:
+ - row "机构编码 892000 运行模式 1" [ref=e458]:
+ - rowheader "机构编码" [ref=e459]
+ - cell "892000" [ref=e460]
+ - rowheader "运行模式" [ref=e461]
+ - cell "1" [ref=e462]
+ - rowgroup [ref=e463]:
+ - row "客户内码 test 证件类型 身份证" [ref=e464]:
+ - rowheader "客户内码" [ref=e465]
+ - cell "test" [ref=e466]
+ - rowheader "证件类型" [ref=e467]
+ - cell "身份证" [ref=e468]
+ - rowgroup [ref=e469]:
+ - row "证件号码 ** 创建时间 2026-04-10 15:03:11" [ref=e470]:
+ - rowheader "证件号码" [ref=e471]
+ - cell "**" [ref=e472]
+ - rowheader "创建时间" [ref=e473]
+ - cell "2026-04-10 15:03:11" [ref=e474]
+ - rowgroup [ref=e475]:
+ - row "创建者 若依-admin" [ref=e476]:
+ - rowheader "创建者" [ref=e477]
+ - cell "若依-admin" [ref=e478]
+ - generic [ref=e479]:
+ - heading "业务信息" [level=4] [ref=e480]
+ - table [ref=e483]:
+ - rowgroup [ref=e484]:
+ - row "担保方式 信用 申请金额 1000 元" [ref=e485]:
+ - rowheader "担保方式" [ref=e486]
+ - cell "信用" [ref=e487]
+ - rowheader "申请金额" [ref=e488]
+ - cell "1000 元" [ref=e489]
+ - rowgroup [ref=e490]:
+ - row "贷款用途 消费 借款期限 1" [ref=e491]:
+ - rowheader "贷款用途" [ref=e492]
+ - cell "消费" [ref=e493]
+ - rowheader "借款期限" [ref=e494]
+ - cell "1" [ref=e495]
+ - rowgroup [ref=e496]:
+ - row "是否有经营佐证 否 循环功能 否" [ref=e497]:
+ - rowheader "是否有经营佐证" [ref=e498]
+ - cell "否" [ref=e499]
+ - rowheader "循环功能" [ref=e500]
+ - cell "否" [ref=e501]
+ - rowgroup [ref=e502]:
+ - row "抵质押类型 - 抵质押物是否三方所有 否" [ref=e503]:
+ - rowheader "抵质押类型" [ref=e504]
+ - cell "-" [ref=e505]
+ - rowheader "抵质押物是否三方所有" [ref=e506]
+ - cell "否" [ref=e507]
+ - generic [ref=e508]:
+ - generic [ref=e511]: 模型输出
+ - generic [ref=e513]:
+ - generic [ref=e515]:
+ - generic [ref=e517] [cursor=pointer]:
+ - generic [ref=e519] [cursor=pointer]:
+ - tablist [ref=e521]:
+ - tab "基本信息" [selected] [ref=e523]
+ - tab "忠诚度分析" [ref=e524]
+ - tab "贡献度分析" [ref=e525]
+ - tab "关联度分析" [ref=e526]
+ - tab "贷款特征" [ref=e527]
+ - tab "风险度分析" [ref=e528]
+ - tab "测算结果" [ref=e529]
+ - tabpanel "基本信息" [ref=e531]:
+ - table [ref=e534]:
+ - rowgroup [ref=e535]:
+ - row "客户内码 CUST20260121001 客户名称 张*" [ref=e536]:
+ - rowheader "客户内码" [ref=e537]
+ - cell "CUST20260121001" [ref=e538]
+ - rowheader "客户名称" [ref=e539]
+ - cell "张*" [ref=e540]
+ - rowgroup [ref=e541]:
+ - row "证件类型 身份证 证件号码 3301********1234" [ref=e542]:
+ - rowheader "证件类型" [ref=e543]
+ - cell "身份证" [ref=e544]
+ - rowheader "证件号码" [ref=e545]
+ - cell "3301********1234" [ref=e546]
+ - rowgroup [ref=e547]:
+ - row "基准利率 4.35 %" [ref=e548]:
+ - rowheader "基准利率" [ref=e549]
+ - cell "4.35 %" [ref=e550]
+ - text:
\ No newline at end of file
diff --git a/.playwright-cli/page-2026-04-11T07-25-40-868Z.yml b/.playwright-cli/page-2026-04-11T07-25-40-868Z.yml
new file mode 100644
index 0000000..711875f
--- /dev/null
+++ b/.playwright-cli/page-2026-04-11T07-25-40-868Z.yml
@@ -0,0 +1,18 @@
+- generic [ref=e2]:
+ - generic [ref=e3]:
+ - generic [ref=e4]:
+ - heading "上虞利率定价系统" [level=3] [ref=e5]
+ - generic [ref=e8]:
+ - textbox "账号" [ref=e9]
+ - img [ref=e11]
+ - generic [ref=e15]:
+ - textbox "密码" [ref=e16]
+ - img [ref=e18]
+ - generic [ref=e20] [cursor=pointer]:
+ - generic [ref=e21]:
+ - checkbox "记住密码"
+ - generic [ref=e23]: 记住密码
+ - button "登 录" [ref=e26] [cursor=pointer]:
+ - generic [ref=e27]: 登 录
+ - generic [ref=e28]: Copyright © 2018-2026 RuoYi. All Rights Reserved.
+ - text:
\ No newline at end of file
diff --git a/.playwright-cli/page-2026-04-11T07-25-55-827Z.yml b/.playwright-cli/page-2026-04-11T07-25-55-827Z.yml
new file mode 100644
index 0000000..7de5200
--- /dev/null
+++ b/.playwright-cli/page-2026-04-11T07-25-55-827Z.yml
@@ -0,0 +1 @@
+- generic [ref=e2]:
\ No newline at end of file
diff --git a/.playwright-cli/page-2026-04-11T07-26-20-300Z.yml b/.playwright-cli/page-2026-04-11T07-26-20-300Z.yml
new file mode 100644
index 0000000..7de5200
--- /dev/null
+++ b/.playwright-cli/page-2026-04-11T07-26-20-300Z.yml
@@ -0,0 +1 @@
+- generic [ref=e2]:
\ No newline at end of file
diff --git a/.playwright-cli/page-2026-04-11T07-26-34-973Z.yml b/.playwright-cli/page-2026-04-11T07-26-34-973Z.yml
new file mode 100644
index 0000000..7de5200
--- /dev/null
+++ b/.playwright-cli/page-2026-04-11T07-26-34-973Z.yml
@@ -0,0 +1 @@
+- generic [ref=e2]:
\ No newline at end of file
diff --git a/.playwright-cli/page-2026-04-14T05-22-21-308Z.yml b/.playwright-cli/page-2026-04-14T05-22-21-308Z.yml
new file mode 100644
index 0000000..19944d6
--- /dev/null
+++ b/.playwright-cli/page-2026-04-14T05-22-21-308Z.yml
@@ -0,0 +1,28 @@
+- generic [active] [ref=e1]:
+ - generic [ref=e2]:
+ - generic [ref=e3]:
+ - generic [ref=e4]:
+ - heading "若依管理系统" [level=3] [ref=e5]
+ - generic [ref=e8]:
+ - textbox "账号" [ref=e9]: admin
+ - img [ref=e11]
+ - generic [ref=e15]:
+ - textbox "密码" [ref=e16]: admin123
+ - img [ref=e18]
+ - generic [ref=e21]:
+ - generic [ref=e22]:
+ - textbox "验证码" [ref=e23]
+ - img [ref=e25]
+ - generic [ref=e27]:
+ - img
+ - generic [ref=e28] [cursor=pointer]:
+ - generic [ref=e29]:
+ - checkbox "记住密码"
+ - generic [ref=e31]: 记住密码
+ - button "登 录" [ref=e34] [cursor=pointer]:
+ - generic [ref=e35]: 登 录
+ - generic [ref=e36]: Copyright © 2018-2026 RuoYi. All Rights Reserved.
+ - text:
+ - alert [ref=e37]:
+ - generic [ref=e38]:
+ - paragraph [ref=e39]: 系统接口500异常
\ No newline at end of file
diff --git a/.playwright-cli/page-2026-04-14T05-39-30-657Z.yml b/.playwright-cli/page-2026-04-14T05-39-30-657Z.yml
new file mode 100644
index 0000000..cd1ffad
--- /dev/null
+++ b/.playwright-cli/page-2026-04-14T05-39-30-657Z.yml
@@ -0,0 +1,18 @@
+- generic [ref=e2]:
+ - generic [ref=e3]:
+ - generic [ref=e4]:
+ - heading "若依管理系统" [level=3] [ref=e5]
+ - generic [ref=e8]:
+ - textbox "账号" [ref=e9]: admin
+ - img [ref=e11]
+ - generic [ref=e15]:
+ - textbox "密码" [ref=e16]: admin123
+ - img [ref=e18]
+ - generic [ref=e20] [cursor=pointer]:
+ - generic [ref=e21]:
+ - checkbox "记住密码"
+ - generic [ref=e23]: 记住密码
+ - button "登 录" [ref=e26] [cursor=pointer]:
+ - generic [ref=e27]: 登 录
+ - generic [ref=e28]: Copyright © 2018-2026 RuoYi. All Rights Reserved.
+ - text:
\ No newline at end of file
diff --git a/README.md b/README.md
index 34ffad8..7c4bcbf 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,11 @@
-RuoYi v3.9.1
+RuoYi v3.9.2
基于SpringBoot+Vue前后端分离的Java快速开发框架
-
+
@@ -13,16 +13,37 @@
若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
+* 本仓库为RuoYi-Vue的Spring Boot 2 的版本,保持同步更新。
* 前端采用Vue、Element UI。
* 后端采用Spring Boot、Spring Security、Redis & Jwt。
* 权限认证使用Jwt,支持多终端认证系统。
* 支持加载动态权限菜单,多方式轻松权限控制。
* 高效率开发,使用代码生成器可以一键生成前后端代码。
-* 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://gitcode.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。
-* 提供了单应用版本[RuoYi-Vue-fast](https://gitcode.com/yangzongzhuan/RuoYi-Vue-fast),Oracle版本[RuoYi-Vue-Oracle](https://gitcode.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)
+# 版本分支
+
+RuoYi-Vue 后端项目提供 Spring Boot 2.x / 3.x / 4.x 多版本分支的并行维护。
+
+| 名称 | 说明 | 地址 |
+| :---------------- | :------------------------ | :------------------------------------------------------ |
+| master 默认分支 | Spring Boot 4.x (JDK 17+) | https://gitee.com/y_project/RuoYi-Vue |
+| springboot3 分支 | Spring Boot 3.x (JDK 17+) | https://gitee.com/y_project/RuoYi-Vue/tree/springboot3 |
+| springboot2 分支 | Spring Boot 2.x (JDK 8+) | https://gitee.com/y_project/RuoYi-Vue/tree/springboot2 |
+
+RuoYi-Vue 前端项目提供 Vue 2.x / 3.x / JavaScript TypeScript 版本均可混用搭配
+
+| 项目名称 | **RuoYi-Vue** | **RuoYi-Vue3** | **RuoYi-Vue3-TypeScript** |
+| :--- | :--- | :--- | :--- |
+| **前端框架** | Vue 2 | Vue 3 | Vue 3 |
+| **脚本语言** | JavaScript | JavaScript | TypeScript |
+| **构建工具** | Vue CLI | Vite | Vite |
+| **UI 组件库** | Element UI | Element Plus | Element Plus |
+| **状态管理** | Vuex | Pinia | Pinia |
+| **路由管理** | Vue Router 3 | Vue Router 4 | Vue Router 4 |
+| **核心特点** | 1. 技术栈经典稳定
2. 社区资料丰富
3. 当前维护重心已转移 | 1. 现代前端技术栈
2. 开发体验与性能更优
3. 官方主推的活跃版本 | 1. 类型加持,减少沟通成本
2. 开发时有提示,效率更高
3. 多人协作企业级开发项目 |
+| **仓库地址** | [RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) | [RuoYi-Vue3](https://gitcode.com/yangzongzhuan/RuoYi-Vue3) | [RuoYi-Vue3-TypeScript](https://gitcode.com/yangzongzhuan/RuoYi-Vue3/tree/typescript) |
+
## 内置功能
1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
@@ -92,4 +113,4 @@
## 若依前后端分离交流群
-QQ群: [](https://jq.qq.com/?_wv=1027&k=5bVB1og) [](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [](https://jq.qq.com/?_wv=1027&k=51G72yr) [](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [](https://jq.qq.com/?_wv=1027&k=SpyH2875) [](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=GsOo-OLz53J8y_9TPoO6XXSGNRTgbFxA&authKey=R7Uy%2Feq%2BZsoKNqHvRKhiXpypW7DAogoWapOawUGHokJSBIBIre2%2FoiAZeZBSLuBc&noverify=0&group_code=191164766) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=PmYavuzsOthVqfdAPbo4uAeIbu7Ttjgc&authKey=p52l8%2FXa4PS1JcEmS3VccKSwOPJUZ1ZfQ69MEKzbrooNUljRtlKjvsXf04bxNp3G&noverify=0&group_code=174569686) 点击按钮入群。
\ No newline at end of file
+QQ群: [](https://jq.qq.com/?_wv=1027&k=5bVB1og) [](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [](https://jq.qq.com/?_wv=1027&k=51G72yr) [](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [](https://jq.qq.com/?_wv=1027&k=SpyH2875) [](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=GsOo-OLz53J8y_9TPoO6XXSGNRTgbFxA&authKey=R7Uy%2Feq%2BZsoKNqHvRKhiXpypW7DAogoWapOawUGHokJSBIBIre2%2FoiAZeZBSLuBc&noverify=0&group_code=191164766) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=PmYavuzsOthVqfdAPbo4uAeIbu7Ttjgc&authKey=p52l8%2FXa4PS1JcEmS3VccKSwOPJUZ1ZfQ69MEKzbrooNUljRtlKjvsXf04bxNp3G&noverify=0&group_code=174569686) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=M9y5NjAl44lAL_Vh2crmEehZU_PMU6KS&authKey=ZSDz8hEREWSaPuxQV3gEwqGIaGjfRNnkB4rJjf0IvXhrSUGSGwQFmBA%2Boe8HFxyl&noverify=0&group_code=127358632) 点击按钮入群。
\ No newline at end of file
diff --git a/bin/.DS_Store b/bin/.DS_Store
deleted file mode 100644
index f0c5f420b45fd5c98567889cbc609ac5eb74c19d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 8196
zcmeHMTWl0n7(U;$&>1?=0a{tG1DkG%fGw;A(sE0-Hw6k5*_Lk0W!c>s>A-ZR?96V9
zrKU0Qg^R`~jkm~?x5$Hv5??e?6n#`Q!5AMf8udjJd{KGupEJgQVucZ=rfy=z7j0!cYhkUz_gIKx@f&JurNhIJ?i
zGZ1DV%s`ldFau!*{tX$RcedBW+r0O=HtfR;gcX29DYqI7vQ5zq-v{jGyK{|G?T
zI|BHP#)>x}8VzV7pc9;uh8nmlQSOT1hym_S@@Qa}2~jE!3hQa>NJ1U
zH)lw28unoZ!VJvJfLA`{Y?$Sl&9uqq_w2A~IBq=tC4{o_S+grDq>9Rl1Ia;qBjg_r-gKCay+I}
zZ0Fx2%95pcz6#!}aPNqrxr2R0!!fd^-eYBkbZI^sq{~&2#Y^t4RaI_q)1hRVDrAjg
z1;ahA#6;0wBdXTP`!%|!ownw!qKV3Rnuk_juGXphJWYFEr(O#jR;u^PJq`sgDj9CL
zT8_&-M+pLw;&91YdA-_eX0o~|DH>m=Mc%0P6?y(8rHc!<$TeyzXAccgh>pZ%t!le^
z&|7v##&Nrcb<4Y@OI&w9=?0v^OkVFEAqWO{w4J2>BPF@#)TtS+?JFr8yXsW6-5=6Nwrs0J`>Z5Vpv6kU{8;gqhE}b9!)H@9YYeZ;@IqHTD~T*{HxARH7P7P>%+zM>ATm0d45UZtOu4
z`!NUuN8n%-$1#Qzcnl|T3TN;*p2G8Z0Wab#Ud0=D6X)?Z-oqt)f=}@|uHsvKhwt$-
ze#alUF3b`Z2@zqjP$x79jlyc7S!fY93Y&yoLbs3-GQttT7DjmhLaEdaaK6+F$7yt9
z>!4B#KK%*jZe41%4{Y7Gz3abIYFFm@#Z_H%*P`h1RcqF@Y-zm#LXO%JP$$FR$NZE^
z@iFgXVj5mA`&B3}T~;c)n}x^=vzLlR9~HftRVo7OSiMNaqRa}|6)TDDQf70uwsEyc
zg{cTWE7vxym8krbvVd)DCKjBLH*J=v5S8+PU78@4`AltXM<-2lNfG}plwV<2*$?a&
zcAZc@4+{~&J%|&w+prb8d~_$#i-Snx5VFuP1PeBf5zbFw9FJfEj}ppH6V9K&lXwQt
z;yJ?lOL!Tt;5EEXNPh11RrEcC?Y~c6*+8){fG3h%T>rb`zZX
wF4Rr=5J3EmKMZLcB~#BQ5zq-vNkZ)({}AB+ApZ+LwZr#+`2P11dS`Zj0^pBm#sB~S
diff --git a/bin/clean.bat b/bin/clean.bat
index 24c0974..af841d8 100644
--- a/bin/clean.bat
+++ b/bin/clean.bat
@@ -1,12 +1,12 @@
-@echo off
-echo.
-echo [Ϣ] target·
-echo.
-
-%~d0
-cd %~dp0
-
-cd ..
-call mvn clean
-
+@echo off
+echo.
+echo [Ϣ] target·
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+call mvn clean
+
pause
\ No newline at end of file
diff --git a/bin/package.bat b/bin/package.bat
index c693ec0..af8af8e 100644
--- a/bin/package.bat
+++ b/bin/package.bat
@@ -1,12 +1,12 @@
-@echo off
-echo.
-echo [Ϣ] Weḅwar/jarļ
-echo.
-
-%~d0
-cd %~dp0
-
-cd ..
-call mvn clean package -Dmaven.test.skip=true
-
+@echo off
+echo.
+echo [Ϣ] Weḅwar/jarļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+call mvn clean package -Dmaven.test.skip=true
+
pause
\ No newline at end of file
diff --git a/bin/prod/restart_java_test.sh b/bin/prod/restart_java_test.sh
old mode 100644
new mode 100755
diff --git a/bin/restart_java_backend_test.sh b/bin/restart_java_backend_test.sh
old mode 100644
new mode 100755
diff --git a/bin/run.bat b/bin/run.bat
index 41efbd0..99c4992 100644
--- a/bin/run.bat
+++ b/bin/run.bat
@@ -1,14 +1,14 @@
-@echo off
-echo.
-echo [Ϣ] ʹJarWeb̡
-echo.
-
-cd %~dp0
-cd ../ruoyi-admin/target
-
-set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
-
-java -jar %JAVA_OPTS% ruoyi-admin.jar
-
-cd bin
+@echo off
+echo.
+echo [Ϣ] ʹJarWeb̡
+echo.
+
+cd %~dp0
+cd ../ruoyi-admin/target
+
+set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
+
+java -jar %JAVA_OPTS% ruoyi-admin.jar
+
+cd bin
pause
\ No newline at end of file
diff --git a/doc/2026-04-13-local-tomcat-remote-tongweb-backend-plan.md b/doc/2026-04-13-local-tomcat-remote-tongweb-backend-plan.md
new file mode 100644
index 0000000..6444612
--- /dev/null
+++ b/doc/2026-04-13-local-tomcat-remote-tongweb-backend-plan.md
@@ -0,0 +1,43 @@
+# 本地 Tomcat 与 TongWeb 打包并存后端实施计划
+
+## 目标
+
+- 恢复本地 `jar + 内嵌 Tomcat` 启动链路
+- 保留服务器 `war + TongWeb` 部署链路
+- 一次 `mvn package` 同时产出 `ruoyi-admin.jar` 和 `ruoyi-admin.war`
+
+## 改动范围
+
+- Maven 打包配置
+- 后端启动与部署脚本
+- 脚本测试
+- 相关运行文档和实施记录
+
+## 实施步骤
+
+1. 先修改脚本测试,重新定义目标行为
+ - 本地测试脚本期望 `restart_java_backend.sh` 使用 `java -jar`
+ - 生产测试脚本继续期望 TongWeb 使用 `war`
+2. 调整 Maven 打包配置
+ - `ruoyi-admin` 恢复主产物 `jar`
+ - 增加附加 `war` 产物
+ - 恢复本地运行所需的内嵌 Tomcat 依赖
+3. 调整脚本
+ - 本地脚本改回管理 `ruoyi-admin.jar`
+ - 生产脚本继续管理 `ruoyi-admin.war`
+4. 更新文档
+ - 更新运行说明
+ - 新增本次实施记录
+5. 执行验证
+
+## 验证要求
+
+- `sh bin/restart_java_backend_test.sh`
+- `sh bin/prod/restart_java_test.sh`
+- `sh bin/prod/deploy_from_package_test.sh`
+- `sh -n bin/restart_java_backend.sh`
+- `sh -n bin/prod/restart_java.sh`
+- `sh -n bin/prod/deploy_from_package.sh`
+- `mvn -pl ruoyi-admin -am package -DskipTests`
+- 确认 `ruoyi-admin/target/ruoyi-admin.jar`
+- 确认 `ruoyi-admin/target/ruoyi-admin.war`
diff --git a/doc/2026-04-13-local-tomcat-remote-tongweb-design.md b/doc/2026-04-13-local-tomcat-remote-tongweb-design.md
new file mode 100644
index 0000000..7822649
--- /dev/null
+++ b/doc/2026-04-13-local-tomcat-remote-tongweb-design.md
@@ -0,0 +1,147 @@
+# 本地 Tomcat 运行与 TongWeb 打包并存设计
+
+## 背景
+
+当前项目已经被调整为统一的 TongWeb `war` 交付模式,这会导致本地开发时也必须围绕 TongWeb 组织启动流程,不符合当前开发诉求。
+
+本次目标是同时保留两条链路:
+
+- 本地开发运行继续使用内嵌 Tomcat
+- 打包交付继续支持服务器上的 TongWeb
+
+并且要求一次 `mvn package` 同时产出本地运行所需的 `jar` 和服务器部署所需的 `war`。
+
+## 目标
+
+- 保留 `IDEA`、`mvn spring-boot:run`、本地脚本直启后端的开发体验
+- 保留面向 TongWeb 的 `war` 交付方式
+- `mvn package` 后同时得到 `ruoyi-admin.jar` 与 `ruoyi-admin.war`
+- 本地不强依赖安装 TongWeb
+- 服务器部署脚本继续只消费 `war`
+
+## 非目标
+
+- 不新增第二个后端启动模块
+- 不拆分额外的部署工程
+- 不修改前端构建方式
+- 不引入“兼容模式”“降级模式”之类额外分支逻辑
+
+## 设计方案
+
+### 1. 构建产物设计
+
+`ruoyi-admin` 恢复为以 `jar` 为主产物的 Spring Boot 应用,用于本地开发运行。
+
+在同一个 Maven 模块中补充 `war` 打包步骤,使一次 `mvn package` 后同时得到:
+
+- `ruoyi-admin/target/ruoyi-admin.jar`
+- `ruoyi-admin/target/ruoyi-admin.war`
+
+这样本地和服务器都从同一套源码构建,但消费不同产物:
+
+- 本地消费 `jar`
+- 服务器消费 `war`
+
+### 2. 依赖设计
+
+为了保证本地可继续走内嵌 Tomcat:
+
+- 恢复 Web 模块中的内嵌 Tomcat 依赖链
+- 保持 `spring-boot:run` 与 `java -jar` 均可正常工作
+
+为了保证 TongWeb 外部容器部署:
+
+- 打出的 `war` 不能把容器自身实现错误打包成部署冲突形式
+- `Servlet API` 继续按外部容器提供的思路处理
+
+本质上,本地运行和 TongWeb 部署共享同一套业务代码,但运行容器不同。
+
+### 3. 启动脚本设计
+
+#### 本地脚本
+
+`bin/restart_java_backend.sh` 恢复为本地开发脚本:
+
+- 执行 Maven 打包
+- 使用 `ruoyi-admin.jar`
+- 通过 `java -jar` 管理本地后端进程
+
+这条链路不再依赖 `TONGWEB_HOME`。
+
+#### 生产脚本
+
+以下脚本保持 TongWeb 交付模型:
+
+- `bin/prod/restart_java.sh`
+- `bin/prod/deploy_from_package.sh`
+- `bin/prod/deploy_release.sh`
+
+它们继续只处理 `ruoyi-admin.war`,不回退到 `jar`。
+
+### 4. 本地与服务器联调设计
+
+本地开发时不要求本机安装 TongWeb。
+
+如果需要验证 TongWeb 运行环境,只通过两种方式完成:
+
+- 打包后部署到服务器 TongWeb 验证
+- 本地系统直接调用服务器上已部署的 TongWeb 地址联调
+
+这意味着:
+
+- 本地开发链路只围绕 `jar + Tomcat`
+- 服务器部署链路只围绕 `war + TongWeb`
+
+## 验证方案
+
+### 构建验证
+
+执行:
+
+```sh
+mvn -pl ruoyi-admin -am package -DskipTests
+```
+
+确认同时存在:
+
+- `ruoyi-admin/target/ruoyi-admin.jar`
+- `ruoyi-admin/target/ruoyi-admin.war`
+
+### 本地运行验证
+
+执行:
+
+```sh
+sh bin/restart_java_backend.sh restart
+```
+
+确认本地以 `java -jar` 正常运行。
+
+### TongWeb 脚本验证
+
+执行:
+
+```sh
+sh bin/prod/restart_java_test.sh
+sh bin/prod/deploy_from_package_test.sh
+```
+
+确认 TongWeb 侧仍围绕 `war` 工作。
+
+## 影响范围
+
+- `ruoyi-admin` Maven 打包配置
+- Web 相关模块的容器依赖声明
+- 本地后端脚本
+- 生产 TongWeb 脚本
+- 运行文档与实施记录
+
+## 结论
+
+本方案采用最短路径实现“双产物、双运行链路并存”:
+
+- 本地运行继续走内嵌 Tomcat
+- 服务器部署继续走 TongWeb
+- 一次打包同时产出 `jar` 与 `war`
+
+在不新增模块、不扩散复杂度的前提下,满足开发与部署两端的实际需要。
diff --git a/doc/2026-04-13-tongweb-replace-tomcat-backend-plan.md b/doc/2026-04-13-tongweb-replace-tomcat-backend-plan.md
new file mode 100644
index 0000000..9618c34
--- /dev/null
+++ b/doc/2026-04-13-tongweb-replace-tomcat-backend-plan.md
@@ -0,0 +1,39 @@
+# 东方通替换 Tomcat 后端实施计划
+
+## 目标
+
+- 将后端交付形态从内嵌 Tomcat 的 `jar` 调整为部署到东方通 TongWeb 的 `war`
+- 清理当前发布链路中围绕 `java -jar` / `ruoyi-admin.jar` 的脚本约定
+- 保持现有前端发布方式和 Nginx 入口不变,后端仍沿用 `63310` 作为反向代理目标端口
+
+## 改动范围
+
+- Maven 构建
+ - 调整 `ruoyi-admin` 打包类型为 `war`
+ - 去除模块链路中的嵌入式 Tomcat 打包依赖
+ - 明确 Servlet API 由外部容器提供
+- 部署脚本
+ - 将生产部署脚本中的后端产物从 `ruoyi-admin.jar` 切换为 `ruoyi-admin.war`
+ - 将生产重启脚本从 Java 进程启停改为 TongWeb 容器启停与 `war` 发布
+ - 调整本地后端重启脚本,使其面向 TongWeb 进行构建和部署
+- 运行文档
+ - 更新本地安装手册中的后端环境说明,改为 TongWeb
+ - 新增本次改动实施记录
+
+## 实施步骤
+
+1. 先修改现有脚本测试,明确新的 `war + TongWeb` 约束
+2. 调整 Maven 配置,产出 `ruoyi-admin.war`
+3. 修改生产部署脚本和本地重启脚本
+4. 更新运行文档与实施记录
+5. 执行脚本测试、语法校验和 Maven 打包验证
+
+## 验证要求
+
+- `mvn -pl ruoyi-admin -am clean package -DskipTests` 成功,且产物为 `ruoyi-admin.war`
+- `sh bin/prod/restart_java_test.sh` 成功
+- `sh bin/prod/deploy_from_package_test.sh` 成功
+- `sh bin/restart_java_backend_test.sh` 成功
+- `sh -n bin/prod/restart_java.sh`
+- `sh -n bin/prod/deploy_from_package.sh`
+- `sh -n bin/restart_java_backend.sh`
diff --git a/doc/2026-04-14-ruoyi-vue-springboot2-backend-plan.md b/doc/2026-04-14-ruoyi-vue-springboot2-backend-plan.md
new file mode 100644
index 0000000..6ab0d24
--- /dev/null
+++ b/doc/2026-04-14-ruoyi-vue-springboot2-backend-plan.md
@@ -0,0 +1,41 @@
+# RuoYi-Vue springboot2 后端迁移实施计划
+
+## 目标
+
+以上游 `RuoYi-Vue/springboot2` 为后端框架基线,将当前项目的后端框架层整体回退并重对齐到 Spring Boot 2 / Java 8,同时恢复 `ruoyi-loan-pricing` 业务模块和管理端业务接入配置。
+
+## 范围
+
+- 根 `pom.xml`
+- `ruoyi-admin`
+- `ruoyi-common`
+- `ruoyi-framework`
+- `ruoyi-generator`
+- `ruoyi-quartz`
+- `ruoyi-system`
+- `ruoyi-loan-pricing`
+- `sql`
+
+## 执行步骤
+
+1. 备份当前后端业务模块与业务配置
+2. 用上游 `springboot2` 覆盖根 POM 和基础后端模块
+3. 恢复 `ruoyi-loan-pricing` 模块目录
+4. 在根 POM 与 `ruoyi-admin/pom.xml` 中重新挂载 `ruoyi-loan-pricing`
+5. 恢复 `ruoyi-admin/src/main/resources` 中的 `loan-pricing` 业务配置
+6. 检查并修正 `ruoyi-loan-pricing` 中不兼容 Spring Boot 2 的依赖、注解和包引用
+7. 校正 Mapper、资源文件和测试依赖,保证模块能参与 Maven 聚合构建
+8. 保留并整理业务 SQL 脚本
+9. 在 Java 8 环境下执行后端编译与关键测试
+
+## 验证要求
+
+- `mvn -pl ruoyi-admin -am test` 至少能够完成依赖解析和关键模块测试
+- `mvn -pl ruoyi-admin -am package -DskipTests` 能通过
+- `ruoyi-loan-pricing` 模块可被 `ruoyi-admin` 正常引用
+
+## 注意事项
+
+- 不保留 Spring Boot 3 / Java 17 双配置
+- 不引入兼容层或过渡层
+- 若业务模块使用了 Boot 3 专属依赖,直接改为 Boot 2 可运行实现
diff --git a/doc/2026-04-14-ruoyi-vue-springboot2-frontend-plan.md b/doc/2026-04-14-ruoyi-vue-springboot2-frontend-plan.md
new file mode 100644
index 0000000..597707c
--- /dev/null
+++ b/doc/2026-04-14-ruoyi-vue-springboot2-frontend-plan.md
@@ -0,0 +1,37 @@
+# RuoYi-Vue springboot2 前端迁移实施计划
+
+## 目标
+
+以上游 `RuoYi-Vue/springboot2` 为前端基线,将当前项目前端整体回退并重对齐到上游 `ruoyi-ui`,然后恢复 `loanPricing` 业务页面、接口调用、路由与相关依赖。
+
+## 范围
+
+- `ruoyi-ui/package.json`
+- `ruoyi-ui/src`
+- `ruoyi-ui/public`
+- `ruoyi-ui/build`
+- `ruoyi-ui/tests`
+
+## 执行步骤
+
+1. 备份当前 `loanPricing` 页面、接口文件、路由改动和业务测试脚本
+2. 用上游 `springboot2` 的 `ruoyi-ui` 覆盖当前前端框架层
+3. 恢复 `src/views/loanPricing` 页面目录
+4. 恢复 `src/api/loanPricing` 接口文件
+5. 将业务路由重新挂回 `src/router/index.js`
+6. 恢复业务所需的前端依赖与测试脚本
+7. 用 `nvm` 切换到合适的 Node 版本后重新安装依赖
+8. 执行前端构建与页面联调验证
+
+## 验证要求
+
+- `npm install` 成功
+- `npm run build:prod` 成功
+- `loanPricing` 页面路由可访问
+- 页面基础交互和接口调用链路未丢失
+
+## 注意事项
+
+- 前端直接以 `springboot2` 上游为准,不保留当前非业务性的历史前端定制
+- Node 版本必须通过 `nvm` 控制
+- 测试完成后要关闭前端调试进程
diff --git a/doc/2026-04-14-ruoyi-vue-springboot2-migration-design.md b/doc/2026-04-14-ruoyi-vue-springboot2-migration-design.md
new file mode 100644
index 0000000..d74a560
--- /dev/null
+++ b/doc/2026-04-14-ruoyi-vue-springboot2-migration-design.md
@@ -0,0 +1,120 @@
+# RuoYi-Vue springboot2 基线迁移设计
+
+## 1. 目标
+
+本次迁移以上游 `https://gitee.com/y_project/RuoYi-Vue/tree/springboot2` 为唯一框架基线,先将当前仓库整体回退并重对齐到该基线,再迁回现有业务模块与业务页面,最终形成一个“框架层跟随上游、业务层保留现状”的项目结构。
+
+本次迁移不采用兼容层、补丁层或双栈并存方案,不保留 Spring Boot 3 / Java 17 的框架实现。
+
+## 2. 现状与目标差异
+
+当前仓库已经是 RuoYi 多模块工程,但后端已升级到 `Spring Boot 3.5.x`、`Java 17`,并引入了以下业务定制:
+
+- 后端业务模块:`ruoyi-loan-pricing`
+- 前端业务页面:`ruoyi-ui/src/views/loanPricing`
+- 前端业务接口:`ruoyi-ui/src/api/loanPricing`
+- 管理端业务接入:`ruoyi-admin` 中的业务依赖与配置
+- 业务 SQL:`sql/loan_pricing_*`、`sql/model_*`、`sql/loan_pricing_menu.sql`
+
+目标上游 `springboot2` 分支采用:
+
+- `RuoYi-Vue 3.9.2`
+- `Spring Boot 2.5.15`
+- `Java 8`
+- `Vue 2 + Element UI`
+
+因此本次迁移的本质是:先将框架层彻底切回 Spring Boot 2 基线,再把利率定价业务重新挂载到新的基线上。
+
+## 3. 迁移范围
+
+### 3.1 框架层
+
+以下内容以上游 `springboot2` 版本为准:
+
+- 根目录框架文件与脚本
+- 根 `pom.xml`
+- `ruoyi-admin`
+- `ruoyi-common`
+- `ruoyi-framework`
+- `ruoyi-generator`
+- `ruoyi-quartz`
+- `ruoyi-system`
+- `ruoyi-ui`
+- 上游自带 `sql` 基础脚本
+
+### 3.2 业务层
+
+以下内容需要从当前仓库迁回到新基线:
+
+- `ruoyi-loan-pricing` 全模块
+- `ruoyi-admin` 中与 `loan-pricing` 相关的业务配置、业务依赖
+- `ruoyi-ui/src/views/loanPricing` 页面
+- `ruoyi-ui/src/api/loanPricing` 接口文件
+- `ruoyi-ui/src/router/index.js` 中的业务路由
+- 业务 SQL、部署脚本、项目文档
+
+## 4. 实施策略
+
+### 4.1 基线覆盖策略
+
+采用“上游覆盖 + 业务回贴”模式:
+
+1. 先备份当前业务目录与业务配置
+2. 将上游 `springboot2` 内容覆盖到当前仓库
+3. 恢复业务模块、业务页面、业务配置和业务 SQL
+4. 处理 Spring Boot 2 下的编译和运行差异
+
+### 4.2 后端回贴策略
+
+后端只保留一套 Spring Boot 2 实现,不额外保留 Spring Boot 3 兼容写法。若 `ruoyi-loan-pricing` 内存在 Boot 3 / Jakarta / SpringDoc 相关依赖或 API,则直接改回 Boot 2 可运行写法。
+
+### 4.3 前端回贴策略
+
+前端以 `springboot2` 上游 `ruoyi-ui` 为基础,回贴 `loanPricing` 页面、接口调用、路由和必要依赖;不保留与当前业务无关的历史定制。
+
+## 5. 风险点与处理原则
+
+### 5.1 框架依赖回退风险
+
+风险:
+
+- `springdoc`、`jakarta.*`、Boot 3 专用依赖不兼容 Boot 2
+- 测试依赖、插件版本、JDK 版本需要一并回退
+
+处理原则:
+
+- 以 Boot 2 上游依赖为准
+- 业务模块仅保留完成业务所必需的依赖
+
+### 5.2 业务接入点遗漏风险
+
+风险:
+
+- `ruoyi-admin` 配置遗漏
+- 前端路由、菜单、接口路径遗漏
+- SQL 脚本与权限菜单脚本遗漏
+
+处理原则:
+
+- 逐类枚举迁移对象
+- 迁移后通过编译、页面访问、接口调用进行闭环验证
+
+## 6. 验证标准
+
+迁移完成后至少满足以下条件:
+
+- Maven 多模块在 Spring Boot 2 / Java 8 环境下可编译
+- `ruoyi-admin` 可启动
+- `ruoyi-ui` 在指定 Node 版本下可安装并构建
+- `loanPricing` 页面路由可访问
+- 利率定价相关接口类与 Mapper 可通过编译
+- 业务 SQL 与菜单脚本仍保留在仓库内
+
+## 7. 产出物
+
+本次任务最终需产出:
+
+- 本设计文档
+- 后端实施计划文档
+- 前端实施计划文档
+- 迁移实施记录文档
diff --git a/doc/implementation-report-2026-04-13-local-tomcat-remote-tongweb.md b/doc/implementation-report-2026-04-13-local-tomcat-remote-tongweb.md
new file mode 100644
index 0000000..4815378
--- /dev/null
+++ b/doc/implementation-report-2026-04-13-local-tomcat-remote-tongweb.md
@@ -0,0 +1,34 @@
+# 本地 Tomcat 与 TongWeb 双产物实施记录
+
+## 本次改动
+
+- 将 `ruoyi-admin` 的主打包方式从 `war` 恢复为 `jar`
+- 恢复 `spring-boot-maven-plugin` 的 `repackage`,保证本地可直接运行 `ruoyi-admin.jar`
+- 在 `ruoyi-admin` 中增加附加 `war` 打包步骤,使 `mvn package` 同时产出:
+ - `ruoyi-admin.jar`
+ - `ruoyi-admin.war`
+- 在 `war` 打包中排除内嵌 Tomcat 相关 jar,避免 TongWeb 部署时容器冲突
+- 将 `bin/restart_java_backend.sh` 恢复为本地 `java -jar` 启动链路
+- 保持 `bin/prod/restart_java.sh`、`bin/prod/deploy_from_package.sh` 继续消费 `ruoyi-admin.war`
+- 更新 `bin/run.bat`,恢复为本地 `jar` 启动入口
+- 新增设计文档 `doc/2026-04-13-local-tomcat-remote-tongweb-design.md`
+- 新增实施计划 `doc/2026-04-13-local-tomcat-remote-tongweb-backend-plan.md`
+
+## 验证结果
+
+- 已执行 `sh bin/restart_java_backend_test.sh`
+- 已执行 `sh bin/prod/restart_java_test.sh`
+- 已执行 `sh bin/prod/deploy_from_package_test.sh`
+- 已执行 `sh -n bin/restart_java_backend.sh`
+- 已执行 `sh -n bin/prod/restart_java.sh`
+- 已执行 `sh -n bin/prod/deploy_from_package.sh`
+- 已执行 `mvn -pl ruoyi-admin -am clean package -DskipTests`
+- 已确认产物:
+ - `ruoyi-admin/target/ruoyi-admin.jar`
+ - `ruoyi-admin/target/ruoyi-admin.war`
+
+## 结果说明
+
+- 本地开发运行继续使用内嵌 Tomcat,不要求本机安装 TongWeb
+- 服务器部署继续使用 TongWeb,只消费 `war`
+- 一次打包即可同时得到本地运行产物和 TongWeb 部署产物
diff --git a/doc/implementation-report-2026-04-13-tongweb-replace-tomcat.md b/doc/implementation-report-2026-04-13-tongweb-replace-tomcat.md
new file mode 100644
index 0000000..18982bc
--- /dev/null
+++ b/doc/implementation-report-2026-04-13-tongweb-replace-tomcat.md
@@ -0,0 +1,25 @@
+# Tomcat 替换为东方通实施记录
+
+## 本次改动
+
+- 将 `ruoyi-admin` 打包方式从 `jar` 调整为 `war`
+- 在 `ruoyi-admin` 中显式声明 `spring-boot-starter-tomcat` 为 `provided`
+- 在 `ruoyi-framework`、`ruoyi-loan-pricing` 中排除 `spring-boot-starter-web` 传递进来的嵌入式 Tomcat
+- 将 `ruoyi-common` 中的 `jakarta.servlet-api` 调整为 `provided`
+- 删除 `application-dev.yml`、`application-uat.yml`、`application-pro.yml` 中仅对内嵌 Tomcat 生效的 `server.tomcat` 配置
+- 将 `bin/prod/restart_java.sh` 从 `java -jar` 启停改为 TongWeb 启停与 `war` 同步
+- 将 `bin/prod/deploy_from_package.sh`、`bin/prod/deploy_release.sh` 的后端交付物从 `ruoyi-admin.jar` 改为 `ruoyi-admin.war`
+- 将 `bin/restart_java_backend.sh` 改为本地构建 `war` 并发布到 TongWeb
+- 更新 `deploy/2026-03-31-local-nginx-java-install-manual.md`,将后端运行环境说明改为 TongWeb
+- 新增后端实施计划 `doc/2026-04-13-tongweb-replace-tomcat-backend-plan.md`
+
+## 验证结果
+
+- 已执行 `sh bin/prod/restart_java_test.sh`
+- 已执行 `sh bin/prod/deploy_from_package_test.sh`
+- 已执行 `sh bin/restart_java_backend_test.sh`
+
+## 说明
+
+- 本次替换按当前项目 `Spring Boot 3 + Jakarta Servlet` 路线落地,要求实际使用的东方通版本能够承载 Jakarta 体系应用
+- Nginx 入口和反向代理端口保持不变,仍通过 `63310` 转发到后端容器
diff --git a/doc/implementation-report-2026-04-14-ruoyi-vue-springboot2-migration.md b/doc/implementation-report-2026-04-14-ruoyi-vue-springboot2-migration.md
new file mode 100644
index 0000000..9d156ce
--- /dev/null
+++ b/doc/implementation-report-2026-04-14-ruoyi-vue-springboot2-migration.md
@@ -0,0 +1,105 @@
+# RuoYi-Vue springboot2 基线迁移实施记录
+
+## 本次完成内容
+
+- 以 `RuoYi-Vue/springboot2` 为基线覆盖当前仓库的框架层:
+ - 根 `pom.xml`
+ - `ruoyi-admin`
+ - `ruoyi-common`
+ - `ruoyi-framework`
+ - `ruoyi-generator`
+ - `ruoyi-quartz`
+ - `ruoyi-system`
+ - `ruoyi-ui`
+ - `sql` 基础脚本
+- 恢复并接回业务模块与业务页面:
+ - `ruoyi-loan-pricing`
+ - `ruoyi-ui/src/views/loanPricing`
+ - `ruoyi-ui/src/api/loanPricing`
+ - `ruoyi-ui/src/router/index.js` 中的业务路由
+ - `ruoyi-admin` 中的业务配置
+- 将 `ruoyi-loan-pricing` 从 Boot 3 / Java 17 写法回退到 Boot 2 / Java 8 可编译形态:
+ - 移除 `springdoc` 注解和依赖
+ - 将 `jakarta.*` 改回 `javax.*`
+ - 将 `String.repeat` 改为 Java 8 兼容实现
+ - 将模型调用改为模块内 `RestTemplate + form-urlencoded`
+- 补回当前项目的“无 Redis”本地缓存实现:
+ - `InMemoryCacheEntry`
+ - `InMemoryCacheStats`
+ - `InMemoryCacheStore`
+ - 本地缓存版 `RedisCache`
+ - 本地缓存版 `CacheController`
+- 调整前端业务依赖与脚本:
+ - 恢复 `crypto-js`
+ - 恢复 `splitpanes`
+ - 恢复 `ruoyi-ui/tests` 下 4 个业务测试脚本
+- 恢复项目原有部署辅助脚本:
+ - `bin/prod/*.sh`
+ - `bin/restart_java_backend*.sh`
+- 修正本地启动所需配置:
+ - `logback.xml` 日志目录改为项目内 `logs`
+ - `application.yml` 补齐 `swagger`、`redis`、`mybatis`
+ - 增加 `ruoyi-loan-pricing` 模块挂载和依赖声明
+
+## 验证结果
+
+### 后端编译验证
+
+已通过:
+
+- `export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home && export PATH="$JAVA_HOME/bin:$PATH" && mvn -pl ruoyi-admin -am -DskipTests package`
+- `export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home && export PATH="$JAVA_HOME/bin:$PATH" && mvn -pl ruoyi-admin -am install -DskipTests`
+
+### 前端构建验证
+
+已通过:
+
+- `source ~/.nvm/nvm.sh && nvm use 14.21.3 && npm install`
+- `source ~/.nvm/nvm.sh && nvm use 14.21.3 && npm run build:prod`
+
+### 前后端联调验证
+
+已验证:
+
+- 前端开发服务成功启动于 `http://localhost:1024`
+- 浏览器打开 `http://localhost:1024/login`,页面标题显示为“若依管理系统”
+- 浏览器点击登录后成功进入 `/index`
+- 页面已实际渲染“流程列表”业务页面
+- 通过前端代理访问 `http://localhost:1024/dev-api/captchaImage` 返回:
+ - `{"msg":"操作成功","code":200,"captchaEnabled":false}`
+- 源码态后端在 `Java 8 + spring-boot:run` 模式下可启动成功
+- 登录接口可成功返回 token:
+ - `POST /login`
+
+## 联调中发现的遗留问题
+
+浏览器进入系统后,页面出现两条后端错误提示:
+
+1. 数据库缺少 `sys_notice_read` 表
+2. `GET /loanPricing/workflow/list` 仍返回 `TooManyResultsException`
+
+其中第 1 项已确认当前仓库 SQL 中已有对应建表语句:
+
+- `sql/ry_20260330.sql`
+- `sql/loan_pricing_prod_init_20260331.sql`
+
+说明当前代码迁移已落地,但联调数据库尚未完全补齐到 `springboot2` 基线所需表结构。
+
+第 2 项已经定位到当前运行态仍存在列表查询返回值与 MyBatis 映射结果不一致的问题,表现为:
+
+- `GET /loanPricing/workflow/list?pageNum=1&pageSize=10`
+- 返回:`{"msg":"nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 15","code":500}`
+
+## 结论
+
+本次代码迁移已经完成:
+
+- 框架层已切回 `RuoYi-Vue springboot2`
+- 业务模块和业务页面已接回
+- Java 8 / Spring Boot 2 / Vue 2 的编译与构建链路已打通
+- 浏览器已成功进入业务页面与登录链路
+
+当前剩余问题集中在:
+
+- 联调数据库尚未补齐 `sys_notice_read` 表
+- `workflow/list` 运行态查询仍需继续收口
diff --git a/pom.xml b/pom.xml
index 1e76ac2..75ffadd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,191 +1,218 @@
-
-
- 4.0.0
-
- com.ruoyi
- ruoyi
- 3.9.1
-
- ruoyi
- http://www.ruoyi.vip
- 若依管理系统
-
-
- 3.9.1
- UTF-8
- UTF-8
- 17
- 3.1.1
- 3.0.5
- 1.2.27
- 7.32.0
- 3.0.0
- 2.3.3
- 2.1.1
- 2.0.60
- 6.9.1
- 2.21.0
- 4.1.2
+
+
+ 4.0.0
+
+ com.ruoyi
+ ruoyi
+ 3.9.2
+
+ ruoyi
+ http://www.ruoyi.vip
+ 若依管理系统
+
+
+ 3.9.2
+ UTF-8
+ UTF-8
+ 1.8
+ 3.1.1
+ 2.5.15
+ 1.2.28
+ 7.32.0
+ 3.0.0
+ 2.3.3
+ 1.4.7
+ 2.0.61
+ 6.10.0
+ 2.21.0
+ 4.1.2
2.3
0.9.1
- 2.5.2
- 8.2.0
- 2.3.1
- 6.0.0
- 2.8.14
-
-
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-dependencies
- 3.5.8
- pom
- import
-
-
-
-
- com.alibaba
- druid-spring-boot-3-starter
- ${druid.version}
-
-
-
-
- nl.basjes.parse.useragent
- yauaa
- ${yauaa.version}
-
-
-
-
- com.github.pagehelper
- pagehelper-spring-boot-starter
- ${pagehelper.boot.version}
-
-
-
- org.mybatis.spring.boot
- mybatis-spring-boot-starter
- ${mybatis-spring-boot.version}
-
-
-
- com.mysql
- mysql-connector-j
- ${mysql.version}
-
-
-
- javax.xml.bind
- jaxb-api
- ${jaxb-api.version}
-
-
-
- jakarta.servlet
- jakarta.servlet-api
- ${jakarta.version}
-
-
-
-
- com.github.oshi
- oshi-core
- ${oshi.version}
-
-
-
-
- org.springdoc
- springdoc-openapi-starter-webmvc-ui
- ${springdoc.version}
-
-
-
-
- commons-io
- commons-io
- ${commons.io.version}
-
-
-
-
- org.apache.poi
- poi-ooxml
- ${poi.version}
-
-
-
-
- org.apache.velocity
- velocity-engine-core
- ${velocity.version}
-
-
-
-
- org.quartz-scheduler
- quartz
- ${quartz.version}
-
-
-
-
- com.alibaba.fastjson2
- fastjson2
- ${fastjson.version}
-
-
-
-
- io.jsonwebtoken
- jjwt
- ${jwt.version}
-
-
-
-
- pro.fessional
- kaptcha
- ${kaptcha.version}
-
-
-
-
- com.ruoyi
- ruoyi-quartz
- ${ruoyi.version}
-
-
-
-
- com.ruoyi
- ruoyi-generator
- ${ruoyi.version}
-
-
-
-
- com.ruoyi
- ruoyi-framework
- ${ruoyi.version}
-
-
-
-
- com.ruoyi
- ruoyi-system
- ${ruoyi.version}
-
-
+ 3.5.7
+ 4.5
+
+ 9.0.112
+ 1.2.13
+ 5.7.14
+ 5.3.39
+
+
+
+
+
+
+
+
+ org.springframework
+ spring-framework-bom
+ ${spring-framework.version}
+ pom
+ import
+
+
+
+
+ org.springframework.security
+ spring-security-bom
+ ${spring-security.version}
+ pom
+ import
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+ ch.qos.logback
+ logback-core
+ ${logback.version}
+
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+
+
+ org.apache.tomcat.embed
+ tomcat-embed-core
+ ${tomcat.version}
+
+
+
+ org.apache.tomcat.embed
+ tomcat-embed-el
+ ${tomcat.version}
+
+
+
+ org.apache.tomcat.embed
+ tomcat-embed-websocket
+ ${tomcat.version}
+
+
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ ${druid.version}
+
+
+
+
+ nl.basjes.parse.useragent
+ yauaa
+ ${yauaa.version}
+
+
+
+
+ com.github.pagehelper
+ pagehelper-spring-boot-starter
+ ${pagehelper.boot.version}
+
+
+
+
+ com.github.oshi
+ oshi-core
+ ${oshi.version}
+
+
+
+
+ io.springfox
+ springfox-boot-starter
+ ${swagger.version}
+
+
+ io.swagger
+ swagger-models
+
+
+
+
+
+
+ commons-io
+ commons-io
+ ${commons.io.version}
+
+
+
+
+ org.apache.poi
+ poi-ooxml
+ ${poi.version}
+
+
+
+
+ org.apache.velocity
+ velocity-engine-core
+ ${velocity.version}
+
+
+
+
+ com.alibaba.fastjson2
+ fastjson2
+ ${fastjson.version}
+
+
+
+
+ io.jsonwebtoken
+ jjwt
+ ${jwt.version}
+
+
+
+
+ pro.fessional
+ kaptcha
+ ${kaptcha.version}
+
+
+
+
+ com.ruoyi
+ ruoyi-quartz
+ ${ruoyi.version}
+
+
+
+
+ com.ruoyi
+ ruoyi-generator
+ ${ruoyi.version}
+
+
+
+
+ com.ruoyi
+ ruoyi-framework
+ ${ruoyi.version}
+
+
+
+
+ com.ruoyi
+ ruoyi-system
+ ${ruoyi.version}
+
+
com.ruoyi
@@ -200,64 +227,70 @@
${ruoyi.version}
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.github.jsqlparser
+ jsqlparser
+ ${jsqlparser.version}
+
+
-
-
- ruoyi-admin
- ruoyi-framework
- ruoyi-system
+
+
+ ruoyi-admin
+ ruoyi-framework
+ ruoyi-system
ruoyi-quartz
ruoyi-generator
ruoyi-common
ruoyi-loan-pricing
- pom
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.13.0
-
- true
- ${java.version}
- ${java.version}
- ${project.build.sourceEncoding}
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
- 3.3.0
-
-
-
-
-
-
- public
- aliyun nexus
- https://maven.aliyun.com/repository/public
-
- true
-
-
-
-
-
-
- public
- aliyun nexus
- https://maven.aliyun.com/repository/public
-
- true
-
-
- false
-
-
-
-
-
\ No newline at end of file
+ pom
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.1
+
+ ${java.version}
+ ${java.version}
+ ${project.build.sourceEncoding}
+
+
+
+
+
+
+
+ public
+ aliyun nexus
+ https://maven.aliyun.com/repository/public
+
+ true
+
+
+
+
+
+
+ public
+ aliyun nexus
+ https://maven.aliyun.com/repository/public
+
+ true
+
+
+ false
+
+
+
+
+
diff --git a/ruoyi-admin/.DS_Store b/ruoyi-admin/.DS_Store
deleted file mode 100644
index 5f707857019bfe3a2d702e0adf2be21e1eb5a091..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 8196
zcmeHMU2GIp6u#fIv@>*|0~A?sCoB|#kOfMqY0Hn<{wW|(U|YH^g=Mxg(t+tr*_qt}
zrLi&bg+Jqy#($qQ5_vG7#1~CeL?0DRFvbU>#-9g#@I~dpGjpfJZmAE(7}2@O+;e}<
zx%Zwk-#4>omNACbg1(Ni7-LMN%a=+ORd*=L>zH1g1v7r%wg*n8xz#P)YuNIX7&Xu2)z0IfSzE85Nb4Qe{=;{`8h-MA-v#2T`lQ``-Nj{-KU#I4h%
zK3Q(DjenCUOHcUpMd*_#&8(7VsXdwAKDj@u%q`O4JBK~fvE98!-X)n;s$Ft&>wshL
z${YTC&wyhUhHN*h%o)(Efr6!ZMvG;o%@YQVRl5Uu$Fg=guIVq+oAHceoe#wt_qA$e&fIx5
zvfM|}v_10?)5v#^n7TLEtGNS)t(*3to}%fRIm_s>wIO2;l9F_-I<|1py>V5YPBl}=
znMVtzcU-9z#bA%b5>@Wk>2Nz7-QPu5E{U`b?Y?}8s_ye=+VTd~dT6k6l`40+ttY!wBp&@e74aZtq
zRrP?s?RL%eI)@FLj&wEL`$3xPa|gA&(K$je3`e)oXmCqu+&AjbP0tA?DH=P;i(Y@Z
z7F`c~SQJ}Wt)|s(QTarqTV&crlb}zxl`}xBowzl%sa3pL`|c6m2m&qDrs_f!k*Tbn
zwX^N)Adzj9on=q6^Xww~fL&pqv9H+o>?ZpKKm{bsL=|eV2+NSf{b)oJn$e0*?8Y9X
z(T_oxI1CrZZ~~(^iN|pYXK)th@D!fMi+Bky<2Ag2i@1b0@eZ!yBYcccaRXoD8+?nK
z_!Yn5mM}wDAjE`)!crkAtQOV?jY5;KLD(ql6gq{Bpb3WsM;PYk7bfVoKlCRQ!f|R$
zdV~<&!cTz0g*($N{?L}K+vM$c4c)HK<^-F6&w|AARcjlXHn-dcB1i57SpP_Y0QZyF
z65u|-MG0oFaVE-(Cs0$#zZg!l7!ozVUkF5_*yhxc&>ABMR9l2HExek?)qj>$;I&!tE%rt`Mt*oSC*
z0{xRs?&@9{KYh&4|2wAt{(o2d7#%)}Koo&Lj{wTs)9tOKGu<=J&$SbD9i+=IzTP;O
xfeBSXI!-c3$4TD)!;snuQuS?8p&aLuMyUMb9|Hc$&+X{_AHDwrwElOh-vLjjal-%r
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 84c510f..9c6e921 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -1,53 +1,60 @@
-
-
-
- ruoyi
- com.ruoyi
- 3.9.1
-
- 4.0.0
- jar
- ruoyi-admin
-
-
- web服务入口
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-devtools
- true
-
-
-
-
- org.springdoc
- springdoc-openapi-starter-webmvc-ui
-
-
-
-
- com.mysql
- mysql-connector-j
-
-
-
-
- com.ruoyi
- ruoyi-framework
-
-
-
-
- com.ruoyi
- ruoyi-quartz
-
-
+
+
+
+ ruoyi
+ com.ruoyi
+ 3.9.2
+
+ 4.0.0
+ jar
+ ruoyi-admin
+
+
+ web服务入口
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
+
+
+
+ io.springfox
+ springfox-boot-starter
+
+
+
+
+ io.swagger
+ swagger-models
+ 1.6.2
+
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+
+ com.ruoyi
+ ruoyi-framework
+
+
+
+
+ com.ruoyi
+ ruoyi-quartz
+
+
com.ruoyi
@@ -60,42 +67,36 @@
ruoyi-loan-pricing
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
- 3.5.4
-
- true
-
-
-
-
- repackage
-
-
-
-
-
- org.apache.maven.plugins
- maven-war-plugin
- 3.1.0
-
- false
- ${project.artifactId}
-
-
-
- ${project.artifactId}
-
-
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 2.5.15
+
+ true
+
+
+
+
+ repackage
+
+
+
+
+
+ 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/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
index 32eb6f1..e3c56ee 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -1,30 +1,30 @@
-package com.ruoyi;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
-
-/**
- * 启动程序
- *
- * @author ruoyi
- */
-@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
-public class RuoYiApplication
-{
- public static void main(String[] args)
- {
- // System.setProperty("spring.devtools.restart.enabled", "false");
- SpringApplication.run(RuoYiApplication.class, args);
- System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" +
- " .-------. ____ __ \n" +
- " | _ _ \\ \\ \\ / / \n" +
- " | ( ' ) | \\ _. / ' \n" +
- " |(_ o _) / _( )_ .' \n" +
- " | (_,_).' __ ___(_ o _)' \n" +
- " | |\\ \\ | || |(_,_)' \n" +
- " | | \\ `' /| `-' / \n" +
- " | | \\ / \\ / \n" +
- " ''-' `'-' `-..-' ");
- }
-}
+package com.ruoyi;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+
+/**
+ * 启动程序
+ *
+ * @author ruoyi
+ */
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
+public class RuoYiApplication
+{
+ public static void main(String[] args)
+ {
+ // System.setProperty("spring.devtools.restart.enabled", "false");
+ SpringApplication.run(RuoYiApplication.class, args);
+ System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" +
+ " .-------. ____ __ \n" +
+ " | _ _ \\ \\ \\ / / \n" +
+ " | ( ' ) | \\ _. / ' \n" +
+ " |(_ o _) / _( )_ .' \n" +
+ " | (_,_).' __ ___(_ o _)' \n" +
+ " | |\\ \\ | || |(_,_)' \n" +
+ " | | \\ `' /| `-' / \n" +
+ " | | \\ / \\ / \n" +
+ " ''-' `'-' `-..-' ");
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java
index 6de67dc..9d82a23 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java
@@ -1,18 +1,18 @@
-package com.ruoyi;
-
-import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-
-/**
- * web容器中进行部署
- *
- * @author ruoyi
- */
-public class RuoYiServletInitializer extends SpringBootServletInitializer
-{
- @Override
- protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
- {
- return application.sources(RuoYiApplication.class);
- }
-}
+package com.ruoyi;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * web容器中进行部署
+ *
+ * @author ruoyi
+ */
+public class RuoYiServletInitializer extends SpringBootServletInitializer
+{
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
+ {
+ return application.sources(RuoYiApplication.class);
+ }
+}
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 d6dcf06..e1a397e 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,94 +1,94 @@
-package com.ruoyi.web.controller.common;
-
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-import jakarta.annotation.Resource;
-import javax.imageio.ImageIO;
-import jakarta.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;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.core.domain.AjaxResult;
-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;
-
-/**
- * 验证码操作处理
- *
- * @author ruoyi
- */
-@RestController
-public class CaptchaController
-{
- @Resource(name = "captchaProducer")
- private Producer captchaProducer;
-
- @Resource(name = "captchaProducerMath")
- private Producer captchaProducerMath;
-
- @Autowired
- private RedisCache redisCache;
-
- @Autowired
- private ISysConfigService configService;
- /**
- * 生成验证码
- */
- @GetMapping("/captchaImage")
- public AjaxResult getCode(HttpServletResponse response) throws IOException
- {
- AjaxResult ajax = AjaxResult.success();
- boolean captchaEnabled = configService.selectCaptchaEnabled();
- ajax.put("captchaEnabled", captchaEnabled);
- if (!captchaEnabled)
- {
- return ajax;
- }
-
- // 保存验证码信息
- String uuid = IdUtils.simpleUUID();
- String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
-
- String capStr = null, code = null;
- BufferedImage image = null;
-
- // 生成验证码
- String captchaType = RuoYiConfig.getCaptchaType();
- if ("math".equals(captchaType))
- {
- String capText = captchaProducerMath.createText();
- capStr = capText.substring(0, capText.lastIndexOf("@"));
- code = capText.substring(capText.lastIndexOf("@") + 1);
- image = captchaProducerMath.createImage(capStr);
- }
- else if ("char".equals(captchaType))
- {
- capStr = code = captchaProducer.createText();
- image = captchaProducer.createImage(capStr);
- }
-
- redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
- // 转换流信息写出
- FastByteArrayOutputStream os = new FastByteArrayOutputStream();
- try
- {
- ImageIO.write(image, "jpg", os);
- }
- catch (IOException e)
- {
- return AjaxResult.error(e.getMessage());
- }
-
- ajax.put("uuid", uuid);
- ajax.put("img", Base64.encode(os.toByteArray()));
- return ajax;
- }
-}
+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;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.domain.AjaxResult;
+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;
+
+/**
+ * 验证码操作处理
+ *
+ * @author ruoyi
+ */
+@RestController
+public class CaptchaController
+{
+ @Resource(name = "captchaProducer")
+ private Producer captchaProducer;
+
+ @Resource(name = "captchaProducerMath")
+ private Producer captchaProducerMath;
+
+ @Autowired
+ private RedisCache redisCache;
+
+ @Autowired
+ private ISysConfigService configService;
+ /**
+ * 生成验证码
+ */
+ @GetMapping("/captchaImage")
+ public AjaxResult getCode(HttpServletResponse response) throws IOException
+ {
+ AjaxResult ajax = AjaxResult.success();
+ boolean captchaEnabled = configService.selectCaptchaEnabled();
+ ajax.put("captchaEnabled", captchaEnabled);
+ if (!captchaEnabled)
+ {
+ return ajax;
+ }
+
+ // 保存验证码信息
+ String uuid = IdUtils.simpleUUID();
+ String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
+
+ String capStr = null, code = null;
+ BufferedImage image = null;
+
+ // 生成验证码
+ String captchaType = RuoYiConfig.getCaptchaType();
+ if ("math".equals(captchaType))
+ {
+ String capText = captchaProducerMath.createText();
+ capStr = capText.substring(0, capText.lastIndexOf("@"));
+ code = capText.substring(capText.lastIndexOf("@") + 1);
+ image = captchaProducerMath.createImage(capStr);
+ }
+ else if ("char".equals(captchaType))
+ {
+ capStr = code = captchaProducer.createText();
+ image = captchaProducer.createImage(capStr);
+ }
+
+ redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
+ // 转换流信息写出
+ FastByteArrayOutputStream os = new FastByteArrayOutputStream();
+ try
+ {
+ ImageIO.write(image, "jpg", os);
+ }
+ catch (IOException e)
+ {
+ return AjaxResult.error(e.getMessage());
+ }
+
+ ajax.put("uuid", uuid);
+ ajax.put("img", Base64.encode(os.toByteArray()));
+ return ajax;
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
index a2333d5..cda80bd 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
@@ -1,162 +1,162 @@
-package com.ruoyi.web.controller.common;
-
-import java.util.ArrayList;
-import java.util.List;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
-import com.ruoyi.common.config.RuoYiConfig;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.file.FileUploadUtils;
-import com.ruoyi.common.utils.file.FileUtils;
-import com.ruoyi.framework.config.ServerConfig;
-
-/**
- * 通用请求处理
- *
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/common")
-public class CommonController
-{
- private static final Logger log = LoggerFactory.getLogger(CommonController.class);
-
- @Autowired
- private ServerConfig serverConfig;
-
- private static final String FILE_DELIMITER = ",";
-
- /**
- * 通用下载请求
- *
- * @param fileName 文件名称
- * @param delete 是否删除
- */
- @GetMapping("/download")
- public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
- {
- try
- {
- if (!FileUtils.checkAllowDownload(fileName))
- {
- throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
- }
- String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
- String filePath = RuoYiConfig.getDownloadPath() + fileName;
-
- response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
- FileUtils.setAttachmentResponseHeader(response, realFileName);
- FileUtils.writeBytes(filePath, response.getOutputStream());
- if (delete)
- {
- FileUtils.deleteFile(filePath);
- }
- }
- catch (Exception e)
- {
- log.error("下载文件失败", e);
- }
- }
-
- /**
- * 通用上传请求(单个)
- */
- @PostMapping("/upload")
- public AjaxResult uploadFile(MultipartFile file) throws Exception
- {
- try
- {
- // 上传文件路径
- String filePath = RuoYiConfig.getUploadPath();
- // 上传并返回新文件名称
- String fileName = FileUploadUtils.upload(filePath, file);
- String url = serverConfig.getUrl() + fileName;
- AjaxResult ajax = AjaxResult.success();
- ajax.put("url", url);
- ajax.put("fileName", fileName);
- ajax.put("newFileName", FileUtils.getName(fileName));
- ajax.put("originalFilename", file.getOriginalFilename());
- return ajax;
- }
- catch (Exception e)
- {
- return AjaxResult.error(e.getMessage());
- }
- }
-
- /**
- * 通用上传请求(多个)
- */
- @PostMapping("/uploads")
- public AjaxResult uploadFiles(List files) throws Exception
- {
- try
- {
- // 上传文件路径
- String filePath = RuoYiConfig.getUploadPath();
- List urls = new ArrayList();
- List fileNames = new ArrayList();
- List newFileNames = new ArrayList();
- List originalFilenames = new ArrayList();
- for (MultipartFile file : files)
- {
- // 上传并返回新文件名称
- String fileName = FileUploadUtils.upload(filePath, file);
- String url = serverConfig.getUrl() + fileName;
- urls.add(url);
- fileNames.add(fileName);
- newFileNames.add(FileUtils.getName(fileName));
- originalFilenames.add(file.getOriginalFilename());
- }
- AjaxResult ajax = AjaxResult.success();
- ajax.put("urls", StringUtils.join(urls, FILE_DELIMITER));
- ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMITER));
- ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMITER));
- ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMITER));
- return ajax;
- }
- catch (Exception e)
- {
- return AjaxResult.error(e.getMessage());
- }
- }
-
- /**
- * 本地资源通用下载
- */
- @GetMapping("/download/resource")
- public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
- throws Exception
- {
- try
- {
- if (!FileUtils.checkAllowDownload(resource))
- {
- throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
- }
- // 本地资源路径
- String localPath = RuoYiConfig.getProfile();
- // 数据库资源地址
- String downloadPath = localPath + FileUtils.stripPrefix(resource);
- // 下载名称
- String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
- response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
- FileUtils.setAttachmentResponseHeader(response, downloadName);
- FileUtils.writeBytes(downloadPath, response.getOutputStream());
- }
- catch (Exception e)
- {
- log.error("下载文件失败", e);
- }
- }
-}
+package com.ruoyi.web.controller.common;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.file.FileUtils;
+import com.ruoyi.framework.config.ServerConfig;
+
+/**
+ * 通用请求处理
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/common")
+public class CommonController
+{
+ private static final Logger log = LoggerFactory.getLogger(CommonController.class);
+
+ @Autowired
+ private ServerConfig serverConfig;
+
+ private static final String FILE_DELIMITER = ",";
+
+ /**
+ * 通用下载请求
+ *
+ * @param fileName 文件名称
+ * @param delete 是否删除
+ */
+ @GetMapping("/download")
+ public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
+ {
+ try
+ {
+ if (!FileUtils.checkAllowDownload(fileName))
+ {
+ throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
+ }
+ String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
+ String filePath = RuoYiConfig.getDownloadPath() + fileName;
+
+ response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+ FileUtils.setAttachmentResponseHeader(response, realFileName);
+ FileUtils.writeBytes(filePath, response.getOutputStream());
+ if (delete)
+ {
+ FileUtils.deleteFile(filePath);
+ }
+ }
+ catch (Exception e)
+ {
+ log.error("下载文件失败", e);
+ }
+ }
+
+ /**
+ * 通用上传请求(单个)
+ */
+ @PostMapping("/upload")
+ public AjaxResult uploadFile(MultipartFile file) throws Exception
+ {
+ try
+ {
+ // 上传文件路径
+ String filePath = RuoYiConfig.getUploadPath();
+ // 上传并返回新文件名称
+ String fileName = FileUploadUtils.upload(filePath, file);
+ String url = serverConfig.getUrl() + fileName;
+ AjaxResult ajax = AjaxResult.success();
+ ajax.put("url", url);
+ ajax.put("fileName", fileName);
+ ajax.put("newFileName", FileUtils.getName(fileName));
+ ajax.put("originalFilename", file.getOriginalFilename());
+ return ajax;
+ }
+ catch (Exception e)
+ {
+ return AjaxResult.error(e.getMessage());
+ }
+ }
+
+ /**
+ * 通用上传请求(多个)
+ */
+ @PostMapping("/uploads")
+ public AjaxResult uploadFiles(List files) throws Exception
+ {
+ try
+ {
+ // 上传文件路径
+ String filePath = RuoYiConfig.getUploadPath();
+ List urls = new ArrayList();
+ List fileNames = new ArrayList();
+ List newFileNames = new ArrayList();
+ List originalFilenames = new ArrayList();
+ for (MultipartFile file : files)
+ {
+ // 上传并返回新文件名称
+ String fileName = FileUploadUtils.upload(filePath, file);
+ String url = serverConfig.getUrl() + fileName;
+ urls.add(url);
+ fileNames.add(fileName);
+ newFileNames.add(FileUtils.getName(fileName));
+ originalFilenames.add(file.getOriginalFilename());
+ }
+ AjaxResult ajax = AjaxResult.success();
+ ajax.put("urls", StringUtils.join(urls, FILE_DELIMITER));
+ ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMITER));
+ ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMITER));
+ ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMITER));
+ return ajax;
+ }
+ catch (Exception e)
+ {
+ return AjaxResult.error(e.getMessage());
+ }
+ }
+
+ /**
+ * 本地资源通用下载
+ */
+ @GetMapping("/download/resource")
+ public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
+ throws Exception
+ {
+ try
+ {
+ if (!FileUtils.checkAllowDownload(resource))
+ {
+ throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
+ }
+ // 本地资源路径
+ String localPath = RuoYiConfig.getProfile();
+ // 数据库资源地址
+ String downloadPath = localPath + FileUtils.stripPrefix(resource);
+ // 下载名称
+ String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
+ response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+ FileUtils.setAttachmentResponseHeader(response, downloadName);
+ FileUtils.writeBytes(downloadPath, response.getOutputStream());
+ }
+ catch (Exception e)
+ {
+ log.error("下载文件失败", e);
+ }
+ }
+}
diff --git a/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 854bdcc..44b3f91 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
@@ -7,6 +7,13 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysCache;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -15,33 +22,24 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-/**
- * 缓存监控
- *
- * @author ruoyi
- */
@RestController
@RequestMapping("/monitor/cache")
public class CacheController
{
private final RedisCache redisCache;
- private final static List caches = new ArrayList();
+ private static final List CACHES = new ArrayList();
+
+ static
{
- caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
- caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
- caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
- caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
- caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
- caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
- caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
+ CACHES.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
+ CACHES.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
+ CACHES.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
+ CACHES.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
+ CACHES.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
+ CACHES.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
+ CACHES.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
}
public CacheController(RedisCache redisCache)
@@ -55,23 +53,23 @@ public class CacheController
{
InMemoryCacheStats stats = redisCache.getCacheStats();
Map info = new LinkedHashMap<>();
- info.put("cache_type", stats.cacheType());
- info.put("cache_mode", stats.mode());
- info.put("key_size", stats.keySize());
- info.put("hit_count", stats.hitCount());
- info.put("miss_count", stats.missCount());
- info.put("expired_count", stats.expiredCount());
- info.put("write_count", stats.writeCount());
+ info.put("cache_type", stats.getCacheType());
+ info.put("cache_mode", stats.getMode());
+ info.put("key_size", stats.getKeySize());
+ info.put("hit_count", stats.getHitCount());
+ info.put("miss_count", stats.getMissCount());
+ info.put("expired_count", stats.getExpiredCount());
+ info.put("write_count", stats.getWriteCount());
Map result = new HashMap<>(3);
result.put("info", info);
- result.put("dbSize", stats.keySize());
+ result.put("dbSize", stats.getKeySize());
List