顺序表第 1 条:平台后台建设备、导入 唯一码、生成二维码。
依据:定稿记录 home-device-plan-decisions-20260929.md + 长官 9-20 业务方案 v0.8 第 02 / 05 / 06 节。
效果图:device-admin-mockup-20260929.html(同目录)。
本文只是方案,代码 0 行。 长官点头后再写技术方案和施工步骤。
原始终端输出全文:~/reports/device-admin-preverify-raw-20260929.txt(脚本直接落盘,不是手抄)。
| # | 查什么 | 结论 | 证据(file:line) | 对照组 |
|---|---|---|---|---|
| V1 | 后台菜单在哪 | 平台管理组在新壳 AdminConsoleShell.tsx,「子席位管理」在 :45 |
web/app/(dashboard)/admin/AdminConsoleShell.tsx:35-47 |
同文件其他组 :52 / :76 命中 |
| V1b | 菜单权限登记 | 每个菜单要在 menu_registry 登记一条 | app/core/menu_registry.py:25 platform.parent_seats |
:18-29 共 7 条 |
| V2 | 已有的「设备」页面(要避开) | 旧壳里已有「设备数据池」/admin/devices、「设备类型」/admin/device-types,接口前缀 /api/v1/admin |
web/app/(dashboard)/layout.tsx:16,104,113;app/api/admin_devices.py:17 |
— |
| V3 | 已有设备表(要避开重名) | 只有 device_data / device_type_config / user_phone_verification,是厂商推送数据,没有编号、门店、二维码、绑定 |
app/models/device.py:18,43,57 |
user.py 查同写法命中 2 |
| V4 | 二维码能力 | /api/qr 现成(python qrcode),但无鉴权、缓存 1 天;全仓没有打包 zip 先例 |
app/api/qr.py:26-27,79;zipfile 0 命中 |
import qrcode 命中 qr.py、share_poster.py |
| V5 | 后台接口鉴权 | 平台管理员接口一律 Depends(require_role("admin")) |
app/auth/middleware.py:100;app/api/admin_parent_seats.py:10 |
— |
| V6 | Excel 导入先例 | 后端全用 openpyxl(3 个文件),没有 pandas;上传用 UploadFile;「先预览再确认」两步式有现成写法 | app/api/excel_import.py:1,86;app/api/admin_flywheel.py:158 |
pandas 0 命中 / openpyxl 3 文件 |
| V7 | 门店按名字匹配行不行 | organizations.name 没有唯一约束,可能重名 → 导入必须把「对不上 / 重名」单列给人确认 |
app/models/organization.py:20(对比 :17 org_code unique=True) |
同文件 unique 命中 4 处 |
| V8 | 随机码先例 | 品牌码就是 secrets.token_urlsafe(32) 落库唯一,设备码照抄 |
app/api/admin_brand_code.py:368;app/models/brand_code.py:44 |
— |
| V9 | 家长 / 孩子表 | 家长 = users(seat_type)、孩子 = patients(owner_seat_id) | app/models/user.py:130;app/models/flywheel.py:52 |
— |
| V10 | 数据库迁移挂哪 | test 上迁移是多头;最新链尾 phase85_006。实施时要先确认挂载点 |
migrations/versions/phase85_006_wecom_wait_timeline.py:16-17 |
共 111 个迁移文件 |
| V11 | 后台真实样式 | 后台实际是灰黑风格:黑按钮 bg-slate-900(65 处)、border-slate-200(205)、rounded-xl(109);蓝 bg-blue-600 只 24 处 | 频次命令见原始输出 V11 | — |
| V12 | 门店手机/平板有没有子席位列表(第 2 件用) | 没找到。平板和门店手机里带「席位」的文件只有登录、绑家长弹框,没有列表页 → 第 2 件多半要新做页面(第 2 件开工再细查) | web/app/h5/tablet/components/seat-login.tsx;h5 目录共 15 个子目录逐个列过 |
「席位」在 h5 下命中 20 个文件 |
| V13 | 出图样板 | 后台 PC 样板有 phase21b-admin-demo 等 | docs/superpowers/demos/ |
— |
| V14 | 照着做的真实页面 | 「子席位管理」页:标题 23px 粗体、表头 bg-slate-50 text-slate-500、「查看明细」蓝色文字链 |
web/app/(dashboard)/admin/parent-seats/page.tsx:759,966-974,995 |
— |
| V15 | 弹框样式 | 居中白卡 rounded-2xl + 遮罩 bg-slate-900/40,主按钮 rounded-xl bg-slate-900 |
parent-seats/bulk-open.tsx:290,295,313 |
— |
| V16 | 业务方案原文 | v0.8 第 02 节(设备管理)、05 节(后台查询)、06 节(解绑)已逐条读过;跟它不同的地方(不要厂商、按设备停用)以长官 9-29 晚定的为准 | ~/reports/shared/subseat-device-plan-v08-20260920.html | — |
verify 改变了什么
1. 后台已有「设备数据池」「设备类型」两个老页面(存厂商推送的使用数据,跟本件无关)→ 新页面地址用 /admin/device-mgmt,不碰老的 /admin/devices、/admin/device-types。注意老菜单也叫「设备类型」,两边同名,实施时老菜单要不要改名/收起,到时问长官
2. /api/qr 公开、会被缓存 → 设备二维码不走这个接口,下载走后台鉴权接口,在服务端生成
3. 机构名不唯一 → 导入时门店对不上 / 重名的,单列出来,由人从下拉框选机构,系统不猜
4. 第 2 件门店端没有子席位列表 → 第 2 件工作量比原先估的大(要新做页面)
结构只有两层:设备类型 → 设备名称,每个设备名称下挂很多 唯一码。不设厂家。
「平台管理」组,在「子席位管理」下面加 设备管理,页面三个页签:「唯一码」「设备」「设备类型」;标题和页签同一行,筛选放进表格卡片头,页头不占地方(照子席位管理页的排法)。
parent-seats/page.tsx:1172-1185、app/models/user.py:42-43)确认后才写入;唯一码原样保存,前导零和大小写不变
两个模板:第 1 行是浅橙底的填写说明(合并单元格),第 2 行表头,第 3 行示例;导入从第 2 行表头开始读
web/app/h5/brand-scan/page.tsx:18 复用微信授权;:7-8 注明微信不许自动授权,所以要点一下本件跟第 2、6 件先上线,那时家长还不能扫码,所以「当前绑定家长」「平台解绑」先空着。绑定记录表本件就建好。
9-30 长官令:「SN码」统一改叫「唯一码」(页面、导入模板、图片名都用这个词)。