2026-09-24 · 云机只读核查 · 非验收证据
对象:subseat-login-plan-v2-20260924.html(r10,16 块 + 附录)
方法:把每块可见文字抽出来(/tmp/pv2-selfcheck-text.md),逐条对照方案文档 §十三 的 16 条拍板 + 5 条红线;可疑的地方再查代码和生产库。⚠️ 9-24 晚·自查更正(长官要求排查我说错的)
1. B 条前提错(家长密码登录必带微信身份,页面认得出人)→ 已撤回
2. 「9-20 那种授权失败家长用密码也进不去」错:9-20 的 409 在另一条「公众号家长」链路(h5_user_auth.py:57-59),席位授权容忍无 unionid(seat_auth.py:490)
3. A 条「卡死、跳不过去」说过头:弹窗显示红字后换个手机号就能过;「多孩家庭会撞」不成立(一个家长号能挂多个孩子),只有换店才撞
4. 三-2「品牌码家长也不是第一次登录」错:刚扫码的家长点功能时确实是第一次 → 第 7 块标题不改,只删「管理员给您的初始密码立即失效」
5. 「已开品牌码 / 子席位没前缀的机构,家长进不去」说过头:生产品牌码 0 个;老家长照常用,只是开新号时出提示
16 条拍板在图上都画到了,没有哪块画反。问题出在图没画到的情况:有 3 处会让人登不进或卡住,另有 1 处需要您定一句话,还有 4 处文字不准。
事实
- 生产库手机号唯一索引是分边的:门店号之间唯一、家长号之间唯一,门店号和家长号之间可以用同一个号(生产 pg_indexes 实查:uq_users_phone_store / uq_users_phone_parent / uq_users_phone_h5 三个带条件的唯一索引,没有全表唯一)→ 第 8 块「门店号 + 家长号同一个手机号」成立
- 撞号时后端回 409「该手机号已被其他账号使用」(seat_auth.py:756-759)
- 生产实数(seatops 通道,只取计数):
| 生产 | test | |
|---|---|---|
| 有门店号的机构 | 46 | 82 |
| 其中只有 1 个门店号 | 27 | 57 |
| 有 2 个门店号 | 9 | 9 |
| 有 3 个及以上 | 10 | 16 |
| 门店号总数 / 已填手机号 | 153 / 111 | 238 / 26 |
| 家长号总数 / 已填手机号 | 20 / 6 | 65 / 7 |
| 同一个微信绑了 2 个以上家长号 | 0 | 0 |
会怎样
- 门店:19 家机构(四成)有多个门店号。标题写「门店联系电话」,店员会很自然都填店里那一个电话 → 第 2 个号起卡在初始化弹窗,又跳不过去
- 家长:目前 0 人撞;以后换店、多孩才会撞
建议
1. 门店版标题:「门店联系电话」→「您的手机号」(旁边照旧「用于登录」)。每个店员填自己的
2. 撞号时给一句能看懂的话:
- 门店版:「这个手机号已被其他门店账号使用,请换一个」
- 家长版:「这个手机号已绑定其他家长账号,请换一个」
3. 图里补这个撞号状态(第 4 块、第 11 块各加一个小样)
⚠️ 9-24 更正(B 条的前提查错了,已撤回):家长号用密码登录必须带微信身份,不带直接 403「家长账号请先完成微信授权后登录」(
seat_auth.py:318-330);在微信内打开一定带身份(seat-login-sheet.tsx:20「微信内必有」),页面能认出人,新号登录框直接就是「手机号」,碰不到提交前拦截 → 下面举的品牌码家长例子不成立。长官指出「让门店自己分新老号不行」;又确认门店、家长都必须在微信里打开(不会用普通浏览器)→ 定案:页面不变,输手机号照旧提交前拦,红字用第 16 块改后那句「席位账号不是手机号,请输入提供给您的账号」。能看到「席位账号」框的都是该用账号的人(老号 / 第一次登录 / 刚重置),不用谁自己分。另:9-20 那种微信整个授权失败,家长用密码也进不去,决策 11 的兜底管不了。
事实
- 登录框写什么,是靠「这个微信登过哪些号」判断的(决策 14);微信认不出人时(授权失败、不在微信里打开),就回到默认的「席位账号」框
- 现在的代码:「席位账号」框里输入像手机号(11 位 1 开头),提交前就直接拦下、不发给后台(seat-login-sheet.tsx:118、tablet/seat-login.tsx:104,seat-login-hints.ts 注释「提交前拦 · 不打接口」)
- 第 16 块只改了这句话的文字,没改「提交前拦」这个动作
会怎样
- 决策 11「品牌码家长微信失效时用手机号 + 密码兜底」,恰好发生在微信认不出人的时候 → 家长看到「席位账号」框,输手机号 → 被拦 → 兜底失效
- 第 7 块写的「界面同第 5 块改后」在这种情况下不成立
建议
- 「席位账号」框名字不变;输手机号不再提交前拦,交给后台
- 后台按手机号只找新号:对上就照常验密码(照走换微信 403 + 连错冷却两道锁);对不上再回那句提示
- 查不到不推告警、不计冷却(红线 5 本来就这么定的)
- 图上:第 16 块只改说明(提示改成「提交后没对上才出」);第 7 块说明改成「微信登不上时,输手机号 + 密码也能进」
事实
- 重置后弹的发号卡片只放账号和新密码(parent-seats/page.tsx:334 setCred({ seats: [{ username, password }] })),确认框写「请及时告知家长新密码」(:1110)
- 重置后 must_change_password = True(seat_service.py:466)
- 决策 14:新号只认手机号
会怎样
- 管理员照卡片告诉家长「账号 BF100001、密码 xxxxxx」→ 家长的登录框是「手机号」→ 输账号登不进
建议
- 新号(已填过手机号的)重置后,卡片显示「手机号 + 新密码」,并写「请让对方用手机号 + 这个密码登录」
- 还没初始化过的新号、老号:照旧显示账号
- 第 10 块(品牌码页)加了「重置密码」按钮,用的是同一张卡片 → 图里补一块「重置后的卡片」
| # | 块 | 现在写的 | 问题 | 改成 |
|---|---|---|---|---|
| 1 | 第 1 块说明 | 「前缀由各机构自己设」 | 前缀是平台后台设的,机构自己设不了(第 15 块也写了「请联系平台管理员」) | 「前缀由平台后台给每个机构设」 |
| 2 | 第 7 块弹窗 | 「首次登录 · 请设置您的密码」「管理员给您的初始密码立即失效」 | 品牌码家长从来没有初始密码,也不是第一次登录 | 同一个弹窗,品牌码家长这两句换成「请设置登录密码」「以后微信登不上时,可以用手机号 + 这个密码登录」 |
| 3 | 第 10 块第 3 行 | 「陈晨」+ 一串 openid | 编出来的示意行(test 真实数据只有 2 行),违反「不许编数据」 | 删掉这一行 |
| 4 | 附录第 21 条 | 说提示用的是「灰字」 | 图上实际是橙色字,附录没跟着改 | 改成实际用的颜色和出处 |
另外记一条(不改图):第 15 块门店手机端写「家长账号前缀」,后台几块写「子席位账号前缀」。店员不认识「子席位」这个词,我认为保持现状更好懂。
app/models/user.py:46 还写着 phone = Column(..., unique=True),但生产 / test 库实际是 phase74_001 建的三个带条件唯一索引(全表唯一已在 phase74_001 删掉)。模型和库不一致,写迁移时别用 autogenerate,否则会生成错的约束/tmp/pv2-selfcheck-text.md(608 行,17 段)/tmp/pv2-self-<块号>.pngsudo db-prod "SELECT indexname, indexdef FROM pg_indexes WHERE tablename='users' AND indexdef ILIKE '%phone%'" → 3 行(对照组:users 表索引共 13 个)