Skip to content

响应码

所有接口返回 {"code": "xxxx", "msg": "...", "data": ...},HTTP 状态恒为 200,业务结果由 code 字段承载。

源码:app/core/code.py。前端 .envVITE_SERVICE_* 把若干码映射为"登出 / 弹窗 / 自动刷新 token / 静默失败"等行为。

码段划分

码段含义
0000成功
1000–1999系统内部错误(异常捕获、入参校验失败)
2000–2999框架内置业务错误(认证、授权、资源冲突、Schema 必填等)
3000–3999框架预留(暂未使用)
4000–9999项目 / 业务模块自定义码(业务模块码必须从 4000 起,不得占用 2xxx

0000 — 成功

常量说明
0000Code.SUCCESS请求成功

1xxx — 系统内部错误

10xx — 服务器错误

常量说明
1000INTERNAL_ERROR通用 / 未处理异常

11xx — 数据库错误

常量说明
1100INTEGRITY_ERROR唯一键 / 外键约束冲突
1101NOT_FOUND记录不存在(DoesNotExist

12xx — 数据校验

常量说明
1200REQUEST_VALIDATION请求参数 / 请求体校验失败(FastAPI 层)
1201RESPONSE_VALIDATION响应序列化失败

1200data.errors 数组里每条错误形如 {field, message, type},由 exceptions.py_format_validation_error 把 Pydantic v2 的英文错误翻译成中文。

2xxx — 业务逻辑错误

21xx — 认证(前端有特殊处理)

常量说明前端行为
2100INVALID_TOKENToken 缺失 / 解码失败 / 格式无效跳转登录
2101INVALID_SESSIONToken 类型错误 / 用户不存在跳转登录
2102ACCOUNT_DISABLED用户账号已禁用弹窗后登出
2103TOKEN_EXPIREDaccess token 已过期自动刷新 token
2104REFRESH_TOKEN_MISSING刷新令牌缺失
2105NOT_REFRESH_TOKEN传入的不是刷新令牌
2106SESSION_INVALIDATEDtoken_version 已递增,旧 token 失效跳转登录

前端 .envVITE_SERVICE_LOGOUT_CODES=2100,2101,2104,2105VITE_SERVICE_MODAL_LOGOUT_CODES=2102,2106VITE_SERVICE_EXPIRED_TOKEN_CODES=2103

22xx — 授权

常量说明
2200API_DISABLED接口被管理员禁用
2201PERMISSION_DENIEDRBAC 接口权限不足
2202MISSING_BUTTON_PERMISSIONrequire_buttons(..., require_all=True) 缺指定按钮
2203NEED_ANY_BUTTON_PERMISSIONrequire_buttons(...) 任一按钮都不持有
2204MISSING_ROLErequire_roles(..., require_all=True) 缺指定角色
2205NEED_ANY_ROLErequire_roles(...) 任一角色都不持有
2206SUPER_ADMIN_ONLY仅超级管理员可操作
2207USER_NO_ROLE用户未绑定任何角色

23xx — 资源冲突

常量说明
2300DUPLICATE_RESOURCE通用资源重复(兜底)
2301DUPLICATE_ROLE_CODE角色编码已存在
2302DUPLICATE_USER_EMAIL邮箱已注册
2303DUPLICATE_USER_PHONE手机号已注册
2304DUPLICATE_USER_NAME用户名已存在
2305DUPLICATE_MENU_ROUTE菜单路由路径已存在

24xx — 通用业务失败

常量说明
2400FAIL未归类失败(尽量避免使用,新增场景请加专属码)
2401WRONG_CREDENTIALS用户名或密码错误
2402CAPTCHA_INVALID验证码错误或已过期
2403CAPTCHA_SEND_FAILED验证码发送失败
2404PHONE_NOT_REGISTERED手机号未注册
2405OLD_PASSWORD_WRONG修改密码时原密码错误
2406TARGET_USER_NOT_FOUND操作目标用户不存在(如模拟登录)

25xx — 限流 / 安全

常量说明
2500RATE_LIMITED请求过于频繁
2501IP_BANNEDIP 已被临时封禁
2502ACCESS_DENIED被安全策略拦截

26xx — Schema 必填校验(业务 Schema 层主动抛)

常量说明
2600PARAM_REQUIRED通用必填兜底
2601USERNAME_REQUIRED用户名不能为空
2602PASSWORD_REQUIRED密码不能为空
2603USER_ROLE_REQUIRED用户至少需要一个角色
2604USER_EMAIL_REQUIRED用户邮箱不能为空
2605ROLE_NAME_REQUIRED角色名称不能为空
2606ROLE_CODE_REQUIRED角色编码不能为空
2607ROUTE_NAME_REQUIRED路由名称不能为空
2608ROUTE_PATH_REQUIRED路由路径不能为空

4000–9999 — 自定义

项目专属业务码段。框架本身不使用,前端默认不会自动弹错——按需自行处理。

业务模块约定:业务码统一从 4000 起(不得占用 2xxx 系统段),在 app/core/code.py 末尾追加本模块的码段(如 41xx42xx),不要反复使用 2400。每个失败场景一个唯一码,便于前端精确弹窗与测试断言。

40xx — HR 业务(业务模块码示例)

常量说明
4000HR_DEPARTMENT_REQUIRED超级管理员创建员工需指定部门
4001HR_MANAGER_REQUIRED仅部门主管可创建员工
4002HR_CREATE_FORBIDDEN无权限创建员工
4003HR_TAGS_EXCEED_LIMIT员工标签数量超出上限
4004HR_EMPLOYEE_NOT_IN_DEPT该员工不在当前主管部门中
4005HR_USER_NOT_EMPLOYEE当前用户未关联员工信息
4006HR_MANAGER_ONLY仅部门主管可执行此操作
4007HR_INVALID_TRANSITION不允许的状态流转

抛出方式

业务代码统一抛 BizError(或返回 Fail)。BizErrorexceptions.py 的全局处理器捕获并转成 Fail(code, msg)

python
from app.utils import BizError, Code, Fail

# 方式 A:抛异常(推荐,能在任意层穿透)
raise BizError(code=Code.HR_INVALID_TRANSITION, msg="不允许从 'resigned' 转换为 'active'")

# 方式 B:返回 Fail(仅在 api 层用,更直白)
return Fail(code=Code.OLD_PASSWORD_WRONG, msg="原密码错误")

SchemaValidationError(继承自 BizError)专用于 Pydantic 校验器中抛出:它继承 ValueError,因此 Pydantic 不会捕获,能直达全局处理器。

前端码映射

前端 .env 变量默认值行为
VITE_SERVICE_SUCCESS_CODE0000视为成功,提取 data
VITE_SERVICE_LOGOUT_CODES2100,2101,2104,2105直接登出
VITE_SERVICE_MODAL_LOGOUT_CODES2102,2106弹窗提示后登出
VITE_SERVICE_EXPIRED_TOKEN_CODES2103自动用 refresh token 刷新并重试
其他显示 msg 错误消息

基于 MIT 协议发布