项目:ERP-CRM | 版本:v1.3 | 生成日期:2026-10-06 | 依据:源码分析(v1.3:2026-10-06 一致性回刷——oshi"可能无消费者"经回源 grep 确认为"无消费者")
本篇是两端依赖的逐个解析手册:后端以 erp-crm/pom.xml(297 行)为唯一清单,前端以 erpcrm-ui/package.json(v4.0.0)为唯一清单,每个依赖给出版本、用途、实际使用位置、选型理由、替代方案与升级风险。重点依赖(ORM、工作流引擎、Excel 导出、权限框架)单独立段展开。技术栈的宏观描述见《00-项目总览》第 3 节,构建与运行配置见《14-配置与环境详解》,本篇不重复选型结论之外的内容。版本号一律以两份清单文件为准(本篇写作时点的实际值),引用处标注文件与依赖坐标。
后端构建基座为 spring-boot-starter-parent 3.5.16(parent 继承,Java 17),因此凡未显式写版本的依赖均由 BOM 管理版本。仓库配置为阿里云 nexus 镜像(pom.xml 第 271-294 行),打包由 spring-boot-maven-plugin 完成(repackage,mainClass com.ec.ErpCrmApplication,<finalName>erpcrm</finalName>,devtools 在 repackage 时被排除)。
| 依赖 | 版本 | 用途 | 使用位置 | 选型理由 | 替代方案 | 升级风险 |
|---|---|---|---|---|---|---|
| spring-boot-starter-web | 3.5.16(BOM) | Web 容器与 MVC | 全部 Controller | 框架基座 | — | 随 parent 整体升级 |
| spring-boot-starter-security | BOM(6.x) | 认证授权 | auth/config/SecurityConfig.java 全链 | RBAC 与方法级鉴权标准件 | Shiro | 6.x API 稳定,大版本升级需重查过滤器链 |
| spring-boot-starter-validation | BOM | JSR-303 校验 | TenantRegisterBody 等 @Pattern | 标准 | 手工校验 | 低 |
| spring-boot-starter-aop | BOM | 切面 | auth/aspectj/ 四切面 | @DataSource/@Log/@RateLimiter/@DataScope 的载体 | — | 低 |
| spring-boot-starter-actuator | BOM | 健康与指标端点 | application.yml management 段(9091) | 可观测性入口 | — | 低 |
| micrometer-registry-prometheus | BOM | Prometheus 格式输出 | common/metrics/ErpMetrics.java | Grafana 栈标配 | — | 随 BOM |
| spring-boot-starter-data-redis | BOM | Redis 客户端(lettuce 池) | common/core/redis/RedisCache.java | 会话/计数/字典缓存 | jedis | SB3 前缀 spring.data.redis 易写错(AGENTS.md) |
| lettuce-core | BOM | Redis 网络层 | 同上(web starter 中被排除后显式引入) | 与 commons-pool2 配合连接池 | — | 低 |
| commons-pool2 | BOM | lettuce 连接池 | application.yml lettuce 段 | — | — | 低 |
| spring-boot-devtools | BOM | 开发热重载 | optional=true,repackage 排除 | 开发体验 | — | 生产无影响 |
| spring-boot-starter-test | BOM | 测试基座 | src/test/ 13 个测试类 | JUnit5+MockMvc+TestRestTemplate | — | 低 |
| mysql-connector-j | BOM(8.x) | MySQL 驱动 | 动态数据源与注册建库 | 官方驱动 | mariadb-java-client | 8.4 服务器配套驱动随 BOM |
| druid | 1.2.25 | 连接池(纯依赖,非 starter) | auth/config/properties/DruidProperties.java、DynamicRoutingDataSource | 需要编程式建池(主库/租户两档规格) | HikariCP | 详见 1.2 段 |
| mybatis-spring-boot-starter | 3.0.3 | ORM | resources/mapper/** 43 个 XML | RuoYi 栈延续 | MyBatis-Plus | 详见 1.2 段 |
| pagehelper-spring-boot-starter | 2.1.0 | 物理分页 | common/utils/PageUtils.java(pageSize 钳制 ≤500) | 与手写 SQL 正交 | 手写 LIMIT | 详见 1.2 段 |
| flowable-spring-boot-starter | 7.0.1 | 审批流程引擎 | crm/service/impl/CrmApprovalServiceImpl.java(全库唯一 import org.flowable 的文件) | 成熟 BPMN 引擎 | Camunda 7/自研审批单 | 详见 1.3 段 |
| jjwt-api / jjwt-impl / jjwt-jackson | 0.12.7(impl/jackson 为 runtime) | JWT 签发解析 | auth/web/service/TokenService.java | 0.12 新 API(HS512 密钥 ≥64 字节硬要求) | java-jwt / nimbus | 详见 1.4 段 |
| fastjson2 | 2.0.64 | JSON 序列化 | 10 个文件(Redis 序列化器 FastJson2JsonRedisSerializer 等) | RuoYi 栈约定、性能好 | Jackson(Spring 默认) | 详见 1.4 段 |
| poi-ooxml | 5.3.0 | Excel 导入导出 | common/utils/poi/ExcelUtil.java(3 个文件引用) | @Excel 注解体系的地基 | EasyExcel | 详见 1.5 段 |
| UserAgentUtils | 1.21 | UA 解析 | TokenService.java 第 21 行、auth/manager/factory/AsyncFactory.java 第 15 行 | 登录日志记录浏览器/OS | yauaa | 停更多年,仅两处使用 |
| oshi-core + jna + jna-platform | 6.4.8 / 5.14.0 | 服务器监控 | auth/web/domain/Server.java(全库唯一引用) | /monitor/server 的数据层 | — | 端点已随单模块消失(见 15 篇);回源已确认 Server.java 无任何调用方,依赖事实上无消费者 |
| springdoc-openapi-starter-webmvc-ui | 2.8.17 | 接口文档 | web/core/config/SwaggerConfig.java(3 文件引用 io.swagger.v3) | springfox 已死,springdoc 是 SB3 标配 | knife4j | prod 强制关闭(EcProdConfigVerifier) |
| commons-io | 2.16.1 | IO 工具 | common/utils/file/FileUtils.java 等 | 文件上传下载 | — | 低 |
| commons-fileupload | 1.5 | 上传异常类型 | 仅 common/exception/file/InvalidExtensionException.java 一处 import | RuoYi 遗留 | Spring 自带 multipart | 可移除候选(见第 3 节) |
| commons-collections | 3.2.2 | 集合工具 | 源码零直接引用(grep org.apache.commons.collections 无命中) | RuoYi pom 惯例保留 | — | 3.x 已 EOL,可移除候选 |
| lombok | BOM | 样板代码消除 | TenantRegisterBody(@Data)等 | 少量使用 | record | 注意与 mapstruct 组合问题(未用) |
| ec-quartz | — | 定时任务 | pom 中已注释掉(第 230-236 行"暂未启用") | 定时任务改用 @Scheduled | quartz | 已事实上决定不用 |
这三个依赖共同构成数据访问层,选型是"手写 SQL 优先"路线。MyBatis 3.0.3(starter):全部 SQL 以 XML 手写/生成(erp-crm/src/main/resources/mapper/{sys,crm,erp,saas}/*.xml 共 43 个映射文件),typeAliasesPackage com.ec.**.domain,mapperLocations classpath*:mapper/**/*Mapper.xml(application.yml mybatis 段)——新增 XML 放对目录即被扫描,无需登记。选 MyBatis 而非 MyBatis-Plus 的理由有三:其一,项目继承 RuoYi 的 XML 写法存量(含 restrictOwner 这类条件 SQL 谓词、${params.dataScope} 切面片段),换框架等于全量重写;其二,多租户动态数据源架构下需要完全掌控 SQL 形态,Query Wrapper 反而隔了一层;其三,生成器 gen_business_modules.py 的模板产出就是 RuoYi 风格 XML(见《18-代码走读实录》第二走读),工具链已闭环。升级风险:mybatis-spring-boot 3.0.x 对 Spring Boot 3.5 的兼容性经过 CI 验证,2.x→3.x 的 SqlSessionFactory 配置迁移已完成,再升级主要是跟随 Spring 官方节奏。
PageHelper 2.1.0:物理分页拦截器,supportMethodsArguments: true 使其能从请求参数自动取 pageNum/pageSize——这是 PageUtils.startPage() 能生效的前提;配套做了两条项目级加固(git 提交 afaa542):pageSize 钳制上限 500 防恶意大分页、PageClearInterceptor 每请求结束清理分页 ThreadLocal 防容器线程复用串页(AGENTS.md 后端约定)。替代方案是手写 LIMIT 或 MyBatis-Plus 的 IPage,前者侵入每个 SQL、后者绑定框架,都不如独立分页插件正交。升级风险集中在"startPage 后必须立即执行查询"这条纪律被破坏时,分页会染到下一条 SQL——这是使用纪律问题而非版本问题。
Druid 1.2.25:本项目最"非标准"的依赖用法——不用 starter,纯依赖 + 编程式装配。理由在《01-系统架构》第 4 节已展开:多租户"每租户一池"需要运行时动态创建数据源(DynamicRoutingDataSource.addDataSource),DruidProperties.dataSource()/tenantDataSource() 两个方法定义主库/租户两档规格(租户池 1/1/10 的连接数账见《10-性能设计与优化》1.1)。HikariCP 虽是 Spring 默认且性能更优,但当时需要 Druid 的三件东西:可编程建池的成熟 API、内置慢 SQL 统计与防火墙(application-druid.yml 的 stat/wall 配置)、以及运维熟悉的监控控制台(dev 环境开启、账号走 EC_DRUID_*)。升级风险:Druid 与新 JDK 的兼容性历史上偶有滞后(1.2.x 线目前良好);另一处隐性风险是 DruidMonitorConfig 把控制台账号接到 EC_DRUID_* 三个环境变量,升级 starter 化会丢失这套自定义装配。
Flowable 是后端最重的单一依赖(引入十余个传递依赖与 40+ 张 ACT_* 引擎表)。使用面却刻意收得很窄:全库只有 crm/service/impl/CrmApprovalServiceImpl.java 一个文件 import org.flowable,仅用 RuntimeService/TaskService/HistoryService 三个 API 与一个 BPMN 流程定义(erp-crm/src/main/resources/processes/contract-approval.bpmn20.xml,key=contractApproval)。配置三板斧(application.yml 第 148-151 行):database-schema-update: true(引擎表启动自动建在主库)、async-executor-activate: false(关闭异步执行器,审批全同步执行——这是 taskService.complete 同步语义的前提,若打开会改变补偿式一致性的失败窗口)、check-process-definitions: true(启动校验流程定义与引擎版本匹配)。选 Flowable 而非 Camunda 7 的理由:课程原码生态与中文资料更丰富、BPMN 2.0 规范实现完整、Spring Boot 3 starter 官方维护;而非自研审批单的理由是"轻量审批单"已被试用过并放弃(git 提交 b0f2684 → 9f51b23 的替换史,见《16-决策记录ADR》ADR-003)。升级风险:Flowable 大版本升级伴随引擎表结构变更与历史数据迁移脚本,当前 database-schema-update: true 只处理新建不处理跨大版本迁移,升级前必须备份主库;7.0.x 对 SB 3.5 的兼容良好,跨 7→8 的风险 ⚠️ 待确认届时评估。另一个值得记录的边界:引擎表落主库意味着 Flowable 的启动建表动作会写主库——首次启动前主库账号需要 DDL 权限,部署时容易踩(compose 栈的 db-init 已考虑)。
Spring Security 6.x:安全链完全按 6.x 新版 Lambda DSL 配置(auth/config/SecurityConfig.java),@EnableMethodSecurity 开启方法级 @PreAuthorize("@ss.hasPermi(...)"),自定义 PermissionService 以 @ss bean 名暴露。会话策略 STATELESS、CSRF 关闭、匿名白名单与 401 的"HTTP 200 + body 401"协议见《08-安全与权限设计》第 3 节。升级风险主要是 6.x 内部持续的小重构(如 SecurityFilterChain bean 式配置取代 WebSecurityConfigurerAdapter 已完成迁移)。
jjwt 0.12.7:三件套拆分(api/impl/jackson)按官方推荐;0.12 的新 parser/builder API 与"HS512 密钥必须 ≥64 字节"的硬约束都已在 TokenService.getSecretKey() 落实(EcProdConfigVerifier 亦有校验)。升级风险低,但注意 0.12 是 API 大改版本(旧 Jwts.parser().setSigningKey 写法失效),从课程原码迁移时已踩平。
fastjson2 2.0.64:承担两类职责——Redis 值序列化(FastJson2JsonRedisSerializer,含白名单 autotype 配置,git 提交 e0d8874"Redis 序列化白名单"是加固痕迹)与部分工具类内的 JSON 转换。注意 Spring MVC 的 HTTP JSON 消息转换并未换成 fastjson2,仍走 Jackson 默认——即"Redis 用 fastjson2、HTTP 用 Jackson"的双栈现状,两套日期/空值序列化语义略有差异,排查"Redis 里存的和返回的字段不一致"类问题时先想到这里。替代方案是统一 Jackson(可减少一个依赖),但 RuoYi 栈的存量写法依赖 fastjson2 特性,迁移收益低风险高。fastjson2 与历史声名狼藉的 fastjson 1.x 不同,安全模型重写,版本保持跟随即可。
Excel 是业务系统的高频刚需(每个列表页都有导出按钮),项目自建了一套轻量注解体系:common/annotation/Excel.java 定义列头/类型,common/utils/poi/ExcelUtil.java(继承自 RuoYi)在导出时反射读取 @Excel(name="中文列头") 注解生成 xlsx。使用密度很高:CrmCustomer.java 有 10 个导出字段、生成器 gen_business_modules.py 的 gen_domain 函数为每个非主键非 remark 列自动加 @Excel 注解(见《18-代码走读实录》第二走读)。两种导出形态并存(CRM 系统管理用 POST + HttpServletResponse 直写流、ERP 主数据用 GET + AjaxResult 包裹)的差异已在《15-接口全量参考》第 7 节说明。选 POI 而非 EasyExcel(阿里):EasyExcel 在大数据量流式写出上更优,但 @Excel 注解体系与存量代码深度绑定,且本项目导出量级(分页钳制 ≤500 的同源查询全量导出)未到 EasyExcel 的收益区间 ⚠️ 待确认未来导出量级。升级风险:POI 5.x 需要 JDK 8+ 且 5.3.0 与 log4j-api 传递依赖的版本对齐要注意;Excel 导入(用户导入 importData)同走 ExcelUtil,格式兼容性回归时两个方向都要测。
通读 pom 时有三处"看似奇怪、实则有意"的写法值得专门解释,它们都是加固期留下的决策痕迹。第一处是 Redis starter 的 lettuce 排除再显式引入(第 84-102 行):spring-boot-starter-data-redis 里把 lettuce-core 排除,紧跟着单独声明 lettuce-core 与 commons-pool2——效果上等价于默认行为,但把"连接池依赖 commons-pool2"从隐式传递变成显式声明,防止上游 starter 未来调整传递依赖时 lettuce 池静默失效(lettuce 无 pool2 时会退化为单连接,表现为并发下 Redis 排队)。第二处是 devtools 的 optional 与 repackage 排除双保险:<optional>true</optional> 保证它不传递,spring-boot-maven-plugin 的 excludes 保证打出的生产 jar 不含它——devtools 的重启类加载器若混进生产包会引发诡异的类转换异常,双保险是 RuoYi 社区踩坑后的标准写法。第三处是 ec-quartz 的注释块(第 230-236 行):课程原码带 quartz 定时任务模块,合并单模块后项目改用 Spring @Scheduled(TenantExpirationJob、IdleDataSourceEvictor 都是),quartz 依赖被注释保留而非删除——它本身就是一个"决策化石",提醒后来者"定时任务框架曾经存在、已被有意放弃",清理建议见第 3.1 节。这三个点合起来说明:这个 pom 里的每一行非标准写法都能在 git 提交或 AGENTS.md 里找到解释依据,读 pom 与读代码同等重要。
pom.xml 的 <properties> 段(第 21-40 行)集中管理全部显式版本号(druid/mybatis/pagehelper/fastjson2/oshi/jna/commons 系/poi/jwt/springdoc 共 11 个属性)。维护口径有两条:一是凡 BOM 管得到的绝不写版本号(web/security/redis/mysql/actuator 全部裸引用),保证升级 parent 时整组联动;二是显式写版本的都是 BOM 不管或需要偏离的(flowable 不在 BOM、druid 有意用纯依赖)。检查一个依赖"该不该升级"的最快方法就是看它出现在 properties 还是裸引用:前者按自己的节奏升级并跑全量测试,后者跟随 parent 升级即可。这个口径没有文档化在仓库内(pom 无注释说明),本节即其事实记录,升级操作前建议先读《09-测试与质量保障》第 4 节确认两端门禁基线。
前端 v4.0.0 为"pure-admin 底座 + erpcrm 业务层"结构,依赖因此分三类:纯底座(模板自带,升级跟随模板)、业务直用(RuoYi 系页面引用)、构建工具链。包管理器 pnpm 10.x(preinstall: npx only-allow pnpm 强制),engines.node >=22.22.1(v24 实测可用,AGENTS.md 记录)。
| 依赖 | 版本 | 用途 | 使用位置 | 备注/风险 |
|---|---|---|---|---|
| vue | 3.5.41 | UI 框架 | 全局 | 核心基座 |
| vue-router | 5.2.0 | 路由(hash 模式) | src/router/ | pure-admin 基座 |
| pinia | 4.0.3 | 状态管理 | src/store/modules/*.ts 六个 store | |
| element-plus | 2.14.5 | 组件库 | 86 页全面使用 | 唯一允许的组件库(AGENTS.md 禁 element-ui) |
| @element-plus/icons-vue | 2.3.2 | EP 图标 | 各页面 | |
| axios | 1.18.1(钉死精确版本) | HTTP 客户端 | src/utils/request.js、src/api/user.ts | 精确锁版防 1.x 拦截器行为漂移 |
| echarts | 5.6.0 | 图表 | src/plugins/echarts.ts 按需注册 | 禁止全量 import(AGENTS.md,防 chunk 膨胀) |
| @pureadmin/utils | 2.6.4 | 工具函数集 | 45 个文件引用(前端引用面最广的库) | 底座配套 |
| @pureadmin/table | 3.3.0 | 二次封装表格 | ReVxeTableBar 等基座组件 | |
| @pureadmin/descriptions | 1.2.1 | 描述列表组件 | 基座 | |
| @vueuse/core | 14.4.0 | 组合式工具 | 基座多处 | |
| @vueuse/motion | 3.0.3 | 动画指令 | 2 个文件(基座) | |
| js-cookie | 3.0.8 | cookie 读写 | request.js 注入 tenant 头 | 业务关键路径 |
| nprogress | 0.2.0 | 路由进度条 | 基座路由守卫 | |
| mitt | 3.0.1 | 事件总线 | 7 个文件(多标签 tab 通信) | |
| localforage | 1.10.0 | IndexedDB 封装 | 2 个文件 | |
| responsive-storage | 2.2.0 | 响应式 localStorage | settings store | |
| dayjs | 1.11.23 | 日期处理 | 仅 views/welcome/utils.ts 1 处 | 可移除候选(用 parseTime 平替) |
| remixicon | 4.9.1 | 图标字体 | 7 个文件(2026-09 图标体系迁移方案 A) | git 提交 4050d3b 退役 RuoYi SVG 精灵 |
| highlight.js | 11.12.0 | 代码高亮 | 仅 views/tool/gen/index.vue | 死页面依赖,可移除候选 |
| js-beautify | 1.13.0 | 代码格式化 | 仅 tool/gen 路径 | 同上 |
| vue3-treeselect | 0.1.10 | 树选择 | user/menu/dept 三个系统页 + tool/gen | Vue2 时代组件的 Vue3 移植版,样式陈旧 |
| quill | 1.3.7 | 富文本 | components/Editor/index.vue | 1.3.7 是老版(2.x 已出),RuoYi 富文本延续 |
| plus-pro-components | 0.1.31 | EP 高阶表单 | 仅 App.vue | 底座演示遗留,可移除候选 |
| version-rocket | 1.7.4 | 发版检测 | 仅 App.vue | 底座自带 |
| pinyin-pro | 3.29.3 | 拼音搜索 | 全局搜索组件 SearchModal | |
| vue-cropper / cropperjs | 1.1.4 / 1.6.2 | 头像裁剪 | 个人中心头像上传 | cropperjs 为 vue-cropper 传递 |
| file-saver | 2.0.5 | 客户端保存文件 | 2 个文件(导出场景) | |
| clipboard | 2.0.8 | 剪贴板 | 5 个文件 | |
| sortablejs / vuedraggable | 1.15.7 / 4.1.0 | 拖拽排序 | 多标签排序、gen 页面 | |
| vue-tippy | 6.7.1 | 提示 | main.ts + ReVxeTableBar | |
| vue-types | 7.0.0 | props 类型工具 | 基座组件 | |
| path-browserify | 1.0.1 | 浏览器端 path | 路由拼接 | Vite5 移除 node polyfill 后的替代 |
| animate.css | 4.1.1 | CSS 动画 | layout + ReAnimateSelector |
核心链:vite 8.2.2(rolldown 内核,pnpm.overrides 钉 rolldown 1.2.5 规避 1.2.8 兼容问题——升级后应改用新 codeSplitting API 替换弃用的 advancedChunks,见 D15)+ @vitejs/plugin-vue 6.0.8 / plugin-vue-jsx 5.1.6。样式双轨:tailwindcss 4.3.3(@tailwindcss/vite 插件化接入,4.x 无 tailwind.config)+ sass 1.77.8(RuoYi/EP 覆盖样式)。质量门禁:eslint 10.9.0(--max-warnings 0 零容忍)+ prettier 3.9.6 + typescript-eslint 8.67.0 + eslint-plugin-vue 10.10.0 + vue-eslint-parser 10.4.1 + eslint-plugin-better-tailwindcss 4.7.0;typescript 6.0.3 + vue-tsc 3.3.11(typecheck,但 tsconfig exclude **/*.js 使业务层不在检查范围);vitest 5.0.0(两个测试文件)。构建辅助:vite-plugin-compression(gzip/br 产物)、vite-plugin-remove-console(生产去 console)、vite-svg-loader(svg 组件化)、rollup-plugin-visualizer(体积分析)、code-inspector-plugin(点击页面元素跳 IDE)。全套清单见 erpcrm-ui/package.json 第 73-113 行。
前端重点依赖的展开理由有三处值得记录。Element Plus 2.14.5 是 86 页的唯一组件库,RuoYi 系页面的交互范式(el-table + el-form + ElMessage)与 pure-admin 基座的 Re* 组件共存,element-plus-overrides.scss(原 element-ui.scss 更名而来,git 提交 a93e509)做样式收口;升级节奏跟随底座模板,大版本升级需回归 86 页。axios 1.18.1 钉精确版本(无 ^)是刻意为之:request.js 的拦截器栈(tenant 注入、401 重登、防重复提交)对 axios 响应结构有隐式依赖,1.x 线内小版本偶有行为调整,锁版换取稳定。echarts 5.6.0 按需注册(src/plugins/echarts.ts 注册 Pie/Bar/Line/Radar/Gauge + Canvas/SVG 渲染器 + macarons 主题)是性能红线:git 提交 62e0fe6"perf(echarts): 图表全量引入改按需——5 处 import * as echarts 统一切到 plugins/echarts 按需实例"专门修过 chunk 膨胀,新增图表类型必须先在 plugins 登记。
总体判断:后端 20 个直接依赖全部有明确用途,密度健康(无依赖地狱);前端 36 个运行时依赖中约 6 个存在"低引用或零业务价值"的冗余,属于底座迁移的沉淀物而非决策失误。两端均无已知高危漏洞版本(fastjson2/poi/jjwt 均为修复后的大版本线 ⚠️ 待确认定期跑 mvn dependency-check 或 pnpm audit 复核)。
| 项 | 证据 | 建议 |
|---|---|---|
| oshi-core + jna + jna-platform(3 个依赖) | 唯一引用 auth/web/domain/Server.java 是 RuoYi 服务器监控页的域对象;/monitor/server 端点已随单模块消失(15 篇第 3 节),前端 monitor/server.vue 是死页 ⚠️ 待确认是否恢复该功能 | 若决定不恢复:删 3 依赖 + Server 域对象 + 死页,减重明显 |
| commons-collections 3.2.2 | 源码零直接引用(3.x 已 EOL) | 直接移除;若编译期意外报缺类再评估(大概率是历史 pom 抄写残留) |
| commons-fileupload 1.5 | 仅 InvalidExtensionException.java 一处 import(异常类型继承) | 把该异常类改为继承标准 Exception 即可移除;Spring 自带 multipart 已承担实际上传 |
| spring-boot-devtools | 生产包已排除,仅开发期 | 无害保留;团队若不接受热重载行为可移除 |
| UserAgentUtils 1.21 | 仅 TokenService/AsyncFactory 两处 UA 解析 | 停更多年但功能稳定;若介意可换 yauaa,收益低 |
| ec-quartz 注释块 | pom 第 230-236 行 | 定时任务已定型 @Scheduled(SOP-6),建议删注释块明确"不会启用" |
| 项 | 证据 | 建议 |
|---|---|---|
| highlight.js + js-beautify | 唯一消费点 views/tool/gen/index.vue 属 RuoYi 遗留死页面(D19,后端生成接口未迁移) | 与死页一起删除(D19 清偿时顺手完成) |
| vue3-treeselect | user/menu/dept 三页 + tool/gen 在用 | 前三页可用 el-tree-select 平替(EP 原生),替换后可移除 |
| plus-pro-components | 仅 App.vue 引用 | 底座演示遗留,确认无业务使用后移除 |
| version-rocket | 仅 App.vue(发版检测提示) | 产品未提发版提示诉求 ⚠️ 待确认,可移除 |
| dayjs | 仅 welcome/utils.ts 一处 | 用项目既有 parseTime 平替后移除 |
| cropperjs(直接依赖) | 实际由 vue-cropper 传递引入 | 从 dependencies 摘除(pnpm 严格模式下显式声明反而掩盖传递关系)⚠️ 待确认 vue-cropper 的 peer 声明 |
| animate.css | 基座动画选择器组件 | 底座自带,跟随底座处置,不建议单独动 |
按"动不得 → 小心动 → 随便可动"排序:动不得——rolldown 1.2.5 钉版(升级需连带迁移 codeSplitting API 并验证构建,D15)、axios 精确锁版、fastjson2 与 Redis 白名单的配套;小心动——Spring Boot/parent 升级(牵动 security 6 API、druid 兼容、flowable 引擎表)、MyBatis starter 大版本、Element Plus 大版本(86 页回归)、Flowable 跨大版本(引擎表迁移脚本);随便动——commons-io、file-saver、mitt 等无深度耦合的工具件。整体节奏建议:跟随 spring-boot-starter-parent 的 3.5.x 补丁线(安全补丁优先),前端跟随 pure-admin 模板的上游节奏,两者都每季度复核一次;任何升级前先跑两端质量门禁(mvn test 47 例基线 + pnpm lint/typecheck/test),绿灯基线是升级的唯一安全网(命令见《09-测试与质量保障》第 4 节)。