项目:xyMall | 版本:v1.2 | 生成日期:2026-10-06 | 依据:源码分析
本文盘点全部四个子项目的第三方依赖:后端以 xy-mall/pom.xml(父 POM)为中心,五个 framework 模块与 server/pom.xml 为分支;前端以 xy-mall-web/package.json、xy-mall-admin/package.json、xy-mall-h5/package.json 三份清单为准。版本来源有三层:Spring Boot 3.4.13 的 parent BOM 仲裁(flyway、micrometer、jackson 等不写版本号的项)、父 POM properties 显式钉死的项(druid 1.2.25、jjwt 0.12.6 等)、以及前端 ^/~ 语义化范围加 pnpm-lock.yaml 锁定。
两个先行结论帮助读者建立框架。第一,这个项目的依赖哲学是"平台件用最主流的、外围件用最薄的":ORM 取 MyBatis-Plus 而非 JPA,文档取 SpringDoc + Knife4j,连接池取 Druid——都是国内 Java 生态的主流默认值;而 ES 搜索干脆不引客户端、用 JDK 原生 HttpClient 直连 REST(见《07-模块详解》4.4),图片压缩、对象存储、支付各引一个单一职责的小库。第二,声明与使用存在明显温差:父 POM 里有一批依赖在全部 Java 源码中检索不到任何 import(第 5 节健康度评估给出 grep 证据与处置建议),这正是"依赖全景"篇区别于"技术栈速览"(《00-项目总览》第 3 节)的价值——速览回答"用了什么",全景回答"哪些真的在用、哪些只是躺在 pom 里"。
| 依赖 | 版本 | 用途 | 实际使用位置(grep 证据) | 选型理由 | 替代方案 | 升级风险 |
|---|---|---|---|---|---|---|
| spring-boot-starter-parent | 3.4.13 | BOM 仲裁 + 自动装配 | 全部模块的 parent | 单体内聚、版本一站式管理 | 手工 dependencyManagement | 大版本升级需评估 jakarta 生态 |
| spring-boot-starter-web | 随 BOM | MVC + 内嵌 Tomcat | framework-web 引入,server 传递依赖 | 标配 | WebFlux(响应式改造成本巨大) | 低 |
| spring-boot-starter-aop | 随 BOM | 限流/锁/审计/日志切面 | framework-web、framework-cache;RateLimitAspect/DistributeLockAspect/AdminOperationLogAspect/WebLogAspect | 四个横切件全靠它 | 手写过滤器链 | 低 |
| spring-boot-starter-validation | 随 BOM | Jakarta Validation | 各 Controller @Valid @RequestBody;UserLoginContext 等入参 | 声明式校验 | 手工 if 校验 | 低 |
| spring-boot-starter-data-redis | 随 BOM | Redis 客户端(Lettuce) | CacheConfig(RedisTemplate JSON 序列化)、SeckillStockRedisService(StringRedisTemplate + Lua) | Spring 生态原生集成 | Redisson(功能强但重) | Lettuce→Redisson 迁移需改全部访问点 |
| spring-boot-starter-websocket | 随 BOM | 客服 IM | modules/im/ws/ImWebSocketConfig.java、ImWebSocketHandler.java | 原生 WS 端点最轻 | Netty/Socket.IO(过重) | 低 |
| spring-boot-starter-actuator + micrometer-registry-prometheus | 随 BOM | 健康检查 + Prometheus 指标 | application.yml management 段;WebLogAspect 打 xy.mall.api.cost Timer | 与 Grafana 面板(deploy/grafana/)直连 | 自写 metrics 端点 | prod 收紧配置见《14》2.3 |
| spring-boot-starter-test | 随 BOM | JUnit5 + Spring Test | 7 个测试类(《09》第 1 节) | 标配 | AssertJ/Mockito(未引入) | 低 |
| spring-boot-starter-cache | 随 BOM | Spring Cache 抽象 | 仅 CacheConfig 的 @EnableCaching 一行;全库无 @Cacheable | 声明时预期用注解缓存 | 见健康度评估 5.2 | 无(可移除) |
| springdoc-openapi-starter-webmvc-ui | 2.6.0 | OpenAPI 生成 | framework-swagger2;各 Controller @Tag/@Operation | 注解即文档,/doc.html 可调试 | springfox(已停更) | 与 Boot 版本强耦合,需同步升 |
| knife4j-openapi3-jakarta-spring-boot-starter | 4.5.0 | 中文增强 UI | 同上 | 国内事实标准 | 纯 swagger-ui | 跟随 springdoc |
| 依赖 | 版本 | 用途 | 实际使用位置(grep 证据) | 选型理由 | 替代方案 | 升级风险 |
|---|---|---|---|---|---|---|
| mybatis-plus-spring-boot3-starter | 3.5.9 | ORM:lambda 条件构造、ServiceImpl 基类、逻辑删除 | 30 个模块的 Mapper/Service 全家;《01》2.3 节 | 国内主流,lambda 防字段名硬编码 | MyBatis 原生 / JPA / JOOQ | 3.5.9 起分页拆到 jsqlparser 模块,升级需带 companion |
| mybatis-plus-jsqlparser | 3.5.9 | 分页插件依赖 | framework-orm/.../MybatisPlusConfig.java | MP 官方拆分后的必配 | — | 与 MP 同版本 |
| druid-spring-boot-3-starter | 1.2.25 | 连接池 + SQL 监控 | application.yml datasource.druid 段(慢 SQL 2000ms 日志、stat 合并、Web 台关闭) | 监控内建 | HikariCP(Boot 默认,更快但无监控台) | 1.2.x 线稳定,风险低 |
| mysql-connector-j | 8.4.0(runtime) | JDBC 驱动 | 同上 | 与 MySQL 8 对应 | mariadb-java-client | 跟随服务端大版本 |
| flyway-core + flyway-mysql | 随 Boot BOM(本机仓库解析 11.7.2) | schema 版本化迁移 | db/migration/V1~V8;application.yml validate-on-migrate | 决策见《16-决策记录ADR》ADR-7 | Liquibase(XML/YAML 更重) | MySQL 8.4 有"未测试"告警,实测可用(HANDOVER 第七轮) |
| 依赖 | 版本 | 用途 | 实际使用位置(grep 证据) | 选型理由 | 替代方案 | 升级风险 |
|---|---|---|---|---|---|---|
| jjwt-api / jjwt-impl / jjwt-jackson | 0.12.6 | JWT 签发与验签(HS256) | framework-core/.../security/JwtUtil.java、framework-web/.../resolver/LoginUserArgumentResolver.java、framework-web/.../aop/RateLimitAspect.java(切面内独立验签) | API/impl/jackson 三件套分离,0.12.x 新 builder API | java-jwt(auth0)/ nimbus-jose | 0.12 的 fluent API 与 0.11 断代,跨大版本需重写调用点 |
| spring-security-crypto | 6.2.8(父 POM 显式钉死) | 仅 BCryptPasswordEncoder | framework-core/.../security/PasswordUtil.java 第 3 行 import | 只取 crypto 一个 jar,不引入 Security 过滤器链全家桶 | 引入完整 spring-security(本项目刻意不用) | 注释自述"本地离线仓库可用版本"——低于 Boot 3.4 BOM 默认,离线仓库更新后应对齐(CODE-AUDIT P3 同结论) |
| 依赖 | 版本 | 用途 | 实际使用位置(grep 证据) | 选型理由 | 替代方案 | 升级风险 |
|---|---|---|---|---|---|---|
| alipay-sdk-java | 4.40.984.ALL | 支付宝沙箱/正式支付 | modules/pay/service/AlipayPayService.java(签名/验签/统一下单) | 官方 SDK 唯一选择 | 手写签名(不推荐) | 自带 okhttp 3.12 声明已被 exclude(pom 注释:其运行时要求 ≥4.11,统一用 MinIO 的 4.12),升级 SDK 时需复核该冲突 |
| minio | 8.5.17 | S3 兼容对象存储客户端 | modules/upload/service/UploadStorageService.java(建桶/策略/上传/迁移) | NAS MinIO 自建存储的官方客户端 | AWS S3 SDK(重) | okhttp 版本耦合见上;超时参数 okhttp 连接 5s/读写 60s(HANDOVER 第七轮) |
| thumbnailator | 0.4.20 | 图片压缩(>1280px 缩放、0.85 质量) | 同上 UploadStorageService | 单一职责、纯 Java | ImageMagick/自写 Graphics2D | 低 |
| 依赖 | 版本 | 用途 | 实际使用位置(grep 证据) | 备注 |
|---|---|---|---|---|
| lombok | 1.18.46 | 样板代码消除 | 全部实体/VO/Context(@Data);server pom 配置了 lombok+mapstruct 联合注解处理器 | 真实使用 |
| mapstruct | 1.6.3 | 编译期 VO 映射 | 零使用:全库无 @Mapper(componentModel=...) 转换接口,VO 转换实际用 BeanUtils.copyProperties(如 OrderServiceImpl.toVO);注解处理器仍在 server pom 配置但无产出 | 可移除,见 5.2 |
| hutool-core | 5.8.47 | 国产工具集 | 零使用(grep -rn "cn.hutool" --include=*.java 无命中) | 可移除 |
| guava | 33.6.0-jre | 集合/缓存工具 | 零使用(com.google.common 无命中) | 可移除 |
| commons-lang3 | 3.20.0 | 字符串工具 | 零使用(项目用 Spring 的 StringUtils.hasText) | 可移除 |
| commons-collections4 / commons-io | 4.4 / 2.18.0 | 集合与 IO 工具 | 零使用 | 可移除 |
| fastjson2 | 2.0.64 | JSON 序列化 | 零使用:JSON 全走 Jackson ObjectMapper(AdminOperationLogAspect、ImWebSocketHandler、EsGoodsIndexService 等 6 处) | 可移除;与 Jackson 功能重复 |
| versions-maven-plugin / maven-jar-plugin | 2.17.1 / 3.4.2 | 构建插件 | 父 POM build 段 | 依赖审计入口(mvn versions:display-dependency-updates) |
Redis 客户端(spring-data-redis / Lettuce)。这是全项目最"忙"的第三方依赖:商品缓存、空值缓存、秒杀 Lua 预扣、延迟队列、分布式锁、token 黑名单、验证码、登录失败计数、接口级限流滑窗九个机制都压在它身上。项目对它的用法分两档——对象缓存用 CacheConfig 装配的 RedisTemplate<String, Object>(key 走 String 序列化、value 走 GenericJackson2JsonRedisSerializer,因此 GoodsCacheService 能直接存取 GoodsVO 对象);秒杀与限流用 StringRedisTemplate + DefaultRedisScript 执行 Lua(脚本与返回码语义见《05-核心流程》流程四)。选 Lettuce(Boot 默认)而非 Redisson 是刻意取舍:需要的只是"命令执行器 + 原子脚本",不需要分布式对象/布隆过滤器这些高层抽象;换 Redisson 的收益为零、改造成本覆盖九个机制。升级风险主要在序列化:GenericJackson2JsonRedisSerializer 写入的值带类型信息,升级 Jackson 大版本可能造成旧缓存反序列化失败——由于所有读点都有 try/catch 回源 DB(ADR-2),最坏后果是"升级后几分钟缓存全 miss"而非故障。
JWT 库(jjwt 0.12.6)。选它而非 auth0 java-jwt 的实际原因是 API 形态:0.12 的 Jwts.builder().signWith(key) 与 Jwts.parser().verifyWith(key) 把"密钥即算法来源"表达得很直白,与本项目"算法由密钥长度决定走 HS256"的用法(JwtUtil 类注释,见《08-安全与权限设计》2.1)契合。值得注意的工程细节是 jjwt 被三处共享:框架层的签发(core)、请求解析(web 的 resolver)、以及 RateLimitAspect 切面内部的独立验签——后者意味着限流切面不依赖 controller 已完成的解析,独立成立。风险点在 0.12 相对 0.11 是断代式 API 变更,如果将来升级 0.13+ 需要同时复核三处调用点;好消息是 JwtUtil 是唯一封装层,调用面收敛良好。
连接池(Druid 1.2.25)。在 HikariCP 是 Boot 默认的今天选 Druid,理由写在配置里而非文档里:application.yml 的 druid 段开启了 stat 合并统计与 slow-sql-millis: 2000 慢 SQL 日志,把 SQL 层观测做进了连接池(《10-性能设计与优化》2.6);同时 Web 监控台 stat-view-servlet.enabled: false 关闭以保安全。代价是吞吐略逊 Hikari 且参数取默认值——maxActive 等未显式声明(《10》第 3 节风险 2 已核实"Druid 默认 maxActive=8、配置未显式声明"),这是依赖选型留下的、至今未还的参数化欠账。
加密库(spring-security-crypto 6.2.8)。这是一个"只取一瓢"的依赖:整个 Spring Security 家族里只引了 crypto 一个 jar,用的是 BCryptPasswordEncoder(《09》2.4 的 PasswordUtilTest 锚定其行为)。pom 注释坦白它钉在 6.2.8 的原因是"本地离线仓库可用",与 Boot 3.4 BOM 的默认版本并不对齐——这是全后端唯一一个故意落后于 BOM的版本,升级动作应与离线仓库建设同步,属于低频但需登记在案的技术债。它也承载了《16-决策记录ADR》ADR-4 的懒迁移策略:旧 MD5 校验分支与 BCrypt 主路径共存于同一个工具类。
对象存储与支付 SDK(minio 8.5.17 / alipay-sdk 4.40.984)。这两个外围 SDK 共享一条升级教训:okhttp 版本耦合。alipay-sdk 自带的 okhttp 3.12 声明与其运行时要求(≥4.11)自相矛盾,pom 里以 <exclusions> 显式剔除、统一用 MinIO 传递的 4.12(server/pom.xml 注释与《HANDOVER.md》第九轮"依赖坑"一节双重记录)。这意味着 minio 与 alipay-sdk 的版本不是独立的:升级任何一个都要重新对一遍 okhttp 依赖树,否则会出现运行时 NoSuchMethodError 这类经典冲突。此外 MinIO 客户端的超时(连接 5s/读写 60s)是启动探测"快速失败、回落本地 upload"设计(《07-模块详解》8.3)的实现前提。
可观测件(actuator + micrometer)。micrometer-core 在 framework-web 被 WebLogAspect 用于打接口耗时 Timer(指标名 xy_mall_api_cost_seconds),micrometer-registry-prometheus 在 server 侧把它导出为 /actuator/prometheus 端点,Grafana 面板 JSON(xy-mall/deploy/grafana/)直接消费。这套组合是"随 BOM 免费拿"的典型——没有它,WebLogAspect 的观测数据只能进日志文件;《13-技术债务与演进建议》中期路线图的 CI/监控补齐也以它为底座。
文档件(springdoc 2.6.0 + knife4j 4.5.0)。二者的关系是"引擎 + 中文档皮肤":springdoc 从 @Tag/@Operation 注解生成 OpenAPI JSON,knife4j 提供 /doc.html 调试界面。升级必须同频(knife4j 4.5 对 springdoc 2.x 有版本对应关系),且 prod profile 双双关闭(《14》2.3 节)——这意味着升级验证只能在 dev 环境做,生产暴露面为零。
| 依赖 | 版本 | 端 | 用途 | 实际使用位置 | 选型理由 / 替代 | 升级风险 |
|---|---|---|---|---|---|---|
| vue | ^3.5.13 | 三端同 | UI 框架 | 全部 .vue | 标配 | 低 |
| vue-router | ^4.5.0 | 三端同 | 路由(history 模式、全懒加载) | src/router/index.ts ×3 | 标配 | 低 |
| pinia | web/admin ^2.3.0;h5 ^3.0.1 | 三端 | 登录态 store(token/userInfo 持久化 localStorage) | src/stores/user.ts ×3 | 轻量状态 | 版本漂移:h5 已到 3.x 而其余两端 2.x,见 5.3 |
| axios | ^1.7.9 | 三端同 | HTTP 客户端 + 拦截器 | src/api/request.ts ×3(R 解包、401 去重) | 拦截器生态 | 低 |
| element-plus | ^2.9.1 | web/admin | 组件库 | 按需自动引入(unplugin-vue-components + ElementPlusResolver) | 表格/表单密集场景 | 大版本升级伴随样式变量变动 |
| @element-plus/icons-vue | ^2.3.2 | web | 图标 | AppHeader 等组件 | 配套 | 低 |
| vant | ^4.9.15 | h5 | 移动端组件库 | src/main.ts 全量引入 | 触摸交互 | 全量引入拖包体(《10》建议 7:可改按需) |
| echarts | ^6.1.0 | admin | 仪表盘图表 | DashboardView.vue 按需注册(echarts.use([...]));vite manualChunks 拆包 | 功能全 | 6.x 相对 5.x 有 API 变更面 |
| @wangeditor/editor(+ for-vue) | ^5.1.23 / ^5.1.12 | admin | 商品详情富文本 | GoodsListView.vue 编辑弹窗 | 中文富文本主流 | 5.x 停更风险见 5.4 |
| element-china-area-data | ^6.1.0 | web | 省市区三级联动数据 | AddressView.vue | 开箱即用的中国区划 | 数据随区划调整需更新 |
| vite | web/admin ^6.0.3;h5 ^6.2.0 | 三端 | 构建 + dev server(proxy 到 8081) | vite.config.ts ×3 | 标配 | 配置项见《14》3.6 |
| vue-tsc | ^2.2.x | web/admin(build 强制);h5(devDeps 有但 build 不跑) | 类型门禁 | build 脚本 vue-tsc -b && vite build | 构建期拦截类型错误 | 见 5.3 |
| typescript | web/admin ~5.6.3;h5 ~5.8.3 | 三端 | 类型系统 | 全部 .ts/.vue | — | 三端小版本漂移 |
| unplugin-vue-components | ^32.1.0 | web/admin | 组件自动按需引入 | vite.config.ts | 免手工 import | 与组件库 resolver 配套 |
| eslint + eslint-plugin-vue + typescript-eslint | ^9.39.5 等 | web/admin | 代码规范(h5 未配置) | eslint.config.js 平面配置 | HANDOVER 工程债清理轮引入 | 低 |
| playwright-core | ^1.49.0 | web(devDep) | GUI 冒烟驱动本机 Chrome | e2e/gui-smoke.mjs(npm run e2e:gui) | 不下载浏览器,零体积 | 依赖本机 Chrome 路径探测 |
Element Plus 2.9(web/admin)与 Vant 4.9(h5)。双组件库并存是"两种终端、两种交互范式"的直接映射:Element Plus 承担后台的 el-table + el-dialog + el-form 密集表单(19 个业务视图同一范式,《02-页面设计》2.2),Vant 4 承担 H5 的触摸手势组件(van-swipe-cell 左滑删除、van-action-bar 底部操作条)。两者的引入方式刻意相反:Element Plus 走 unplugin-vue-components 自动按需(产物只含用到的组件),Vant 在 main.ts 全量引入(代码省事、包体变大,H5 定位迭代中故暂接受,《13》D2 所属的"精简端债务簇")。web 端还通过 styles/variables.css 覆写 --el-color-primary 系列把品牌色统一为京东红,H5 用 :root:root 双写覆盖 --van-primary-color(《02-页面设计》3.2)——同一视觉目标、两种 CSS 变量机制,是双组件库成本的具体体现。
ECharts 6(admin)。仪表盘三图(趋势/占比/热卖)的唯一图表源。工程上有两处值得记住的处理:按需注册(只 use 了 Line/Bar/Pie/Grid/Legend/Tooltip/CanvasRenderer 七个模块)与构建拆包(vite.config.ts 的 manualChunks 把 echarts/zrender 拆成独立 chunk,登录页与列表页不背图表库的体积)。从 5.x 升 6.x 时 echarts.use 的模块路径有变化面,好在全库只有一个文件使用它(DashboardView.vue),爆炸半径为一。
wangEditor 5(admin)。商品详情富文本编辑器,产出 HTML 存入 goods.goods_detail。选择它的理由是中文场景的开箱即用(图片上传、粘贴清理),风险是社区版 5.x 处于低维护状态(官方重心转向 6/收费版)——它与后端 utils/sanitize.ts 前端消毒(《08-安全与权限设计》第 4 节 XSS 行)构成一对"编辑器产出不可信 HTML"的攻防组合,替换编辑器时必须连带复核消毒白名单。
axios 1.7(三端)。三端 request.ts 几乎同构的封装(baseURL /api、15s 超时、blob 放宽 60s、R 解包、401 去重跳转)是 axios 拦截器能力的标准教科书用法(《01-系统架构》4.1)。不换 fetch 的理由:拦截器、超时、blob 处理三件套在 axios 里是配置,在 fetch 里是手写。风险最低的依赖,唯一注意点是三端各自独立声明版本、靠 ^ 范围漂移保持大致同步。
element-china-area-data 6.1(web)。只被 AddressView.vue 一处使用的纯数据包(省市区三级编码),却支撑了收货地址的完整交互。它属于"数据即依赖"的类别:包体不小(全国区划码表)但只有一个消费者,若将来 H5 也要地址编辑,可评估改为后端下发接口而非前端打包码表。
playwright-core 1.49(web devDep)。GUI 冒烟的驱动层。选 playwright-core 而非完整 playwright 是刻意的:前者不下载浏览器二进制,通过 findChrome() 探测本机 Chrome(《09-测试与质量保障》4.2),让 e2e 的安装成本为零。约束是测试结果依赖本机浏览器版本,跨机器复现时需核对 CHROME_PATH。
后端依赖面干净:真正参与运行的第三方依赖约 15 个,全部是主流、活跃、大社区项目,无停更项、无已知严重 CVE(CODE-AUDIT-20260905.md 依赖节结论:"Spring Boot 3.4.13 / fastjson2 2.0.64 / jjwt 0.12.6 / druid 1.2.25 均无已知严重 CVE")。前端同理,核心五件(vue/router/pinia/axios/组件库)均为主流版本线。主要健康问题不在"用了坏依赖",而在"声明了不用的依赖"与"三端版本漂移"——以下三小节按优先级给出处置。
以下依赖在 xy-mall 全部 Java 源码中 grep 不到任何 import(检索命令与命中数见 2.5 表"备注"列),移除不影响任何功能:
ObjectMapper 使用点可作反证。它与 Jackson 的功能重复是历史选择痕迹(父 POM properties 至今保留 fastjson2.version)。移除时同步删 properties 行。AGENTS.md/README 提法已核对(回刷确认):xy-mall/README.md 第 17 行工具表提及 Hutool/Fastjson2、第 98 行声称"VO 转换统一由 MapStruct converter 处理",AGENTS.md 无相关提法;README 属源码仓库文件(不在本文档集修订范围),若日后清理依赖需同步修正。StringUtils,IO 操作用 JDK 原生。xy-mall/README.md(第 98 行)工程约定写着"VO 转换统一由 MapStruct converter 处理"(《00》§3.1 亦沿用该口径),但当前源码一个转换接口都没有,实际全部用 BeanUtils.copyProperties(运行时反射拷贝)。两个处置方向:要么补真正的 converter 接口兑现约定(收益是编译期字段对齐检查),要么移除依赖并把约定改写为"BeanUtils 拷贝、字段名必须同名"。现状是 pom(含 server 的 annotationProcessorPaths)与文档都为它付出了维护成本却零产出。CacheConfig 只用了它的 @EnableCaching 开关,全库没有一处 @Cacheable/@CacheEvict——所有缓存都是手工 RedisTemplate 实现的。移除依赖与注解即可;CacheConfig 的 RedisTemplate 装配必须保留(它是对象缓存的序列化基础)。上述清理的连锁收益:父 POM properties 可删 7 行版本声明、依赖树与镜像体积变小、versions:display-dependency-updates 的噪音减少。唯一需要谨慎的是 mapstruct(涉及工程约定改写)与 spring-boot-starter-cache(涉及 @EnableCaching 行为面),建议各自单独提交并在 mvn test 与 e2e-smoke 后合入。
^3.0.1,web/admin 停在 ^2.3.0。pinia 3 相对 2 的破坏面不大(主要移除 Vue 2 支持与部分弃用 API),但三端"同名同构"的 stores/user.ts 若将来要抽公共包,必须先统一大版本。建议低风险路径:web/admin 升 3.x(store 代码极薄,回归点是登录态持久化)。vue-tsc ^2.2.8,但 build 脚本只是 vite build——类型检查装了不跑,这正是《09-测试与质量保障》6 节建议 8 说的"三端质量水位分化"。要么补上 vue-tsc -b &&(与另两端对齐,可能暴露存量类型错误需要先修),要么删掉依赖声明,别让"装而不用"误导读者。packageManager 字段(pnpm 版本未锁定,web/admin 均锁定 pnpm@11.24.0)、无 eslint 配置、无 Dockerfile(《13》D2)、无 CI(回刷核实:web/admin 均有 .github/workflows/ci.yml,h5 目录没有)。这与"迭代中精简端"定位一致,但若 h5 转正,这四项是第一批补齐项。sanitize.ts 白名单复核。mvn dependency:tree -Dincludes=com.squareup.okhttp3 可复核)。把全景压缩成三句话:后端"用了的都是主流货,没用的都在吃闲饭"——15 个在用依赖构成的平台层健康稳定,7 个零使用依赖是立等可取的清理项;前端的健康问题集中在 h5 端——类型门禁空挂、pnpm 未锁定、pinia 版本孤岛,都与"精简端"定位互为因果;版本耦合有三条暗线要记(okhttp、knife4j-springdoc、mapstruct-processor 与约定的名实分离),任何一次升级前先对着本文 5.4 节过一遍。与《00-项目总览》第 3 节的选型理由表对照阅读,可以同时回答"当初为什么选它"与"现在它值不值得留"。