上线前夜,我把权限表导了三遍才发现 `pid` 写成了自己的 id

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 116 浏览 0 回复

上周赶一个后台管理系统上线,下午六点测试说"都过了",我七点开始打包。结果部署到预发布环境,超管账号进去左侧菜单只剩一个"首页",其他全灰。我第一反应是前端路由守卫搞事了,抓包看返回的菜单树,数据明明在啊。

蹲那儿看了二十分钟,突然瞄到数据库里那条"系统管理"的 `pid` 字段写的是它自己的 `id`。递归渲染菜单的时候,前端按 `pid` 找子节点,这条记录直接闭环了,树形算法栈溢出,后面的兄弟节点全被吞。更绝的是本地开发时数据少,递归深度浅,浏览器没炸,测试环境数据一多就露馅。

这事让我把上线前的检查清单彻底改了写法。以前我是按"功能模块"列的,比如"用户模块 OK""订单模块 OK",现在换成"数据一致性 + 配置闭环"两条线,专门盯着那种"有数据但表现不对"的暗病。分享出来,各位站长看看有没有漏的:

一、权限与菜单:别只看"能不能进",要看"对不对"

1. `auth_rule` 和 `menu` 不是一回事,但上线前必须交叉对一遍。规则表管"能不能点",菜单表管"显不显示",我遇到过规则删了菜单还在,点进去 403;也遇到过菜单 `status=0` 但规则生效,直接 URL 敲进去能进。

2. 菜单树的 `pid` 必须跑一遍"孤儿节点检测"和"自环检测"。SQL 很简单:SELECT * FROM menu WHERE id = pid,再加一条 SELECT id FROM menu WHERE pid NOT IN (SELECT id FROM menu) AND pid != 0。别信眼瞅,数据量过百必跑脚本。

3. 超管角色的权限节点数,记下来。我现在的习惯是上线前 `SELECT COUNT(*) FROM auth_rule`,部署后再跑一遍,数字对不上立刻停。上次少两条,查到最后是迁移脚本里 `INSERT IGNORE` 把冲突吞了。

二、路由:大小写、斜杠、参数顺序都是雷

4. Linux 生产环境路由大小写敏感,本地 Windows/Mac 不敏感。我清单里专门有一条:把路由表导出,在 Linux 容器里跑一遍 `curl` 批量测试,302 或 404 的拎出来人工审。

5. 带可选参数的路由,比如 `/user/[id]/profile`,必须测"不传 id"和"传非法 id"两种。上线后蜘蛛爬到一个旧外链,直接抛 `Parameter missing`,错误监控没配的话要第二天才晓得。

6. 如果用了路由缓存(ThinkPHP 的 `route.php` 缓存或 Laravel 的 `route:cache`),清缓存后务必重启 worker。我踩过 Swoole 模式下路由缓存刷新了,但 worker 进程没重启,新旧路由混着用,用户 A 看到新页面,用户 B 还是旧的。

三、配置:环境变量是"薛定谔的猫"

7. `.env` 文件里的配置,和数据库 `config` 表的配置,优先级必须文档化。我现在的项目统一约定:数据库配置覆盖 `.env`,但上线前夜要把两处的"支付回调地址""OSS 域名"这类关键项,用脚本 diff 一遍。

8. 缓存前缀必须带环境标识。预发布和生产共用一套 Redis 时,前缀一样会导致配置串台。我的方案是前缀固定 `项目名:环境:模块:`,比如 `myapp:prod:site:`,上线 checklist 里加一条检查 `CACHE_PREFIX`。

9. 定时任务配置单独列一条。Crontab 是跟着服务器走的,代码里写了任务,上线后 `crontab -l` 没有等于白写。我现在用代码仓库里的 `crontab.txt`,上线后执行 `crontab crontab.txt`,然后立刻 `crontab -l` 截图存证。

四、最后两小时:做减法,不做加法

10. 上线前四小时,冻结所有"顺手改一下"。这条是血泪换来的。上次我觉得"这个提示语不顺眼,改个字",顺手改了语言包,结果引用的变量名跟着变了,前端没同步,上线后弹窗显示 `{user_name}` 原样输出。

11. 准备回滚包的时间,不能少于部署时间的 1.5 倍。我现在是:部署脚本 10 分钟,回滚脚本必须 15 分钟内能跑完,包括数据库回滚。回滚脚本提前在预发布跑通,不是"应该能回",是"已经回过一次"。

12. 上线后第一通电话打给谁,提前写在便签上。不是技术问题,是心理锚定。我写过"数据库挂了找老张,CDN 炸了找老李,自己慌了找媳妇",虽然一次没用过,但贴显示器上踏实。

那份 `pid` 写错的菜单数据,我现在还留着,导出来一个 `menu_bak_2024_bug.sql`,每次新员工来就打开给他看。不是什么高深技术,就是上线前跑一遍树结构校验的事。但人嘛,总觉得"这种低级错误我不会犯",直到真犯一次。

各位站长,你们清单里有没有那种"看起来傻但救过命"的条目?贴出来互相抄抄。

评论0
回复 · 0
还没有回复
微信客服 微信客服