# API 对比与修复方案 ## 概览统计 - v1 控制器: adminapi 81、api 24、core 4、boot 4、ai 2、src 1、apps 1(合计 113) - v1 接口: adminapi 552、api 108、core 9、boot 8、ai 8、src 4、apps 3(合计 692) - Java 控制器: adminapi 122、api 45(合计 167) - Java 接口: adminapi 850、api 200(合计 1050) - 分布一致性:两侧以 `/adminapi` 为主、`/api` 次之;方法分布均以 `GET` 为主,`POST/PUT` 次之,`DELETE` 较少,无 `PATCH` ## 模块覆盖明细(v1 vs Java) - sys(api) - v1: `sys-config.controller.ts` 5、`sys-verify.controller.ts` 6、`upload.controller.ts` 4、`captcha.controller.ts` 1 - Java: `SysConfigController.java` 7、`SysVerifyController.java` 6、`UploadController.java` 4、`CaptchaController.java` 1 - wechat(api) - v1: `wechat.controller.ts` 9 - Java: `WechatController.java` 9 - weapp(api) - v1: `weapp.controller.ts` 6 - Java: `WeappController.java` 7 - pay(api) - v1: `pay.controller.ts` 4 - Java: `PayController.java` 4 - member(api) - v1: `member.controller.ts` 9、`member-cash-out.controller.ts` 13、`member-account.controller.ts` 8、`member-address.controller.ts` 5、`member-sign.controller.ts` 6 - Java: `MemberController.java` 9、`MemberCashOutController.java` 13、`MemberAccountController.java` 8、`MemberAddressController.java` 5、`MemberSignController.java` 6 - login(api) - v1: `login.controller.ts` 7、`register.controller.ts` 3 - Java: `LoginController.java` 7、`RegisterController.java` 2 - diy(api) - v1: `diy-form.controller.ts` 6、`diy.controller.ts` 4 - Java: `DiyFormController.java` 6、`DiyController.java` 4 - channel(api) - v1: `channel/app.controller.ts` 2 - Java: `channel/AppController.java` 2 - agreement(api) - v1: `agreement.controller.ts` 1 - Java: `AgreementController.java` 1 - addon(api) - v1: `addon.controller.ts` 1 - Java: `AddonController.java` 1 - adminapi(样本) - v1: `sys-*` 合计 19(如 `sys-config.controller.ts:19`)、`member-*` 合计 19、`site-*` 合计 18、`notice-*` 合计 27、`diy-*` 合计 24、`niucloud-*` 合计 13、`pay-*` 合计 8、`login-*` 合计 4 - Java: 对应 `sys/*` 19、`member/*` 19、`site/*` 18、`notice/*` 27、`diy/*` 24、`niucloud/*` 13、`pay/*` 8、`login/*` 2 ## 模块差异与证据(按域) - sys(api) - 证据(v1): - `wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-config.controller.ts:50,60,70,80,90` — 五个 GET 路由已对齐 Java - `wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-verify.controller.ts:35,45,55,69,77,85` — 六个路由已对齐(含 POST `verify/{code}`) - `wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/upload.controller.ts:47,61,75,86` — 四个 POST 路由已对齐 - `wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/captcha.controller.ts:35` — `GET /api/captcha` 对齐 - 证据(Java): - `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysConfigController.java:64,75,86,96,107,140` — 六个 GET;v1 缺 `member_mobile_exist` - `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysVerifyController.java:25,36,48,59,72,85` — 六个路由对齐 - `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/UploadController.java:24,31,38,47` — 四个 POST 对齐 - `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/CaptchaController.java:13-15` — `GET /api/captcha` 对齐 - 差异:缺失 `GET /api/member_mobile_exist`;`verify_detail` 参数名 `{code}` vs `:id` - wechat(api) - 证据(v1):`wwjcloud/libs/wwjcloud-core/src/controllers/api/wechat/wechat.controller.ts:30,41,49,59,67,75,83,91,99` - 证据(Java):`niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/wechat/WechatController.java:38,48,60,69,78,87,98,107,116` - 差异:`GET /api/wechat/user` 返回结构需按 Java 包装为 `{ data: '' }` - weapp(api) - 证据(v1):`wwjcloud/libs/wwjcloud-core/src/controllers/api/weapp/weapp.controller.ts:38,50,62,74,86,98` - 证据(Java):`niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/weapp/WeappController.java:28,37,46,56,65,75` - 差异:`getMsgJumpPath` 的查询参数名 `out_trade_no`(Java) vs `outTradeNo`(v1) - pay(api) - 证据(v1):`wwjcloud/libs/wwjcloud-core/src/controllers/api/pay/pay.controller.ts:25,34-55,56-68,70-84` - 证据(Java):`niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/pay/PayController.java:31-34,47-57,64-67,69-72` - 差异:无(路径与方法一致) - member(api) - 证据(v1):`member-cash-out.controller.ts:44,62,73,83,93,102,112,125,140,153,165,174,188`(示例) - 证据(Java):`MemberCashOutController.java:33-36,43-48,55-59,66-70,77-80,87-93,101-105,112-115,122-127,134-137,144-147,155-159,166-172` - 差异:无显著差异(路径与方法一致,返回结构键名部分需逐项核验) - login(api) - 证据(v1):`login.controller.ts:44,62,86,106,119,146,159` - 证据(Java):`LoginController.java:53-57,65-70,78-83,90-93,100-105,112-116,119-131` - 差异:`register.controller.ts` 方法数 v1 为 3,Java 为 2;需核验新增方法来源与必要性 - adminapi/login - 证据(v1):`adminapi/login/login.controller.ts:40,60,73-107,114-122` - 证据(Java):`adminapi/login/LoginController.java:39-43,50-53,56-67` - 差异:`tokenInfo` 返回结构差异(`SaResult` vs `{ code,msg,data }`);方法总数差异(v1:4 vs Java:2) - 其他 adminapi 模块(样本) - sys:`sys-config.controller.ts`(v1 19,Java 19);`sys-poster.controller.ts`(v1/Java 13) - site:`site.controller.ts`(v1/Java 18);`site-group.controller.ts`(v1/Java 8) - notice:`niu-sms.controller.ts`(v1/Java 27);`notice.controller.ts`(v1/Java 7) - diy:`diy-form.controller.ts`(v1/Java 24);`diy.controller.ts`(v1/Java 17) - niucloud:`cloud.module.controller.ts`(v1/Java 8);`module.controller.ts`(v1/Java 5) - pay:`pay.controller.ts`(v1/Java 8) - 证据来源:方法装饰器计数基于源码检索(已在“总体规模”与“分布统计”中给出),可按需继续展开到每个具体路由的 `file:line` ## 问题分类 - 缺失接口 - v1 缺少 `GET /api/member_mobile_exist`(Java 已实现) - 路径参数不一致 - `GET /api/verify_detail/{code}`(Java) vs `GET /api/verify_detail/:id`(v1) - 业务实现不一致 - `POST /api/verify/{code}`:Java 为核销执行;v1 目前调用校验逻辑而非核销执行 - 方法数量轻微差异(需逐路由核验) - 管理端 login 控制器:v1 方法数 4;Java 方法数 2(可能包含额外路由或组合) - 响应结构不一致(新增) - `GET /api/wechat/user`:Java 返回 `{ data: '' }`;v1 直接返回对象(需按 Java 包装为字符串字段) - `GET /adminapi/login/tokenInfo`:Java 返回 `SaResult.data(SaTokenInfo)`;v1 返回 `{ code,msg,data }` 结构(需按项目统一策略确认是否对齐 SaResult 形态) ## 证据与代码定位 - 缺失接口 - Java `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysConfigController.java:140` — `GET /api/member_mobile_exist` - v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-config.controller.ts` — 未见对应方法 - 路径参数不一致 - Java `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysVerifyController.java:59` — `GET /api/verify_detail/{code}` - v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-verify.controller.ts:69` — `GET /api/verify_detail/:id` - 业务实现不一致 - Java `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysVerifyController.java:85-93` — `POST /api/verify/{code}` 调用 `verifyCode` - v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-verify.controller.ts:85-93` — 当前调用 `checkVerifier` - 方法数量差异(样本) - v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/adminapi/login/login.controller.ts` — 方法装饰器计数 4 - Java `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/login/LoginController.java` — 方法计数 2 - 响应结构不一致(证据) - v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/wechat/wechat.controller.ts:41-47` — 直接返回 service 数据对象 - Java `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/wechat/WechatController.java:48-53` — 返回 `Map{ data: '' }` - v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/adminapi/login/login.controller.ts:73-107` — 返回 `{ code,msg,data }` - Java `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/login/LoginController.java:56-59` — 返回 `SaResult.data(StpUtil.getTokenInfo())` - 参数命名不一致(证据) - Weapp 消息跳转路径: - v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/weapp/weapp.controller.ts:98-105` — `@Get('getMsgJumpPath') @Query('outTradeNo')` - Java `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/weapp/WeappController.java:75-77` — `@GetMapping('/getMsgJumpPath') @RequestParam('out_trade_no')` ## 修复方案清单 - 缺失接口:补齐 `GET /api/member_mobile_exist` - 路由定义:`@Controller('/api') @Get('member_mobile_exist')` - 输入:`openid`(Query),`Channel`(Header,默认 `h5`);对齐 Java 逻辑 - 位置:`wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-config.controller.ts` - 验收:返回键包含 `member_mobile_exist` 与 `member_exist` - 路径参数一致化:`verify_detail` - 将 v1 路由从 `@Get('verify_detail/:id')` 改为 `@Get('verify_detail/:code')` - DTO/Param:统一使用 `code` 字段绑定与传递 - 位置:`wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-verify.controller.ts:69` - 验收:`GET /api/verify_detail/{code}` 返回明细正确,参数名与 Java 一致 - 业务实现一致化:`POST /api/verify/{code}` - 将 v1 方法体从 `checkVerifier` 调用改为 `verifyCode` 调用 - 位置:`wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-verify.controller.ts:85-93` - 验收:成功返回 `Result.success()`;失败返回 `Result.fail()`,与 Java 行为一致 - 管理端 login 差异核验 - 对比 v1 与 Java 的管理端 login 路由明细(含路径、方法、鉴权) - 若 v1 存在额外路由需确认其业务来源与必要性;否则按 Java 精简或调整到对应模块 - 位置: - v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/adminapi/login/login.controller.ts` - Java `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/login/LoginController.java` - 响应结构一致化(新增) - `GET /api/wechat/user`:按 Java 将 service 返回对象序列化为 JSON 字符串并包装到 `{ data: string }` - `GET /adminapi/login/tokenInfo`:与团队达成统一策略后,对齐至 `SaResult.data(...)` 等效形态或保持 `{ code,msg,data }` 并在映射工具中设置例外规则 - 参数命名一致化(新增) - `GET /api/weapp/getMsgJumpPath`:将 v1 的 `outTradeNo` 统一为 `out_trade_no`(Query 参数名),保持服务层入参兼容;或在服务层做参数别名映射以不破坏现有前端 ## 执行步骤(建议) - 步骤 1:新增 `member_mobile_exist` 方法于 `sys-config.controller.ts`,对齐 Java 入参与服务层返回结构 - 步骤 2:统一 `verify_detail` 路由参数名为 `code`,更新 DTO/Param 绑定与服务层入参 - 步骤 3:修正 `POST /api/verify/{code}` 为 `verifyCode` 业务调用,按结果返回 success/fail - 步骤 4:核验管理端 login 路由,清单化差异并修复(必要时迁移或删除冗余) - 步骤 5:运行映射检查与 e2e 路由校验(含返回结构键名与 HTTP 方法) ## 验收标准 - 路由一致性:路径、HTTP 方法、参数名完全与 Java 一致 - 返回结构:键名与层级对齐(例如 `member_exist`、`member_mobile_exist`) - 业务语义:`verifyCode` 实际执行核销流程;`verify_detail` 正确按 `code` 查询 - 安全一致:`/adminapi` 使用统一守卫(如 Jwt/Roles),`/api` 按实际要求应用公开或鉴权 - 检查通过:`auto-mapping-checker.js` 映射检查零差异;e2e 覆盖关键路径全部通过 ## 全量证据索引 - 生成的路由全量报告(不做任何推断): - `docs/routes-full-report.md` — 摘要与前 50 的示例列表 - `docs/routes-full-report.json` — 完整的 Nest/Java 路由列表与差异数组,含 `file:line` - `docs/routes-modules-report.md` — 按模块聚合的差异统计与样例证据 - `docs/routes-modules-report.json` — 模块字典,包含各模块的 nest/java 路由数与缺失计数 ## 模块修复优先级(依据 routes-modules-report.md) - `adminapi/goods` — 差异计数最高(缺失于 v1: 122);证据示例:`webroot/addon/shop/java/.../AttrController.java:27` - `adminapi/marketing` — 次高(缺失于 v1: 68);证据示例:`.../marketing/CouponController.java:28` - `adminapi/delivery` — 高(缺失于 v1: 52);证据示例:`.../delivery/CompanyController.java:22` - `adminapi/member` — 高(缺失于 v1: 28,缺失于 java: 21);证据示例:`.../MemberAccountController.java:25` - `adminapi/notice` — 高(缺失于 v1: 26,缺失于 java: 23);证据示例:`.../NiuSmsController.java:19` - `adminapi/addon` — 高(缺失于 v1: 24,缺失于 java: 19);证据示例:`.../AddonController.java:124` - `adminapi/order`、`api/goods`、`api/marketing`、`api/order`、`api/refund` — 与前端强相关,建议同步推进;详见 `routes-modules-report.md` ## 批次修复计划 - 批次一(前端使用密集):`adminapi/dict`、`adminapi/channel`、`adminapi/member` - 批次二(商城域):`adminapi/goods`、`adminapi/marketing`、`adminapi/delivery`、`api/goods`、`api/order`、`api/refund` - 每批次完成后:更新 `routes-full-report.{json,md}`、`routes-modules-report.{json,md}`,并在本文件标记模块“已消除”与证据 `file:line` ## AI 修复任务指令(逐项可执行) - 任务 A:补齐 `GET /api/member_mobile_exist`(已修复) - 证据:Java `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysConfigController.java:140` - 位置:v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-config.controller.ts` - 行为:新增 `@Get('member_mobile_exist')`,读取 `openid`(Query)与 `Channel`(Header,默认 `h5`),调用对应服务方法并返回包含 `member_exist`、`member_mobile_exist` - 任务 B:统一 `verify_detail` 路径参数名(已修复) - 证据:Java `SysVerifyController.java:59` 使用 `{code}`;v1 `sys-verify.controller.ts:69` 使用 `:id` - 位置:v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-verify.controller.ts` - 行为:将路由改为 `@Get('verify_detail/:code')`,DTO/Param 绑定字段统一为 `code` - 任务 C:修正 `POST /api/verify/{code}` 的业务实现(已修复) - 证据:Java `SysVerifyController.java:85-93` 调用 `verifyCode`;v1 `sys-verify.controller.ts:85-93` 当前调用 `checkVerifier` - 位置:v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-verify.controller.ts` - 行为:方法体改为调用核销执行服务 `verifyCode`,按结果返回 `Result.success()` 或 `Result.fail()` - 任务 D:对齐 `GET /api/wechat/user` 的返回结构(已修复) - 证据:Java `WechatController.java:48-53` 返回 `{ data: '' }`;v1 `wechat.controller.ts:41-47` 返回对象本身 - 位置:v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/wechat/wechat.controller.ts` - 行为:将 service 返回对象序列化为 JSON 字符串并包装到 `{ data: string }` - 任务 E:对齐 `GET /api/weapp/getMsgJumpPath` 的参数名(已修复) - 证据:Java `WeappController.java:75-77` 使用 `out_trade_no`;v1 `weapp.controller.ts:98-105` 使用 `outTradeNo` - 位置:v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/weapp/weapp.controller.ts` - 行为:Query 参数名改为 `out_trade_no`,或在服务层增加参数别名映射以兼容现有前端 - 任务 F:管理端 `tokenInfo` 返回结构统一(需团队确认) - 证据:Java `adminapi/login/LoginController.java:56-59` 使用 `SaResult.data(...)`;v1 `adminapi/login/login.controller.ts:73-107` 返回 `{ code,msg,data }` - 位置:v1 `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/adminapi/login/login.controller.ts` - 行为:按统一策略对齐返回结构;若保持 `{ code,msg,data }`,在映射工具配置例外映射,确保差异不被计为错误 ## 影响范围与回归建议 - 受影响模块:`sys-config`、`sys-verify`、`login(adminapi)` - 回归建议: - 新增/变更路由的 4xx/5xx 行为与防抖/限流(如有) - 租户隔离(`siteId`/`Channel`)与鉴权策略的一致性 - 上传/核销等接口在 H5/Weapp 渠道的参数来源与头信息 ## 参考文件位置 - v1 - `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-config.controller.ts` - `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/api/sys/sys-verify.controller.ts` - `wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controllers/adminapi/login/login.controller.ts` - Java - `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysConfigController.java` - `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysVerifyController.java` - `niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/login/LoginController.java`