thinkphp后台审核功能需解决可追溯、权限控制、异常上下文保留三大问题:状态变更须留痕,审核动作需权限校验与业务规则约束,日志须中间件前置捕获且脱事务记录。

ThinkPHP后台数据审核功能,核心不是“加个按钮改个状态”,而是要解决三个实际问题:状态变更必须可追溯、审核动作不能绕过权限控制、失败或异常时不能丢失上下文。直接在控制器里写 Db::update() 改 check_status 字段,90% 的项目后期都会卡在查不到谁在什么时候驳回了哪条数据。
审核接口必须带完整业务上下文校验
单纯接收 id 和 status 并更新,会埋下越权和脏数据隐患。真实场景中,审核操作必须确认:当前登录人有该数据的审核权限、目标记录未被软删除、状态变更符合业务流转规则(比如不能从“已驳回”直接跳到“已发布”)。
- 用
Auth::id()拿当前操作人 ID,别依赖 session 变量或手动传参 - 查原记录时显式加上软删除条件:
['trash' => 0],避免误审已删数据 - 状态值必须白名单校验:
in_array($status, [1, 2, 3]),别用$status > 0这类宽松判断 - 更新前先
Db::name('article')->where('id', $id)->find(),确保记录存在且可读
审核日志必须走中间件统一拦截
在 audit() 方法里手写 Log::write(),漏掉异常分支、参数没抓全、IP 和 URL 缺失是常态。真正能审计的记录,得在请求进入控制器前就捕获原始输入和上下文。
- 注册
app/middleware/AdminLogMiddleware.php全局中间件,不依赖路由分组 - 过滤免日志操作:
in_array($request->action(), ['login', 'captcha', 'logout']),别用 URL 字符串匹配 - 记录字段必须含:
user_id、ip、method、url(带 query)、input(json_encode($request->param(), JSON_UNESCAPED_UNICODE))、result_code -
input中必须unset($param['token'], $param['password']),否则审计日志本身成风险点
前端提交和后端响应要约定明确的 code 语义
很多项目返回 {"code":1} 就认为成功,结果前端无法区分“审核通过”、“审核驳回”、“状态未变”。审核是业务动作,不是简单 CRUD,响应体必须携带可驱动 UI 的状态标识。
- 不要只靠 HTTP 状态码判断成败;
$response->getCode()在异常未被捕获时恒为 200 - 统一用业务字段
code表达结果:1(成功)、0(参数错误)、-1(无权限)、-2(记录不存在) - 审核通过/驳回需额外返回
check_status值,方便前端刷新列表时精准更新对应行状态 - 错误响应必须带
msg,且内容不含敏感信息(如数据库字段名、路径)
最常被忽略的一点:审核操作一旦涉及多表更新(比如同时改主表状态 + 插入审核流水表),日志写入必须脱离主事务。否则事务回滚时,操作日志也消失,等于没审。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











