@app-mall/controllers/GroupBuyController.php: 135行的代码,会返回自主定义的错误码,但项目里没有这方面的一个整体规划,请给一套方案设计方案出来。
@app-mall/controllers/GroupBuyController.php: 135行的代码对应的前端页面是 mallApp/src/pages/groupBuy/detail.vue,如果在此页面下,接收到后端返回 6001(或整体设计后的新码),则可以按需求做独自业务处理。
name: 自定义业务错误码体系设计 overview: 为项目建立一套统一的自定义业务错误码(bizCode)规划与命名常量管理机制,并以 GroupBuyController 的 6001 为首个落地案例,同步打通前端 mallApp 识别该业务码的框架。
util::error($code, $msg, $data)(common/components/util.php:302)已经存在,但项目里裸用的自定义 code 目前只有两类:-1(多处用作"静默业务失败",前端 resolve 不 toast)和 6001(app-mall/controllers/GroupBuyController.php:135,唯一一个"正经"业务码,但是随手定的数字,没有号段规划、没有常量、没有文档)。
前端拦截器 luch-request_0.0.7/request.js:188-222 里 code 的语义目前是写死的几个分支:1 成功、0 失败(toast+reject)、-1 静默业务失败(resolve)、2 登录态失效。其余任何 code(包括 6001)都会落进 else 分支:既弹全局 toast 又 reject,页面完全拿不到 code 做区分处理。这就是"6001 传到前端后没法单独处理"的根因。
1 成功、0 通用失败(toast)、2 登录态失效、-10 未登录 —— 维持不变。-1 维持作为历史遗留的"静默业务码"(继续兼容 ProductClass 限购、ChatController 校验失败等已有调用)。code >= 1000 均为"业务码"(bizCode),前端统一按 -1 的方式处理(resolve、不弹全局 toast),交由具体页面 res.code === xxx 判断后做专属逻辑。之后任何新业务码只要 >= 1000,都不需要再改一次拦截器。集中管理业务码常量 + 文档注释,按模块预留号段(每段 1000 个号):
6001 正好落在此区间,保留原值不变,只是补上命名和文档文件里以类常量形式登记每个码的含义、触发场景、对应前端页面,例如:
class errCode
{
/**
* 客户在当前门店暂无绑定关系(hd 表无记录)
* 场景:GroupBuyController::actionDetail
* 前端:mallApp/src/pages/groupBuy/detail.vue
*/
const GROUP_BUY_HD_NOT_BOUND = 6001;
}
之后新增业务码的规范:在对应号段追加常量 + 注释,Controller 里用 util::error(errCode::XXX, $msg) 代替裸数字。
app-mall/controllers/GroupBuyController.php:135 引入 use common\components\errCode;,把:
util::error(6001, '客户暂无关联此店');
替换为:
util::error(errCode::GROUP_BUY_HD_NOT_BOUND, '客户暂无关联此店');
值不变,行为不变,只是消除魔法数字。
>=1000 静默通道request.js 在 code == -1 分支后新增一支:
} else if (response.data.code && response.data.code >= 1000) {
// 自定义业务码(见 common/components/errCode.php 号段规划)
// 不弹全局 toast、不 reject,交给页面自行判断 code 处理
resolve(response.data)
}
(仅改动 mallApp 的拦截器;hdApp/ghsApp 若以后有类似诉求,可复用同一套 >=1000 约定,但本次不代为修改。)
新建 front-end/mallApp/src/constant/errCode.js(风格对齐现有 constant/storageKeys.js):
/** 与后端 common/components/errCode.php 对应的业务错误码 */
// 拼团:客户在当前门店暂无绑定关系
export const GROUP_BUY_HD_NOT_BOUND = 6001
在 detail.vue init() 方法里,if (this.groupBuyId) { const res = results[0]; ... } 分支中,在判断 res.code === 1 之前插入:
if (res.code === GROUP_BUY_HD_NOT_BOUND) {
this.handleHdNotBound(res)
return
}
新增占位方法:
/**
* 处理"客户暂无关联此店"业务码(GROUP_BUY_HD_NOT_BOUND)
* TODO: 具体引导登录/绑定关系的产品交互待定,目前仅做识别与占位
*/
handleHdNotBound(res) {
this.$msg(res.msg || '客户暂无关联此店')
}
顶部新增 import { GROUP_BUY_HD_NOT_BOUND } from '@/constant/errCode'。
由于第 4 步已让 code>=1000 走 resolve,此前 .catch(() => { uni.hideLoading() }) 不会再吞掉 6001 这个场景,改为在 .then() 里被正确识别。
common/components/errCode.phpapp-mall/controllers/GroupBuyController.phpfront-end/mallApp/src/plugins/luch-request_0.0.7/request.jsfront-end/mallApp/src/constant/errCode.jsfront-end/mallApp/src/pages/groupBuy/detail.vue