# 正式管理端发布与门店流程验收 ## 发布结果 - 正式入口:`https://admin.xiaoshu.pro/admin/login`。 - 华为云 CDN 域名详情确认源站为 `xiaoshu-admin.obs-website.cn-south-1.myhuaweicloud.com`,对应 OBS 桶 `xiaoshu-admin`,区域 `cn-south-1`。这不是学生端站点。 - 前端提交:`817b561a537fab1b0411f0581aa61200bef125a6`;版本号:`817b561a537f-20261015T124317689Z`。 - 发布前备份桶内 362 个对象,共约 19.14 MB。旧入口 MD5 为 `62a1fd2a225e4f1c1cae58587cf6d9ef`,与公网原入口一致。 - 先上传资源,沿用旧站点静态对象的 `public-read` 权限;源站校验后上传版本清单,最后切换 `index.html`。旧哈希资源保留。 - CDN 目录刷新任务:`7892998146`,回读状态 `task_done`,成功 1、失败 0。 - `node scripts/release-admin-web.mjs --verify` 校验公网 95 个文件的 SHA-256、版本清单和登录/工资深层路由成功。 - 另行不带查询参数读取 `/`、`/admin/login`、`/admin/store-home`、`/admin/schedule`,均为 HTTP 200 且入口哈希与本次发布相同。 ## 真实接口流程 在正式后端创建明确标记的隔离测试门店、老师和学生,使用测试门店真实密码调用正式登录接口,返回 `store-admin`。没有修改真实门店密码,也没有使用临时会话冒充密码登录验证。 通过实际业务接口验证: 1. 总部给测试门店记入 1 节 30 分钟课时及 0.5 小时陪练额度,门店划拨给测试学生。无真实收款。 2. 门店开通单词课,排课选项只包含本店测试学生、老师。 3. 创建 2026-10-16 的一节测试预约,使用同一请求号重试后仍只有一节。正确预留 1 节课时及 0.5 小时陪练。 4. 指定外店学生的排课请求被拒绝。 5. 修改时间成功;使用修改前版本取消,被拒绝为过期请求。 6. 使用最新版本取消,预留全部释放;恢复后重新预留;再次取消后预留归零。 验收发现数据库 `updatedAt` 有微秒,而前端接口通过 JavaScript Date 返回毫秒;原 SQL 精确比较使新预约修改/取消误报“预约已变更”。已修改两个版本判断,与 API 的毫秒精度一致,仍保留过期版本拒绝。生产通过 `scripts/sql/schedule-version-precision.sql` 只替换现有函数的比较表达式,未覆盖其他线上热修复;更新前备份函数,更新后核对定义只发生这两处变化。 ## 清理与回归 - 测试学生额度按原单退回,测试门店入账按原凭据冲销;双方四类余额均为零,预约预留为零。 - 测试课程回收,三个测试账号标记删除并停用,所有测试会话撤销。保留业务流水及操作审计,不删除或改写真实交易。 - 本轮定向测试 34 项通过:开课/课时事务、门店隔离、发布校验。包含微秒时间经 JSON 返回后的编辑/取消/恢复、拒绝旧版本、精度迁移重复执行。 - 发布后再次运行 35 项线上权限检查通过;两个现有门店的学生范围仍隔离,总部会员总数仍为 628。门店 287 尚无本店有效老师,仍需总部配置老师归属后才能指定老师排课;门店 100 有 35 位本店有效老师。 - 正式浏览器可读取运营工作台,但浏览器自动化出现持续超时,未完成门店表单的浏览器点击全流程。上述登录及排课验收来自正式 HTTP 接口与数据回读,不能替代完整浏览器交互验收。手机及微信 WebView 未测试。 ## 后续发布与回滚 仓库的 `scripts/release-admin-web.mjs` 负责打包和验证。上传使用官方 `obsutil`,CDN 使用 `hcloud CDN CreateRefreshTasks/v2`,凭据从受保护的现有配置读取,不写入仓库或静态包。 已确认的上传目标为 `obs://xiaoshu-admin/`,endpoint 为 `obs.cn-south-1.myhuaweicloud.com`。后续发布仍应先备份、上传资源并校验,再更新版本清单和入口,刷新 `https://admin.xiaoshu.pro/` 目录,最后运行公网校验。不得执行清空整个桶的命令。 本次完整基线、上传记录、函数定义、接口验收及清理结果保存在本机受保护目录 `/Users/mac/.local/state/xiaoshu/cloud-releases/2026-10-15-store-web/`。回滚前端时恢复基线中的入口及非哈希资源,再刷新 CDN;保留旧新两套哈希资源。数据库回滚仅基于保存的两个函数定义并确认没有后续修改,不触碰课时、凭据、审计或门店隔离约束。